diff --git a/AGENTS.md b/AGENTS.md index 5a7fce3..edfd2d5 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -10,6 +10,18 @@ Primary Git remote: - `origin -> ssh://git@nas:2222/tei/pbf.git` +## 2026-10-13 全国 Full PBF 权威生产基线(优先于下列历史 20nm 规则) + +用户明确指定公网 `pbf-delivery-full-20260418-rebuild` 是 NavSea PBF 全国 Full 标准;请首先阅读: +`docs/报告/20261013_NavSea_PBF全国Full生产链溯源调查_v1.md` 及 `NavSea_全国完整PBF重建流水线说明.md`。 +真正的 2026-04-18 四段生成路径是 `/home/wwwroot/pbf-delivery-full-20260418-rebuild.parts/{z0_8,z9_10,z11,z12}`; +生产源码历史固定在 `6d72340`,采用 NewPEC 原始 PBF + MySQL `pbf_analysis` / `navsea-core`。 +2026-10-13 抽查多个缩放等级的公网样本与历史分片字节一致。 +本地同名合并目录已在后续语义统一操作中出现部分不同的文件,并与 20260808 派生目录存在硬链接; +不要把该目录的当前全部内容误当成公网原始生产基线。 +历史 20nm 对比页和 Domain/Provider 路径是各自的历史或独立范围,不能覆盖此权威生产定义。 +任何新重建只允许写独立候选目录;严禁覆盖原始分片、正式同名目录或公开版本。 + ## First Files To Read When resuming work in this project, read in this order: @@ -191,3 +203,22 @@ At the end of a session: 1. Update [`STEP_RECORD.md`](/root/sourceserver/pbf/STEP_RECORD.md). 2. If the checkpoint is useful, commit it. 3. Keep unrelated dirty files out of the commit. + + + +## 3. Codex 文档命名与版本管理规则 + +当 Codex 被要求编写、整理或生成项目文档时,必须遵守以下规则: + +- 文档文件名必须使用中文 +- 文档正文内容必须使用中文 +- 在创建整理后的文档之前,必须先检查项目中已有文档 +- 如果已有文档是在总结同一个主题、同一个问题或同一类方案,不要另起完全不同的文件名 +- 对同一个主题的总结文档,必须沿用统一主题名称,并在文件名中加入版本号 +- 版本号必须逐步升级,例如: + - `AIS数据解析总结-v1.md` + - `AIS数据解析总结-v2.md` + - `AIS数据解析总结-v3.md` +- 新版本应表示当前整理后的最新版 +- 避免对同一个事情反复创建多个不同名称的总结文档 +- 如果确实需要新文件名,必须是因为主题范围发生了明显变化 \ No newline at end of file diff --git a/Codex_Prompt_版_NavSea_Pickup_当前点击解读_迁移.md b/Codex_Prompt_版_NavSea_Pickup_当前点击解读_迁移.md new file mode 100644 index 0000000..2cc0387 --- /dev/null +++ b/Codex_Prompt_版_NavSea_Pickup_当前点击解读_迁移.md @@ -0,0 +1,174 @@ +# Codex Prompt 版:NavSea Pickup 当前点击解读迁移 + +请在当前 `React + MapLibre` 项目中,实现 `NavSea` 海图的 `pickup` “当前点击解读”。 + +## 目标 + +把 `/root/sourceserver/pbf` 仓库里当前 web 测试页上的点击解释逻辑,迁移到当前 React 前端项目里。 + +不要只给方案,请直接完成实现。 + +## 必须先阅读的参考文件 + +请先阅读下面这些文件,再开始改代码: + +1. `/root/sourceserver/pbf/Codex_指令_NavSea_Pickup_当前点击解读_迁移到_React_MapLibre.md` +2. `/root/sourceserver/pbf/src/pbf/navsea-pickup-test-karatsu-20nm.html` +3. `/root/sourceserver/pbf/src/pbf/navsea-pickup-interpreter.ts` +4. `/root/sourceserver/pbf/src/pbf/navsea-pickup-rules.v1.json` +5. `/root/sourceserver/pbf/NavSea_Native_Pickup_ReactNative_MapLibre_实现说明.md` + +## 核心要求 + +### 1. 点击结果必须分成两类 + +- `海面/露出物` +- `海底信息` + +规则: + +- 只要用户点到了看得见的具体对象,就优先按对象解释 +- 只有在没有明确命中对象,或更适合按海底信息解释时,才回退到海底信息 + +### 2. 必须复用当前规则,不要另造一套 + +- 使用: + - `navsea-pickup-rules.v1.json` +- 使用: + - `navsea-pickup-interpreter.ts` + 的结构或直接移植其逻辑 + +不要重新发明: + +- 图层名单 +- 对象分类 +- title/detail/render 规则 + +### 3. 查询方式必须保留双阶段 + +必须保留: + +1. `exact point query` +2. `bbox query` + +当前规则: + +- `exact` 使用: + - `area + primary + info` +- `bbox` 使用: + - `primary + info` + +### 4. “附近”必须按真实距离,不允许再用固定像素作为业务定义 + +当前业务定义: + +- `附近 = 100 米内` + +正确做法: + +1. 把 `100m` 换算成当前 zoom 下的屏幕半径 +2. 用这个半径做 `queryRenderedFeatures` +3. 再按真实 `distance_m <= 100` 二次过滤 + +### 5. 必须实现“当前点击解读”展示数据 + +至少输出下面这些字段: + +- `结果类型` +- `主显示` +- `当前水深` +- `物体名` +- `水底情况` +- `判断理由` +- `补充提示` + +### 6. “判断理由”必须保留 + +不要把判断做成黑箱。 + +至少要能说明: + +- 当前水深取自哪个最近可见深度 +- `100 米` 内深度样本范围和跨度 +- 附近等深线数量 +- 深度标签数量 +- 海底辅助线数量 +- 附近结构或底质 + +### 7. 建筑物、陆地、地标不能被海底解释吞掉 + +必须确保下面这些可见对象优先按对象解释: + +- `land-area` +- `land-structures-area` +- `land-structures-line` +- `coast-structures-area` +- `coast-structures-line` +- `facility-points` +- `landmark-points` +- `landmark-point-fallback` +- `bridge-area` + +### 8. 用户文案要简单 + +不要把内部术语直接给普通用户。 + +允许内部调试保留: + +- `坡折` +- `槽` +- `脊` +- `bathymetry` + +但最终展示优先用普通用户能懂的话,比如: + +- `这里水底起伏比较明显,像一道坎。` +- `这里像水底一条沟的边上。` +- `这里像水底一个小包或小凸起边上。` +- `这里水底看起来比较平。` +- `这附近像礁边,鱼容易沿边活动。` +- `当前位置只有少量海底辅助线证据,暂不判断明显坎沟。` + +## 推荐拆分 + +请至少实现: + +1. 一个 `pickup rules loader` +2. 一个 `pickup interpreter` +3. 一个 `depth context service` +4. 一个 `terrain interpretation service` +5. 一个 `friendly click interpretation service` +6. 一个 React 组件或 hook,把 map 点击接进这套逻辑 +7. 一个展示 `当前点击解读` 的 panel + +## 不要做的事 + +1. 不要重新设计一套新的 pickup 体系 +2. 不要删掉 `判断理由` +3. 不要把所有点击都优先解释成海底 +4. 不要把“附近”改回固定 `px` +5. 不要为了“更聪明”擅自引入复杂插值算法 + +## 验收标准 + +实现完成后,至少满足: + +1. 点到灯塔、灯标、浮标、建筑物、地标、防波堤、栈桥、桥梁、陆地时: + - 优先返回具体对象 +2. 点到空白水域时: + - 返回海底信息 + - 不是直接返回空 +3. “附近”稳定定义为: + - `100 米内` +4. “当前水深”和“判断理由”不互相打架 +5. 页面不会再出现: + - 明明点到建筑物,却解释成海底 + +## 交付要求 + +完成后请给出: + +1. 改了哪些文件 +2. 主要实现了什么 +3. 如何在当前项目里接入 +4. 还剩哪些限制或待确认点 diff --git a/Codex_指令_NavSea_Pickup_当前点击解读_迁移到_React_MapLibre.md b/Codex_指令_NavSea_Pickup_当前点击解读_迁移到_React_MapLibre.md new file mode 100644 index 0000000..e765095 --- /dev/null +++ b/Codex_指令_NavSea_Pickup_当前点击解读_迁移到_React_MapLibre.md @@ -0,0 +1,438 @@ +# Codex 指令:把 NavSea `pickup` 的“当前点击解读”迁移到 React + MapLibre + +最后更新:`2026-04-11` +项目根:`/root/sourceserver/pbf` + +## 1. 这份文档的用途 + +这是一份给 `Codex` 的中文任务指令。 + +目标不是讨论方案,而是让 `Codex` 在目标前端项目里,直接把当前 NavSea 测试页上的 `pickup / 当前点击解读` 逻辑迁移到 `React + MapLibre`。 + +这份指令要求实现结果尽量与当前测试页一致,而不是重新发明一套新逻辑。 + +## 2. 你要实现的目标 + +请在目标前端项目中实现一套 NavSea 海图点击能力,点击后返回并展示“当前点击解读”。 + +这套逻辑必须满足: + +1. 如果点击命中海面上或露出水面的可见对象: + - 直接返回这个对象是什么 + - 例如: + - 灯塔 + - 灯标 + - 浮标 + - 建筑物 + - 地标 + - 防波堤 + - 栈桥 + - 陆地 + - 桥梁 + - 危险物 +2. 如果点击更适合按海底信息解释: + - 返回当前水深 + - 返回物体名(有的话) + - 返回一句简单、普通钓鱼人能看懂的水底情况说明 + - 返回“判断理由” +3. 不要让用户看见一堆内部调试术语。 +4. 不要默认优先海底解释。 + - 只要用户明确点到了看得见的物体,就优先按物体解释。 + +## 3. 当前实现的唯一参考来源 + +迁移时,请以本仓库下面这些文件为准,不要自己脑补一套新规则: + +- 测试页主逻辑: + - [src/pbf/navsea-pickup-test-karatsu-20nm.html](/root/sourceserver/pbf/src/pbf/navsea-pickup-test-karatsu-20nm.html) +- pickup 解释器: + - [src/pbf/navsea-pickup-interpreter.ts](/root/sourceserver/pbf/src/pbf/navsea-pickup-interpreter.ts) + - [src/pbf/navsea-pickup-interpreter.js](/root/sourceserver/pbf/src/pbf/navsea-pickup-interpreter.js) +- pickup 规则字典: + - [src/pbf/navsea-pickup-rules.v1.json](/root/sourceserver/pbf/src/pbf/navsea-pickup-rules.v1.json) +- 当前前端实现说明: + - [NavSea_Native_Pickup_ReactNative_MapLibre_实现说明.md](/root/sourceserver/pbf/NavSea_Native_Pickup_ReactNative_MapLibre_实现说明.md) + +当前测试页里真正要迁移的核心行为,重点看: + +- `handlePickup` +- `buildDepthContext` +- `collectTerrainSamples` +- `buildTerrainInterpretation` +- `buildFriendlyClickInterpretation` +- `shouldPreferBBoxPrimary` + +## 4. 当前业务口径 + +迁移时请严格保持下面这些口径。 + +### 4.1 主键口径 + +- 主对象 id 使用: + - `feature.id` +- 当前前端可把它视为: + - `fid` + +### 4.2 图层口径 + +- 不允许前端手写一套新的 layer 名单 +- 统一从: + - `navsea-pickup-rules.v1.json` + 读取: + - `render_layer_groups.primary` + - `render_layer_groups.area` + - `render_layer_groups.info` + - `render_layer_groups.ignore` + +### 4.3 点击优先级口径 + +- 用户点到可见对象时: + - 优先按对象解释 +- 用户没点到明确对象时: + - 再回退到海底信息解释 + +### 4.4 “附近”口径 + +- 当前业务定义: + - `附近 = 100 米内` +- 不能再直接用固定 `px` 当业务口径 +- 正确做法: + 1. 先把 `100m` 换成当前 zoom 下对应的屏幕半径 + 2. 用这个半径做 `queryRenderedFeatures` + 3. 再用真实 `distance_m` 二次过滤 + 4. 只有 `distance_m <= 100` 的对象,才算“附近” + +### 4.5 用户文案口径 + +- 要用普通用户能看懂的话 +- 不要把下面这些词直接当最终用户文案: + - 坡折 + - 脊 + - 槽 + - bathymetry + - contour evidence +- 可以保留在内部调试结构里 +- 但正式展示应尽量写成: + - `这里水底起伏比较明显,像一道坎。` + - `这里像水底一条沟的边上。` + - `这里像水底一个小包或小凸起边上。` + - `这里水底看起来比较平。` + - `这附近像礁边,鱼容易沿边活动。` + - `当前位置只有少量海底辅助线证据,暂不判断明显坎沟。` + +## 5. 需要迁移的功能拆分 + +请把实现拆成下面几层,不要把所有逻辑塞进一个组件里。 + +### A. `pickup rules loader` + +负责: + +- 加载 `navsea-pickup-rules.v1.json` +- 对外提供: + - `primary / area / info / ignore` + - `display_name_overrides` + - `layer_rules` + +### B. `rendered feature interpreter` + +优先复用或移植: + +- [src/pbf/navsea-pickup-interpreter.ts](/root/sourceserver/pbf/src/pbf/navsea-pickup-interpreter.ts) + +负责: + +- 把 `queryRenderedFeatures` 返回的 feature 转成统一解释结构 +- 对每个 feature 输出: + - `fid` + - `source_layer_std` + - `object_domain` + - `object_class` + - `canonical_object_type` + - `title` + - `details` + - `render` + - `score` + - `distance_m` + +### C. `pickup query adapter` + +负责把 React + MapLibre 的 map 实例封装成统一查询接口。 + +至少提供: + +1. `queryExactFeatures(point)` +2. `queryBBoxFeatures(point, radiusPx)` +3. `queryRawFeatures(point, radiusPx)` + +要求: + +- `exact` 查询层: + - `area + primary + info` +- `bbox` 查询层: + - `primary + info` + +### D. `depth context service` + +负责: + +- 在对象未命中时,返回最近深度上下文 + +必须保持与测试页同样口径: + +- 当前采用: + - `100 米` + 口径 +- 返回: + - `nearest_depth_m` + - `nearest_label` + - `nearest_render_layer` + - `nearest_distance_m` + - `candidate_count` + - `candidates` + +### E. `terrain interpretation service` + +负责: + +- 采样 `100 米` 内的海底证据 +- 做规则判读 + +当前只看下面这些强相关层: + +- 深度/海底线: + - `depth-contours` + - `depth-contours-major` + - `depth-contour-labels` + - `depth-contours-major-labels` + - `bathymetry-support` + - `bathymetry-depth-labels` +- 底质: + - `bottom-material-labels` +- 结构: + - `submerged-structures` + - `fishery-areas` + - `hazard-polygons` + - `navigation-hazard-polygons` + +返回: + +- `local_depth_range_m` +- `nearest_depth_m` +- `contour_density` +- `seabed_material` +- `nearby_structures` +- `hints` + +### F. `friendly click interpretation service` + +这是最重要的一层。 + +负责把内部 pickup / depth / terrain 结果,变成前端真正展示的“当前点击解读”。 + +输出必须分两种模式: + +1. `海面/露出物` +2. `海底信息` + +并返回: + +- `mode` +- `headline` +- `depth_text` +- `object_name` +- `shape_text` +- `reason_text` +- `extra_text` + +## 6. 必须保留的关键逻辑 + +### 6.1 `exact` 与 `bbox` 的双阶段查询 + +不要只做一个 `queryRenderedFeatures`。 + +必须保留: + +1. `exact point query` +2. `bbox query` + +理由: + +- 海图小符号太小 +- 单点容易漏 +- bbox 用来补小灯标/小浮标/小地标 + +### 6.2 `nearby primary` 抢回规则 + +当前逻辑里,如果: + +- `exact` 命中的是 broad area / 次级对象 +- `bbox` 命中了 nearby `primary` + +则允许 nearby `primary` 抢回。 + +但下列层不能被轻易抢走: + +- `land_area` +- `onshore_structure_area` +- `onshore_structure_line` +- `bridge_structure` + +也就是: + +- 陆地、建筑物、桥这种可见对象 +- 一旦已经被命中 +- 不应再被附近别的点对象夺走 + +### 6.3 可见建筑/地标点必须纳入主入口 + +当前规则里,这些层已经属于正式 pickup 主入口,迁移时必须保留: + +- `facility-points` +- `landmark-points` +- `landmark-point-fallback` + +不能只顾海底,不关注建筑/地标。 + +### 6.4 海底解释不要黑箱 + +“当前点击解读”里必须展示: + +- `判断理由` + +当前要求至少能显示: + +- 当前水深取最近可见深度,约多少米 +- `100米` 内样本深度范围与跨度 +- 附近等深线数量 +- 深度标签数量 +- 海底辅助线数量 +- 附近结构或底质 + +## 7. React 侧建议数据结构 + +请实现一个统一返回结构,例如: + +```ts +export type NavSeaClickInterpretation = { + resultType: "surface_object" | "seabed_context" | "empty"; + primary: null | { + fid: string | null; + title: string; + sourceLayerStd: string; + objectDomain: string; + objectClass: string; + canonicalObjectType: string | null; + distanceM: number | null; + details: Array<{ field: string; label: string; value: unknown }>; + }; + currentDisplay: { + mode: "海面/露出物" | "海底信息" | "未命中"; + headline: string; + depthText: string; + objectName: string; + shapeText: string; + reasonText: string; + extraText: string; + }; + depthContext: unknown; + terrainInterpretation: unknown; + candidates: unknown[]; + debug?: { + exactFeatures: unknown[]; + bboxFeatures: unknown[]; + rawFeatures: unknown[]; + }; +}; +``` + +## 8. React 组件层要求 + +请在目标前端项目里落一个正式的点击结果 panel。 + +至少显示下面这些字段: + +- `结果类型` +- `主显示` +- `当前水深` +- `物体名` +- `水底情况` +- `判断理由` +- `补充提示` + +要求: + +- 样式简洁,不需要复刻测试页调试风格 +- 但字段含义必须保留 +- JSON 调试块可以放到开发模式或 debug 开关下 + +## 9. 不要做的事 + +请不要做下面这些事: + +1. 不要另造一套新的对象分类体系 +2. 不要手写一套新的 layer 白名单 +3. 不要把 `附近` 再改回固定像素半径 +4. 不要把所有用户都按“海底信息”解释 +5. 不要为了“更聪明”擅自引入复杂插值算法 +6. 不要删掉当前 `判断理由` +7. 不要把内部调试术语直接暴露给普通用户 + +## 10. 你应该产出的内容 + +请在目标前端项目里至少完成: + +1. 一个可复用的 `pickup` service / hook +2. 一个可复用的 `current click interpretation` 解释器 +3. 一个前端 panel 组件 +4. 把 map 点击事件接到这套逻辑上 +5. 必要的类型定义 +6. 一份简短说明,写清: + - 主要新增了哪些文件 + - 如何接入 + - 当前有哪些限制 + +## 11. 验收标准 + +实现完成后,至少满足下面这些验收条件: + +1. 点到灯塔、灯标、浮标、建筑物、地标、防波堤、栈桥、桥梁时: + - 优先返回具体物体 +2. 点到空白水域时: + - 不直接返回空 + - 返回海底信息 +3. “附近”口径稳定为: + - `100 米内` +4. “当前水深”和“判断理由”使用同一套证据口径 +5. 海底解释文案对普通钓鱼人基本可理解 +6. 不会出现: + - 明明点到建筑物,却解释成海底 +7. 不会出现: + - 当前水深和判断理由互相打架 + +## 12. 建议给 Codex 的直接执行口令 + +如果你把这份文档直接发给另一个 Codex,可以在前面加上这段: + +```md +请在当前 React + MapLibre 项目中,严格按照这份文档实现 NavSea 的 pickup “当前点击解读”。 + +要求: + +1. 先阅读文档中列出的参考文件。 +2. 不要另造规则,尽量复用现有 pickup 规则字典和解释器结构。 +3. 直接在项目里完成实现,不要只给方案。 +4. 完成后给出: + - 改了哪些文件 + - 如何接入 + - 还剩哪些限制 +``` + +## 13. 当前一句话总结 + +迁移时请记住唯一重点: + +- **可见对象优先按对象解释** +- **海底信息只作为未命中明确对象时的回退解释** +- **“附近”统一按 100 米** +- **“当前点击解读”必须带判断理由** 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/NavSea_Native_Pickup_ReactNative_MapLibre_实现说明.md b/NavSea_Native_Pickup_ReactNative_MapLibre_实现说明.md new file mode 100644 index 0000000..dd36c57 --- /dev/null +++ b/NavSea_Native_Pickup_ReactNative_MapLibre_实现说明.md @@ -0,0 +1,658 @@ +# NavSea Native Pickup React Native + MapLibre 实现说明 + +最后更新:`2026-04-09` +适用项目:`/root/sourceserver/pbf` +目标前端:`React Native + MapLibre Native` + +## 1. 文档目的 + +本文给前端团队一份可以直接实现的 `pickup` 方案。 + +目标不是再讨论抽象模型,而是回答下面几件事: + +1. 在 `native MapLibre` 中如何点击海图并拿到结果 +2. 当前 `NavSea 20nm final` 这条线应该怎么消费 +3. 哪些层应该能点,哪些层应屏蔽 +4. 点击空白水域时如何返回深度上下文 +5. 规则字典和解释器怎么接入 + +## 2. 当前正式口径 + +当前项目已经收口为以下原则: + +- 对象主键统一使用: + - `feature.id` +- `feature.id` 视为当前 `fid` 的 native 可消费形式 +- 当前 `Karatsu 20nm final` 不拆 query 数据源 +- pickup、渲染、CPA / 安全判断继续消费同一个 `feature` 的同一套属性 +- 只要用户看不到的东西,就不应该成为正式 pickup 的点击结果 + +## 3. 当前数据基线 + +当前固定视觉与 PBF 基线: + +- compare 页面: + - `http://192.168.200.184/newpec/navsea-compare-karatsu-20nm.html` +- style: + - [style.navsea-delivery-karatsu-20nm-final.json](/root/sourceserver/pbf/src/pbf/style.navsea-delivery-karatsu-20nm-final.json) +- tile root: + - `/home/wwwroot/pbf-delivery-karatsu-20nm-final` + +当前真实瓦片抽样结果已经确认: + +- `feature.id` 可直接作为主对象 id 使用 +- 当前 `properties` 是瘦载荷,但已经保留一批 pickup 必要字段 + +典型保留字段包括: + +- `navigation_marks` + - `display_code` + - `canonical_object_type` + - `chart_icon_image` + - `chart_label_text` + - `chart_label_subtext` + - `light_color_code` + - `light_sector_mode` + - `name_ja` +- `navigation_hazard_point` + - `class_code` + - `canonical_object_type` + - `chart_icon_image` +- `clearance_limit_point` + - `class_code` + - `clearance_height_m` + - `chart_label_text` + - `name_ja` +- `depth_contour` + - `class_code` + - `least_depth_m` + - `chart_label_text` + +## 4. Pickup 的结果类型 + +pickup 不只返回“对象”,而是返回三类结果之一。 + +### 4.1 `object` + +点中了明确海图对象,例如: + +- 航标 +- 危险物 +- 引航站 +- 净空限制点 +- 锚地符号 + +返回: + +- 这个对象是什么 +- 它有哪些细节 + +### 4.2 `info` + +点中了可见信息,例如: + +- 深度数字 +- 净空数字 +- 灯略记 +- 标签 + +返回: + +- 这条信息是什么 +- 它属于哪个对象 + +### 4.3 `context` + +点的是空白水域,但这个位置本身有海图意义。 + +返回: + +- 当前深度上下文 +- 是否浅水 +- 最近等深线信息 +- 是否位于锚地/航路/危险区 + +说明: + +- 空白水域不应简单返回“未命中对象” +- 应优先返回水深上下文 + +## 5. 当前推荐实现结构 + +前端实现建议直接采用: + +- 规则字典: + - [navsea-pickup-rules.v1.json](/root/sourceserver/pbf/src/pbf/navsea-pickup-rules.v1.json) +- JS 解释器: + - [navsea-pickup-interpreter.js](/root/sourceserver/pbf/src/pbf/navsea-pickup-interpreter.js) +- TS 解释器: + - [navsea-pickup-interpreter.ts](/root/sourceserver/pbf/src/pbf/navsea-pickup-interpreter.ts) + +对于 `React Native` 团队,推荐两种接法: + +### 方案 A:直接复用解释器逻辑 + +- 把现有 JS 解释器迁入 RN 工程 +- 把规则字典作为静态 JSON 资源加载 + +适合: + +- JS / TS 代码统一 +- Web compare 和 RN 共享判读逻辑 + +### 方案 B:规则字典保留,解释器改写为 TypeScript + +- 保留同一份 JSON 规则字典 +- RN 端直接使用仓库里的 TS 解释器,或以它为母版迁入工程 + +适合: + +- RN 工程更强调类型约束 +- 前端团队不想直接引用仓库脚本文件 + +建议优先使用方案 B。 + +## 6. MapLibre Native 查询方式 + +官方 `MapLibre React Native` 的 `MapView` 提供: + +- `queryRenderedFeaturesAtPoint(point, [filter], [layerIDs])` +- `queryRenderedFeaturesInRect(bbox, [filter], [layerIDs])` + +其中更推荐用于 pickup 的是: + +- `queryRenderedFeaturesInRect` + +原因: + +- 海图符号小 +- 单点容易漏 +- 小范围矩形更稳 + +建议默认点击窗口: + +- `8px` + +例如: + +- 点击点 `(x, y)` +- 查询框: + - `[x - 8, y - 8, x + 8, y + 8]` + +## 7. 交互原则 + +### 7.1 只点“看得见”的东西 + +用户通常不是在做数据检索,而是在解释当前画面。 + +因此: + +- 可见对象可以点 +- 可见信息可以点 +- 不可见辅助层不应可点 + +### 7.2 看到的表达可以是入口,返回结果必须归到主对象 + +例如: + +- 点到航标标签 +- 点到净空数字 +- 点到灯略记 + +可以作为 pickup 入口,但最终结果应尽量回到同一个主对象 `fid`。 + +### 7.3 空白水域优先返回海图上下文 + +当没有主对象命中时,不要立刻返回空。 + +应继续尝试: + +- 深度上下文 +- 水域分带 +- 最近等深线 + +## 8. 哪些层应参与 pickup + +当前不建议在 RN 工程里手写 layer 名单。 + +统一做法是直接读取规则字典中的: + +- `render_layer_groups.primary` +- `render_layer_groups.area` +- `render_layer_groups.info` +- `render_layer_groups.ignore` + +这样当 style / pickup 规则更新时,前端无需同步改动硬编码数组。 + +### 8.1 主对象层 + +主对象层从规则字典读取: + +- `pickupRules.render_layer_groups.primary` + +这组层是正式 pickup 主入口。 + +### 8.2 信息层 + +信息层从规则字典读取: + +- `pickupRules.render_layer_groups.info` + +这些层允许点击,但应尽量回归到主对象解释。 + +### 8.3 可见区域层 + +可见区域层从规则字典读取: + +- `pickupRules.render_layer_groups.area` + +这些层本身不是小图标,但它们是用户肉眼明确能看到的主表达。 + +典型包括: + +- 渔业/定置渔具面 +- 危险区面 +- 锚地区 +- 设施区 +- 桥区 + +对这类层,原则是: + +- 如果用户精确点在可见区域填充上,应优先返回该区域对象 +- 不应让附近的小点符号把它抢走 + +### 8.4 默认屏蔽层 + +默认屏蔽层从规则字典读取: + +- `pickupRules.render_layer_groups.ignore` + +说明: + +- 这些层多为辅助表达 +- 用户通常不是想点它们本身 +- 其中包括 flare、arc、outline、support 与 background/container 类层 + +## 9. 推荐查询流程 + +推荐前端固定按 4 步做。 + +### 第一步:先做精确点查 + +使用: + +- `queryRenderedFeaturesAtPoint(point, undefined, exactLayers)` + +其中: + +- `exactLayers = [...renderGroups.area, ...renderGroups.primary, ...renderGroups.info]` + +目的: + +- 优先解释用户当前像素下真正看见的表达 +- 特别是: + - 渔网斜线面 + - 危险区面 + - 锚地区 + - 设施区 + +如果精确点查命中: + +- 先保留渲染顺序最靠上的候选 +- 再按 `feature.id` 聚合并解释 + +### 第二步:精确点查未命中,再查主对象层小范围补捞 + +使用: + +- `queryRenderedFeaturesInRect(bbox, undefined, pickupRules.render_layer_groups.primary)` + +如果命中: + +- 按 `feature.id` 聚合 +- 用规则字典解释 +- 返回主对象结果 + +说明: + +- 这一步主要用于补捞: + - 很小的灯标 + - 浮标 + - 危险物点 + - 净空点 + +### 第三步:主对象层未命中,再查信息层 + +使用: + +- `queryRenderedFeaturesInRect(bbox, undefined, pickupRules.render_layer_groups.info)` + +如果命中: + +- 按 `feature.id` 聚合 +- 若能回到同一主对象,则返回主对象结果 +- 同时标记: + - `result_type = info` + +### 第四步:仍未命中,则返回上下文 + +执行: + +- 位置深度上下文解释 +- 水域/浅水/危险区上下文解释 + +返回: + +- `result_type = context` + +## 10. 推荐返回结构 + +### 10.1 `object` + +```json +{ + "result_type": "object", + "fid": "4101640307", + "source_layer_std": "navigation_marks", + "geometry_type": "Point", + "title": "若宮灯台", + "object_domain": "navigation_mark", + "object_class": "lighthouse", + "object_subclass": "coastal_lighthouse_over_15m", + "canonical_object_type": "coastal_lighthouse_over_15m", + "details": [ + { "field": "display_code", "label": "表示用编号", "value": "30000004" }, + { "field": "light_color_code", "label": "灯色", "value": "white" }, + { "field": "light_sector_mode", "label": "灯弧模式", "value": "sector" } + ], + "render": { + "source_layer_std": "navigation_marks", + "render_hit_layers": ["nav-marks-harbor-lighthouses", "nav-mark-labels"], + "chart_icon_image": "symbol-daytime-301", + "chart_symbol_code": "lighthouse" + } +} +``` + +### 10.2 `info` + +```json +{ + "result_type": "info", + "fid": "2689086947", + "source_layer_std": "depth_contour", + "title": "2", + "object_domain": "depth", + "object_class": "depth_contour", + "object_subclass": "depth_contour_line", + "details": [ + { "field": "least_depth_m", "label": "最浅/深度(m)", "value": 2.0 } + ] +} +``` + +### 10.3 `context` + +```json +{ + "result_type": "context", + "context": { + "depth_band": "2-5m", + "nearest_contour_m": 5, + "shallow_water": true, + "in_hazard_area": false, + "in_route_area": false + } +} +``` + +## 11. 前端解释器接法 + +### 11.1 输入 + +输入给解释器的是: + +- `queryRenderedFeatures...` 返回的候选 feature 数组 +- 规则字典 JSON + +### 11.2 当前解释器职责 + +解释器只做以下事: + +1. 从 feature 中读取: + - `feature.id` + - `feature.sourceLayer` + - `feature.layer.id` + - `feature.properties` +2. 按 `feature.id` 聚合 +3. 使用规则字典匹配: + - `source_layer_std` +4. 结合规则字典里的: + - `interaction_role` + - `pickup_priority` +5. 若前端传入点击经纬度: + - `click_lnglat` + 解释器会在同分候选之间优先选择距离点击点最近的对象 +6. 当同一点击同时命中区域对象与附近点对象时: + - 优先尊重精确点查命中的可见区域表达 +7. 输出统一 pickup 结构 + +### 11.3 当前解释器不负责 + +解释器不负责: + +- 再造对象 identity +- 替代 style 做渲染决策 +- 做最终放行审计 + +## 12. React Native 伪代码 + +```ts +import pickupRules from "./navsea-pickup-rules.v1.json"; +import { + getRenderLayerGroups, + interpretRenderedFeatures, +} from "./navsea-pickup-interpreter"; + +type PickupResult = + | { result_type: "object"; primary: any; candidates: any[] } + | { result_type: "info"; primary: any; candidates: any[] } + | { result_type: "context"; context: any }; + +async function runPickup( + mapRef: any, + screenPoint: [number, number], + clickLngLat: { lng: number; lat: number }, + pickupRules: any +): Promise { + const radius = 8; + const bbox: [number, number, number, number] = [ + screenPoint[0] - radius, + screenPoint[1] - radius, + screenPoint[0] + radius, + screenPoint[1] + radius, + ]; + const renderGroups = getRenderLayerGroups(pickupRules); + const exactLayers = [ + ...renderGroups.area, + ...renderGroups.primary, + ...renderGroups.info, + ]; + + const exactFeatures = + (await mapRef.current?.queryRenderedFeaturesAtPoint( + screenPoint, + undefined, + exactLayers + )) || []; + + if (exactFeatures.length > 0) { + const interpreted = interpretRenderedFeatures(exactFeatures, pickupRules, { + click_lnglat: clickLngLat, + }); + const exactPrimary = interpreted.primary; + if (exactPrimary) { + return { + result_type: exactPrimary.interaction_role === "info" ? "info" : "object", + primary: exactPrimary, + candidates: interpreted.candidates, + }; + } + } + + const primaryFeatures = + (await mapRef.current?.queryRenderedFeaturesInRect( + bbox, + undefined, + renderGroups.primary + )) || []; + + if (primaryFeatures.length > 0) { + const interpreted = interpretRenderedFeatures(primaryFeatures, pickupRules, { + click_lnglat: clickLngLat, + }); + return { + result_type: "object", + primary: interpreted.primary, + candidates: interpreted.candidates, + }; + } + + const infoFeatures = + (await mapRef.current?.queryRenderedFeaturesInRect( + bbox, + undefined, + renderGroups.info + )) || []; + + if (infoFeatures.length > 0) { + const interpreted = interpretRenderedFeatures(infoFeatures, pickupRules, { + click_lnglat: clickLngLat, + }); + return { + result_type: "info", + primary: interpreted.primary, + candidates: interpreted.candidates, + }; + } + return { + result_type: "context", + context: await buildDepthContext(mapRef, screenPoint), + }; +} +``` + +## 13. 深度上下文实现建议 + +补充说明: + +- 对点状对象,如果不把 `clickLngLat` 传给解释器 +- 当同一小框里命中多个同类型、同分对象时 +- 解释器只能按原始返回顺序选一个 +- 这会导致: + - popup 标题是对的类型 + - 但返回的对象坐标可能偏到附近另一根灯标/浮标 + +### 13.1 优先级 + +当对象/信息层都未命中时,按下面顺序尝试: + +1. 查深度数字或等深相关 label +2. 查深度分带 / 水域层 +3. 查最近等深线 +4. 最后返回“无可解释上下文” + +### 13.2 当前建议先做的最小版 + +最小版只需要先返回: + +- 最近 `depth_contour` +- 当前是否落在浅水相关面层 +- 当前是否落在危险区 / 航路 / 锚地区 + +后续再升级成更细的: + +- `depth_band` +- `nearest_contour_m` +- `shallow_water` + +## 14. 规则字典的更新规则 + +规则字典不是每次纯视觉微调都要更新。 + +必须同步更新的情况: + +- PBF 标准层变化 +- 某层关键分类字段变化 +- style 主渲染字段依赖变化 +- 新增正式 pickup 层 +- render layer 分组变化 + +也就是说: + +- 纯颜色、字号、间距微调,通常不需要改 +- 但只要改了“这一层怎么解释、怎么归类、怎么点”,就必须改 +- 前端若直接读取 `render_layer_groups`,通常不需要再手改 layer 白名单 +- 前端若已实现: + - 精确点查 `area + primary + info` + - 小范围补查 `primary + info` + 则能明显减少“看起来像渔网,却返回附近灯标”的误判 + +## 15. 当前不建议做的事 + +当前前端不建议: + +- 直接查询所有 style 层 +- 让 flare / arc / outline 抢 primary +- 点空白水域直接返回 null +- 再造一套独立 query API 替代当前统一对象载荷 +- 在前端代码里硬写大量分支而不保留规则字典 + +## 16. 当前建议的落地顺序 + +建议前端团队按下面顺序实现: + +1. 接入规则字典 JSON +2. 接入仓库内的 TS 解释器,或以它为母版迁入 RN 工程 +3. 先实现: + - 精确点查 pickup + - 主对象层补查 pickup + - 信息层 pickup +4. 再实现: + - 空白水域深度上下文 +5. 最后把 compare 页和 RN 端解释结果做对齐抽查 + +## 17. 与后续 PBF 演进的关系 + +当前方案不要求增加 PBF 容量。 + +后续如果 builder 增补: + +- `object_domain` +- `object_class` +- `object_subclass` + +前端仍可继续使用同一套结构,只需把规则字典从“主判读层”逐步降为“兼容补充层”。 + +## 18. 结论 + +当前最稳的 native pickup 方案是: + +- 继续使用当前 `Karatsu 20nm final` PBF/style +- 使用可见层作为点击入口 +- 使用 `feature.id` 作为对象主键 +- 使用规则字典和解释器做本地判读 +- 对空白水域返回深度上下文 + +这样既不增加 PBF 容量,也能满足: + +- 用户点图标看细节 +- 用户点水域看水深上下文 +- 后续继续做 CPA / 安全判断 + +## 19. 参考 + +- MapLibre React Native `MapView` 官方文档: + - `queryRenderedFeaturesAtPoint` + - `queryRenderedFeaturesInRect` + - https://maplibre.org/maplibre-react-native/docs/components/general/map-view/ diff --git a/NavSea_coast_wall_z12_bin_生成说明.md b/NavSea_coast_wall_z12_bin_生成说明.md new file mode 100644 index 0000000..5e42180 --- /dev/null +++ b/NavSea_coast_wall_z12_bin_生成说明.md @@ -0,0 +1,206 @@ +# NavSea coast_wall_z12.bin 生成说明 + +本文说明如何从当前 MySQL 三层格子生成 `coast_wall_z12.bin`。 + +生成脚本: + +- [`coastline/build_coast_wall_z12_bin.py`](/root/sourceserver/pbf/coastline/build_coast_wall_z12_bin.py) + +当前输入数据库: + +- `navsea_japan_coast_grid` + +当前输入表: + +- `navsea_grid_cell` + +## 1. 设计口径 + +这个 bin 文件不是重新从原始海岸线矢量或 PBF 几何开始栅格化。 + +当前口径是: + +1. 先使用数据库里已经生成好的三层格子 +2. 再按 `density_overview_grid` 的密度优先级融合 +3. 最后编码成 z12 / 40x40 的 blocked wall 二进制文件 + +三层输入: + +- `fish_port_20m` +- `hazard_50m` +- `coast_200m` + +融合规则: + +- `20x20` 永远保留 +- `50x50` 如果和已保留的 `20x20` 重叠,则跳过 +- `200x200` 如果和已保留的 `20x20` 或已保留的 `50x50` 重叠,则跳过 + +这和 `density_overview_grid.geojson` 的规则一致:同一区域优先使用更高密度格子,避免重复表达同一片阻断区域。 + +## 2. bin 格式 + +输出 bin 用于快速查询: + +```text +isBlocked(lon, lat) -> bool +``` + +空间划分: + +- zoom:`z12` +- 每个 z12 tile 切成 `40 x 40` +- 每个 tile 最多 `1600` 个 cell + +tile 内编码: + +- blocked cell 数量 `<= 96`:使用 sparse `uint16[]` +- blocked cell 数量 `> 96`:使用 bitset `uint32[50]` + +文件结构: + +- Header +- BlockDirectory +- TileDirectory +- DataBlob + +这个结构的目的主要是节约物理存储空间,同时让运行时可以按 block / tile 做快速查询。 + +## 3. 九州测试生成 + +推荐先生成九州范围样例: + +```bash +cd /root/sourceserver/pbf +./.venv/bin/python coastline/build_coast_wall_z12_bin.py \ + --preset kyushu \ + --out out/navmask/coast_wall_z12_kyushu.bin \ + --debug-geojson out/navmask/coast_wall_z12_kyushu.debug.geojson \ + --debug-limit 2000 +``` + +输出文件: + +- `out/navmask/coast_wall_z12_kyushu.bin` +- `out/navmask/coast_wall_z12_kyushu.bin.meta.json` +- `out/navmask/coast_wall_z12_kyushu.debug.geojson` + +当前九州样例统计: + +```text +tiles=813 +cells=148453 +sparse=351 +bitset=462 +blocks=7 +size=122625 bytes +``` + +## 4. 小范围 smoke test + +可以用福冈附近小范围做快速验证: + +```bash +cd /root/sourceserver/pbf +./.venv/bin/python coastline/build_coast_wall_z12_bin.py \ + --self-test \ + --bbox 130,33,131,34.5 \ + --out out/navmask/coast_wall_z12_fukuoka_smoke.bin \ + --query 130.4,33.6 \ + --progress-every 0 +``` + +这个命令会: + +- 跑内置编码自测 +- 生成小范围 bin +- 用内置 reader 查询 `130.4,33.6` + +当前验证结果: + +```text +query lon=130.4 lat=33.6 blocked=True +``` + +## 5. 全国生成 + +全国生成命令: + +```bash +cd /root/sourceserver/pbf +./.venv/bin/python coastline/build_coast_wall_z12_bin.py \ + --preset all \ + --out out/navmask/coast_wall_z12.bin +``` + +如果需要 debug GeoJSON,可以追加: + +```bash + --debug-geojson out/navmask/coast_wall_z12.debug.geojson \ + --debug-limit 5000 +``` + +全国生成会扫描完整三层数据库,耗时和内存都会高于九州样例。 + +## 6. 参数说明 + +常用参数: + +- `--preset kyushu`:生成九州范围样例,默认值 +- `--preset all`:生成全国范围 +- `--bbox min_lon,min_lat,max_lon,max_lat`:自定义经纬度范围,优先于 `--preset` +- `--out PATH`:输出 bin 路径 +- `--meta-json PATH`:输出 meta JSON;不指定时默认写到 `.meta.json` +- `--debug-geojson PATH`:输出抽样 blocked cell GeoJSON +- `--debug-limit N`:debug GeoJSON 最多输出多少个 cell +- `--query lon,lat`:生成后用内置 reader 查询一个点 +- `--self-test`:执行基础编码自测 +- `--progress-every N`:每读取 N 行打印一次进度,设为 `0` 可关闭 + +查看帮助: + +```bash +cd /root/sourceserver/pbf +./.venv/bin/python coastline/build_coast_wall_z12_bin.py --help +``` + +## 7. 输出 meta + +生成器会写出 meta JSON,包含: + +- 生成时间 +- 数据库名 +- bbox / preset +- z12 cell 大小 +- density 融合规则 +- 三层源数据行数 +- 三层去重后数量 +- 三层保留 / 跳过统计 +- bin 文件大小 +- block / tile / sparse / bitset 统计 +- 可选 query 查询结果 + +示例: + +- `out/navmask/coast_wall_z12_kyushu.bin.meta.json` + +## 8. 当前验证项 + +脚本内已包含: + +- `tileId` pack / unpack +- `cellId` pack +- `blockId` pack +- sparse encode +- bitset encode +- writer / reader 抽样 roundtrip +- `is_blocked_lonlat()` 查询 + +已验证命令: + +```bash +cd /root/sourceserver/pbf +./.venv/bin/python -m py_compile coastline/build_coast_wall_z12_bin.py +./.venv/bin/python coastline/build_coast_wall_z12_bin.py --help +./.venv/bin/python coastline/build_coast_wall_z12_bin.py --self-test --bbox 130,33,131,34.5 --out out/navmask/coast_wall_z12_fukuoka_smoke.bin --query 130.4,33.6 --progress-every 0 +``` diff --git a/NavSea_全国三层数据生成与查看说明.md b/NavSea_全国三层数据生成与查看说明.md index e595fbe..02e72b8 100644 --- a/NavSea_全国三层数据生成与查看说明.md +++ b/NavSea_全国三层数据生成与查看说明.md @@ -6,6 +6,20 @@ - `navsea_japan_coast_grid` +当前 v2 目录: + +- `coastline/navgrid_v2/` + +当前 v2 验证页: + +- `src/pbf/navsea-coastline-fukuoka-saga-200m-v2.html` +- `src/pbf/navsea-fish-port-debug-v2.html` +- `src/pbf/navsea-fish-port-prc50-test-v2.html` + +v2 独立说明: + +- [`coastline/navgrid_v2/NavSea_v2_使用说明.md`](/root/sourceserver/pbf/coastline/navgrid_v2/NavSea_v2_使用说明.md) + 当前全国三层: - `coast_200m`:全国海岸 200x200 @@ -28,7 +42,7 @@ 这样可以先把底盘准备好,再做上层数据。 -## 2. 200x200 全国海岸重算 +## 2. 全国海岸线格子重算 脚本: @@ -40,13 +54,61 @@ - 图层:`coast_200m` - 导出目录:`out/coastline/japan_coast_grid_mysql` -执行命令: +默认执行命令: ```bash cd /root/sourceserver/pbf ./.venv/bin/python coastline/build_japan_coast_grid_mysql.py ``` +说明: + +- 这个脚本现在支持任意格子大小 +- 默认 `--cell-size-m 200`,自动写入 `coast_200m` +- 指定其它尺寸时,默认自动按尺寸生成不同 `layer_name` +- 脚本只清理当前目标 `layer_name`,不会清空 `navsea_grid_cell`,也不会覆盖其它尺寸或其它业务层 +- 当前每个尺寸独立成层,例如: + - `coast_200m` + - `coast_50m` + - `coast_100m` + +如果要生成 `50x50` 全国海岸线格子: + +```bash +cd /root/sourceserver/pbf +./.venv/bin/python coastline/build_japan_coast_grid_mysql.py \ + --cell-size-m 50 \ + --out-dir out/coastline/japan_coast_50m_mysql +``` + +如果你想手动指定图层名: + +```bash +cd /root/sourceserver/pbf +./.venv/bin/python coastline/build_japan_coast_grid_mysql.py \ + --cell-size-m 50 \ + --layer-name coast_50m \ + --out-dir out/coastline/japan_coast_50m_mysql +``` + +如果全国 `50x50` 海岸线格子已经跑完前面的包,中途卡在某个包之后,可以用续跑模式从指定包继续。例如已经完成 `C23-06_12`,要从 `C23-06_13` 继续: + +```bash +cd /root/sourceserver/pbf +./.venv/bin/python coastline/build_japan_coast_grid_mysql.py \ + --cell-size-m 50 \ + --layer-name coast_50m \ + --out-dir out/coastline/japan_coast_50m_mysql \ + --resume \ + --start-code 13 +``` + +说明: + +- `--resume` 会保留当前 `layer_name` 里已经写入的格子,不会清空 `coast_50m` +- `--start-code 13` 等价于 `--start-code C23-06_13` +- 如果不用 `--resume`,脚本仍按完整重建处理,会先清理当前目标 `layer_name` + ## 3. 20x20 全国渔港重算 脚本: @@ -88,11 +150,16 @@ cd /root/sourceserver/pbf 说明: - `PRC` 需要按两位字符串理解,`2` 和 `02` 等价 +- `--prc` 模式会先把该 PRC 下的线要素按 `FPC` 分组,再逐港套用同一套 20m 切格逻辑 - `FPC` 是单个渔港的港码,脚本会先反查它所属的 `PRC`,再只重算这个港口 +- 落库时 `fish_port_20m` 现在按 `layer_name + source_name + cell_id` 做唯一键,避免不同港口的同名格子互相覆盖;全国导出会再按 `cell_id` 去重后写 GeoJSON - 单港口模式会在日志里同时输出: - 命中的 `200x200` 粗格数量 - 最终写入的 `20x20` 格子数量 -- 默认先按渔港 bbox 找同区域 `coast_200m` 粗格,再把粗格切成 `20x20` +- 默认先按渔港 bbox 找同区域 `coast_200m` 粗格,再把每个粗格完整切成 `20x20` +- 这里不会再把 `coast_200m` 窗口和 `fish_part` 二次相交裁掉;`fish_part` 只负责帮我们筛出该港应命中的粗格,真正落格时以完整粗格为底盘 +- 海岸缓冲默认是 `5m`,也可以通过 `--coast-buffer-m` 调大或调小 +- `20x20` 层只保留与海岸线缓冲带相交的 `COASTLINE` 格子,不保存纯海面格子,也不保存纯陆地格子 - 默认不会再允许无边界整片扫描 - 如果确实要回退旧行为,需要手动加脚本里提供的相应开关 @@ -122,6 +189,13 @@ cd /root/sourceserver/pbf ./.venv/bin/python find_fpc_by_port_name.py 無垢島 --exact ``` +如果你想更宽松一点,脚本会先去掉 `漁港`、`港` 等后缀再比对: + +```bash +cd /root/sourceserver/pbf +./.venv/bin/python find_fpc_by_port_name.py 福吉漁港 --fuzzy +``` + 如果你想要 JSON 结果: ```bash @@ -153,6 +227,82 @@ cd /root/sourceserver/pbf - 辅助名称 - 源记录 id - 如果原始包里没有这条名字,脚本会提示你改用 `--catalog` + +## 4.1 PRC=50 单港测试页 + +如果你要单独确认 `PRC=50` 的 `20x20` 是否正确,可以直接看这个测试页: + +- `http://192.168.200.184/newpec/navsea-fish-port-prc50-test.html` + +这个页面只做一件事: + +- 读取 PRC=50 专用导出 `fish_port_20m_prc50_grid.geojson` +- 只显示 `COASTLINE` 海岸线格子 +- 把这些格子单独画出来 + +如果你想只导出 PRC=50 的小数据集,可以先跑这个脚本: + +```bash +cd /root/sourceserver/pbf +./.venv/bin/python coastline/export_prc20_test_assets.py --prc 50 +``` + +默认输出目录: + +- `src/pbf/coastline-mysql/prc50_test/` + +输出文件: + +- `fish_port_20m_prc50_grid.geojson` +- `manifest.json` + +用途: + +- 只盯一个港,不受全国其它港干扰 +- 快速确认这次 `20x20` 重算是否把 PRC=50 的格子切对了 +- 专用导出只保留 `COASTLINE` + +## 4.2 单港 20m 调试页 + +如果你要把“渔港 bbox、海岸线、buffer、200m 底盘、20m 结果”放在一张图里看,可以用这个调试页: + +- `http://192.168.200.184/newpec/navsea-fish-port-debug.html` + +这个页面会读取单港调试包: + +- `./coastline-mysql/fish_port_debug/fpc_/buffer_/manifest.json` +- `./coastline-mysql/fish_port_debug/fpc_/buffer_/debug.geojson` + +推荐先针对波津漁港测试: + +```bash +cd /root/sourceserver/pbf +./.venv/bin/python coastline/export_fish_port_debug_assets.py \ + --fpc 4320050 \ + --coast-buffer-m 20 +``` + +默认输出目录: + +- `src/pbf/coastline-mysql/fish_port_debug/fpc_4320050/buffer_20/` + +同步到网页目录时: + +```bash +cp -r src/pbf/coastline-mysql/fish_port_debug /mnt/sda1/www/newpec/coastline-mysql/ +cp src/pbf/navsea-fish-port-debug.html /mnt/sda1/www/newpec/navsea-fish-port-debug.html +``` + +调试页里会分开画: + +- 渔港 bbox +- 海岸线 +- 海岸 buffer +- 200m 底盘 +- 实际扫描窗 +- 20m 海岸格 +- 20m 海面格 + ## 5. 50x50 全国障碍重算 脚本: @@ -201,6 +351,24 @@ cd /root/sourceserver/pbf --out-dir src/pbf/coastline-mysql/japan_national ``` +只导出20渔港到可测试的html里。 + ./.venv/bin/python coastline/export_navgrid_mysql_assets.py --db-name navsea_japan_coast_grid --out-dir /home/wwwroot/newpec/coastline-mysql/japan_national/ --no-coast-200m --no-hazard-50m --no-density-overview + + +可选开关: + +- `--no-coast-200m` +- `--no-fish-port-20m` +- `--no-hazard-50m` +- `--no-density-overview` + +说明: + +- 默认四项都导出 +- 如果只想重出其中一层,可以把不需要的层关掉 +- `density_overview` 依赖前三层的数据分布,建议一般保持开启 +- `out-dir` 可以指向仓库内目录,也可以直接指向网页目录;如果指到仓库外,`manifest.json` 里会写绝对路径 + 导出结果包括: - `coast_200m_grid.geojson` @@ -269,7 +437,8 @@ cd /root/sourceserver/pbf 如果你重新生成了静态资产,想让线上页面立即看到新内容,通常需要把生成结果同步到网页目录: ```bash -cp -r src/pbf/coastline-mysql/japan_national /mnt/sda1/www/newpec/ +cp -r src/pbf/coastline-mysql/japan_coast_200m /mnt/sda1/www/newpec/coastline-mysql/ +cp -r src/pbf/coastline-mysql/japan_national /mnt/sda1/www/newpec/coastline-mysql/ cp src/pbf/navsea-coastline-fukuoka-saga-200m.html /mnt/sda1/www/newpec/navsea-coastline-fukuoka-saga-200m.html ``` diff --git a/NavSea_海底地形解读_钓鱼参考.md b/NavSea_海底地形解读_钓鱼参考.md new file mode 100644 index 0000000..b303780 --- /dev/null +++ b/NavSea_海底地形解读_钓鱼参考.md @@ -0,0 +1,439 @@ +# NavSea 海底地形解读与钓鱼参考 + +最后更新:`2026-04-11` +项目根:`/root/sourceserver/pbf` + +## 1. 文档目的 + +本文把当前 `NavSea PBF` 里与海底情况相关的图层、字段和可推断信息整理成一份面向业务的中文说明。 + +目标是回答 4 件事: + +1. 当前 PBF 里,哪些层真的和海底形态有关 +2. 这些层分别表达什么 +3. 是否能看出“槽、脊、坎、坑、突起”等海底形态 +4. 这些信息对钓鱼有什么实际帮助 + +## 2. 最重要的结论 + +先直接收口: + +- 当前 `NavSea PBF` **没有一个现成字段直接告诉你“这里是槽”“这里是脊”** +- 但它已经提供了足够的海底相关表达,可以让我们**基于等深线和辅助线去推断海底形态** +- 对钓鱼最有价值的,不是单独某个字段,而是: + - `depth_contour` + - `depth_contour_overview` + - `bathymetry_line` + - `seabed_text_point` + 这几类信息组合后的判断 + +一句话说: + +**当前 PBF 已经可以帮助识别海底形态,但主要是“判读型能力”,还不是“对象已明确定义为槽/脊/坎”的能力。** + +## 3. 当前最相关的海底图层 + +### 3.1 `depth_contour` + +- 含义: + - 普通等深线 +- 当前作用: + - 判断海底起伏最核心的线层 +- 常见字段: + - `least_depth_m` + - `chart_label_text` +- 对钓鱼价值: + - 最适合看: + - 坡折 + - 坎 + - 小沟 + - 浅深交界 + +### 3.2 `depth_contour_overview` + +- 含义: + - 概略等深线 +- 当前作用: + - 适合看大尺度地形轮廓 +- 常见字段: + - `least_depth_m` +- 对钓鱼价值: + - 更适合看: + - 大坡面 + - 脊状隆起 + - 主槽走向 + +### 3.3 `bathymetry_line` + +- 含义: + - 海底地形支撑线 +- 当前项目口径: + - 它现在更像 `support` + - 不是正式业务主对象 +- 对钓鱼价值: + - 可以当作海底变化的辅助参考 + - 但不要单独把它直接解释成: + - 海沟 + - 山脊 + - 坎线 + +### 3.4 `seabed_text_point` + +- 含义: + - 底质标注点 +- 常见内容: + - 泥 + - 砂 + - 岩 + - 混合底质 +- 对钓鱼价值: + - 很重要 + - 因为很多鱼不是只看深度,也会明显依赖: + - 岩底 + - 砂泥交界 + - 底质变化带 + +### 3.5 `hole_area` + +- 含义: + - 当前更偏透明挖空/支撑区域 +- 当前口径: + - 不建议直接解释成真实“海底坑” +- 说明: + - 名字容易误导 + - 现阶段不应拿它直接给钓鱼业务做坑位判断 + +### 3.6 当前 PBF 可直接消费的相关字段 + +如果只站在当前 `Karatsu 20nm final PBF` 的实际消费角度,和海底判读最相关的字段主要是下面这些: + +- `depth_contour` + - `least_depth_m` + - `depth_value_m` + - `chart_label_text` + - `class_code` + - `canonical_object_type` +- `depth_contour_overview` + - `least_depth_m` + - `depth_value_m` + - `chart_label_text` + - `class_code` + - `canonical_object_type` +- `seabed_text_point` + - `chart_label_text` + - `canonical_object_type` + - `class_code` +- `submerged_reef_area` + - `least_depth_m` + - `canonical_object_type` + - `class_code` +- `fixed_fishing_gear_area` + - `canonical_object_type` + - `name_ja` + - `class_code` +- `bathymetry_line` + - `canonical_object_type` + - `class_code` +- `seabed_line` + - `canonical_object_type` + - `class_code` + +实际理解时可以这样看: + +- `least_depth_m / depth_value_m` + - 提供深度值或等深线对应深度 +- `chart_label_text` + - 提供图面上真正显示出来的文字 +- `canonical_object_type` + - 提供当前 NavSea 体系下的对象细类 +- `class_code` + - 提供与原体系对回时仍然有价值的原生细分类码 + +也就是说,当前做海底判读时,真正应该优先依赖的是: + +- 深度值 +- 图面标签 +- 等深线形状 +- 礁体/渔具/底质等周边对象 + +而不是只盯住某一个“神奇分类字段”。 + +### 3.7 一个容易误解的点:`seabed_line` 不等于“只有海底电缆” + +当前 style 里有一个叫 `subsea-cables` 的渲染层,但它消费的是: + +- `source-layer = seabed_line` + +这不表示 `seabed_line` 里的所有对象都严格等于“海底电缆”。 + +当前 builder 的实际口径是: + +- 原始 `L海底線` 会统一归到 `seabed_line` +- 渲染上暂时复用 `subsea_cable` 这一类线样式 +- 其中确实可能包含: + - 海底电信电话线 + - 海底电力线 + - 以及其他仍被归在海底线表达里的对象 + +所以对业务解释来说,当前更稳妥的说法应是: + +- `seabed_line = 海底线表达` + +而不是直接说: + +- `seabed_line = 海底电缆` + +## 4. 现在能看出哪些海底形态 + +下面这些不是当前 PBF 已经明确定义好的“对象类名”,而是**可以通过当前图面去推断的形态**。 + +### 4.1 槽 / 沟 / 下切带 + +典型图面特征: + +- 等深线向深水方向形成狭长下切 +- 线形像: + - `V` + - 狭长带 + - 手指状深入 +- 两边线密,中间向更深处延伸 + +可推断含义: + +- 水流容易集中 +- 饵料可能沿槽边或槽底移动 +- 槽边往往比槽底更值得重点看 + +对钓鱼的价值: + +- 找鱼道 +- 找回游边缘 +- 找流线集中位置 + +### 4.2 脊 / 隆起 / 海底包 + +典型图面特征: + +- 较浅值被较深值包围 +- 线形围出高起区 +- 如果形状细长,更像“脊” +- 如果接近圆形,更像“包”或“小山” + +可推断含义: + +- 是典型的结构位 +- 容易形成: + - 流切 + - 藏鱼边 + - 掠食等待位 + +对钓鱼的价值: + +- 很高 +- 尤其是: + - 孤立小包 + - 包边 + - 脊顶与脊侧 + +### 4.3 坎 / 坡折 / 落差边 + +典型图面特征: + +- 等深线间距突然变密 +- 从平缓区一下进入陡坡 +- 同一片区域线距变化明显 + +可推断含义: + +- 海底坡度在这里突然变陡 +- 是典型的“边界结构” + +对钓鱼的价值: + +- 非常高 +- 常见有效点位: + - 坎顶 + - 坎脚 + - 坎线拐点 + +### 4.4 凹坑 / 小坑 / 洼地 + +典型图面特征: + +- 闭合线往更深方向收敛 +- 或局部深值嵌在周围较浅区域内部 + +可推断含义: + +- 可能形成局部积流、积沙、积饵 +- 小坑边缘通常比坑中心更值得看 + +### 4.5 突起 / 小台 / 局部高点 + +典型图面特征: + +- 闭合线往更浅方向收敛 +- 周围较深,局部突然浅起来 + +可推断含义: + +- 是非常典型的鱼站位 +- 尤其是高点边缘和迎流面 + +### 4.6 浅滩边缘 + +典型图面特征: + +- 一圈较浅区外面包着更深等深线 +- 外缘一带线距明显变化 + +可推断含义: + +- 浅滩本体不一定最好 +- 但浅滩边缘、出入通道、尖角、缺口都很关键 + +## 5. 当前不能直接下结论的部分 + +下面这些目前不能直接靠一个字段稳定下结论: + +- “这里就是海沟” +- “这里就是海底脊” +- “这里就是坡折点” +- “这里就是坑” + +原因不是数据完全没用,而是: + +- 当前 PBF 还没有把这些形态正式物化成独立对象 +- 现在更多还是: + - 图面表达 + - 人工或算法判读 + +所以当前正确说法应是: + +- `可推断` +- `高度怀疑` +- `疑似坡折/疑似槽边` + +而不是: + +- `系统已确认` + +## 6. 对钓鱼最有用的实战看法 + +如果站在钓鱼使用角度,我建议优先看下面 6 种位置: + +### 6.1 坡折线 + +- 最值得优先关注 +- 因为: + - 结构明确 + - 流态变化明显 + - 藏鱼概率高 + +### 6.2 浅深交界 + +- 例如: + - `5m -> 8m` + - `8m -> 12m` +- 常常比纯平底更有价值 + +### 6.3 孤立小包或小隆起 + +- 是典型的“单点结构” +- 很适合做重点打点 + +### 6.4 小槽边缘 + +- 槽底未必最好 +- 槽边和槽口往往更有效 + +### 6.5 礁体边缘 + +- 如果图上存在: + - 鱼礁 + - 潜提 + - 礁状危险物 +- 那通常比纯深度变化更值得重视 + +### 6.6 底质变化带 + +- 岩到砂 +- 砂到泥 +- 礁边到沙底 + +这类地方对很多鱼种都很关键。 + +## 7. 当前 PBF 里哪些内容最值得结合看 + +如果你是做钓鱼相关分析,建议把下面这些一起看,而不是只看一个层: + +- `depth_contour` +- `depth_contour_overview` +- `bathymetry_line` +- `seabed_text_point` +- `navigation_hazard_point` +- `anchor_caution_hazard_point` +- `submerged_reef_area` +- `fixed_fishing_gear_area` + +原因: + +- 海底形态只是一个维度 +- 真正有用的位置通常是: + - 地形变化 + - 障碍物/礁体 + - 底质 + - 可作钓/不可作钓约束 + 这几个维度叠起来 + +## 8. 面向后续产品化的建议 + +如果后面要把这件事做成更稳定的功能,我建议分 3 步。 + +### 第一步:做 `depth context` + +在空白水域点击时,返回: + +- 最近深度值 +- 最近等深线 +- 最近概略等深线 + +这是当前最容易落地的。 + +### 第二步:做 `terrain hint` + +基于等深线密度和形状,给出轻量提示: + +- 疑似坡折 +- 疑似小槽 +- 疑似高起 +- 疑似浅滩边缘 + +这一步最适合先做规则版,不用一开始就做复杂算法。 + +### 第三步:做 `fishing structure score` + +把下面这些因素叠加评分: + +- 深度变化 +- 坡折强度 +- 附近礁体/障碍物 +- 底质变化 +- 区域约束 + +这一步才适合真正做“钓点辅助”。 + +## 9. 当前一句话总结 + +当前 `NavSea PBF` 已经能支持你识别很多对钓鱼有价值的海底结构, +但方式不是“直接读出槽、脊、坎对象”,而是**基于等深线、海底地形辅助线、底质和礁体信息去综合判读**。 + +如果后面继续做,我建议优先产品化的是: + +- 空白水域返回深度上下文 +- 再往上叠: + - 坡折 + - 小槽 + - 隆起 + - 礁边 + 这几类结构提示 diff --git a/NavSea_物体统一判定_点击查询_审计设计.md b/NavSea_物体统一判定_点击查询_审计设计.md new file mode 100644 index 0000000..cd42aab --- /dev/null +++ b/NavSea_物体统一判定_点击查询_审计设计.md @@ -0,0 +1,1646 @@ +# NavSea 物体统一判定、点击查询与审计设计 + +最后更新:`2026-04-09` +项目根:`/root/sourceserver/pbf` + +## 1. 文档目标 + +本文用于把 `NavSea PBF` 项目的物体模型正式收口为一套可实现、可审计、可交付的设计。 + +当前项目的核心目标有三项: + +1. 点击海图物体时,能够稳定回答“这是什么”,并返回桥高、水深、灯光、净空、名称等关键细节。 +2. 能与 `NewPEC` 原体系稳定对应,并通过审计确认“对象没有丢、没有错归、没有错误合并”。 +3. 能渲染出与 `NewPEC` 等价的图标、文字、线型、面样式和安全语义。 + +本文把这三项目标统一到一套模型里,并明确: + +- 哪些字段服务于点击查询 +- 哪些字段服务于对象对回与审计 +- 哪些字段服务于样式渲染 +- 审计应该如何分层,哪些门禁是硬门禁 + +## 2. 设计结论 + +最重要的结论只有一条: + +- 不应再试图用单一字段同时承担“身份锚点”“本体分类”“渲染控制”三种职责。 + +正确做法是把一个 `feature` 拆成 3 个主维度: + +1. `identity / trace` +2. `object semantics` +3. `render semantics` + +其中: + +- `identity / trace` 用于和 `NewPEC` 对回、做对象保真审计 +- `object semantics` 用于点击查询、业务解释、CPA 相关判断 +- `render semantics` 用于让最终渲染表现与 `NewPEC` 等价 + +`canonical_object_type` 可以保留并继续使用,但它应被定位为: + +- `NavSea` 统一语义子类名 + +而不是: + +- 唯一身份键 +- 唯一审计锚点 +- 唯一渲染控制字段 + +## 3. 现有问题 + +当前项目里,一个 `feature` 的字段来源混杂了多个维度: + +- `fid`、`source_layer` 这类追踪字段 +- `class_code`、`display_code` 这类 `NewPEC` 原生分类码 +- `canonical_object_type` 这类统一语义名 +- `chart_icon_image`、`chart_symbol_code` 这类渲染结果字段 +- `depth_value_m`、`clearance_height_m`、`light_color_code` 这类业务属性字段 + +如果不先分层,就会出现三个问题: + +1. 点击后不知道“应该信哪个字段来判定物体是什么”。 +2. 审计时容易把“画出来了”误当成“对象还在”。 +3. 渲染字段容易反过来污染本体分类,导致“画成什么”与“它是什么”混淆。 + +## 4. 总体设计原则 + +### 4.1 物体本体优先于渲染结果 + +- 一个对象是什么,必须优先由对象语义决定 +- 不能用 `chart_icon_image`、`chart_fill_style` 等渲染字段反推本体 + +### 4.2 对象审计优先于视觉相似 + +正式顺序必须保持为: + +1. 对象保真审计 +2. 渲染一致性审计 +3. AOI / 视觉审计 + +如果对象已经丢失、错归或被错误合并,则视觉相似不能判定为通过。 + +### 4.3 原生码值保留,但不再让它们直接统治上层业务 + +- `class_code`、`display_code` 必须保留 +- 但上层点击查询、业务接口、CPA 判断不应直接依赖 `NewPEC` 原始码值 +- 应把这些码值映射进 `NavSea` 自有对象分类体系 + +### 4.4 交付版不能只顾渲染,还必须可查询 + +最终交付版 `PBF` 不能只保留“刚好够 style 用”的字段。 + +至少对以下查询能力,必须保留足够字段: + +- 点击知道对象是什么 +- 点击读取桥高 / 水深 / 净空 / 灯光属性 +- 点击读取危险物或航标的细类信息 +- 为 CPA / 安全判断提供必要业务属性 + +## 5. 统一物体模型 + +### 5.1 三层主模型 + +建议每个 `feature` 的逻辑模型固定为下面三层。 + +#### A. identity / trace + +回答: + +- 这是哪个原始对象 +- 它来自哪个 `NewPEC` layer +- 它能否稳定对回原始对象 + +建议字段: + +- `fid` +- `source_layer_native` +- `source_layer_std` +- `geometry_type` +- `feature_id` +- `native_code_type` +- `native_code_value` + +其中: + +- `fid` 是第一锚点 +- `source_layer_native + geometry_type` 是第二锚点 +- `native_code_type + native_code_value` 是第三锚点 + +#### B. object semantics + +回答: + +- 这个物体本体是什么 +- 它属于哪个业务域、哪一类、哪一个子类 +- 它有哪些业务属性 + +建议字段: + +- `object_domain` +- `object_class` +- `object_subclass` +- `canonical_object_type` +- `object_display_name` +- `object_properties` + +其中: + +- `canonical_object_type` 建议保留并作为 `object_subclass` 的稳定值 +- `object_display_name` 用于 UI 展示 +- `object_properties` 用于承载查询和业务细节 + +#### C. render semantics + +回答: + +- 这个物体应该如何渲染 +- 应该命中什么 icon、text、fill、line + +建议字段: + +- `chart_icon_image` +- `chart_symbol_code` +- `chart_label_text` +- `chart_label_subtext` +- `chart_fill_style` +- `chart_fill_pattern` +- `chart_line_color` +- `chart_line_width` +- `chart_text_style` +- `chart_text_color` + +### 5.2 NavSea 自有分类体系 + +建议正式建立一套 `NavSea` 自有分类体系,不再让上层业务直接依赖旧码值。 + +建议结构: + +- `object_domain` + - 业务大域 +- `object_class` + - 业务大类 +- `object_subclass` + - 业务细类 +- `native_code_type` + - 原生码种类 +- `native_code_value` + - 原生码值 + +建议示例: + +- `object_domain = navigation_mark` +- `object_class = buoy` +- `object_subclass = pillar_buoy` +- `native_code_type = display_code` +- `native_code_value = 31300003` + +再例如: + +- `object_domain = hazard` +- `object_class = wreck` +- `object_subclass = dangerous_fully_submerged_wreck` +- `native_code_type = class_code` +- `native_code_value = 404` + +### 5.3 object_domain 建议集合 + +建议首批固定为: + +- `navigation_mark` +- `hazard` +- `facility` +- `boundary` +- `depth` +- `clearance` +- `toponym` +- `seabed` +- `route` +- `area_usage` +- `landform` +- `support` +- `unclassified` + +### 5.4 object_class / object_subclass 的职责 + +- `object_class` 用于稳定业务分组和 API 过滤 +- `object_subclass` 用于更细粒度判定和 UI 展示 + +例如: + +- `object_domain = navigation_mark` +- `object_class = lighthouse` +- `object_subclass = breakwater_lighthouse` + +或者: + +- `object_domain = hazard` +- `object_class = rock` +- `object_subclass = awash_rock` + +### 5.5 原生码与自有体系并存 + +新的 `NavSea` 体系不是要删除 `NewPEC` 码值,而是要把原生码值纳入可映射、可审计的结构中。 + +因此应保留: + +- `native_code_type` +- `native_code_value` +- `source_layer_native` + +并新增: + +- `object_domain` +- `object_class` +- `object_subclass` + +这样: + +- 审计仍能稳定回到 `NewPEC` +- 业务和 UI 则可以直接消费 `NavSea` 自有语义体系 + +## 6. 字段设计建议 + +### 6.1 必保留的身份与审计字段 + +无论工程版还是交付版,建议至少保留: + +- `fid` +- `source_layer_native` +- `source_layer_std` +- `geometry_type` +- `native_code_type` +- `native_code_value` +- `canonical_object_type` + +说明: + +- 如果交付版完全移除这些字段,将直接削弱点击查询能力和对象审计能力 +- 当前项目如果要长期支持“点击解释 + CPA + 安全判断”,这些字段不能被视为纯工程期字段 + +### 6.2 必保留的业务查询字段 + +建议按对象类型保留以下关键字段: + +- `depth_value_m` +- `least_depth_m` +- `clearance_height_m` +- `light_color_code` +- `light_sector_mode` +- `bearing_deg` +- `name_ja` +- `place_name_en` +- `shape_class_code` + +必要时还应扩展: + +- 灯质 +- 周期 +- 射程 +- 桥名 +- 净空类别 +- 航标附注 + +### 6.3 必保留的渲染字段 + +建议保留: + +- `chart_icon_image` +- `chart_symbol_code` +- `chart_label_text` +- `chart_label_subtext` +- `chart_fill_style` +- `chart_fill_pattern` +- `chart_line_color` +- `chart_line_width` +- `chart_text_style` +- `chart_text_color` + +### 6.4 建议新增的统一字段 + +为降低上层复杂度,建议新增: + +- `object_domain` +- `object_class` +- `object_subclass` +- `object_display_name` +- `source_layer_native` +- `native_code_type` +- `native_code_value` + +其中: + +- `source_layer_native` 可直接承接现有 `source_layer` +- `object_subclass` 可直接复用 `canonical_object_type` + +## 7. NewPEC 到 NavSea 的映射设计 + +### 7.1 映射目标 + +映射的目标不是简单改名字,而是建立一套完整、可回查、可审计的自我体系。 + +映射应回答: + +1. 一个 `NewPEC` feature 属于哪个 `NavSea object_domain` +2. 它属于哪个 `object_class` +3. 它属于哪个 `object_subclass` +4. 映射依据是什么 +5. 是否仍能回到原始 `class_code / display_code` + +### 7.2 建议映射键 + +建议映射规则至少按以下组合匹配: + +- `source_layer_native` +- `geometry_type` +- `native_code_type` +- `native_code_value` +- 必要时加 `canonical_object_type` + +说明: + +- 航标类通常以 `display_code` 为主 +- 危险物 / 设施类通常以 `class_code` 为主 +- 地名、深度、净空类则常常以 `source_layer + 业务字段` 判定 + +### 7.3 建议规则表 + +建议新增一张正式映射表,例如: + +- `navsea_object_taxonomy_rules` + +建议字段: + +- `taxonomy_rule_id` +- `bundle_id` +- `source_layer_native` +- `geometry_type` +- `native_code_type` +- `native_code_value` +- `canonical_object_type_in` +- `object_domain` +- `object_class` +- `object_subclass` +- `object_display_name` +- `rule_priority` +- `rule_reason` +- `status` + +### 7.4 规则来源要求 + +每条映射规则都应有明确来源,来源可以是: + +- 原始 `NewPEC` 码值定义 +- 既有 style / sprite 行为 +- 现有数据库映射规则 +- 既有审计结论 +- 专家确认 + +禁止出现: + +- 无来源、不可解释的“拍脑袋分类” + +## 8. 点击查询模型 + +### 8.1 点击查询的目标 + +点击查询返回结果不应只告诉用户“命中了哪个 style layer”,而应返回: + +1. 命中了哪个真实海图对象 +2. 这个对象是什么 +3. 它有哪些业务细节 +4. 当前它如何被渲染 + +### 8.2 推荐返回结构 + +建议 `native MapLibre` 点击拾取最终返回如下结构: + +```json +{ + "identity": { + "fid": "13025299", + "source_layer_native": "p航行危険障害物", + "source_layer_std": "navigation_hazard_point", + "geometry_type": "Point", + "native_code_type": "class_code", + "native_code_value": "404" + }, + "object": { + "object_domain": "hazard", + "object_class": "wreck", + "object_subclass": "dangerous_fully_submerged_wreck", + "canonical_object_type": "dangerous_fully_submerged_wreck", + "object_display_name": "危险全沉没船" + }, + "properties": { + "least_depth_m": 7.2, + "light_color_code": null, + "clearance_height_m": null, + "name_ja": null + }, + "render": { + "chart_icon_image": "symbol-daytime-404", + "chart_symbol_code": "wreck", + "chart_label_text": null + } +} +``` + +### 8.3 点击判定逻辑 + +推荐顺序: + +1. 先取点击范围内所有可见候选 feature +2. 先按 `fid` 聚合 +3. 再按 `source_layer_native + native_code_type + native_code_value + geometry_type` 兜底聚合 +4. 聚合后返回一个“真实物体”而不是多个分裂的 render hit + +### 8.4 点击展示逻辑 + +面板建议固定分为四块: + +- `物体身份` +- `物体分类` +- `物体细节` +- `当前渲染` + +这样可以清楚区分: + +- 它是谁 +- 它是什么 +- 它有哪些航行含义 +- 它在地图上为何画成现在这样 + +## 9. 与 CPA / 安全判断的关系 + +### 9.1 设计原则 + +CPA 或其他安全判断不应直接依赖渲染字段,而应依赖对象语义和业务属性。 + +也就是说: + +- `chart_icon_image` 不能作为安全逻辑输入 +- `object_domain / object_class / object_subclass` 才是主要业务入口 + +### 9.2 对 CPA 重要的对象属性 + +至少应能稳定读取: + +- `least_depth_m` +- `depth_value_m` +- `clearance_height_m` +- `light_color_code` +- `light_sector_mode` +- `bearing_deg` +- `object_domain` +- `object_class` +- `hazard severity` 或等价危险等级字段 + +### 9.3 安全对象建议单独分层 + +建议在 `object_domain` 之上再建立一个轻量级安全标签: + +- `safety_category` + +例如: + +- `navigation_aid` +- `navigation_hazard` +- `depth_constraint` +- `clearance_constraint` +- `facility_reference` + +这样上层业务不必每次都回读复杂 `source_layer` 判定。 + +## 10. 审计设计 + +本文最重要的部分是审计。 + +本设计把审计收口为两条核心硬门禁,外加若干辅助审计。 + +### 10.1 两条核心硬门禁 + +#### A. 物体不丢 + +必须回答: + +- 原始对象是否在 NavSea 输出中仍能找到等价对象 +- 是否发生: + - `missing object` + - `wrong relayer` + - `identifier lost` + - `identifier mismatch` + - `over-merged object` + +这是第一硬门禁。 + +只要这一条不过,后面渲染相似也不能判通过。 + +#### B. 渲染结果一致 + +必须回答: + +- 原始版有 icon/text/line/fill 的对象,在 NavSea 输出中是否仍以等价语义渲染 +- 是否出现: + - icon 丢失 + - 文字丢失 + - 线型/面样式语义画反 + - 危险物 / 航标被画成错误类别 + +这是第二硬门禁。 + +### 10.2 审计总顺序 + +正式顺序固定为: + +1. 对象保真审计 +2. 分类映射审计 +3. 查询字段完整性审计 +4. render-hit 一致性审计 +5. style 语义审计 +6. AOI / 视觉审计 +7. 公开部署一致性审计 + +其中: + +- 第 1 层和第 4 层是两条核心硬门禁 +- 第 2、3、5、6、7 层是配套强制审计 + +## 11. 对象保真审计 + +### 11.1 审计目标 + +确认“对象没有丢”。 + +### 11.2 审计对齐键 + +推荐优先级: + +1. `fid` +2. `source_layer_native + geometry_type + native_code_type + native_code_value` +3. `geometry + 稳定业务字段` + +### 11.3 必查问题 + +- `missing object` +- `wrong relayer` +- `identifier lost` +- `identifier mismatch` +- `native_code lost` +- `semantic collapse` + +其中新增重点: + +- `native_code lost` + - 原始 `class_code / display_code` 无法追回 +- `semantic collapse` + - 多个原始细类被错误压成一个过粗的 NavSea 细类 + +### 11.4 通过条件 + +- 安全关键对象丢失数必须为 `0` +- `wrong relayer` 必须为 `0` +- `identifier lost` 必须为 `0` +- 原始关键码值不可大规模丢失 + +## 12. 分类映射审计 + +### 12.1 审计目标 + +确认从 `NewPEC` 原生码值到 `NavSea` 自有体系的映射是完整、稳定、可解释的。 + +### 12.2 必查问题 + +- 是否存在 `source_layer` 无法映射到任何 `object_domain` +- 是否存在 `class_code / display_code` 无法映射到任何 `object_class` +- 是否存在同一原生码被映射到多个冲突分类 +- 是否存在重要对象被映射到 `unclassified` + +### 12.3 建议输出 + +- `feature_count by object_domain` +- `feature_count by object_class` +- `feature_count by object_subclass` +- `unmapped native_code top list` +- `conflicting mapping rules` + +### 12.4 通过条件 + +- 正式输出对象必须都有: + - `object_domain` + - `object_class` + - `object_subclass` +- 安全关键对象不允许进入: + - `unclassified` + +## 13. 查询字段完整性审计 + +### 13.1 审计目标 + +确认交付版不仅“能画”,还“能点开查到关键细节”。 + +### 13.2 必查对象组 + +至少包括: + +- 桥梁 / 净空限制 +- 深度数字 / 等深线 +- 航标 / 灯标 +- 危险物 / 沉船 / 暗岩 / 洗岩 +- 锚地 / 航路 / 主要设施 + +### 13.3 必查字段 + +按对象组检查: + +- 桥高 / 净空: + - `clearance_height_m` +- 深度: + - `depth_value_m` + - `least_depth_m` +- 灯标: + - `light_color_code` + - `light_sector_mode` +- 危险物: + - `object_class` + - `object_subclass` + - `native_code_value` + +### 13.4 通过条件 + +- 与航行判断直接相关的关键查询字段不能大面积缺失 +- 如果对象在地图上可点击,但关键数字或关键语义字段缺失,应判为不通过 + +## 14. render-hit 一致性审计 + +### 14.1 审计目标 + +确认“渲染结果一致”。 + +### 14.2 审计粒度 + +保持当前项目正式口径: + +- 按 `feature instance` 粒度审计 +- 保留 tile / zoom 敏感性 + +### 14.3 必比内容 + +- `hit_count_old` +- `hit_count_new` +- `hit_types_old` +- `hit_types_new` +- icon 名 +- text 值 +- fill 语义 +- line 语义 +- opacity / width / pattern + +### 14.4 通过条件 + +- 不允许关键对象从“有有效渲染”变成“无有效渲染” +- 不允许命中层数量相同但语义画反 +- 不允许图标 fallback 误导本体判断 + +## 15. style 语义审计 + +### 15.1 审计目标 + +确认新版 style 忠于旧版 style 的表现语义,而不是重新设计。 + +### 15.2 重点专项 + +- 陆海主判定一致 +- 水上 / 水下 / 露出 / 干出语义一致 +- 危险物、潜堤、暗礁、洗岩、浅水区语义一致 +- render-support 层没有被错误强化 +- 深度数字、净空数字、灯标辅助信息没有被丢掉 + +### 15.3 通过条件 + +- 不允许“画得很像,但安全语义已经反了” + +## 16. AOI / 视觉审计 + +### 16.1 定位 + +AOI / 视觉审计是强制层,但它不能替代对象保真审计。 + +### 16.2 用途 + +- 校准 backend 审计盲区 +- 复核用户实际看到的问题是否真的被修复 +- 核对密集区点击对象和渲染对象是否一致 + +### 16.3 当前固定基线 + +当前仍应固定使用: + +- `http://192.168.200.184/newpec/navsea-compare-karatsu-20nm.html` + +不要用视觉相似去覆盖对象丢失事实。 + +## 17. 公开部署一致性审计 + +必须确认: + +- 页面加载的是当前候选 style +- 页面加载的是当前候选 tile +- 版本号已经更新 +- compare 页与候选构建产物一致 + +只要公开页面和候选产物不一致,放行审计就应视为未完成。 + +## 18. 工程版与交付版的职责划分 + +### 18.1 工程版 + +工程版应保留更多 trace 与审计字段,用于: + +- 规则定位 +- 审计追踪 +- 对象回查 +- 映射调试 + +### 18.2 交付版 + +交付版可以做裁剪,但不应裁掉: + +- 点击查询必要字段 +- 安全判断必要字段 +- 与原始对象对回必要字段 + +因此建议未来不要把交付版收缩成“只够 style 渲染”的极小集合,而是收缩成: + +- “足够渲染” +- “足够查询” +- “足够审计兜底” + +## 19. 实施顺序建议 + +建议分 4 步落地。 + +### 第一步:先固定字段模型 + +在 builder 中新增并固化: + +- `source_layer_native` +- `native_code_type` +- `native_code_value` +- `object_domain` +- `object_class` +- `object_subclass` +- `object_display_name` + +### 第二步:建立正式映射规则表 + +为 `class_code / display_code -> NavSea taxonomy` 建规则表与 trace。 + +### 第三步:补查询字段清单 + +按对象组梳理交付版必须保留的查询字段,避免“能画不能查”。 + +### 第四步:扩展审计脚本 + +在现有脚本上补 3 类审计: + +1. 分类映射审计 +2. 查询字段完整性审计 +3. `native_code` 保留审计 + +## 20. 最终放行口径 + +未来正式放行建议固定为以下口径: + +### 必须全部通过 + +- 对象保真审计通过 +- 分类映射审计通过 +- 查询字段完整性审计通过 +- render-hit 一致性审计通过 +- style 语义审计通过 +- AOI / 视觉审计通过 +- 公开部署一致性审计通过 + +### 其中两条是核心硬门禁 + +- 物体不丢 +- 渲染结果一致 + +### 一句总括 + +`NavSea PBF` 的交付标准不应再是“图大致像了”,而应是: + +- 对象能对回 +- 语义能解释 +- 细节能查询 +- 渲染能等价 +- 审计能闭环 + +只有这样,这套 PBF 才既能做图,也能做查询、做安全判断、做长期工程演进。 + +## 21. 首版语义定义草案 + +这一节给出当前 `NavSea` 可以直接采用的首版语义定义。 + +目的不是一次性把所有历史对象都做成最终完美 taxonomy,而是先建立一套: + +- 可解释 +- 可映射 +- 可审计 +- 可逐步细化 + +的统一语义口径。 + +### 21.1 定义层级 + +建议把每个对象的语义定义固定分成三层: + +1. `object_domain` +2. `object_class` +3. `object_subclass` + +其中: + +- `object_domain` + - 业务大域 + - 用于上层筛选、CPA、离线包、风险分组 +- `object_class` + - 业务大类 + - 用于稳定 API 与审计聚合 +- `object_subclass` + - 细粒度对象子类 + - 用于 pickup 解释与精细渲染映射 + +### 21.2 首版 object_domain 定义 + +建议当前正式采用以下 `object_domain`。 + +- `navigation_mark` + - 助航与导航标识对象 +- `hazard` + - 危险物、障碍物、潜在碍航对象 +- `depth` + - 深度、等深、深度分带 +- `clearance` + - 净空、高度、通行限制 +- `anchorage` + - 锚地、锚泊、抛锚限制 +- `route` + - 航路、航道、通行边界 +- `facility` + - 港湾设施、边界设施、结构物 +- `landsea` + - 陆海主判定对象 +- `seabed` + - 底质、海底支撑对象 +- `toponym` + - 地名标注对象 +- `fishery` + - 渔具、鱼礁、渔业相关对象 +- `support` + - 仅承担支撑语义、不应直接作为业务主对象的图层 +- `pending` + - 当前仍未完成语义收口的编码层 + +### 21.3 当前标准层语义定义 + +以下定义基于当前 `Karatsu 20nm final` 实际标准层,以及现有 Domain 原型中的语义口径。 + +#### A. `navigation_mark` + +- `navigation_marks` + - 语义定义: + - 航标、灯标、浮标、灯塔、信标、AIS 航标等导航辅助对象 + - `object_class` 建议: + - `lighthouse` + - `beacon` + - `buoy` + - `light_buoy` + - `leading_light` + - `virtual_aid_to_navigation` + - `object_subclass` 建议主要来自: + - `canonical_object_type` + - `display_code` + - `shape_class_code` + - 说明: + - 这是最典型需要“原生码值 + NavSea 统一语义名”并存的对象组 + +#### B. `hazard` + +- `navigation_hazard_point` + - 语义定义: + - 对航行构成直接危险的点状障碍物 + - `object_class` 建议: + - `wreck` + - `rock` + - `reef` + - `obstruction` + +- `navigation_hazard_area` + - 语义定义: + - 对航行构成直接危险的面状障碍区 + +- `navigation_hazard_outline` + - 语义定义: + - 航行危险区域的边界线 + +- `anchor_caution_hazard_point` + - 语义定义: + - 对抛锚、泊船、近岸操作构成注意/限制的点状障碍物 + +- `anchor_caution_hazard_area` + - 语义定义: + - 抛锚注意障碍区 + +- `anchor_caution_hazard_outline` + - 语义定义: + - 抛锚注意障碍区边界 + +- `submerged_reef_area` + - 语义定义: + - 潜堤、潜礁、浅下危险地形区域 + +- `hazard_boundary_outline` + - 语义定义: + - 危险界、危险区域外缘边界 + +#### C. `depth` + +- `depth_contour` + - 语义定义: + - 等深线 + +- `depth_contour_overview` + - 语义定义: + - 概略等深线 + +- `depth_zone_739` + - 语义定义: + - 当前仍带旧编码痕迹的深度分带层 + - 当前域建议: + - `pending` + +- `depth_zone_741` + - 语义定义: + - 当前仍带旧编码痕迹的深度分带层 + - 当前域建议: + - `pending` + +说明: + +- `depth_zone_*` 当前不建议直接当最终业务语义层 +- 更合理的最终形态应是: + - `depth_band` + - `shallow_water_band` + - `deep_water_band` + 等可解释层名 + +#### D. `clearance` + +- `clearance_limit_point` + - 语义定义: + - 高度/净空限制点标注对象 + - 关键查询字段: + - `clearance_height_m` + +- `clearance_limit_line` + - 语义定义: + - 高度/净空限制线或关联约束线 + +- `bridge_structure` + - 语义定义: + - 桥梁等与净空判断相关的重要结构物 + +#### E. `anchorage` + +- `anchorage_point` + - 语义定义: + - 锚地符号或锚泊点状标识 + +- `anchorage_area` + - 语义定义: + - 锚地、锚泊区域 + +- `anchorage_outline` + - 语义定义: + - 锚地边界线 + +#### F. `route` + +- `route_outline` + - 语义定义: + - 航路、航道、通行带边界 + +说明: + +- 当前 `20nm final` style 里主要暴露的是 `route_outline` +- 未来若要做更完整 route 语义,应进一步引入: + - `route_area` + - `route_axis_line` + - `route_boundary_point` + +#### G. `facility` + +- `facility_boundary_point` + - 语义定义: + - 港湾设施、边界设施、港口辅助设施等点状对象 + - 说明: + - 当前语义仍偏宽,后续建议继续细分 + +- `facility_boundary_area` + - 语义定义: + - 设施/边界相关区域 + - 当前域建议: + - `detail` + - 说明: + - 更像容器层,后续需继续拆清 + +- `facility_boundary_outline` + - 语义定义: + - 设施/边界边线 + +- `onshore_structure_area` + - 语义定义: + - 陆上结构物面 + +- `onshore_structure_line` + - 语义定义: + - 陆上结构物线 + +- `onshore_structure_point` + - 语义定义: + - 陆上结构物点 + +- `pilot_station_point` + - 语义定义: + - 引航站点 + +- `clip_outline_754` + - 语义定义: + - 旧编码型边界辅助层 + - 当前域建议: + - `pending` + +#### H. `landsea` + +- `land_area` + - 语义定义: + - 陆海主判定层中的陆地区域 + - 说明: + - `land_area` 应继续作为陆海主判定唯一主来源 + +- `baseline_area` + - 语义定义: + - 基本线相关面 + - 当前域建议: + - `safety_extended` + - 说明: + - 当前仍偏容器/组合语义,后续需继续收口 + +- `baseline_line` + - 语义定义: + - 基本线线层 + +- `baseline_outline` + - 语义定义: + - 基本线边界 + +#### I. `seabed` + +- `seabed_text_point` + - 语义定义: + - 底质标注点 + +- `seabed_line` + - 语义定义: + - 海底线 + +- `bathymetry_line` + - 语义定义: + - 海底地形支撑线 + - 当前域建议: + - `support` + - 说明: + - 它更像支撑线,不宜直接作为最终业务主对象 + +- `hole_area` + - 语义定义: + - 穴/凹地/透明支撑区域 + - 当前域建议: + - `support` + - 说明: + - 不应被误解释为陆地或实体设施 + +#### J. `toponym` + +- `place_label_sea` + - 语义定义: + - 海上地名标注 + +- `place_label_land` + - 语义定义: + - 陆上地名标注 + +#### K. `fishery` + +- `fixed_fishing_gear_area` + - 语义定义: + - 定置渔具或渔业占用区域 + +### 21.4 当前仍属于待收敛或容器语义的层 + +以下层当前不建议被视为最终稳定的业务语义层,应继续在后续 builder / taxonomy 中细化: + +- `baseline_area` +- `baseline_line` +- `baseline_outline` +- `facility_boundary_area` +- `facility_boundary_outline` +- `bathymetry_line` +- `hole_area` +- `depth_zone_739` +- `depth_zone_741` +- `clip_outline_754` + +这些层的问题不是不能用,而是: + +- 语义过宽 +- 仍带旧编码/制图容器痕迹 +- 容易被错误当作业务主对象 + +### 21.5 当前可以直接作为稳定业务对象层的部分 + +以下层已经足够接近稳定业务语义,可直接作为 pickup 和业务查询的首版入口: + +- `navigation_marks` +- `navigation_hazard_point` +- `anchor_caution_hazard_point` +- `depth_contour` +- `depth_contour_overview` +- `clearance_limit_point` +- `clearance_limit_line` +- `anchorage_area` +- `anchorage_point` +- `route_outline` +- `pilot_station_point` +- `place_label_sea` +- `place_label_land` +- `seabed_text_point` +- `land_area` + +### 21.6 语义定义与审计的关系 + +语义定义不是写出来就结束,必须进入审计。 + +至少应新增以下检查: + +1. 每个正式输出 `feature` 必须有: + - `object_domain` + - `object_class` + - `object_subclass` + +2. 每个标准层必须有明确语义定义,不能长期停留在: + - `unknown` + - `pending` + +3. 所有安全关键层不得退回到纯容器语义或支撑语义 + +4. 视觉审计时,不允许: + - 用 `support` 对象冒充业务主对象 + - 用容器层视觉相似掩盖真实对象语义漂移 + +## 22. 核心规则记录 + +本节把当前已经讨论收口、后续不应再反复摇摆的核心规则固定下来。 + +### 22.1 唯一对象主键 + +- 每个原始 `NewPEC` 对象只认一个主键: + - `fid` +- `NewPEC fid` 与 `NavSea fid` 允许采用不同编码形式 +- 但两者必须: + - 一对一 + - 稳定 + - 可逆 + +这意味着: + +- 对象 identity 只有一个 +- 不再为对象对应额外发明第二套 identity 字段 + +### 22.2 主对象一对一 + +- 当前正式口径坚持: + - `1 raw object -> 1 primary NavSea feature` +- 不把一个原始对象默认拆成多个业务主 feature +- 如后续确需派生辅助 feature,也只能作为: + - `helper / support feature` + - 不得替代主对象 + +### 22.3 统一对象载荷 + +- 同一个 `feature` 的同一套属性同时服务: + - 渲染 + - pickup + - CPA / 安全判断 + - 审计 +- 不再设计: + - 一套只给渲染的对象模型 + - 一套只给查询的对象模型 + - 一套只给安全判断的对象模型 + +### 22.4 审计全部围绕 fid + +- 对象保真审计主键: + - `fid` +- 语义漂移审计: + - 看同一 `fid` 的语义属性是否漂移 +- 渲染一致性审计: + - 看同一 `fid` 的渲染结果是否等价 + +因此审计结构固定为: + +1. `fid` 是否还在 +2. 该 `fid` 的语义是否还对 +3. 该 `fid` 的渲染是否仍与 `NewPEC` 等价 + +### 22.5 不做“查询字段 vs 渲染字段”硬分离 + +- 当前项目不建议把: + - `pickup` 查询字段 + - 渲染字段 + 完全拆成两套数据源 +- 原因: + - 二者高度重合 + - 容易形成双真相源 + - 不利于离线、native、本地判断与审计闭环 + +正确方向是: + +- 一个统一对象载荷 +- 但做“必要最小集”裁剪 +- 剔除纯 debug / 纯 trace / 纯中间推导字段 + +## 23. 当前 Karatsu 20nm Final 的调整判断 + +本节回答一个现实问题: + +- 当前 `Karatsu 20nm final` 是否需要重写 PBF / style + +结论: + +- 当前不建议重写整体架构 +- 建议在现有 `20nm final` 基础上做增量调整 + +### 23.1 当前 20nm final 已具备的基础 + +当前这条线已经具备: + +- 标准层收口 +- 对象保真通过 +- 视觉 compare 基线稳定 +- 关键分类/渲染字段已物化 + +因此它已经是一条: + +- 可交付 +- 可审计 +- 可继续演进 + +的基础线,而不是需要推倒重来。 + +### 23.2 当前不建议做的事 + +当前不建议: + +- 改成完全新的分层体系后再重做整套 style +- 为 pickup 单独再造第二套 query 数据模型 +- 把查询与渲染彻底拆成两套接口 +- 仅为了语义理想化而破坏当前 compare 审计基线 + +### 23.3 当前建议调整 PBF 的部分 + +当前更应优先调整的是: + +#### A. 补统一语义字段 + +建议在当前 `20nm final` PBF 中增量补入: + +- `object_domain` +- `object_class` +- `object_subclass` + +说明: + +- 这三个字段是当前统一对象模型最缺的一层 +- 它们直接服务 pickup、CPA 和业务消费 +- 加它们不要求推翻现有标准层和 style + +#### B. 保留现有关键原生码与渲染字段 + +继续保留: + +- `class_code` +- `display_code` +- `shape_class_code` +- `canonical_object_type` +- 关键 `chart_*` +- 关键数值字段 + +说明: + +- 这些字段当前已经被 style、解释和审计共同依赖 +- 不应为了追求“纯新体系”而过早删掉 + +#### C. 保持 fid 作为 primary feature id + +建议继续坚持: + +- `feature.id = fid` 或与之等价的稳定主键口径 + +这样 native 端 pickup、对象保真审计、左右对照都最直接。 + +### 23.4 当前建议调整 style 的部分 + +style 当前不建议大改架构,但建议注意以下原则: + +#### A. style 继续主要消费标准层 + 物化渲染字段 + +- 继续使用当前标准层 +- 继续优先消费: + - `chart_icon_image` + - `chart_label_text` + - `chart_fill_style` + - `chart_line_color` + 等物化字段 + +#### B. style 不承担对象 identity 解释职责 + +- style 的职责是“画” +- 不负责“定义对象身份” +- pickup 与审计都应围绕 `fid` 和统一语义字段解释对象 + +#### C. compare 页不换基线,只升级 pickup 逻辑 + +- 不切换当前固定 compare URL +- 不另建新的主视觉对比页 +- 若要改动优先改: + - 点击拾取逻辑 + - 面板展示结构 + - 左右对照方式 + +### 23.5 当前最推荐的调整顺序 + +建议按下面顺序进行: + +1. 先给当前 builder 增补统一语义字段 +2. 再用同一批字段改 pickup 解释层 +3. 再补相关审计 +4. 最后才考虑是否需要进一步精简或重构 style + +## 24. Pickup 消费方案 + +本节定义 native 侧如何消费当前及后续增强后的 `NavSea PBF`。 + +### 24.1 Pickup 的目标 + +pickup 的目标不是“点中了哪个 render layer”,而是: + +1. 找到点击命中的真实对象 +2. 返回这个对象的统一语义 +3. 返回该对象的关键查询属性 +4. 返回当前命中的渲染层信息 + +### 24.2 输入 + +native 端输入: + +- 点击屏幕坐标 +- 当前地图缩放级 +- 当前视图内已加载的 `NavSea` source + +### 24.3 查询方式 + +建议使用: + +- `queryRenderedFeatures` + +但不要只查单像素点,建议用: + +- 点击点周围 `6px ~ 10px` 小范围 + +说明: + +- 海图符号小且密集 +- 单点查询容易错过目标 + +### 24.4 候选过滤 + +先过滤到: + +- 当前 `NavSea` source +- 当前业务关注的渲染层 + +必要时对 support/background 降权。 + +### 24.5 候选聚合主键 + +所有候选 feature 必须先按: + +- `feature.id` + +聚合。 + +这里的设计前提是: + +- `feature.id` 与 `fid` 等价或可稳定映射 + +这一步非常关键,因为: + +- 同一个对象可能命中 icon/text/outline 多个 render layer +- pickup 最终应返回一个对象,不是多个分裂的 render hit + +### 24.6 候选排序 + +同一点击区域内多个 `fid` 候选时,建议排序优先级: + +1. `navigation_marks` +2. `navigation_hazard_point` +3. `anchor_caution_hazard_point` +4. `clearance_limit_point` +5. 其他点对象 +6. 线对象 +7. 面对象 +8. support / background + +如果同一对象内部有多个 render hit,展示时可保留全部命中层,但只选一个代表对象。 + +### 24.7 Pickup 返回结构 + +建议 native 层最终统一返回: + +```json +{ + "fid": 12007897, + "source_layer_std": "navigation_marks", + "geometry_type": "Point", + "object_domain": "navigation_mark", + "object_class": "lighthouse", + "object_subclass": "harbor_lighthouse", + "canonical_object_type": "harbor_lighthouse", + "properties": { + "display_code": "30100005", + "class_code": null, + "shape_class_code": null, + "depth_value_m": null, + "least_depth_m": null, + "clearance_height_m": null, + "light_color_code": "white", + "light_sector_mode": "sector", + "name_ja": "平戸牛ケ首灯台" + }, + "render": { + "chart_icon_image": "symbol-daytime-301", + "chart_symbol_code": "lighthouse", + "render_hit_layers": [ + "navigation-mark-icon", + "navigation-mark-text" + ] + } +} +``` + +### 24.8 Pickup 面板展示建议 + +建议 pickup UI 固定展示四块: + +1. `对象` + - `fid` + - `source_layer_std` +2. `分类` + - `object_domain` + - `object_class` + - `object_subclass` +3. `细节` + - 水深 + - 净空 + - 灯光 + - 名称 +4. `渲染` + - 当前命中 render layer + - icon + - text + +### 24.9 Pickup 与 CPA 的关系 + +pickup 不应定义一套独立于安全判断的数据模型。 + +正确做法是: + +- pickup 展示的就是对象统一语义模型的一部分 +- CPA / 安全判断消费的也是同一对象上的同一组语义字段 + +也就是说: + +- `pickup` 是展示层 +- `CPA` 是判定层 +- 但二者读取同一份对象语义 + +### 24.10 当前 compare 页建议改法 + +当前 compare 页的点击逻辑还是: + +- `queryRenderedFeatures(event.point)` +- 直接取 `features[0]` + +这只适合临时 inspect,不适合作为正式 pickup 逻辑。 + +建议后续改成: + +1. 查询点击小范围候选 +2. 先按 `feature.id` 聚合 +3. 再按对象优先级选代表对象 +4. 面板展示统一对象结构 +5. 左右页如果命中同一 `fid`,则做并排对照 + +## 25. Pickup 规则字典与解释器 + +当前建议正式采用: + +- 规则字典: + - [navsea-pickup-rules.v1.json](/root/sourceserver/pbf/src/pbf/navsea-pickup-rules.v1.json) +- JS 前端解释器: + - [navsea-pickup-interpreter.js](/root/sourceserver/pbf/src/pbf/navsea-pickup-interpreter.js) +- TS 前端解释器: + - [navsea-pickup-interpreter.ts](/root/sourceserver/pbf/src/pbf/navsea-pickup-interpreter.ts) + +### 25.1 为什么采用“规则字典 + 薄解释器” + +原因: + +- 前端可以本地判读,不增加 PBF 容量 +- 规则可版本化、可审计、可和 builder / style 同步管理 +- 不把所有解释逻辑写死在前端 if/else 中 +- 后续补 `object_domain / object_class / object_subclass` 后,可以平滑过渡 + +### 25.2 当前解释器职责 + +解释器当前职责固定为: + +1. 接收 `queryRenderedFeatures` 返回的候选 feature +2. 按 `feature.id` 聚合 +3. 按规则字典匹配 `source_layer_std` +4. 若前端传入 `click_lnglat`,则在同分候选间优先选离点击点最近的对象 +5. 结合规则字典中的 `interaction_role` 与 `pickup_priority` 选主对象 +6. 生成统一 pickup 结果 + +解释器不负责: + +- 再造对象 identity +- 替代 style 做渲染判断 +- 替代审计脚本做最终放行判定 + +### 25.3 当前规则字典职责 + +规则字典负责声明: + +- 每个标准层属于哪个 `object_domain` +- 当前默认 `object_class` +- 当前优先看的原生码字段 +- pickup 标题字段优先级 +- pickup 细节字段清单 +- render 信息回显字段清单 +- `semantic_status` +- `interaction_role` +- `pickup_priority` +- `render_layer_groups.primary / area / info / ignore` + +### 25.4 更新规则 + +规则字典不是要求每次纯视觉微调都改。 + +必须同步更新的情形是: + +- PBF 标准层发生变化 +- 某层的关键分类字段发生变化 +- style 对某层的主渲染字段依赖发生变化 +- 新增正式支持 pickup 的层 +- 可交互 render layer 分组发生变化 + +### 25.5 当前消费建议 + +当前 native / web 端消费建议: + +1. 加载 `navsea-pickup-rules.v1.json` +2. 优先读取 `render_layer_groups.primary / area / info / ignore` +3. 先做精确点查: + - `area + primary + info` +4. 精确点查未命中时,再做小范围补查: + - `primary + info` +5. 把候选数组喂给对应解释器 +6. 直接展示返回的: + - `primary` + - `candidates` +7. 后续如果补入统一语义字段,再逐步把规则字典从“判读主来源”降为“兼容补充层” diff --git a/STEP_RECORD.md b/STEP_RECORD.md index 1543b33..38544c4 100644 --- a/STEP_RECORD.md +++ b/STEP_RECORD.md @@ -1,9 +1,38 @@ # 项目步骤记录 -最后更新:`2026-06-16` +最后更新:`2026-10-13` 仓库:`/root/sourceserver/pbf` 远端:`ssh://git@nas:2222/tei/pbf.git` +## 2026-10-13 全国 Full PBF 原始生产链溯源与标准冻结 + +- 用户明确指定公网 `https://pbf.jpcn.ccwu.cc/pbf/pbf-delivery-full-20260418-rebuild/{z}/{x}/{y}.pbf` 为 NavSea PBF 全国 Full 权威产物。 +- 追溯结果:正式历史生成器为 Git `6d72340` 的 `navsea_tile_builder.py` + `navsea_mapping_registry.py` + `tasks/pbf/mappings/`,输入为 NewPEC 原始 PBF / MySQL `pbf_analysis` / `navsea-core`。 +- 原始四段分片路径:`/home/wwwroot/pbf-delivery-full-20260418-rebuild.parts/{z0_8,z9_10,z11,z12}`;四份实际 mapping audit 写入数量合计 65,148。 +- 2026-10-13 抽查 8 张公网瓦片,与各段历史原始分片 SHA-256 完全相同。当前同名合并目录的部分样本与原始分片不同,与 20260808 派生目录存在硬链接。 +- **新生产与审计必须以公网 Full + 历史 .parts 为对照,不能把后续现存同名合并目录或新版本 semantic/Provider 数据误当历史原始生产文件。** +- 详细证据、历史时序、重建参数、审计门禁和未确认事项:`docs/报告/20261013_NavSea_PBF全国Full生产链溯源调查_v1.md`。 +- 本轮为源码及历史归档,不执行全国重新生成、MySQL 写入、正式瓦片或 Style 替换。 + + +## 2026-09-24 当前海岸线与陆海判定图层核对 + +- 当前 20nm 对比页右侧使用 `/home/wwwroot/pbf-delivery-karatsu-20nm-final`;其 style 的陆地填充 `land-area` 读取 PBF `land_area`,原始图层映射为 `P陸域 -> land_area`。 +- 实际解码 `z12/3525/1643.pbf`:有 `50` 个 `land_area` Polygon/MultiPolygon 对象(样本属性 `class_code=100`),无独立 `shoreline_boundary` 图层。当前 Full semantic unified 同一瓦片也有 `50` 个 `land_area` 对象。 +- `land_area` 可用于判断覆盖范围内的陆地,海岸线是该面的边界;但图层缺失不能直接判作海洋,`baseline_area` 是海域/深度区等海图填充,并非覆盖完整海洋的二值面。若需严格、连续的陆海二值判定,应另建并审计完整陆地掩膜;现有 GSI 海岸线格网是沿岸阻断带,并非完整陆地/海洋分类层。 + +## 2026-09-02 PBF 生成链路与 schema v2 交付包 + +- 已核对并补充:[`tasks/pbf/NavSea_tile_generation_pipeline_v2.md`](tasks/pbf/NavSea_tile_generation_pipeline_v2.md)、[`tasks/pbf/NavSea_PBF_schema_v2.md`](tasks/pbf/NavSea_PBF_schema_v2.md)。 +- 已确认 z12 `extent=1048576` 来自源 MVT layer header;`navsea_tile_builder.py` 读取后经 `per_layer_options` 原样保留,不是按 z12 计算出的固定值。 +- 已确认 MVT numeric `feature.id` 来源是 legacy `fid` 经 `NavSeaFidCodec` 的 `feistel32_aes_cyclewalk_v1` 可逆变换;不是 SQL `features.id`。当前抽样源/交付 tile `z12/3525/1643` 的 layer extent 均为 `1048576`。 +- 已准备交付包:`/mnt/nas/pdf/NavSea_PBF生成链路与Schema-v2_2026-09-02.zip`,包含上述文档、审计规范(仓库实际文件名为 `.md`,用户请求中的 `.mdd` 按现有文件纠正)、实际 generator、mapping registry、规则 YAML、FID 解码说明及全国重建说明。 + +## 2026-09-03 AOI 21 个 PBF 打包 + +- 已从当前最新 Full semantic unified 目录 `/home/wwwroot/pbf-delivery-full-semantic-unified-20260808` 取出指定的 21 个 `z/x/y.pbf`。 +- 已保持目录结构打包至 `/mnt/nas/pbf/aoi.zip`,通过 `unzip -t` 校验;压缩包 SHA-256:`00c9d43746d6dc2cf29fdea6f75a2b04ef6718d68c604b2d1e5bf20d6083076c`。 + ## 保留原则 - 只保留最近 3 天里真正会反复回看的内容 @@ -24,6 +53,138 @@ ## 最近 3 天摘要 +### 2026-09-02 Full semantic 样本打包 + +- 已将当前 Full semantic unified 版本的样式、semantic sprite 的 `sprite.json`,以及 Karatsu 同一区域的 z10/z11/z12 工作 PBF 样本打包到: + - `/tmp/navsea_full_semantic_unified_20260808_karatsu_z10-z12.zip` +- PBF 样本坐标:`z10/881/410.pbf`、`z11/1762/820.pbf`、`z12/3525/1643.pbf`。 +- 压缩包已通过 `unzip -t` 完整性校验,SHA-256:`8b72986ec789e9c94420a029f10ddd44d7e2be064fbb9f74b37c22f61dc20940`。 + +### 2026-09-02 CM95 向现有 NavSea style 靠齐的接入规范 v1 + +- 已新增 [`NavSea_CM95接入规范-v1.md`](NavSea_CM95接入规范-v1.md),明确 CM95 是新上游数据源,必须适配既有 NavSea PBF/schema/style,而不是为 CM95 重写现有 style。 +- 接入基线固定为当前 Full semantic unified style;首版 CM95 style 只允许替换 `sources.navsea_delivery.tiles`,保持既有 layer、sprite、glyph 和渲染规则不变。 +- 规范定义了 37 个既有 `source-layer` 的接入契约、核心 `fid/canonical_*/chart_*` 字段、CM95 原始对象回查要求、映射缺口隔离方式、z0–12 切片要求和三层审计顺序。 +- 后续实施入口:先取得合法导出的 CM95 AOI 样本、对象/字段字典和坐标/单位说明,然后建立版本化 `cm95_to_navsea_v1.yaml` 映射表并完成小范围试产。 + +### 2026-08-07 pbf_analysis NAS properties 修复及 MyISAM→InnoDB 完成 + +- 正确的 NAS MySQL 地址是 `192.168.200.230:3306`;数据库为 `pbf_analysis_nas_20260806`,服务版本为 MySQL `8.0.45`。 +- 已从本机 `pbf_analysis.properties` 重新导出并导入 NAS,修复了原 NAS `properties` 中大量 `k IS NULL` 的问题;原始旧 NAS 表保留为 `properties_backup_20260807`,未删除。 +- 已完成正式表从 MyISAM 到 InnoDB 的迁移。当前正式 `properties` 为 InnoDB、`utf8mb4_general_ci`,保留 `feature_id`、`keys` 两个索引;迁移前已修复的完整 MyISAM 表保留为 `properties_myisam_backup_20260807`,可用于回滚。 +- 正式 NAS `properties` 精确校验:总行数 `23659423`、`fid` `6685117`、`k IS NULL` `0`、`feature_id IS NULL` `0`;23 个 key 分组及每组数量与本机完全一致。 +- 追加强校验:按 `feature_id/k/v` 排序后,前 `feature_id < 1000000` 的 `3521766` 行本机/NAS 摘要完全一致。 +- 5 组实际瓦片构建查询(候选对象联接 `properties`)与本机返回完全一致,已确认 NAS 的 `fid` 反向追踪恢复。 +- 迁移期间临时扩大了 NAS buffer pool、redo 和刷盘参数;完成后已全部恢复:buffer pool `128 MB`、redo `100 MB`、`innodb_flush_log_at_trx_commit=1`、`sync_binlog=1`、I/O capacity `200/2000`、脏页阈值 `90/10`、`flush_sync=ON`、`lru_scan_depth=1024`。 +- 最终 5 组实际瓦片构建查询与本机返回完全一致;NAS 无残留复制/DDL 线程。本机 MySQL 仍为 `active/enabled`,尚未关闭。 +- 注意:`navsea_tile_builder.py` 当前默认仍连接本机 `/tmp/mysql.sock`;关闭本机前还需把流水线连接配置切换为 NAS 并完成一次重建/对象审计。 + +### 2026-08-08 旧版 sprite 灯弧编码重新调查:修正“四种灯弧足够”的结论 + +- 调查基准:旧版 `/mnt/sda1/www/newpec/style.json`、旧版 `/mnt/sda1/www/newpec/sprite/sprite@2x.json`,并用 NAS `pbf_analysis_nas_20260806.properties` 的 `p航路標識群` 进行反查。 +- 旧版 style 的真实规则不是把灯弧归为四类,而是: + - 有 `明弧/分孤` 时,直接生成 `arc-daytime-` + 原字段值; + - 没有该字段时,才按 `形状分類番号` 的 l/m/s 和 `灯色` 的 1/2/3 生成 fallback arc key。 +- `明弧/分孤` 不是普通 ID。当前 NAS 中有 `235` 个不同编码、对应 `1072` 个对象;编码长度为 8/16/24/32/48,每 8 个字符是一段:前 2 位为弧段类别/色段编码,后面两个 3 位数为起止方位角(度)。 +- 当前对象的弧段数量分布: + - 1 段:`938` 个对象 + - 2 段:`97` 个对象 + - 3 段:`26` 个对象 + - 4 段:`6` 个对象 + - 6 段:`5` 个对象 + - 合计 `1264` 个编码弧段 +- 例子: + - `04027289` = `04 / 027° / 289°`,旧图是大范围开口扇弧; + - `0424628604296140` = `04 / 246°–286°` 加 `04 / 296°–140°` 两段; + - `04035221042430270202703502221243` 包含 4 段不同方位区间; + - 旧 sprite 中每一个当前 NAS 的 `明弧/分孤` 编码都有对应图片,未发现当前数据编码缺图。 +- 旧 sprite 共 `255` 个 `arc-daytime-*`:当前 NAS 使用的 `235` 个编码、当前数据未出现但 sprite 仍保留的 `13` 个编码,以及 `l3/m1/m2/m3/s1/s2/s3` 等 `7` 个 fallback key。 +- 当前 `navsea_tile_builder.py` 只输出 `light_sector_mode=sector/omni`,没有输出原始 `明弧/分孤` 或等价的弧段数组;当前 Full semantic style 的 `nav-light-arc` 又只选择 `arc-daytime-04027289/m1/m2/m3`。这会丢失大部分对象的具体弧段方位信息,不能继续按“四种 arc”做语义替换或清理。 +- 结论:后续必须把灯弧定义为“可追溯的多弧段结构”(至少保留原编码、颜色/类别、起角、止角、段序),再设计短语 sprite key;在此之前不删除旧 arc,也不把多个角度图片合并成同一 key。 + +### 2026-08-08 daytime sprite 后缀数字含义核对 + +- `symbol-daytime-*`、`fill-daytime-*`、`line-daytime-*` 的数字均来自旧版海图规则中的业务编码或图案族编号,不是随机流水号;但三类后缀不能按同一套规则解释。 +- `symbol-daytime-*` 主要对应 `分類番号`、`形状分類番号` 或 `表示用番号` 的显示组合/变体;同一个 sprite 可能被多个原始分类号或显示组合号共用。 +- `fill-daytime-*` 主要对应区域分类/填充图案族;例如原始 `分類番号=405` 使用 `fill-daytime-401`,`407/408` 共用 `fill-daytime-407`,`421–426` 共用 `fill-daytime-421`,所以后缀不一定等于原始分类号。 +- `line-daytime-*` 主要对应线对象/线型图案族;例如 `710/711` 共用 `line-daytime-710`,`713/714` 共用 `line-daytime-713`。 +- `arc-daytime-*` 是特殊情况:后缀可能是由弧段类别和起止方位角组成的多段角度编码,不能按普通分类号处理。 +- 语义替换表必须至少保留:`old_key`、资源类型、来源字段、原始值、语义名称、共用/别名关系;`arc` 还需保留弧段类别、起角、止角和段序。 + +### 2026-08-08 Full 版 sprite/style/PBF 统一语义重命名完成 + +- 已以 `src/pbf/style.navsea-delivery-full-semantic-extentfix.json`、旧版实际 sprite PNG/JSON、`report/old_png_semantic_mapping.csv` 和当前 Full PBF 的真实字段使用情况为共同基准,生成统一映射表: + - [`tasks/pbf/NavSea_Sprite_语义统一映射表-2026-08-08.csv`](tasks/pbf/NavSea_Sprite_语义统一映射表-2026-08-08.csv) + - [`src/pbf/semantic_sprite_key_map_2026-08-08.json`](src/pbf/semantic_sprite_key_map_2026-08-08.json) +- 映射表覆盖旧 sprite 的 `476` 个实际键,并保留日语语义、中文语义、图片尺寸、SHA-256、style/PBF 使用计数、来源依据和别名说明;另记录 `fill-daytime-405 -> pattern_fill_rock_hazard` 的旧 style 共用别名。 +- 已生成统一 sprite:`/mnt/sda1/www/newpec/sprite-semantic-unified-20260808/`,包含 `sprite.json/png` 和 `sprite@2x.json/png`,共 `476` 个无旧命名键。 +- 已生成并部署统一 style: + - [`src/pbf/style.navsea-delivery-full-semantic-unified-20260808.json`](src/pbf/style.navsea-delivery-full-semantic-unified-20260808.json) + - `/mnt/sda1/www/newpec/domain/style.navsea-delivery-full-semantic-unified-20260808.json` + - style 与部署文件 SHA-256 一致;图标、填充纹理和灯弧 fallback 均只引用实际新 sprite 键,无法由实际图片支持的旧 canonical 名称改为读取 PBF 的 `chart_*` 语义字段并在缺图时留空。 +- 已生成统一 Full PBF:`/home/wwwroot/pbf-delivery-full-semantic-unified-20260808`。 + - 静态 sprite 字段替换:`2447` 张瓦片、`72068` 个字段值; + - 灯弧层:`808` 张瓦片重新生成并合并,保留 `arc_id` 和 `arc_source_code`;全量最终字段统计为 `arc_id=1072`、`235` 个弧段语义键; + - 全量 PBF:`65148` 张瓦片、`6685117` 个 feature;`chart_icon_image` 使用 `21` 个新键,`chart_fill_pattern` 使用 `4` 个新键,均在新 sprite 中闭合;旧 `arc/symbol/fill/line/light/tidespot-daytime-*` 残留为 `0`。 +- 对象保全审计已用真正原始 MVT 对比最终 Full PBF:`65148` 个同坐标瓦片、`113578` 个对象,保留 `113578`,缺失、错图层、标识丢失、标识不匹配全部为 `0`。报告:[`report/object_preservation_full_semantic_unified_20260808/object_preservation_delivery_20nm.md`](report/object_preservation_full_semantic_unified_20260808/object_preservation_delivery_20nm.md)。 +- extent/几何抽样审计验证 `11` 张包含灯弧或重编码的瓦片,均无 suspicious extent shift 或 overflow 增长。 +- 生成脚本: + - `navsea_generate_sprite_semantic_unified_map.py` + - `navsea_build_unified_semantic_assets.py` + - `navsea_reencode_unified_semantic_pbf.py` + - `navsea_merge_unified_navmarks_layer.py` +- 仍需注意:原始数据中 `class_code=662` 有对象,但旧实际 sprite 没有对应图片;当前统一 style 不伪造该图标,映射表和 style 会让它保持可审计的无图状态。 + +### 2026-08-09 旧键对应表及当前 sprite 使用审计 + +- 旧 sprite JSON 的逐项 `old_key -> new_key` 对应关系,以 [`tasks/pbf/NavSea_Sprite_语义统一映射表-2026-08-08.csv`](tasks/pbf/NavSea_Sprite_语义统一映射表-2026-08-08.csv) 为准;其中 `old_key` 是旧 JSON 键,`new_key` 是新 sprite/style/PBF 共用的语义键。实际旧 JSON 的 `476` 个键均有对应关系,CSV 另有 1 行用于记录 `fill-daytime-405` 的旧 style 共用别名。 +- 对当前统一 Full 的 `476` 个新 sprite 键做了当前最终 style + 最终 PBF 联合扫描: + - 当前使用:`271` 个; + - 当前未使用:`205` 个; + - PBF 实际使用:`264` 个(灯弧 `235`、symbol `25`、fill `4`); + - 当前 style 静态/表达式使用:`8` 个(灯弧 fallback `3`、灯色 flare `3`、`obstruction` `1`、潮汐点 `1`)。 +- 分类统计: + - `arc-daytime`:255 个中当前使用 238 个;其中 235 个来自 PBF 的真实角度编码,3 个是 style fallback; + - `symbol-daytime`:171 个中当前使用 25 个; + - `fill-daytime`:18 个中当前使用 4 个; + - `light-daytime`:3 个全部由当前 style 的灯色 flare 使用; + - `tidespot-daytime`:1 个由当前 style 使用; + - `line-daytime`:7 个当前没有 PBF 值或 style 实际纹理引用; + - `arrow-daytime`:5 个当前没有使用; + - `shipfinder`:16 个当前没有使用。 +- `findship` 不是旧 sprite 的实际资源族名称;旧 style 使用的是 `shipfinder` source 和 `shipfinder-*` 动态键。旧版 `style.json` 中仍有 shipfinder 船体/航向/SOG 三组图层,旧版 `tidal` 图层也使用 `arrow-daytime-0..4`;但当前统一 Full style 没有 shipfinder 图层和 tidal 箭头图层,当前 Full PBF 也没有对应值。 +- 暂不从统一 sprite 删除这 `205` 个当前未使用图片:它们仍保留旧 JSON 的完整可追溯映射,方便后续原始 PBF 重建或恢复旧版 shipfinder/tidal 数据链;若以后确认只服务当前统一 Full,可另做精简 sprite 版本并重新审计。 + +### 2026-08-09 symbol 数字组合结构补充:当前语义名还需修订 + +- `symbol-daytime-*` 不能只按单个 `分類番号` 理解。当前旧 sprite 中有三种结构: + - 3 位基础族:如 `301` 港湾灯台、`320` 球形浮标简略图式; + - 6 位组合:前 3 位为结构族,后 3 位为顶标/航标变体,例如 `311350=311+350` 左舷、`312354=312+354` 北方位、`335359=335+359` 安全水域; + - 8 位显示变体:例如 `30500001/02/03`、`30700001/02/03` 分别编码灯标/灯浮标的颜色变体。 +- 旧 style 的 `display_code` 还可能比 sprite key 更长:例如 `31135001 -> symbol-daytime-311350`、`31235404 -> symbol-daytime-312354`、`33535904 -> symbol-daytime-335359`。因此必须同时保留 `display_code -> sprite_key` 关系,不能只记录 sprite 文件名。 +- 当前统一表中的 `old_key -> new_key` 仍可反向追溯,但部分新名(例如 `beacon_light_mark_port`、`buoy_light_north`、`mark_light_g`)把数字组合隐含在语义里,没有把组合码显式带入 key。该版本不应作为最终的 symbol 命名规范;后续应增加基础码、变体码、显示尾码字段,并考虑使用 `beacon_port_311350`、`buoy_north_312354`、`leading_light_g_30500001` 这类“短语 + 组合码”名称后,再统一重生成 sprite/style/PBF。 + +### 2026-08-09 当前 Full PBF 灯弧位置统计 + +- 当前统一 Full PBF `/home/wwwroot/pbf-delivery-full-semantic-unified-20260808` 的 `navigation_marks` 图层中,共有 `1072` 个带 `arc_id` 的灯弧位置,分布在 `808` 张瓦片中。 +- 这些位置对应 `235` 个不同的弧段语义键;`235` 是弧段类型/角度编码数量,不是位置数量。 + +### 2026-08-09 当前 Full PBF 全量数据分类 + +- 已对 `/home/wwwroot/pbf-delivery-full-semantic-unified-20260808` 完成全量只读盘点:`65148` 张瓦片、`6685117` 个瓦片 feature、`53` 个 PBF 图层、`24` 个属性字段。 +- 详细报告:[`report/current_pbf_inventory_full_semantic_20260809/当前PBF数据分类报告.md`](report/current_pbf_inventory_full_semantic_20260809/当前PBF数据分类报告.md)。明细 CSV:`图层分类.csv`、`字段分类.csv`、`字段值分类.csv`。 +- 当前统一 style 直接引用 `37` 个 PBF 图层;另有 `16` 个图层、`7962` 个瓦片 feature 未被当前 style 直接引用,主要是路线规划、深度概览、边界裁剪和导引线细节,不能全部视为无用数据。 +- 关键渲染/审计字段已分类:`canonical_object_type`、`class_code`、`display_code`、`shape_class_code`、`chart_symbol_code`、`chart_*`、`light_color_code`、`arc_id`;`arc_source_code`、`light_sector_mode`、`least_depth_m`、`clearance_height_m` 虽不一定被当前 style 读取,但分别承担弧段追溯、灯弧模式、深度分析和限高详情,暂不建议删除。 +- 当前可优先讨论的压缩方向是:未被当前 style 引用的图层,以及 zoom 重复展开;不要先删除对象分类码、显示码、灯弧原始码或业务详情字段。 + +### 2026-08-06 九州语义图标测试版 r2 人工视觉确认通过 + +- 用户已在真实浏览器确认以下修复均正常: + - `P漁具定置箇所` 紫色斜线纹理恢复; + - 灯标黑色本体恢复,不再只显示 flare; + - `311350 / 311351` 灯标左右侧 variant 映射正确。 +- 九州语义图标测试版 r2 当前视觉确认通过,后续可将这套纹理保留、variant 保留和语义图标映射规则推广到全国 Full 重建流程。 + ### 2026-08-06 九州语义图标测试版 r2 修复红框纹理漏画 - 用户在九州左右对比页红框指出:左侧原始 newpec 的 `P漁具定置箇所` 紫色斜线填充区域,在右侧语义图标测试版缺失。 @@ -130,6 +291,20 @@ - 结论 `PASS` - 备注:这次修复的是 style 显式 display_code -> sprite key 映射,不涉及 PBF 对象或几何重写。 +### 2026-08-06 语义图标旧新名称对应表落地 + +- 已新增中文对照文档: + - [`tasks/pbf/NavSea_语义图标替换表-v2.md`](/root/sourceserver/pbf/tasks/pbf/NavSea_语义图标替换表-v2.md) +- 用途: + - 直接查看“旧 sprite 名称 -> 当前语义图标名称” + - 不用再先翻 `navsea_semantic_icon_map_v1.json` +- 文档内容分两部分: + - 旧 `symbol-daytime-* / arc-daytime-* / light-daytime-* / tidespot-daytime` 到当前语义名称的主对应表 + - 旧 style / 兼容别名到当前语义名称的附录对应表 +- 当前已包含 2026-08-06 新补的灯标专用 variant: + - `symbol-daytime-311350 -> light_beacon_port_lateral_variantt_311350` + - `symbol-daytime-311351 -> light_beacon_starboard_lateral_variantt_311351` + ### 2026-08-06 当前 Full PBF 与 style 显示消费关系调查 - 调查对象:`/home/wwwroot/pbf-delivery-full-20260418-rebuild`,共 `65148` 张 PBF;对照当前 Full extent-fix / semantic-extent-fix style。 @@ -146,6 +321,8 @@ ### 2026-08-06 Full style 灯弧 sprite 调查 +> 本节为 2026-08-06 的初步调查;其中“当前只需四种 arc”的判断已由 2026-08-08 旧版编码复核结果修正。 + - 当前 Full style 的 `nav-light-arc` 实际只引用 4 个 `arc-daytime-*`: - `arc-daytime-m1`:绿色环 - `arc-daytime-m2`:红色环 @@ -185,6 +362,8 @@ ### 2026-08-06 语义 Full 基线 arc / symbol sprite 重新盘点 +> 本节中的 arc 删除候选结论已被 2026-08-08 的旧版角度编码调查取代;symbol 盘点仍有效,arc 不再按四类判断。 + - 唯一基线:`style.navsea-delivery-full-semantic-extentfix.json` + `/newpec/sprite-semantic/sprite` + `pbf-delivery-full-20260418-rebuild`。 - `arc-*`:semantic sprite 共 `255` 个;当前 style 明确引用并实际需要 `4` 个:`arc-daytime-04027289`、`arc-daytime-m1`、`arc-daytime-m2`、`arc-daytime-m3`。PBF 不直接携带 `arc-*` 图片名,灯弧由 style 根据灯标属性选择。其余 `251` 个是当前基线的删除候选,但删除前需确认旧 semantic style 不再使用同一 sprite。 - `symbol-*`:semantic sprite 共 `171` 个;当前基线实际活跃集合约 `42` 个,来源分三类: @@ -2355,3 +2534,239 @@ - native geometry audit:extent 与当前 raw source 不一致 0,未修复 0;报告中的 outside-extent 是当前既有坐标溢出表现,且对象审计确认本次没有新增几何变化。 - 博多/唐津 z10、z12 浏览器视觉截图已完成;左右差异较大主要来自原始 newpec 底图与 delivery 海图样式本身不同,不能单独作为图标替换失败依据。 - 机器可复现入口:`navsea_build_kyushu_semantic_icon_test.py`;对象审计入口:`navsea_audit_kyushu_semantic_icon_test.py`。 + +## 2026-08-10 福冈湾 20 海里 NewPec / MSIL PBF 左右对比页 + +- 用户明确要求新增福冈湾对比页;不替换既有唐津 20 海里视觉基线页面。 +- 已新增可复现部署脚本:`navsea_build_msil_fukuoka_compare_assets.py`。 + - 左侧从 `/mnt/sda1/www/newpec/style.json` 派生,仅保留 `newpec` 矢量层,并固定为本机已缓存、覆盖福冈湾 20 海里完整范围的 `newpec-mvt-20251001` z9 瓦片;上游原始瓦片端点对本机返回 403,因此不依赖上游在线权限。 + - 右侧从 `/root/sourceserver/seaknow/msil_sprite_style_v1/msil_fukuoka_standalone_style.json` 派生,复用建议的旧 NewPec sprite 键和 glyphs;MSIL 4848 张 PBF 瓦片、范围 GeoJSON 与 manifest 部署到 `/mnt/sda1/www/newpec/msil-fukuoka-20nm/`。 +- 已新增并部署页面: + - 源文件:`src/pbf/navsea-compare-fukuoka-20nm-msil.html` + - URL:`http://192.168.200.184/newpec/navsea-compare-fukuoka-20nm-msil.html` + - 页面版本:`fukuoka-20nm-msil-v1-20260810-r1` + - 左右同步平移/缩放,均叠加 MSIL 的真实 20 海里范围线,支持点击查看渲染层、source-layer 与原始属性。 +- 已验证页面、左右样式、MSIL z9 瓦片和范围 GeoJSON 的 HTTP 状态均为 200;MSIL 样式引用的所有 source-layer 都在 manifest 中,且 manifest 的所有非空层均被样式引用。 +- 后续用户反馈首版双侧内容未显示;已将页面更新为 `fukuoka-20nm-msil-v1-20260810-r3`: + - 左侧直接改用 `style.navsea-newpec-kyushu-icon-test-v1.json`,与 `navsea-compare-kyushu-semantic-icon-v1.html` 左侧完全一致。 + - 右侧改为该已验证样式的 GSI 陆地底图层,加上 MSIL 29 个海图渲染层;不再使用首版自行裁剪的左侧样式。 + - MSIL PBF 已完整复制到 `/mnt/sda1/www/newpec/msil-fukuoka-20nm/pbf/`,z8/z9 均已直接解码核验含有对象。 +- 用户仍反馈右侧空白后,页面已更新为 `fukuoka-20nm-msil-v1-20260810-r4`:右图先加载与左图相同的已验证 NewPec 基线样式,运行时隐藏其 `newpec` 对象层,再动态注入 MSIL source 与 29 个图层。这样右图底图链路与左图一致,同时避免独立 style 在浏览器端整体失效;若某 MSIL source/layer 注册失败,会直接显示在页面状态栏。 +- 用户反馈右侧等深线不明显后,页面已更新为 `fukuoka-20nm-msil-v1-20260810-r5`:在原 `msil-depth-contour` 之上增加无属性依赖的 `msil-depth-contour-strong` 高对比蓝色线层(z8 线宽 1.5px,z10 2.2px),保证当前 20 海里视角下的 MSIL 水深线可见。 + +## 2026-08-10 福冈湾 MSIL 对比页 sprite 与渔网样式修复 + +- 确认右侧 PBF 实际包含 `depth_contour=58`、`fixed_fishery_area=3`、`fishing_port_area=38`,问题不是 PBF 数据缺失。 +- 确认原右侧基底 style 引用的 `/newpec/sprite/sprite` 在服务器上缺少标准 `sprite.json/png`,实际返回 404;这会导致图标和填充纹理无法加载。 +- 已将右侧 MSIL style 改为使用已部署且可访问的 `/newpec/sprite-semantic/sprite`。 +- 已将 `fixed_fishery_area` 从低透明度纯色面改为 `fill-daytime-900` 定置渔业网格纹理,并保留边界线;等深线继续使用无 sprite 依赖的高对比线层。 +- 更新页面版本为 `fukuoka-20nm-msil-v1-20260810-r6`,并重新部署 HTML、style 与 MSIL 静态资源。 +- 已验证 sprite JSON/PNG、style、页面和目标 PBF URL 均返回 HTTP 200。 + +## 2026-08-10 福冈湾 MSIL 等深线运行时显式显示修复 + +- 用户最新截图确认右侧仍没有等深线;复核后确认等深线 GeoJSON 覆盖 `129.9008–130.4853E / 33.5224–33.9370N`,当前中心点在覆盖范围内,PBF z8/z9/z10 均实际含 `depth_contour` 线。 +- 对比页升级为 `fukuoka-20nm-msil-v1-20260810-r7`。 +- 右侧运行时现在先注册一个独立的 `msil-depth-contour-visible` PBF 线层,固定 `minzoom=0`、高对比蓝色、4px 宽度和圆角,绕过原按深度表达式的渲染不确定性;原 MSIL 等深线层不再重复注入。 +- 已重新部署对比页,等待浏览器强制刷新后复核实际画面。 + +## 2026-08-10 福冈湾 MSIL 等深线数字与左侧样式对齐 + +- 对照左侧 `L海底地形` style,确认左侧有独立的沿线数字标注层;右侧原先只有线层,没有数字标注。 +- 右侧 PBF 的深度字段为 `depth_m` / `Depth`,已新增 `msil-depth-contour-label`,按 `depth_m` 沿等深线显示数字,并设置字体、间距、黑色文字和白色描边。 +- 等深线颜色和线宽也按可用的 20m / 50m 深度值重新设置;当前 MSIL PBF 本身只有 20m 与 50m 等深线,不包含左图中的 40–52m 每米级等深线。 +- 对比页更新为 `fukuoka-20nm-msil-v1-20260810-r8`,已重新生成并部署,页面 HTTP 200。 + +## 2026-10-05 Style Visual Object Tool / CM95 Layer Assignment v1 + +- 新建独立工具目录:`tools/style-visual-object/`,README 固定 Provider-neutral 原则:先生成 Anonymous Visual Object,再与冻结的 NavSea Standard Visual Object 比较,最后才允许赋标准 Layer 名;`source-layer`、Provider 名称和私有字段只能作为 provenance/audit,不能作为匹配依据。 +- 当前 NavSea Standard 基线由 `https://pbf.jpcn.ccwu.cc/style/style.navsea-delivery-full-semantic-extentfix.json` + 对应 Sprite 生成: + - `40` 个匿名 group; + - `143` 个 Visual Object; + - `99` 个 Sprite-backed Visual Object; + - `4` 个动态/未完全展开对象; + - Style SHA256:`18b32ad1ea2d3798000abe21406d2f2a5225968910aed48d7ca5b1a1cb7f3ce6`; + - Standard Catalog:`tools/style-visual-object/output/navsea-standard/standard-catalog.json`,状态 `FROZEN`。 +- CM95 使用 `http://192.168.200.184:18889/s52/full-style.json` + Sprite 独立生成 Anonymous Catalog: + - `27` 个匿名 group; + - `3699` 个 Visual Object; + - `3595` 个 Sprite-backed Visual Object; + - 当前 Style 正向可达视觉资源 `150` 个; + - Style SHA256:`6c25ce3e5c1db65060be01ca899acf7f49228fb2277572dc1868c3d34019d4b0`。 +- 修正了 Visual Object 提取规则:`!match`、`!=` 等排除条件中的值不得误收为正向候选;Sprite atlas 中存在但 Style 没有正向可达路径的资源不得进入 Anonymous Catalog。 +- CM95 Layer Assignment 采用实际视觉共同性复核,不使用 CM95 source-layer 名称: + - reviewed visual anchors 共 `88` 个:MATCH `9`、PARTIAL `74`、AMBIGUOUS `5`; + - 资源级剩余 UNKNOWN `62` 个; + - occurrence 级总 Visual Object `3699`; + - 唯一标准 Layer 已命名 `2224`(`60.12%`); + - MATCH `152`、PARTIAL `2072`、AMBIGUOUS `140`、UNKNOWN `1335`; + - Sprite-backed 对象唯一 Layer 命名率 `61.86%`。 +- 已唯一命名的标准 Layer 包括: + - `navigation_marks` + - `anchorage_point` + - `facility_boundary_point` + - `pilot_station_point` + - `onshore_structure_point` + - `clip_outline_754` +- 已确认两类正式视觉歧义: + - `navigation_hazard_point / anchor_caution_hazard_point`:NavSea Standard 本身复用相同危险物视觉图形,不能只靠 Visual Object 二选一; + - `navigation_marks / onshore_structure_point`:部分塔体/杆状图形仅靠视觉不能唯一判断。 +- 已禁止“一个匿名 group 命中某 Layer 后整组继承”的做法;实际 CM95 Style 中多个 group 同时允许多个视觉家族,Layer Assignment 必须以单个 Visual Object / Visual Resource 为基本单位。 +- 正式状态固定为 `MATCH / PARTIAL / AMBIGUOUS / UNKNOWN`,UNKNOWN 与 AMBIGUOUS 都是合法结果,不为提高覆盖率而猜测。 +- 主要输出: + - `tools/style-visual-object/output/cm95-anonymous/anonymous-catalog.json` + - `tools/style-visual-object/output/cm95-visual-anchor-match/reviewed-anchors-v1.json` + - `tools/style-visual-object/output/cm95-layer-assignment/cm95-layer-assignment-v1.json` + - `tools/style-visual-object/output/cm95-layer-assignment/cm95-layer-assignment-v1.csv` + - `tools/style-visual-object/output/cm95-layer-assignment/cm95-layer-assignment-v1.html` + - `tools/style-visual-object/output/CM95_Visual_Object_Layer命名报告_v1.md` + +## 2026-10-05 CM95 Visual Object 人工确认 UI v1 + +- 在 `tools/style-visual-object/reviewer/` 新增本地 Web Reviewer: + - `review_server.py` + - `web/index.html` + - `web/app.js` + - `web/style.css` +- Reviewer 当前覆盖 CM95 Anonymous Catalog 中 `150` 个 Style 正向可达唯一视觉资源,按匿名 Visual Object ID 排队人工确认。 +- 主审查界面默认不返回/不显示 CM95 `resource_key`、`source-layer`、Style Layer id 或 Provider provenance;只有用户主动展开“审计信息”后才通过独立 API 读取,避免人工判断被已有名字带偏。 +- 右侧使用冻结的 NavSea Standard Visual Object Catalog 作为只读参考: + - 可显示 Standard Visual Object 候选图; + - 可打开完整 Standard 视觉资源库; + - 标准 Layer 选择覆盖冻结 Catalog 中全部 `35` 个 Layer,不要求该 Layer 必须有独立 Sprite。 +- 人工状态固定为 `MATCH / PARTIAL / AMBIGUOUS / UNKNOWN`: + - MATCH / PARTIAL:只能选择 1 个标准 Layer; + - AMBIGUOUS:至少选择 2 个标准 Layer; + - UNKNOWN:不选择 Layer。 +- Reviewer 支持: + - 未确认 / 全部 / MATCH / PARTIAL / AMBIGUOUS / UNKNOWN 筛选; + - 前后切换; + - 键盘快捷键 M / P / A / U、左右方向键和 Enter; + - Standard Visual Object 候选选择; + - 完整 Standard 库浏览; + - 备注; + - 撤销当前人工决定; + - 进度统计; + - 主动展开原始审计 provenance。 +- 人工决定增量保存到: + - `tools/style-visual-object/output/cm95-manual-review/manual-review-v1.json` +- “生成当前人工确认结果”只消费人工决定;未人工确认项保持 UNKNOWN,不继承机器建议。输出到: + - `tools/style-visual-object/output/cm95-manual-review/reviewed-anchors-manual-v1.json` + - `tools/style-visual-object/output/cm95-manual-review/assignment/` +- Reviewer 不修改: + - 冻结 NavSea Standard Catalog; + - CM95 Anonymous Catalog; + - 原辅助建议 `reviewed-anchors-v1.json`。 +- 本机服务已在 `0.0.0.0:18083` 启动并完成 HTTP/API/Sprite smoke check: + - 首页 HTTP 200; + - `/api/bootstrap` 返回 150 个匿名资源、35 个标准 Layer; + - CM95 / Standard Sprite 裁剪接口 HTTP 200; + - 主 API 已确认不含 CM95 原始 resource key / provenance。 + +## 2026-10-05 Reviewer 中文名称补充 v1 + +- 新增 `tools/style-visual-object/build_reference_names.py`。 +- 生成 `tools/style-visual-object/output/reference-name-enrichment-v1.json`。 +- CM95 当前 150 个 Style 正向可达视觉资源已全部获得中文显示名: + - 英文说明优先来自当前 CM95 仓库的 S-52 symbol / line / area-pattern metadata; + - 中文名为工程显示译名; + - 原始 S-52 英文 description 保留并在 UI 中作为辅助信息显示。 +- NavSea Standard 当前 96 个 Sprite-backed Visual Object 已全部获得中文显示名;标准 Layer 同时提供中文名。 +- Reviewer 已调整: + - 左侧优先显示 CM95 中文名称; + - S-52 英文 description 作为辅助小字; + - 已有视觉建议显示“标准对象中文名 + 标准 Layer 中文名 + 原始 Layer ID”; + - Standard 候选卡片和 Standard Library 优先显示中文名,资源 key 降为小字; + - Layer 选择器优先显示中文 Layer 名,同时保留原始 Layer ID。 +- 中文名称只用于 UI enrichment,不参与 Visual Matcher、自动聚类或 Layer Assignment。 +- Reviewer 重新启动于 `0.0.0.0:18083`,已验证: + - `/api/bootstrap` 返回 150 个带中文名的 CM95 匿名对象; + - 35 个标准 Layer 均有中文名; + - 96 个 Standard Visual Object 均有中文名; + - 首页与 JS HTTP 200。 + +## 2026-10-05 Reviewer 宽屏布局调整 v2 + +- 根据人工确认实际操作调整 Reviewer 宽屏布局。 +- 当前宽屏主工作区固定为:CM95 当前对象 / NavSea Standard 竖排候选 / 右侧人工判断。 +- Standard 候选改为单列竖排卡片,在候选区内部滚动。 +- 人工判断从页面底部移动到右侧固定区;状态按钮、Layer、Standard Visual Object、备注和保存操作均保持在同一视口。 +- 标准 Layer 列表改为人工区内部滚动,保存按钮固定保留可见。 +- 左侧队列继续独立滚动;主页面宽屏禁止纵向滚动。 +- 使用 Chrome Headless 1900×1080 实际截图验收:布局正常,主确认操作无需页面滚动。 + +## 2026-10-05 Reviewer Layer-only 人工命名 v1 + +- 确认外部 S-52/CM95 Visual Object 可能多于 NavSea Standard Visual Object 图标库。 +- Reviewer 新增“没有对应标准图标,只确认所属 Layer”操作。 +- Layer-only 保存规则: + - 保留人工选择的唯一 Standard Layer; + - `standard_resource_key = null`; + - `assignment_mode = LAYER_ONLY`; + - 默认按 PARTIAL 表达“Layer 已确认但没有一一对应的标准图标”。 +- 有对应标准图标的人工确认记录为 `assignment_mode = VISUAL_OBJECT_MATCH`。 +- 没有对应标准图标不再作为 UNKNOWN 的充分理由;只有连标准 Layer 都无法判断时才保持 UNKNOWN。 +- 本次服务重启后已确认既有人工进度完整保留:47/150(MATCH 4、PARTIAL 41、AMBIGUOUS 2、UNKNOWN 0)。 + +## 2026-10-05 Reviewer COMPONENT 状态 v1 + +- 人工确认状态由四态扩展为五态:`MATCH / PARTIAL / AMBIGUOUS / COMPONENT / UNKNOWN`。 +- `COMPONENT` 用于明确“当前图形只是完整 Visual Object 的组成部分”,不单独分配标准 Layer。 +- COMPONENT 保存规则: + - `standard_layers = []`; + - `standard_resource_key = null`; + - `assignment_mode = COMPONENT_ONLY`; + - 可选 `component_kind`。 +- 可选组件类型: + - `topmark` 顶标; + - `buoy_body` 浮标主体; + - `beacon_body` 立标主体; + - `light` 灯光; + - `auxiliary_mark` 附加标记; + - `fill_pattern` 面填充图案; + - `line_pattern` 线型图案; + - `text` 文字; + - `other` 其他组件。 +- Reviewer UI 新增: + - 顶部 COMPONENT 筛选; + - 人工判断 COMPONENT 按钮; + - 选择 COMPONENT 后显示“组件类型”选择,并隐藏标准 Layer / Standard Visual Object 区; + - 快捷键 `C`。 +- 最终 `apply_reviewed_layer_assignment.py` 已支持 COMPONENT:不会误算为 UNKNOWN,也不会产生 Layer;JSON/CSV/HTML 汇总均保留 COMPONENT 与 `component_kind`。 +- smoke test:将未确认对象临时保存为 `COMPONENT + topmark` 后再撤销,确认 `assignment_mode=COMPONENT_ONLY`,现有 47 条人工确认完整保留。 +- 临时 Assignment smoke test:`BOYGEN03` 设为 COMPONENT 后,28 个 occurrence 均输出 COMPONENT,Layer 为 null,`component_kind=buoy_body`。 +- 1900×1080 Chrome Headless 实际截图确认:五个状态按钮、35 个 Layer、Layer-only 操作及底部“保存并下一个 / 仅保存 / 撤销”均在同一屏可见。 + +## 2026-10-05 Reviewer 最可能候选与宽度调整 v1 + +- 左侧当前 CM95 Visual Object 区进一步收窄,中间 NavSea Standard 视觉候选区扩大。 +- 新增 UI-only“最可能”候选: + - 视觉相似度权重 0.62; + - 中文显示名相似度权重 0.38; + - 已有 reviewed visual suggestion 对相同 Standard Visual Object 追加 0.16,对同一 Layer 追加 0.08。 +- 候选按综合参考分排序;第一名中文名称标红并显示“最可能”。 +- 候选同时显示视觉分与综合参考分;低分不会隐藏,避免误导。 +- 此推荐只用于 Reviewer UI,不自动选择、不写人工决定、不参与最终 Layer Assignment。 +- 实测样例:`海草/海带` 的最可能候选为 `海草`,视觉约 68.9%,中文文字相似度 85%,综合约 75.0%。 +- 1800×1080 Chrome Headless 实际截图确认:左侧缩窄、中间候选加宽、红色最可能提示、35 个 Layer 与底部保存按钮均保持同屏。 + +## 2026-10-06 Reviewer 转为 NavSea Layer 分类确认台 v1 + +- 明确当前工作的最终目的:将 CM95/其他 Provider PBF 对象分类到现有 NavSea Standard Layer,而不是寻找一一对应的 NavSea 图标。 +- 通用 `Style Visual Object Tool` 边界保持不变:只负责 `Style + Sprite → Anonymous Visual Object`,不使用 NavSea Layer 或 Provider 语义。 +- 新增 CM95 Provider Layer Classifier 声明规则:`tools/style-visual-object/cm95_semantic_layer_rules_v1.json`。 +- Classifier 使用 S-52 metadata 官方英文 description + 中文显示名 + 实际视觉证据生成 NavSea Layer 建议;CM95 source-layer 仍不参与分类。 +- Reviewer UI 调整: + - 左侧新增醒目的 `S-52 对象大类`、中文解释和语义理由; + - 中间主区域由“视觉候选”改为 `NavSea Layer 建议`; + - Layer 建议显示综合分、语义分、视觉分和理由; + - 第一候选标红并显示“最可能”; + - Standard Visual Object 图标候选降为折叠的辅助参考区; + - 点击 Layer 建议只选择 Layer 并进入待确认状态,不自动保存。 +- 普通 `tower` 与 `beacon tower` 已定向验证: + - `tower, black/white, full-chart and simplified` → `onshore_structure_point`,语义 97%,综合约 84%; + - 视觉上更像 `navigation_marks` 的证据仅作为低权重辅助,不再主导分类; + - `beacon tower` → `navigation_marks`。 +- `topmark` 定向验证:Classifier 明确提示 `COMPONENT / topmark`,不要求单独分配最终 Layer。 +- 现有人工结果没有被自动覆盖;截至页面验收时进度为 118/150。 +- 1800×1080 Chrome Headless 页面验收通过:Layer 建议为中间主内容,Standard Visual Object 参考默认折叠,右侧 35 个 Layer 和保存按钮同屏可见。 diff --git a/coastline/NavSea_Task_Japan_Coastline_Grid_codex6.md b/coastline/NavSea_Task_Japan_Coastline_Grid_codex6.md new file mode 100644 index 0000000..6832f2e --- /dev/null +++ b/coastline/NavSea_Task_Japan_Coastline_Grid_codex6.md @@ -0,0 +1,581 @@ +# NavSea 任务说明(codex6 / V11) + +## 任务名称 +日本全国海岸线硬阻塞栅格预处理(GSI 基盤地図情報版) + +## 任务编号 +NAVSEA-TASK-COASTLINE-GRID-JP-001 + +## 任务状态 +待实现 + +## 任务目标 +基于日本国土地理院(GSI)提供的**基盤地図情報(FGD)海岸线数据**,构建一套可离线预处理的日本全国海域**200m × 200m 硬阻塞栅格底库**,供 NavSea 路由系统直接使用。 + +本任务只解决以下问题: +- 将日本陆地 / 海岸线转化为路由可直接查询的硬阻塞格网; +- 为后续叠加浅滩、禁航区、桥梁净空、港内限制区等语义层提供统一栅格基底; +- 避免运行时直接依赖 MapLibre 的 MVT/PBF 做判障。 + +本任务**不**解决以下问题: +- 不生成可显示用的地图瓦片; +- 不替代官方航海图或 ENC; +- 不在本阶段判断“安全可航行水深”; +- 不在本阶段实现潮汐相关动态可航行性; +- 不在本阶段实现最终航线规划器。 + +--- + +## 业务背景 +当前 NavSea 项目中的 PBF 为 **MapLibre 使用的矢量瓦片 PBF(MVT)**,适合显示,不适合作为全国统一的分析型原始数据库直接做路径判障。 + +因此需要额外建立一套**Routing Grid 预处理管线**: + +```text +GSI 海岸线 / 其他航海语义数据 +-> 几何清洗与统一投影 +-> 障碍膨胀(buffer) +-> 200m fishnet 栅格化 +-> 二进制 / 分块索引输出 +-> NavSea 路由核心直接查询 +``` + +本任务是该预处理体系中的第一阶段: + +> 先用官方海岸线把“陆地绝对不可通行”这件事做对。 + +--- + +## 数据来源与现实约束 + +### 主数据源 +日本国土地理院(GSI)基盤地図情報(FGD)中的海岸线数据。 + +已确认事实: +- GSI 基盤地図情報站点明确列出“海岸線”为可下载项; +- 下载服务需要用户注册并登录; +- 海岸线属于基盤地図情報的法定基础项之一; +- 精度说明为:城市区域约 1:2500 级别,其它区域约 1:25000 级别; +- 下载服务提供 JPGIS(GML)形式; +- 提供文件按区域网格切分,文件命名规则中 `ss=02` 对应海岸线。 +- 已经下载在目录里了。 + +### 备选/补充数据源 +国土数值信息(KSJ)海岸线数据可作为补充属性源,但其页面说明: +- 最新数据作成年度为 2006 年度; + + +### 使用约束 +本任务默认目标是: +- 在 NavSea 内部离线预处理使用; +- 不在仓库中直接提交受许可限制的原始 GSI 数据; +- 原始下载数据路径加入 `.gitignore`; + + +--- + +## 本任务的成功标准 +完成后,系统应具备以下能力: + +1. 可以从本地 GSI 海岸线原始数据目录读取全国数据; +2. 可以统一转换为 NavSea 内部标准几何坐标体系; +3. 可以生成经过安全膨胀的硬阻塞面; +4. 可以按固定 origin 生成 200m × 200m 的全国海域格网; +5. 可以将与硬阻塞面相交的格子标记为 `hardBlocked = true`; +6. 可以导出供运行时快速查询的二进制结果; +7. 生成过程支持分块处理、断点重建、日志输出与结果校验; +8. 不依赖 MapLibre 前端进行任何运行时几何判障。 + +--- + +## 范围定义 + +### In Scope +- GSI 海岸线数据下载后的本地导入与解析; +- GML -> 内部几何数据转换; +- 海岸线质量检查、闭合/拼接/拓扑清洗; +- 海岸线转陆地硬阻塞面; +- 陆地障碍安全 buffer; +- 全国 200m 栅格生成; +- 格子状态计算; +- 分块导出二进制格网; +- 校验工具与统计输出; +- 针对东京湾 / 大阪湾 / 北海道沿岸的抽样验收。 + +### Out of Scope +- 水深区、浅滩、礁石、干出区、桥梁净空; +- 港口规则、禁航区、养殖区; +- 潮汐动态更新; +- 路由算法本体; +- UI 显示层改造; +- 在线下载 GSI 数据功能。 + +--- + +## 输入与输出定义 + +### 输入 +1. GSI 基盤地図情報原始下载目录(本地,不入库) +2. 配置文件: + - 输入目录 + - 输出目录 + - 目标区域 bbox + - 栅格尺寸(默认 200m) + - 安全 buffer 距离 + - 投影方案 +3. 日本区域边界配置 +4. 船舶安全参数(本任务中仅使用岸线横向安全余量) + +### 输出 +1. `routing-grid-jp-coast-v1.bin` +2. `routing-grid-jp-coast-v1.index.json` +3. `routing-grid-jp-coast-v1.meta.json` +4. 校验报告: + - 总格子数 + - 被阻塞格子数 + - 未知格子数 + - 各分块统计 +5. 抽样 PNG / GeoJSON 调试输出(仅调试用途) + +--- + +## 栅格语义定义 +本任务只定义第一版最小语义: + +```text +CellState: +0 = UNKNOWN +1 = NAVIGABLE_CANDIDATE +2 = HARD_BLOCKED +``` + +说明: +- `UNKNOWN`:未纳入当前处理范围或缺少足够信息; +- `NAVIGABLE_CANDIDATE`:当前阶段未发现岸线硬阻塞,仅表示“未被岸线阻塞”,不代表安全可航行; +- `HARD_BLOCKED`:与陆地 / 经膨胀后的海岸硬阻塞面相交,禁止通行。 + +### 最低字段设计 +建议每个格子最终至少具备以下字段: + +```text +struct CoastGridCellV1 { + uint8 state; // 0 unknown, 1 candidate, 2 hard_blocked + uint8 sourceMask; // bit mask,当前阶段至少标记 GSI_COASTLINE + uint16 blockedPermille; // 0..1000,表示障碍覆盖率千分比 +} +``` + +备注: +- 本阶段不要过早把格式做复杂; +- 允许后续升级到 `GridCellV2/V3` 增加 depth / clearance / risk; +- V11 阶段不得破坏已有读取接口,后续升级采用 wrapper 或版本扩展。 + +--- + +## 技术设计原则 + +### 1. 显示层与路由层分离 +- MapLibre 的 MVT/PBF 继续只服务于显示; +- 路由判障只读取预处理后的 routing grid; +- 不允许运行时对 MVT 做空间判障。 + +### 2. 先建立官方岸线“硬真值基底” +- 以 GSI 海岸线为陆地硬阻塞基线; +- MapLibre 中显示出来的岸线不得反向覆盖 routing 真值; +- 后续其他语义层只能在该基底上叠加,不得削弱陆地阻塞语义。 + +### 3. 所有距离计算使用米制坐标 +- 不允许直接在经纬度下用近似角度长度做 200m 格网; +- 统一先转换到米制坐标后再生成 fishnet; +- 投影方案允许一期先用单一米制投影跑通,后续再按日本区域分带优化。 + +### 4. 禁止中心点判障 +- 不允许只用格子中心点判断是否阻塞; +- 必须按面积相交比例判断; +- 必须支持陆地障碍 buffer 后再相交。 + +### 5. 支持分块处理 +- 日本全国数据不得要求一次性整体载入内存; +- 必须支持按区域块 / tile / mesh 批处理; +- 必须允许断点续跑。 + +### 6. 原始数据不入库 +- 仓库中仅保留导入脚本、格式说明、配置模板; +- 不提交 GSI 原始下载文件; +- 若需要示例数据,仅保留极小匿名/脱敏调试切片(如许可允许)。 + +--- + +## 推荐处理流程 + +### 阶段 A:原始数据导入 +目标:把 GSI 原始 GML 数据转成统一内部几何集合。 + +步骤: +1. 扫描输入目录,识别海岸线数据文件; +2. 解析文件名与区域标识; +3. 读取 GML 几何与属性; +4. 写入中间层(如 GeoPackage / FlatGeobuf / 临时二进制几何块)。 + +产出: +- 标准化海岸线线要素集合; +- 区域索引; +- 导入日志。 + +### 阶段 B:几何清洗与陆地阻塞面构造 +目标:把原始海岸线转换为可用于判障的封闭障碍面。 + +步骤: +1. 统一坐标系; +2. 去除明显坏几何; +3. 线拼接与拓扑清洗; +4. 构造陆地区域面或沿岸阻塞面; +5. 对陆地边界做安全膨胀(buffer)。 + +注意: +- 如果无法全国一次性可靠构造完整陆地面,可采用“海岸线 + 陆地方向约定 + 沿岸膨胀面”作为一期方案; +- 二期再升级为完整 seam-less land polygon。 + +### 阶段 C:生成 200m fishnet +目标:生成路由统一栅格索引。 + +步骤: +1. 确定全国处理范围 bbox; +2. 确定固定 grid origin; +3. 生成 200m × 200m 分块格网; +4. 给每格分配全局 `cellId` 或 `(gx, gy)`。 + +要求: +- origin 固定,保证不同批次重建结果完全一致; +- 必须能按区域分块增量重算。 + +### 阶段 D:格子阻塞判定 +目标:将海岸线障碍面落入格网。 + +推荐规则: + +```text +if blockedOverlapRatio > 0: + state = HARD_BLOCKED +else if insideCoverageArea: + state = NAVIGABLE_CANDIDATE +else: + state = UNKNOWN +``` + +更稳妥的建议: +- 同时记录 `blockedPermille`; +- 若后续发现边缘误判过多,可升级阈值为: + - `> 20‰` 即 hard block; + - 或与 buffer 配合后采用更保守规则。 + +### 阶段 E:导出运行时格式 +目标:让 NavSea 在运行时做到 O(1) 或近 O(1) 查询。 + +建议: +- 按分块导出二进制; +- 使用轻量索引文件记录块范围; +- 运行时只加载当前位置邻近块。 + +--- + +## 推荐目录结构(建议,不强制) + +```text +navsea/ + tools/ + chart-grid-builder/ + src/ + ingest/ + normalize/ + rasterize/ + export/ + validate/ + config/ + scripts/ + README.md + data/ + generated/ + routing-grid/ + docs/ + tasks/ + NAVSEA-TASK-COASTLINE-GRID-JP-001.md +``` + +说明: +- 原始 GSI 数据目录不放入仓库; +- 通过环境变量或本地配置指定; +- 所有新 `.ts/.tsx` 文件必须遵守 NavSea 的 logger 初始化规则。 + +--- + +## 配置建议 + +### 配置文件建议字段 + +```yaml +jobName: jp-coast-grid-v1 +input: + gsiCoastRoot: /local/path/to/gsi/coast +output: + root: /local/path/to/output +region: + bbox: + minLon: 122.0 + minLat: 20.0 + maxLon: 154.0 + maxLat: 46.5 +projection: + mode: metric_projected +grid: + cellSizeMeters: 200 + originX: 0 + originY: 0 +obstacle: + coastBufferMeters: 50 +processing: + chunkSizeMeters: 20000 + resume: true +validation: + sampleAreas: + - tokyo_bay + - osaka_bay + - hokkaido_coast +``` + +备注: +- `coastBufferMeters` 需结合你的船长、定位误差、岸边保守量再定; +- 一期可先用固定值,二期再改成基于船型配置。 + +--- + +## 关键实现要求 + +### 1. 导入器要求 +- 能处理批量 GML; +- 能输出导入统计; +- 能跳过坏文件并记录错误; +- 支持断点续跑。 + +### 2. 几何模块要求 +- 能统一投影; +- 能做拓扑清洗; +- 能做 buffer; +- 能输出调试几何。 + +### 3. 栅格模块要求 +- 使用固定 grid origin; +- 支持按 chunk 生成; +- 可根据 bbox 仅重建局部区域; +- 输出 deterministic 结果。 + +### 4. 导出模块要求 +- 文件格式需带版本号; +- 必须包含元数据文件; +- 元数据至少包含: + - 版本 + - 生成时间 + - 输入数据摘要 + - cellSize + - bbox + - 分块信息 + - 统计信息 + +### 5. 验证模块要求 +- 生成统计摘要; +- 支持抽样区域导出 GeoJSON/PNG 调试图; +- 支持人工核查岸线附近格子是否被正确封堵。 + +--- + +## 验收标准 + +### 功能验收 +1. 可从本地 GSI 数据生成至少一个样例区域的 200m 栅格; +2. 东京湾样例中,陆地区域相邻格子被正确标记为 `HARD_BLOCKED`; +3. 非陆地区域不会被大面积误封; +4. 相同输入重复运行结果一致; +5. 局部重建不会改变未涉及分块结果; +6. 运行时查询不依赖 GSI 原始数据与 MVT。 + +### 数据验收 +1. 输出包含版本与元数据; +2. 统计报告完整; +3. 至少完成三个区域的人工抽样检查: + - 东京湾 + - 大阪湾 / 濑户内海入口 + - 北海道沿岸 + +### 工程验收 +1. 原始下载数据不进入 git; +2. 代码结构符合 V11; +3. 新增 `.ts/.tsx` 文件遵守 logger 初始化规则; +4. 不引入未知依赖; +5. 对外接口保持后续可扩展。 + +--- + +## 风险与应对 + +### 风险 1:海岸线无法直接构造成稳定陆地面 +应对: +- 一期先实现“海岸线 + buffer”阻塞带; +- 二期再升级为完整 land polygon。 + +### 风险 2:全国数据量导致内存占用过高 +应对: +- 强制 chunk 化处理; +- 中间结果写盘; +- 禁止一次性全量几何载入。 + +### 风险 3:投影方案导致边缘区域误差不一致 +应对: +- 一期先统一米制投影跑通; +- 二期再评估按区域分带; +- 元数据中记录投影方案版本。 + +### 风险 4:岸线细节不足导致近岸误判 +应对: +- 记录样例区域误差; +- 后续叠加港口高精层或局部更高精数据; +- 不将 `NAVIGABLE_CANDIDATE` 误解为真实安全通航。 + +### 风险 5:许可边界不清 +应对: +- 明确原始数据不入库; +- 在 docs 中记录数据来源与许可审查待办; +- 若未来要发布生成结果,单独评估。 + +--- + +## 分阶段实施计划 + +### Phase 1:最小可运行样例 +目标:跑通单一区域。 + +交付: +- GSI 海岸线导入器 +- 投影转换 +- 200m 栅格生成 +- `hardBlocked` 判定 +- 东京湾样例输出 + +### Phase 2:全国化与分块化 +目标:支持全国离线构建。 + +交付: +- 分块处理 +- 断点续跑 +- 二进制导出 +- 索引文件 +- 统计报告 + +### Phase 3:质量提升 +目标:提高近岸判障质量。 + +交付: +- 岸线拓扑清洗增强 +- 更稳妥的陆地面构造 +- 局部高风险区域人工校验工具 + +### Phase 4:为后续航海语义层预留接口 +目标:让后续浅滩/限制区/桥梁等数据可无缝叠加。 + +交付: +- `GridCellV2` 设计草案 +- source mask 扩展规则 +- depth / clearance / risk 预留位设计 + +--- + +## 对 Codex 的具体执行要求 + +### 规则 1:遵守 NavSea V11 宪章 +- 不破坏现有架构; +- 不在显示层混入路由判障逻辑; +- 不直接修改 MapLibre 数据消费方式来偷跑此功能; +- 以独立预处理模块实现。 + +### 规则 2:遵守现有协作流程 +- 新文件:由实现方直接给出文件路径和完整代码; +- 旧文件:必须先读取用户提供的当前版本,再给完整替换版本; +- 不只给片段补丁; +- 不臆测未提供的项目结构。 + +### 规则 3:版本标识 +- 每个完整替换文件头部必须带明确版本注释; +- 建议统一使用如 `v11.x-coast-grid` 标识。 + +### 规则 4:日志要求 +- 每个新增 `.ts/.tsx` 文件顶部必须加入 NavSea 规定的 logger 初始化; +- 日志要覆盖:导入、分块处理、异常、统计输出。 + +### 规则 5:不要引入未知重依赖 +- 优先使用现有项目依赖与成熟轻量方案; +- 若确需增加 geospatial 依赖,必须先说明必要性、体积和运行影响。 + +--- + +## 建议的首批交付文件(示意,不代表固定路径) + +```text +/tools/chart-grid-builder/src/config/CoastGridJobConfig.ts +/tools/chart-grid-builder/src/ingest/GsiCoastlineScanner.ts +/tools/chart-grid-builder/src/ingest/GsiCoastlineParser.ts +/tools/chart-grid-builder/src/normalize/CoastlineNormalizer.ts +/tools/chart-grid-builder/src/normalize/CoastObstacleBuilder.ts +/tools/chart-grid-builder/src/rasterize/FishnetGrid.ts +/tools/chart-grid-builder/src/rasterize/CoastGridRasterizer.ts +/tools/chart-grid-builder/src/export/CoastGridBinaryWriter.ts +/tools/chart-grid-builder/src/validate/CoastGridValidator.ts +/tools/chart-grid-builder/src/cli/buildJapanCoastGrid.ts +/docs/tasks/NAVSEA-TASK-COASTLINE-GRID-JP-001.md +``` + +--- + +## 非功能要求 +- 可重复构建; +- 结果确定性; +- 可追踪元数据; +- 支持未来增量升级; +- 输出格式稳定; +- 允许未来按海区局部重建。 + +--- + +## 备注 +1. 本任务是“全国路由底库”的起点,不是最终航海安全判定系统; +2. `NAVIGABLE_CANDIDATE` 只是“未被海岸线阻塞”,不是“确认可安全航行”; +3. 后续必须叠加至少以下层才能形成更可靠的海上路由基础: + - 浅水 / 水深层 + - 干出区 + - 礁石 / 危险物 + - 桥梁净空 + - 禁航区 / 受限区 + - 港内限制区 + - 养殖区 / 网具区 + +--- + +## 参考资料(供实现时核对) +- GSI 基盤地図情報站点:明确基盤地図情報可下载,且需要注册登录。 +- GSI 基盤地図情報说明:海岸线属于法定基础项之一。 +- GSI 下载服务:海岸线为可选下载项。 +- GSI FAQ / Help:下载服务为注册制,基本项下载为 JPGIS(GML)形式。 +- GSI 文件命名规则:提供类编号 `02` 对应海岸线。 +- GSI 数值地图(国土基本信息)说明:城市区域约 1:2500,其它区域约 1:25000 级精度。 +- KSJ 海岸线数据页:可作补充参考,但年度老且页面标示非商用。 + +--- + +## 完成定义(Definition of Done) +当且仅当以下条件同时满足时,本任务可标记完成: + +1. 样例区域可以从 GSI 原始数据成功生成 200m 海岸硬阻塞格网; +2. 全国构建流程可运行并支持分块; +3. 输出带版本号、元数据与统计; +4. 东京湾 / 大阪湾 / 北海道沿岸完成抽样验证; +5. 运行时可仅依赖生成后的 grid 查询,不再读取 GSI 原始数据与 MVT 判障; +6. 实现过程遵守 NavSea V11、codex6、logger、完整替换文件等协作规则。 + diff --git a/coastline/NavSea_Task_Port_Area_Overlay_Classification_codex6.md b/coastline/NavSea_Task_Port_Area_Overlay_Classification_codex6.md new file mode 100644 index 0000000..340aa34 --- /dev/null +++ b/coastline/NavSea_Task_Port_Area_Overlay_Classification_codex6.md @@ -0,0 +1,462 @@ +# NavSea 任务说明(codex6) + +## 任务名称 +港湾区域叠加判定与分级栅格生成(日本全国) + +## 任务编号 +NAVSEA-TASK-PORT-AREA-OVERLAY-CLASSIFICATION-JP-001 + +## 任务类型 +数据预处理 / 路由底库构建 / 港湾语义叠加 + +## 适用架构 +- NavSea Architecture V11 +- NavSea Codex System v6(codex6) + +## 任务背景 +上一阶段任务已确定: +- 使用日本国土地理院(GSI)基盤地図情報中的海岸线数据,作为日本全国海陆边界与硬阻塞判定的基础真值源。 +- 该数据可区分部分海岸线形态,例如通常部、岩等接触部分、堤防等接触部分。 + +但仅靠海岸线数据,不能可靠区分: +- 港口区域内岸线 +- 普通自然海岸线 +- 商港/渔港/人工港湾周边可航行与受限水域 + +因此本任务单独建立“港湾区域叠加判定”模块,用于在既有海岸线硬阻塞格网基础上,叠加港湾区域、港域边界、人工岸线邻接关系,并生成供路由系统使用的港湾语义标签与分级栅格。 + +--- + +## 本任务目标 +构建一套日本全国统一的“港湾区域叠加判定”预处理流水线,实现: + +1. 将港湾区域数据导入并标准化。 +2. 与 GSI 海岸线数据进行空间叠加。 +3. 对海岸线附近及水域格子进行港湾语义分类。 +4. 输出可供 NavSea 路由层直接读取的分级格网标签。 +5. 支持不同区域精度策略: + - 基础全国海域:200m × 200m + - 港湾/近岸重点区:50m × 50m + - 外海区域:50m × 50m(按用户当前要求执行) + +> 注意:本任务不负责显示层渲染,不修改 MapLibre 显示瓦片,不直接修改现有海图展示流程。 + +--- + +## 用户要求(必须满足) + +### 1. 语义要求 +必须能区分至少以下类别: +- 普通海岸线附近水域 +- 港湾区域内水域 +- 港湾区域内人工岸线邻近水域 +- 港湾边界邻近过渡水域 +- 无法判定区域 + +### 2. 精度要求 +必须支持分级网格: +- 日本全国基础层:`200m x 200m` +- 港湾重点层:`50m x 50m` +- 外海区域:`50m x 50m` + +### 3. 架构要求 +必须遵守 NavSea V11 与 codex6 协作规则: +- 不破坏既有架构边界 +- 不把显示层 MVT/PBF 直接当作路由真值源 +- 新增能力应作为独立预处理模块接入 +- 输出独立路由底库,不污染显示数据 + +--- + +## 数据来源 + +### A. 主海岸线真值源 +GSI 基盤地図情報(海岸線) +- C09-06.zip 和 C02-08.zip 港湾和渔港 + +用途: +- 海陆边界 +- 海岸线类型辅助判定 +- 人工岸线/自然岸线邻接判断 + +### B. 港湾语义源 +国土数值信息(KSJ)港湾データ + +用途: +- 港湾区域 +- 港域边界线 +- 港湾名 +- 港湾种别 +- 管理属性(若可用) + +### C. 可选补充源 +仅在后续验证确有需要时引入: +- 渔港数据 +- 河口・運河相关数据 +- 港内限制区/航路数据 +- NavSea 现有矢量瓦片中的 harbour / pier / breakwater / seawall 图层 + +> 原则:GSI/KSJ 优先作为判定真值,MapLibre MVT 仅作补充,不反客为主。 + +--- + +## 最终输出目标 + +输出一套供 NavSea 路由模块使用的“港湾区域叠加语义格网”。 + +### 目标输出一:统一分类格网 +每个格子至少要包含以下字段: + +```ts +export type PortOverlayCell = { + gridLevel: 50 | 200; + cellId: string; + bbox: [number, number, number, number]; + insidePortArea: boolean; + nearPortBoundary: boolean; + nearArtificialCoast: boolean; + nearGeneralCoast: boolean; + classification: + | "PORT_WATER" + | "PORT_COAST" + | "GENERAL_COAST" + | "PORT_TRANSITION" + | "OPEN_WATER" + | "UNKNOWN"; + sourceMask: number; + confidence: number; +}; +``` + +### 目标输出二:供路由使用的轻量索引 +建议生成: +- `routing-port-overlay-japan-v1.bin` +- `routing-port-overlay-japan-v1.index.json` +- 或按区域分块的二进制 tile/chunk 文件 + +### 目标输出三:验证样本 +至少输出以下区域的可视化验证结果: +- 东京湾 +- 大阪湾 +- 濑户内海重点港区 +- 北海道沿岸样本区 + +--- + +## 核心判定模型 + +### 一、基础分类目标 +必须至少实现以下 6 类: + +```text +PORT_WATER 港湾区域内一般水域 +PORT_COAST 港湾区域内且邻近人工岸线/码头/护岸的水域或格子 +GENERAL_COAST 非港湾区域、邻近普通海岸线的水域或格子 +PORT_TRANSITION 港湾边界附近过渡水域 +OPEN_WATER 不属于港湾、也不邻近海岸线的开放水域 +UNKNOWN 数据缺失或冲突无法可靠判定 +``` + +### 二、建议判定逻辑 + +```text +1. 若格子与港湾区域面相交: + -> insidePortArea = true + +2. 若格子落入港湾边界线缓冲区: + -> nearPortBoundary = true + +3. 若格子与 GSI 海岸线相邻,且岸线类型为“堤防等接触部分”或其他人工岸线代理: + -> nearArtificialCoast = true + +4. 若格子与 GSI 海岸线相邻,且岸线类型为通常部/岩等接触部分: + -> nearGeneralCoast = true +``` + +### 三、建议分类优先级 + +```text +if insidePortArea && nearArtificialCoast: + classification = PORT_COAST +elif insidePortArea: + classification = PORT_WATER +elif nearPortBoundary: + classification = PORT_TRANSITION +elif nearGeneralCoast: + classification = GENERAL_COAST +elif not nearGeneralCoast && not insidePortArea: + classification = OPEN_WATER +else: + classification = UNKNOWN +``` + +--- + +## 分级栅格策略(必须执行) + +本任务必须采用分级网格,不允许全国只用单一粒度。 + +### Level 1:全国基础层 +- 网格尺寸:`200m x 200m` +- 用途:全国范围初步港湾语义覆盖 +- 主要服务:大范围路由预筛选、低成本索引 + +### Level 2:重点精细层 +- 网格尺寸:`50m x 50m` +- 必须覆盖: + - 港湾区域 + - 港湾边界缓冲区 + - 海岸线缓冲区 + - 外海区域(按当前用户要求) + +### 精细层触发规则 +建议任一满足即进入 50m 层: +- 进入港湾区域 +- 距离港湾边界小于设定阈值 +- 距离海岸线小于设定阈值 +- 属于外海区域 + +### 注意 +外海区域 50m × 50m 将显著增加数据量和预处理成本。 +因此实现上必须支持: +- 分块构建 +- 分块存储 +- 区域化加载 +- 不能假设全部一次性常驻内存 + +--- + +## 空间处理建议 + +### 1. 投影要求 +不得直接在经纬度下用固定度数近似米网格。 +必须先转换到米制投影后生成格网。 + +建议方案: +- 统一米制投影方案 +- 或按区域分带处理后落格 + +### 2. 缓冲区建议 +建议至少配置以下缓冲: +- 港湾边界缓冲区 +- 海岸线邻接缓冲区 +- 人工岸线增强缓冲区 + +缓冲值不要写死在代码中,必须参数化。 + +### 3. 判定方式 +不允许只使用“格子中心点落入关系”完成判定。 +必须支持至少一种更稳妥方法: +- 面积相交比例 +- 最短距离 +- 缓冲后相交 + +建议组合: +- 面相交用于区域类判断 +- 距离判断用于边界/邻接类判断 + +--- + +## 输出标记建议 + +### A. 供规则引擎读取的主分类 +```ts +export type PortOverlayClass = + | "PORT_WATER" + | "PORT_COAST" + | "GENERAL_COAST" + | "PORT_TRANSITION" + | "OPEN_WATER" + | "UNKNOWN"; +``` + +### B. 供路由代价层使用的附加标签 +```ts +export type PortOverlayFlags = { + insidePortArea: boolean; + nearPortBoundary: boolean; + nearArtificialCoast: boolean; + nearGeneralCoast: boolean; + highConfidence: boolean; +}; +``` + +### C. 供代价映射使用的建议 +```text +PORT_COAST -> 高代价或半禁行 +PORT_WATER -> 中高代价 +PORT_TRANSITION -> 中代价 +GENERAL_COAST -> 中高代价 +OPEN_WATER -> 低代价 +UNKNOWN -> 高代价或待人工确认 +``` + +> 本任务只负责语义输出,不在此任务中写死最终寻路代价函数。 + +--- + +## 推荐目录结构(建议,不强制) + +```text +navsea/ + tools/ + port-overlay-grid-builder/ + README.md + src/ + loaders/ + normalizers/ + classifiers/ + grid/ + exporters/ + config/ + samples/ + data/ + source/ + gsi/ + ksj/ + derived/ + routing-grids/ + validation/ +``` + +--- + +## 模块边界 + +### 本任务负责 +- 港湾数据读取 +- 港湾区域标准化 +- 与海岸线叠加 +- 分级格网生成 +- 分类输出 +- 验证样本输出 + +### 本任务不负责 +- MapLibre 地图显示改造 +- 实时路径搜索算法本体 +- UI 呈现 +- 航道/水深/桥净空等其他语义融合 + +--- + +## 开发阶段拆分 + +### Phase 1:数据审计与标准化 +目标:确认 GSI + KSJ 的字段结构与可用于判定的关键属性。 + +交付物: +- 数据字段审计报告 +- 统一内部字段映射表 +- 样本区域导入脚本 + +### Phase 2:空间叠加与分类规则实现 +目标:实现港湾区域、港湾边界、海岸线邻接的空间判定。 + +交付物: +- 叠加模块 +- 分类模块 +- 样本区验证输出 + +### Phase 3:分级格网与导出 +目标:生成 200m/50m 双层格网输出,并提供路由可读索引。 + +交付物: +- 二进制或分块索引输出 +- 校验脚本 +- 抽样验证报告 + +### Phase 4:NavSea 接入准备 +目标:定义与现有 routing 模块的接入边界。 + +交付物: +- 接口约定文档 +- 数据版本规则 +- 后续融合任务建议 + +--- + +## 验收标准 + +### 必须通过 +1. 能正确导入并读取 GSI 海岸线与 KSJ 港湾数据。 +2. 能完成港湾区域与海岸线的空间叠加。 +3. 能输出六类基础分类结果。 +4. 能生成 200m 与 50m 两级格网。 +5. 能在东京湾与大阪湾样本区输出可人工核查结果。 +6. 输出结构可被后续路由模块直接消费。 + +### 不通过条件 +以下任一成立则视为未完成: +- 仅使用中心点判定 +- 未支持 50m 精细层 +- 未把港湾区域与普通海岸语义分开 +- 结果仍依赖 MapLibre MVT 在线查询 +- 输出格式不能稳定复现 + +--- + +## 风险与注意事项 + +### 1. 港湾数据边界语义可能与显示地图不完全一致 +必须以预处理真值源为准,不以显示层瓦片视觉效果为准。 + +### 2. 50m 全覆盖数据量会很大 +必须分块,不得设计为一次性全量内存方案。 + +### 3. 人工岸线识别可能并不完全等于码头语义 +本任务先实现“人工岸线邻近”判定,不夸大为“所有码头设施已识别”。 + +### 4. UNKNOWN 不能被默认为 OPEN_WATER +对无法确定区域,默认应保守处理。 + +--- + +## 与已有任务关系 +本任务是以下任务的扩展任务: +- 日本全国海岸线硬阻塞栅格生成任务 + +关系说明: +- 前任务解决“海陆边界与硬阻塞真值” +- 本任务解决“港湾区域语义与海岸线语义叠加” +- 后续可继续扩展到: + - 水深层 + - 航道层 + - 港内限制区 + - 桥净空层 + - 养殖区层 + +--- + +## Codex 执行要求 + +### 必须遵守 +1. 所有新文件必须符合 NavSea V11 / codex6 规范。 +2. 新建 `.ts/.tsx` 文件时,必须包含项目约定的 logger 初始化。 +3. 不允许臆测未知项目结构。 +4. 新文件由 AI 提供文件路径和完整代码。 +5. 修改旧文件前,必须先由用户提供原文件内容,再返回完整替换版本。 +6. 不引入未知依赖,不擅自改变既有模块边界。 + +### 输出要求 +后续进入编码阶段时,AI 必须: +- 明确文件路径 +- 提供完整替换内容 +- 在文件头加入清晰版本标注 +- 保持可直接复制使用 + +--- + +## 建议后续子任务 +1. 港湾数据字段审计任务 +2. 海岸线类型归一化任务 +3. 50m/200m 分级格网生成器任务 +4. 港湾叠加分类器任务 +5. 港湾语义验证样本导出任务 +6. Routing 消费接口定义任务 + +--- + +## 一句话定义 +本任务的目标不是“在地图上看起来像港口”,而是: + +**基于官方海岸线与港湾区域数据,为 NavSea 构建可用于路由判断的港湾语义分级格网。** diff --git a/coastline/build_coast_wall_z12_bin.py b/coastline/build_coast_wall_z12_bin.py new file mode 100644 index 0000000..e4807b7 --- /dev/null +++ b/coastline/build_coast_wall_z12_bin.py @@ -0,0 +1,675 @@ +#!/usr/bin/env python3 +from __future__ import annotations + +import argparse +import datetime as dt +import json +import math +import struct +from pathlib import Path +from typing import Iterable + +import pymysql + + +DB_NAME = "navsea_japan_coast_grid" +DB_USER = "root" +DB_PASSWORD = "2chi9ks2" +DB_HOST = "localhost" +DB_SOCKET = "/tmp/mysql.sock" + +ZOOM = 12 +GRID_W = 40 +GRID_H = 40 +CELL_COUNT = GRID_W * GRID_H +BLOCK_SIZE = 32 +SPARSE_THRESHOLD = 96 +MAGIC = b"CWZ12BIN" +VERSION = 1 + +LAYER_20 = "fish_port_20m" +LAYER_50 = "hazard_50m" +LAYER_200 = "coast_200m" +CELL_SIZES = { + LAYER_20: 20.0, + LAYER_50: 50.0, + LAYER_200: 200.0, +} + +RADIUS = 6378137.0 +WORLD_MIN = -math.pi * RADIUS +WORLD_MAX = math.pi * RADIUS +WORLD_SIZE = WORLD_MAX - WORLD_MIN +TILE_COUNT = 1 << ZOOM +TILE_SIZE_M = WORLD_SIZE / TILE_COUNT +Z12_CELL_SIZE_M = TILE_SIZE_M / GRID_W +GLOBAL_CELL_COUNT = TILE_COUNT * GRID_W + +HEADER_STRUCT = struct.Struct("<8sHBBBBBIII") +BLOCK_ENTRY_STRUCT = struct.Struct(" None: + print(f"[{dt.datetime.now().isoformat(timespec='seconds')}] {message}") + + +def mysql_connect(database: str, *, cursorclass=pymysql.cursors.Cursor): + kwargs = { + "host": DB_HOST, + "user": DB_USER, + "password": DB_PASSWORD, + "database": database, + "charset": "utf8mb4", + "cursorclass": cursorclass, + } + if DB_SOCKET: + kwargs["unix_socket"] = DB_SOCKET + return pymysql.connect(**kwargs) + + +def mercator_x(lon: float) -> float: + return RADIUS * math.radians(lon) + + +def mercator_y(lat: float) -> float: + lat = max(min(lat, 85.0511287798066), -85.0511287798066) + return RADIUS * math.log(math.tan(math.pi / 4.0 + math.radians(lat) / 2.0)) + + +def lon_from_mercator(x: float) -> float: + return math.degrees(x / RADIUS) + + +def lat_from_mercator(y: float) -> float: + return math.degrees(2.0 * math.atan(math.exp(y / RADIUS)) - math.pi / 2.0) + + +def parse_bbox(value: str) -> tuple[float, float, float, float]: + parts = [float(part.strip()) for part in value.split(",") if part.strip()] + if len(parts) != 4: + raise argparse.ArgumentTypeError("bbox must be min_lon,min_lat,max_lon,max_lat") + min_lon, min_lat, max_lon, max_lat = parts + if min_lon >= max_lon or min_lat >= max_lat: + raise argparse.ArgumentTypeError("bbox min values must be smaller than max values") + return min_lon, min_lat, max_lon, max_lat + + +def parse_lonlat(value: str) -> tuple[float, float]: + parts = [float(part.strip()) for part in value.split(",") if part.strip()] + if len(parts) != 2: + raise argparse.ArgumentTypeError("query point must be lon,lat") + return parts[0], parts[1] + + +def mercator_bbox_from_lonlat(bbox: tuple[float, float, float, float]) -> tuple[float, float, float, float]: + min_lon, min_lat, max_lon, max_lat = bbox + return mercator_x(min_lon), mercator_y(min_lat), mercator_x(max_lon), mercator_y(max_lat) + + +def rowcol_range_for_bbox( + bbox_mercator: tuple[float, float, float, float], + cell_size_m: float, +) -> tuple[int, int, int, int]: + minx, miny, maxx, maxy = bbox_mercator + col_min = math.floor(minx / cell_size_m) + col_max = math.floor((maxx - 1e-9) / cell_size_m) + row_min = math.floor(miny / cell_size_m) + row_max = math.floor((maxy - 1e-9) / cell_size_m) + return row_min, row_max, col_min, col_max + + +def overlap_range(min_value: float, max_value: float, fine_size_m: float) -> tuple[int, int]: + start = int(math.floor(min_value / fine_size_m)) + end = int(math.floor((max_value - 1e-9) / fine_size_m)) + return start, end + + +def overlaps_finer_cells( + row_idx: int, + col_idx: int, + coarse_size_m: float, + fine_size_m: float, + fine_keys: set[tuple[int, int]], +) -> bool: + min_x = col_idx * coarse_size_m + min_y = row_idx * coarse_size_m + max_x = min_x + coarse_size_m + max_y = min_y + coarse_size_m + row_start, row_end = overlap_range(min_y, max_y, fine_size_m) + col_start, col_end = overlap_range(min_x, max_x, fine_size_m) + for fine_row in range(row_start, row_end + 1): + for fine_col in range(col_start, col_end + 1): + if (fine_row, fine_col) in fine_keys: + return True + return False + + +def pack_tile_id(tile_x: int, tile_y: int) -> int: + if not (0 <= tile_x <= 0xFFF and 0 <= tile_y <= 0xFFF): + raise ValueError(f"tile out of z12 range: {tile_x}, {tile_y}") + return (tile_x << 12) | tile_y + + +def unpack_tile_id(tile_id: int) -> tuple[int, int]: + return tile_id >> 12, tile_id & 0xFFF + + +def pack_cell_id(row: int, col: int) -> int: + if not (0 <= row < GRID_H and 0 <= col < GRID_W): + raise ValueError(f"cell out of tile range: {row}, {col}") + return row * GRID_W + col + + +def pack_block_id(tile_x: int, tile_y: int) -> int: + block_x = tile_x >> 5 + block_y = tile_y >> 5 + return (block_x << 7) | block_y + + +def global_cell_x_range(minx: float, maxx: float) -> tuple[int, int]: + start = math.floor((minx - WORLD_MIN) / Z12_CELL_SIZE_M) + end = math.floor(((maxx - 1e-9) - WORLD_MIN) / Z12_CELL_SIZE_M) + return max(0, start), min(GLOBAL_CELL_COUNT - 1, end) + + +def global_cell_y_range(miny: float, maxy: float) -> tuple[int, int]: + # WebMercator tile rows start at the north edge, while project grid rows use increasing mercator Y. + start = math.floor((WORLD_MAX - maxy) / Z12_CELL_SIZE_M) + end = math.floor(((WORLD_MAX - miny) - 1e-9) / Z12_CELL_SIZE_M) + return max(0, start), min(GLOBAL_CELL_COUNT - 1, end) + + +def add_mercator_rect_to_blocked( + blocked: dict[int, set[int]], + minx: float, + miny: float, + maxx: float, + maxy: float, +) -> int: + gx_start, gx_end = global_cell_x_range(minx, maxx) + gy_start, gy_end = global_cell_y_range(miny, maxy) + added = 0 + for gy in range(gy_start, gy_end + 1): + tile_y = gy // GRID_H + row = gy % GRID_H + for gx in range(gx_start, gx_end + 1): + tile_x = gx // GRID_W + col = gx % GRID_W + tile_id = pack_tile_id(tile_x, tile_y) + cell_id = pack_cell_id(row, col) + cells = blocked.setdefault(tile_id, set()) + before = len(cells) + cells.add(cell_id) + if len(cells) != before: + added += 1 + return added + + +def iter_layer_rows( + conn, + *, + layer_name: str, + bbox_mercator: tuple[float, float, float, float] | None, +): + where = ["layer_name=%s"] + params: list[object] = [layer_name] + if bbox_mercator is not None: + row_min, row_max, col_min, col_max = rowcol_range_for_bbox(bbox_mercator, CELL_SIZES[layer_name]) + where.append("row_idx BETWEEN %s AND %s") + where.append("col_idx BETWEEN %s AND %s") + params.extend([row_min, row_max, col_min, col_max]) + sql = f""" + SELECT cell_id, row_idx, col_idx + FROM navsea_grid_cell + WHERE {' AND '.join(where)} + ORDER BY row_idx, col_idx, source_name + """ + with conn.cursor(pymysql.cursors.SSCursor) as cur: + cur.execute(sql, tuple(params)) + for cell_id, row_idx, col_idx in cur: + yield str(cell_id), int(row_idx), int(col_idx) + + +def source_cell_mercator_bbox(row_idx: int, col_idx: int, cell_size_m: float) -> tuple[float, float, float, float]: + minx = col_idx * cell_size_m + miny = row_idx * cell_size_m + return minx, miny, minx + cell_size_m, miny + cell_size_m + + +def build_blocked_map( + conn, + *, + bbox_mercator: tuple[float, float, float, float] | None, + progress_every: int, +) -> tuple[dict[int, set[int]], dict]: + blocked: dict[int, set[int]] = {} + keys_20: set[tuple[int, int]] = set() + keys_50: set[tuple[int, int]] = set() + seen_20: set[str] = set() + seen_50: set[str] = set() + seen_200: set[str] = set() + + summary = { + "sourceRows": {LAYER_20: 0, LAYER_50: 0, LAYER_200: 0}, + "sourceDistinctCells": {LAYER_20: 0, LAYER_50: 0, LAYER_200: 0}, + "keptByDensity": {"20": 0, "50": 0, "200": 0}, + "skippedByDensity": {"50_over_20": 0, "200_over_20": 0, "200_over_50": 0}, + "blockedCellAdds": {"20": 0, "50": 0, "200": 0}, + } + + log("读取 fish_port_20m;density 规则:20m 永远保留") + for cell_id, row_idx, col_idx in iter_layer_rows(conn, layer_name=LAYER_20, bbox_mercator=bbox_mercator): + summary["sourceRows"][LAYER_20] += 1 + if cell_id in seen_20: + continue + seen_20.add(cell_id) + keys_20.add((row_idx, col_idx)) + summary["sourceDistinctCells"][LAYER_20] += 1 + summary["keptByDensity"]["20"] += 1 + summary["blockedCellAdds"]["20"] += add_mercator_rect_to_blocked( + blocked, + *source_cell_mercator_bbox(row_idx, col_idx, CELL_SIZES[LAYER_20]), + ) + if progress_every and summary["sourceRows"][LAYER_20] % progress_every == 0: + log(f"fish_port_20m rows={summary['sourceRows'][LAYER_20]} kept={summary['keptByDensity']['20']}") + + log("读取 hazard_50m;density 规则:与 20m 重叠则跳过") + for cell_id, row_idx, col_idx in iter_layer_rows(conn, layer_name=LAYER_50, bbox_mercator=bbox_mercator): + summary["sourceRows"][LAYER_50] += 1 + if cell_id in seen_50: + continue + seen_50.add(cell_id) + summary["sourceDistinctCells"][LAYER_50] += 1 + if overlaps_finer_cells(row_idx, col_idx, CELL_SIZES[LAYER_50], CELL_SIZES[LAYER_20], keys_20): + summary["skippedByDensity"]["50_over_20"] += 1 + continue + keys_50.add((row_idx, col_idx)) + summary["keptByDensity"]["50"] += 1 + summary["blockedCellAdds"]["50"] += add_mercator_rect_to_blocked( + blocked, + *source_cell_mercator_bbox(row_idx, col_idx, CELL_SIZES[LAYER_50]), + ) + if progress_every and summary["sourceRows"][LAYER_50] % progress_every == 0: + log(f"hazard_50m rows={summary['sourceRows'][LAYER_50]} kept={summary['keptByDensity']['50']}") + + log("读取 coast_200m;density 规则:与 20m/保留后的 50m 重叠则跳过") + for cell_id, row_idx, col_idx in iter_layer_rows(conn, layer_name=LAYER_200, bbox_mercator=bbox_mercator): + summary["sourceRows"][LAYER_200] += 1 + if cell_id in seen_200: + continue + seen_200.add(cell_id) + summary["sourceDistinctCells"][LAYER_200] += 1 + if overlaps_finer_cells(row_idx, col_idx, CELL_SIZES[LAYER_200], CELL_SIZES[LAYER_20], keys_20): + summary["skippedByDensity"]["200_over_20"] += 1 + continue + if overlaps_finer_cells(row_idx, col_idx, CELL_SIZES[LAYER_200], CELL_SIZES[LAYER_50], keys_50): + summary["skippedByDensity"]["200_over_50"] += 1 + continue + summary["keptByDensity"]["200"] += 1 + summary["blockedCellAdds"]["200"] += add_mercator_rect_to_blocked( + blocked, + *source_cell_mercator_bbox(row_idx, col_idx, CELL_SIZES[LAYER_200]), + ) + if progress_every and summary["sourceRows"][LAYER_200] % progress_every == 0: + log(f"coast_200m rows={summary['sourceRows'][LAYER_200]} kept={summary['keptByDensity']['200']}") + + return blocked, summary + + +def encode_tile_cells(cells: set[int]) -> tuple[int, int, bytes]: + sorted_cells = sorted(cells) + if not sorted_cells: + raise ValueError("empty tile should not be encoded") + if sorted_cells[0] < 0 or sorted_cells[-1] >= CELL_COUNT: + raise ValueError(f"cellId out of range: {sorted_cells[0]}..{sorted_cells[-1]}") + if len(sorted_cells) <= SPARSE_THRESHOLD: + payload = struct.pack(f"<{len(sorted_cells)}H", *sorted_cells) + return 1, len(sorted_cells), payload + words = [0] * 50 + for cell_id in sorted_cells: + word = cell_id >> 5 + bit = cell_id & 31 + words[word] |= 1 << bit + payload = struct.pack("<50I", *words) + return 2, len(sorted_cells), payload + + +def write_bin(path: Path, blocked: dict[int, set[int]]) -> dict: + path.parent.mkdir(parents=True, exist_ok=True) + grouped: dict[int, list[tuple[int, int, int, bytes]]] = {} + sparse_count = 0 + bitset_count = 0 + total_blocked_cells = 0 + + for tile_id in sorted(blocked): + cells = blocked[tile_id] + if not cells: + continue + tile_x, tile_y = unpack_tile_id(tile_id) + encoding, count, payload = encode_tile_cells(cells) + if encoding == 1: + sparse_count += 1 + else: + bitset_count += 1 + total_blocked_cells += count + block_id = pack_block_id(tile_x, tile_y) + grouped.setdefault(block_id, []).append((tile_id, encoding, count, payload)) + + block_ids = sorted(grouped) + block_count = len(block_ids) + block_dir_offset = HEADER_STRUCT.size + tile_dir_offset = block_dir_offset + block_count * BLOCK_ENTRY_STRUCT.size + tile_entry_count = sum(len(grouped[block_id]) for block_id in block_ids) + data_offset = tile_dir_offset + tile_entry_count * TILE_ENTRY_STRUCT.size + + block_entries: list[tuple[int, int, int, int]] = [] + tile_entries_by_block: dict[int, list[tuple[int, int, int, int]]] = {} + data_parts: list[bytes] = [] + current_tile_dir_offset = tile_dir_offset + current_data_offset = 0 + + for block_id in block_ids: + tiles = sorted(grouped[block_id], key=lambda item: item[0]) + block_entries.append((block_id, current_tile_dir_offset, len(tiles), 0)) + current_tile_dir_offset += len(tiles) * TILE_ENTRY_STRUCT.size + tile_entries: list[tuple[int, int, int, int]] = [] + for tile_id, encoding, count, payload in tiles: + tile_entries.append((tile_id, current_data_offset, count, encoding)) + data_parts.append(payload) + current_data_offset += len(payload) + tile_entries_by_block[block_id] = tile_entries + + with path.open("wb") as fh: + fh.write( + HEADER_STRUCT.pack( + MAGIC, + VERSION, + ZOOM, + GRID_W, + GRID_H, + BLOCK_SIZE, + 0, + block_count, + block_dir_offset, + data_offset, + ) + ) + for entry in block_entries: + fh.write(BLOCK_ENTRY_STRUCT.pack(*entry)) + for block_id in block_ids: + for tile_id, offset, count, encoding in tile_entries_by_block[block_id]: + fh.write(TILE_ENTRY_STRUCT.pack(tile_id, offset, count, encoding, 0)) + for payload in data_parts: + fh.write(payload) + + file_size = path.stat().st_size + return { + "file": str(path), + "fileSizeBytes": file_size, + "headerSizeBytes": HEADER_STRUCT.size, + "blockCount": block_count, + "totalBlockedTiles": sparse_count + bitset_count, + "totalBlockedCells": total_blocked_cells, + "sparseTileCount": sparse_count, + "bitsetTileCount": bitset_count, + "blockDirOffset": block_dir_offset, + "dataOffset": data_offset, + "dataBytes": current_data_offset, + } + + +class CoastWallReader: + def __init__(self, path: Path): + self.path = path + self.data = path.read_bytes() + header = HEADER_STRUCT.unpack_from(self.data, 0) + magic, version, zoom, grid_w, grid_h, block_size, _flags, block_count, block_dir_offset, data_offset = header + if magic != MAGIC: + raise ValueError(f"bad magic: {magic!r}") + if version != VERSION or zoom != ZOOM or grid_w != GRID_W or grid_h != GRID_H or block_size != BLOCK_SIZE: + raise ValueError("unsupported coast wall header") + self.block_count = block_count + self.block_dir_offset = block_dir_offset + self.data_offset = data_offset + self.blocks: dict[int, list[tuple[int, int, int, int]]] = {} + for idx in range(block_count): + offset = block_dir_offset + idx * BLOCK_ENTRY_STRUCT.size + block_id, tile_dir_offset, tile_count, _reserved = BLOCK_ENTRY_STRUCT.unpack_from(self.data, offset) + entries: list[tuple[int, int, int, int]] = [] + for tile_idx in range(tile_count): + tile_offset = tile_dir_offset + tile_idx * TILE_ENTRY_STRUCT.size + tile_id, payload_offset, count, encoding, _tile_reserved = TILE_ENTRY_STRUCT.unpack_from(self.data, tile_offset) + entries.append((tile_id, payload_offset, count, encoding)) + self.blocks[block_id] = entries + + def tile_cells(self, tile_id: int) -> set[int]: + tile_x, tile_y = unpack_tile_id(tile_id) + block_id = pack_block_id(tile_x, tile_y) + for entry_tile_id, payload_offset, count, encoding in self.blocks.get(block_id, []): + if entry_tile_id != tile_id: + continue + start = self.data_offset + payload_offset + if encoding == 1: + values = struct.unpack_from(f"<{count}H", self.data, start) + return set(values) + if encoding == 2: + words = struct.unpack_from("<50I", self.data, start) + cells: set[int] = set() + for word_idx, word in enumerate(words): + if not word: + continue + for bit in range(32): + if word & (1 << bit): + cell_id = word_idx * 32 + bit + if cell_id < CELL_COUNT: + cells.add(cell_id) + return cells + raise ValueError(f"unknown encoding: {encoding}") + return set() + + def is_blocked_lonlat(self, lon: float, lat: float) -> bool: + tile_x, tile_y, _row, _col, cell_id = z12_cell_for_lonlat(lon, lat) + tile_id = pack_tile_id(tile_x, tile_y) + return cell_id in self.tile_cells(tile_id) + + +def validate_bin(path: Path, blocked: dict[int, set[int]], sample_tiles: int = 200) -> None: + reader = CoastWallReader(path) + for idx, tile_id in enumerate(sorted(blocked)): + if idx >= sample_tiles: + break + expected = blocked[tile_id] + actual = reader.tile_cells(tile_id) + if actual != expected: + raise RuntimeError(f"reader roundtrip mismatch tile={tile_id}: expected={len(expected)} actual={len(actual)}") + + +def rect_geometry(min_lon: float, min_lat: float, max_lon: float, max_lat: float) -> dict: + return { + "type": "Polygon", + "coordinates": [ + [ + [min_lon, min_lat], + [max_lon, min_lat], + [max_lon, max_lat], + [min_lon, max_lat], + [min_lon, min_lat], + ] + ], + } + + +def z12_cell_bounds(tile_x: int, tile_y: int, row: int, col: int) -> tuple[float, float, float, float]: + minx = WORLD_MIN + (tile_x * GRID_W + col) * Z12_CELL_SIZE_M + maxx = minx + Z12_CELL_SIZE_M + maxy = WORLD_MAX - (tile_y * GRID_H + row) * Z12_CELL_SIZE_M + miny = maxy - Z12_CELL_SIZE_M + return lon_from_mercator(minx), lat_from_mercator(miny), lon_from_mercator(maxx), lat_from_mercator(maxy) + + +def z12_cell_for_lonlat(lon: float, lat: float) -> tuple[int, int, int, int, int]: + x = mercator_x(lon) + y = mercator_y(lat) + gx = math.floor((x - WORLD_MIN) / Z12_CELL_SIZE_M) + gy = math.floor((WORLD_MAX - y) / Z12_CELL_SIZE_M) + if not (0 <= gx < GLOBAL_CELL_COUNT and 0 <= gy < GLOBAL_CELL_COUNT): + raise ValueError(f"lon/lat outside z12 grid: {lon}, {lat}") + tile_x = gx // GRID_W + tile_y = gy // GRID_H + col = gx % GRID_W + row = gy % GRID_H + cell_id = pack_cell_id(row, col) + return tile_x, tile_y, row, col, cell_id + + +def write_debug_geojson(path: Path, blocked: dict[int, set[int]], limit: int) -> int: + path.parent.mkdir(parents=True, exist_ok=True) + count = 0 + with path.open("w", encoding="utf-8") as fh: + fh.write('{"type":"FeatureCollection","features":[\n') + first = True + for tile_id in sorted(blocked): + tile_x, tile_y = unpack_tile_id(tile_id) + for cell_id in sorted(blocked[tile_id]): + row = cell_id // GRID_W + col = cell_id % GRID_W + feature = { + "type": "Feature", + "properties": { + "tile_id": tile_id, + "tile_x": tile_x, + "tile_y": tile_y, + "cell_id": cell_id, + "row": row, + "col": col, + }, + "geometry": rect_geometry(*z12_cell_bounds(tile_x, tile_y, row, col)), + } + if not first: + fh.write(",\n") + fh.write(json.dumps(feature, ensure_ascii=False)) + first = False + count += 1 + if limit and count >= limit: + fh.write("\n]}\n") + return count + fh.write("\n]}\n") + return count + + +def run_self_test() -> None: + assert unpack_tile_id(pack_tile_id(3456, 789)) == (3456, 789) + assert pack_cell_id(39, 39) == 1599 + assert pack_block_id(32, 64) == ((1 << 7) | 2) + sparse_cells = {0, 3, 1599} + encoding, count, payload = encode_tile_cells(sparse_cells) + assert encoding == 1 and count == 3 + assert set(struct.unpack("<3H", payload)) == sparse_cells + dense_cells = set(range(120)) + encoding, count, payload = encode_tile_cells(dense_cells) + assert encoding == 2 and count == 120 and len(payload) == 200 + log("self-test passed") + + +def main() -> None: + parser = argparse.ArgumentParser(description="Build coast_wall_z12.bin from MySQL density-overview grid layers") + parser.add_argument("--db-name", default=DB_NAME) + parser.add_argument("--out", default="out/navmask/coast_wall_z12.bin") + parser.add_argument("--meta-json", default=None, help="默认写到 .meta.json") + parser.add_argument("--debug-geojson", default=None) + parser.add_argument("--debug-limit", type=int, default=5000) + parser.add_argument("--preset", choices=["all", *sorted(PRESET_BBOXES)], default="kyushu") + parser.add_argument("--bbox", type=parse_bbox, default=None, help="min_lon,min_lat,max_lon,max_lat;优先于 --preset") + parser.add_argument("--query", type=parse_lonlat, default=None, help="生成后用 reader 查询一个 lon,lat 点") + parser.add_argument("--progress-every", type=int, default=200000) + parser.add_argument("--self-test", action="store_true") + args = parser.parse_args() + + if args.self_test: + run_self_test() + + bbox_lonlat = args.bbox + if bbox_lonlat is None and args.preset != "all": + bbox_lonlat = PRESET_BBOXES[args.preset] + bbox_mercator = mercator_bbox_from_lonlat(bbox_lonlat) if bbox_lonlat is not None else None + + out_path = Path(args.out) + meta_path = Path(args.meta_json) if args.meta_json else out_path.with_suffix(out_path.suffix + ".meta.json") + + log(f"开始生成 coast wall z12 bin preset={args.preset} bbox={bbox_lonlat}") + conn = mysql_connect(args.db_name) + try: + blocked, density_summary = build_blocked_map( + conn, + bbox_mercator=bbox_mercator, + progress_every=args.progress_every, + ) + finally: + conn.close() + + if not blocked: + raise SystemExit("no blocked cells produced") + + write_summary = write_bin(out_path, blocked) + validate_bin(out_path, blocked) + debug_count = 0 + if args.debug_geojson: + debug_count = write_debug_geojson(Path(args.debug_geojson), blocked, args.debug_limit) + query_result = None + if args.query is not None: + lon, lat = args.query + reader = CoastWallReader(out_path) + tile_x, tile_y, row, col, cell_id = z12_cell_for_lonlat(lon, lat) + query_result = { + "lon": lon, + "lat": lat, + "tile_x": tile_x, + "tile_y": tile_y, + "row": row, + "col": col, + "cell_id": cell_id, + "blocked": reader.is_blocked_lonlat(lon, lat), + } + + meta = { + "generated_at": dt.datetime.now().isoformat(timespec="seconds"), + "db_name": args.db_name, + "preset": args.preset, + "bbox_lonlat": bbox_lonlat, + "zoom": ZOOM, + "grid_w": GRID_W, + "grid_h": GRID_H, + "z12_cell_size_m": Z12_CELL_SIZE_M, + "density_rule": [ + "keep fish_port_20m first", + "keep hazard_50m only when it does not overlap kept fish_port_20m", + "keep coast_200m only when it does not overlap kept fish_port_20m or kept hazard_50m", + ], + "density_summary": density_summary, + "binary_summary": write_summary, + "debug_geojson": args.debug_geojson, + "debug_feature_count": debug_count, + "query_result": query_result, + } + meta_path.parent.mkdir(parents=True, exist_ok=True) + meta_path.write_text(json.dumps(meta, ensure_ascii=False, indent=2), encoding="utf-8") + + log(f"完成 bin={out_path} meta={meta_path}") + log( + "统计 " + f"tiles={write_summary['totalBlockedTiles']} cells={write_summary['totalBlockedCells']} " + f"sparse={write_summary['sparseTileCount']} bitset={write_summary['bitsetTileCount']} " + f"blocks={write_summary['blockCount']} size={write_summary['fileSizeBytes']}" + ) + if query_result is not None: + log(f"query lon={query_result['lon']} lat={query_result['lat']} blocked={query_result['blocked']}") + + +if __name__ == "__main__": + main() diff --git a/coastline/build_fukuoka_saga_coast_grid.py b/coastline/build_fukuoka_saga_coast_grid.py new file mode 100644 index 0000000..8f02787 --- /dev/null +++ b/coastline/build_fukuoka_saga_coast_grid.py @@ -0,0 +1,471 @@ +#!/usr/bin/env python3 +""" +NavSea coastline subset builder v1.0 + +针对 GSI 海岸线数据的福冈 / 佐贺两包(C23-06_40、C23-06_41)生成 +一个可复用的海岸线硬阻塞样例底库: + +1. 解析 GML 曲线 +2. 投影到 Web Mercator 米制坐标 +3. 生成海岸线缓冲区 +4. 生成 200m fishnet +5. 输出 SQLite + GeoJSON + JSON 元数据 + +说明: +- 这是 coastline 全国底库的样例切片,不是最终全国版。 +- 先把福冈 / 佐贺海岸跑通,便于后续扩全国。 +""" + +from __future__ import annotations + +import argparse +import datetime as dt +import json +import math +import sqlite3 +import zipfile +from dataclasses import dataclass +from pathlib import Path +from typing import Iterable +import xml.etree.ElementTree as ET + +from shapely.geometry import LineString, MultiLineString, box, mapping +from shapely.geometry.base import BaseGeometry +from shapely.prepared import prep +from shapely.ops import unary_union + + +RADIUS = 6378137.0 +MAX_MERCATOR_LAT = 85.0511287798066 +NS = {"gml": "http://www.opengis.net/gml/3.2"} + + +@dataclass(frozen=True) +class SourcePackage: + path: Path + prefecture: str + code: str + + +def mercator_x(lon: float) -> float: + return RADIUS * math.radians(lon) + + +def mercator_y(lat: float) -> float: + lat = max(min(lat, MAX_MERCATOR_LAT), -MAX_MERCATOR_LAT) + return RADIUS * math.log(math.tan(math.pi / 4.0 + math.radians(lat) / 2.0)) + + +def mercator_point(lon: float, lat: float) -> tuple[float, float]: + return mercator_x(lon), mercator_y(lat) + + +def align_floor(value: float, step: float) -> float: + return math.floor(value / step) * step + + +def align_ceil(value: float, step: float) -> float: + return math.ceil(value / step) * step + + +def parse_text_list(text: str) -> list[float]: + return [float(part) for part in text.split() if part] + + +def detect_prefecture(meta_xml: str) -> str: + title_start = meta_xml.find("") + if title_start == -1: + return "unknown" + title_end = meta_xml.find("", title_start) + if title_end == -1: + return "unknown" + return meta_xml[title_start + 7:title_end].strip() + + +def load_package(path: Path) -> SourcePackage: + with zipfile.ZipFile(path) as zf: + meta_name = next(name for name in zf.namelist() if "META" in name and name.endswith(".xml")) + meta_xml = zf.read(meta_name).decode("shift_jis", errors="replace") + prefecture = detect_prefecture(meta_xml) + code = path.stem.replace("_GML", "") + return SourcePackage(path=path, prefecture=prefecture, code=code) + + +def iter_coastline_lines(zip_path: Path) -> Iterable[tuple[str, str, LineString]]: + """ + Yield (source_code, curve_id, projected_linestring). + """ + with zipfile.ZipFile(zip_path) as zf: + xml_name = next( + name + for name in zf.namelist() + if name.endswith(".xml") and "META" not in name + ) + root = ET.fromstring(zf.read(xml_name)) + + for idx, curve in enumerate(root.findall(".//gml:Curve", NS), start=1): + curve_id = curve.attrib.get("{http://www.opengis.net/gml/3.2}id", f"curve_{idx:06d}") + coords: list[tuple[float, float]] = [] + for pos_list in curve.findall(".//gml:posList", NS): + if not pos_list.text: + continue + values = parse_text_list(pos_list.text) + if len(values) < 4 or len(values) % 2 != 0: + continue + for i in range(0, len(values), 2): + lat = values[i] + lon = values[i + 1] + x, y = mercator_point(lon, lat) + coords.append((x, y)) + if len(coords) < 2: + continue + yield xml_name, curve_id, LineString(coords) + + +def build_output_dir(path: Path) -> None: + path.mkdir(parents=True, exist_ok=True) + + +def write_geojson(path: Path, features: list[dict]) -> None: + payload = {"type": "FeatureCollection", "features": features} + path.write_text(json.dumps(payload, ensure_ascii=False), encoding="utf-8") + + +def open_sqlite(path: Path) -> sqlite3.Connection: + if path.exists(): + path.unlink() + conn = sqlite3.connect(path) + conn.execute("PRAGMA journal_mode=OFF") + conn.execute("PRAGMA synchronous=OFF") + conn.execute("PRAGMA temp_store=MEMORY") + conn.execute("PRAGMA cache_size=200000") + conn.execute("PRAGMA locking_mode=EXCLUSIVE") + conn.execute("PRAGMA foreign_keys=OFF") + return conn + + +def create_schema(conn: sqlite3.Connection) -> None: + conn.executescript( + """ + CREATE TABLE meta ( + key TEXT PRIMARY KEY, + value TEXT NOT NULL + ); + + CREATE TABLE coastline_feature ( + feature_id INTEGER PRIMARY KEY AUTOINCREMENT, + source_code TEXT NOT NULL, + prefecture TEXT NOT NULL, + curve_id TEXT NOT NULL, + geom_wkt TEXT NOT NULL, + point_count INTEGER NOT NULL, + minx REAL NOT NULL, + miny REAL NOT NULL, + maxx REAL NOT NULL, + maxy REAL NOT NULL + ); + + CREATE TABLE grid_cell ( + cell_id TEXT PRIMARY KEY, + source_code TEXT NOT NULL, + prefecture TEXT NOT NULL, + ix INTEGER NOT NULL, + iy INTEGER NOT NULL, + minx REAL NOT NULL, + miny REAL NOT NULL, + maxx REAL NOT NULL, + maxy REAL NOT NULL, + state INTEGER NOT NULL, + state_name TEXT NOT NULL, + source_mask INTEGER NOT NULL, + blocked_permille INTEGER NOT NULL + ); + + CREATE INDEX idx_grid_cell_state ON grid_cell(state); + CREATE INDEX idx_grid_cell_source ON grid_cell(source_code, prefecture); + """ + ) + + +def main() -> None: + parser = argparse.ArgumentParser(description="Build Fukuoka/Saga coastline hard-blocked grid") + parser.add_argument( + "--input", + dest="inputs", + action="append", + default=[], + help="输入海岸线 GML zip;可重复指定。默认使用 40/41 两个包。", + ) + parser.add_argument( + "--output-dir", + default="out/coastline/fukuoka_saga", + help="输出目录", + ) + parser.add_argument("--cell-size-m", type=float, default=200.0, help="栅格尺寸,默认 200m") + parser.add_argument("--buffer-m", type=float, default=50.0, help="海岸线缓冲距离,默认 50m") + parser.add_argument( + "--margin-cells", + type=int, + default=2, + help="输出范围外扩的格子数,默认 2 个格子", + ) + parser.add_argument( + "--write-geojson", + action="store_true", + help="同时输出 coastlines.geojson 和 grid.geojson", + ) + args = parser.parse_args() + + project_root = Path(__file__).resolve().parent.parent + if args.inputs: + input_paths = [Path(item) for item in args.inputs] + else: + input_paths = [ + project_root / "coastline" / "C23-06_40_GML.zip", + project_root / "coastline" / "C23-06_41_GML.zip", + ] + + packages: list[SourcePackage] = [] + for path in input_paths: + if not path.exists(): + raise SystemExit(f"missing input: {path}") + packages.append(load_package(path)) + + out_dir = Path(args.output_dir) + build_output_dir(out_dir) + + all_lines: list[LineString] = [] + line_features: list[dict] = [] + package_stats: list[dict] = [] + + for package in packages: + line_count = 0 + point_count = 0 + minx = miny = float("inf") + maxx = maxy = float("-inf") + for source_name, curve_id, line in iter_coastline_lines(package.path): + coords = list(line.coords) + point_count += len(coords) + line_count += 1 + xs = [p[0] for p in coords] + ys = [p[1] for p in coords] + minx = min(minx, min(xs)) + miny = min(miny, min(ys)) + maxx = max(maxx, max(xs)) + maxy = max(maxy, max(ys)) + all_lines.append(line) + if args.write_geojson: + line_features.append( + { + "type": "Feature", + "properties": { + "source_code": package.code, + "prefecture": package.prefecture, + "curve_id": curve_id, + "source_xml": source_name, + "point_count": len(coords), + }, + "geometry": mapping(line), + } + ) + + package_stats.append( + { + "source_code": package.code, + "prefecture": package.prefecture, + "zip": str(package.path), + "line_count": line_count, + "point_count": point_count, + "bbox_mercator": [minx, miny, maxx, maxy], + } + ) + + if not all_lines: + raise SystemExit("no coastline curves were parsed") + + coastline_geom = MultiLineString([line.coords[:] for line in all_lines]) + coastline_buffer = coastline_geom.buffer(args.buffer_m, cap_style=2, join_style=2) + prepared_buffer = prep(coastline_buffer) + + coast_bounds = coastline_geom.bounds + minx = align_floor(coast_bounds[0] - args.buffer_m - args.margin_cells * args.cell_size_m, args.cell_size_m) + miny = align_floor(coast_bounds[1] - args.buffer_m - args.margin_cells * args.cell_size_m, args.cell_size_m) + maxx = align_ceil(coast_bounds[2] + args.buffer_m + args.margin_cells * args.cell_size_m, args.cell_size_m) + maxy = align_ceil(coast_bounds[3] + args.buffer_m + args.margin_cells * args.cell_size_m, args.cell_size_m) + + sqlite_path = out_dir / "fukuoka_saga_coast_grid.sqlite" + conn = open_sqlite(sqlite_path) + create_schema(conn) + + build_time = dt.datetime.now().isoformat(timespec="seconds") + source_scope = "福冈/佐贺" + source_code = "C23-06_40+41" + meta_rows = [ + ("build_time", build_time), + ("cell_size_m", str(args.cell_size_m)), + ("buffer_m", str(args.buffer_m)), + ("margin_cells", str(args.margin_cells)), + ("source_scope", source_scope), + ("source_code", source_code), + ("source_count", str(len(packages))), + ("source_packages", json.dumps([stats["zip"] for stats in package_stats], ensure_ascii=False)), + ("coastline_line_count", str(len(all_lines))), + ("coastline_bounds_mercator", json.dumps(coast_bounds, ensure_ascii=False)), + ("grid_bounds_mercator", json.dumps([minx, miny, maxx, maxy], ensure_ascii=False)), + ("notes", "GSI coastline subset for Fukuoka/Saga, generated from C23-06_40/41"), + ] + conn.executemany("INSERT INTO meta(key, value) VALUES (?, ?)", meta_rows) + conn.executemany( + """ + INSERT INTO coastline_feature( + source_code, prefecture, curve_id, geom_wkt, point_count, minx, miny, maxx, maxy + ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?) + """, + [ + ( + package.code, + package.prefecture, + curve_id, + line.wkt, + len(line.coords), + line.bounds[0], + line.bounds[1], + line.bounds[2], + line.bounds[3], + ) + for package in packages + for _, curve_id, line in iter_coastline_lines(package.path) + ], + ) + conn.commit() + + insert_rows = [] + grid_features = [] + blocked_count = 0 + candidate_count = 0 + total_cells = 0 + + ix0 = int(round(minx / args.cell_size_m)) + iy0 = int(round(miny / args.cell_size_m)) + ix1 = int(round(maxx / args.cell_size_m)) + iy1 = int(round(maxy / args.cell_size_m)) + + for ix in range(ix0, ix1): + cell_minx = ix * args.cell_size_m + cell_maxx = cell_minx + args.cell_size_m + for iy in range(iy0, iy1): + cell_miny = iy * args.cell_size_m + cell_maxy = cell_miny + args.cell_size_m + cell = box(cell_minx, cell_miny, cell_maxx, cell_maxy) + intersects = prepared_buffer.intersects(cell) + state = 2 if intersects else 1 + state_name = "HARD_BLOCKED" if intersects else "NAVIGABLE_CANDIDATE" + blocked_permille = 1000 if intersects else 0 + source_mask = 1 + cell_id = f"{ix}:{iy}" + insert_rows.append( + ( + cell_id, + source_code, + source_scope, + ix, + iy, + cell_minx, + cell_miny, + cell_maxx, + cell_maxy, + state, + state_name, + source_mask, + blocked_permille, + ) + ) + total_cells += 1 + if intersects: + blocked_count += 1 + else: + candidate_count += 1 + if args.write_geojson: + grid_features.append( + { + "type": "Feature", + "properties": { + "cell_id": cell_id, + "ix": ix, + "iy": iy, + "state": state, + "state_name": state_name, + "source_mask": source_mask, + "blocked_permille": blocked_permille, + }, + "geometry": mapping(cell), + } + ) + if len(insert_rows) >= 5000: + conn.executemany( + """ + INSERT INTO grid_cell( + cell_id, source_code, prefecture, ix, iy, minx, miny, maxx, maxy, + state, state_name, source_mask, blocked_permille + ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) + """, + insert_rows, + ) + conn.commit() + print(f"已写入格网 {total_cells} 个,blocked={blocked_count} candidate={candidate_count}") + insert_rows.clear() + + if insert_rows: + conn.executemany( + """ + INSERT INTO grid_cell( + cell_id, source_code, prefecture, ix, iy, minx, miny, maxx, maxy, + state, state_name, source_mask, blocked_permille + ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) + """, + insert_rows, + ) + conn.commit() + + conn.execute("ANALYZE") + conn.commit() + + grid_meta = { + "build_time": build_time, + "input_packages": [stats["zip"] for stats in package_stats], + "package_stats": package_stats, + "cell_size_m": args.cell_size_m, + "buffer_m": args.buffer_m, + "margin_cells": args.margin_cells, + "grid_bounds_mercator": [minx, miny, maxx, maxy], + "coastline_feature_count": len(all_lines), + "grid_cell_count": total_cells, + "blocked_count": blocked_count, + "candidate_count": candidate_count, + } + + meta_path = out_dir / "fukuoka_saga_coast_grid.meta.json" + meta_path.write_text(json.dumps(grid_meta, ensure_ascii=False, indent=2), encoding="utf-8") + + if args.write_geojson: + coastline_geojson = out_dir / "fukuoka_saga_coastline.geojson" + write_geojson(coastline_geojson, line_features) + grid_geojson = out_dir / "fukuoka_saga_grid.geojson" + write_geojson(grid_geojson, grid_features) + + conn.close() + + print("完成") + print(f" SQLite: {sqlite_path}") + print(f" 元数据: {meta_path}") + if args.write_geojson: + print(f" 海岸线GeoJSON: {out_dir / 'fukuoka_saga_coastline.geojson'}") + print(f" 栅格GeoJSON: {out_dir / 'fukuoka_saga_grid.geojson'}") + print(f" coastline_features={len(all_lines)}") + print(f" grid_cells={total_cells}") + print(f" blocked={blocked_count}") + print(f" candidate={candidate_count}") + + +if __name__ == "__main__": + main() diff --git a/coastline/build_fukuoka_saga_navgrid_mysql.py b/coastline/build_fukuoka_saga_navgrid_mysql.py new file mode 100644 index 0000000..87874df --- /dev/null +++ b/coastline/build_fukuoka_saga_navgrid_mysql.py @@ -0,0 +1,737 @@ +#!/usr/bin/env python3 +from __future__ import annotations + +import argparse +import datetime as dt +import json +import math +from pathlib import Path +from typing import Callable, Iterable + +import mapbox_vector_tile +import pymysql +from shapely.geometry import box, shape +from shapely.prepared import prep + + +DB_NAME = "navsea_fukuoka_saga_grid" +DB_USER = "root" +DB_PASSWORD = "2chi9ks2" +DB_HOST = "localhost" +DB_SOCKET = "/tmp/mysql.sock" + +COAST_SRC = [ + "coastline/C23-06_40_GML.zip", + "coastline/C23-06_41_GML.zip", +] +FISH_SRC = "coastline/C09-06.zip" +FISH_GRID_SRC = "src/pbf/coastline-only/fukuoka_saga_fish_port_navsplit_20m/fish_port_navsplit_fukuoka_saga_20m_grid.geojson" +COAST_GRID_SRC = "src/pbf/coastline/fukuoka_saga_blocked_cells.geojson" +PBF_TILE_ROOT = Path("/home/wwwroot/pbf-delivery-kyushu-reencoded") +PBF_TILE_Z = 12 +DEFAULT_BBOX = (129.73110007140482, 32.9464631795233, 131.19176072338317, 34.25430274729531) +COAST_CELL_M = 200.0 +FISH_CELL_M = 20.0 +HAZARD_CELL_M = 50.0 + +HAZARD_LAYERS = ( + "navigation_hazard_area", + "fixed_fishing_gear_area", + "anchor_caution_hazard_area", + "navigation_hazard_point", + "anchor_caution_hazard_point", + "navigation_marks", +) +POINT_LAYERS = { + "navigation_hazard_point", + "anchor_caution_hazard_point", + "navigation_marks", +} + +RADIUS = 6378137.0 +MAX_MERCATOR_LAT = 85.0511287798066 + + +def mercator_x(lon: float) -> float: + return RADIUS * math.radians(lon) + + +def mercator_y(lat: float) -> float: + lat = max(min(lat, MAX_MERCATOR_LAT), -MAX_MERCATOR_LAT) + return RADIUS * math.log(math.tan(math.pi / 4.0 + math.radians(lat) / 2.0)) + + +def lon_from_mercator(x: float) -> float: + return math.degrees(x / RADIUS) + + +def lat_from_mercator(y: float) -> float: + return math.degrees(2.0 * math.atan(math.exp(y / RADIUS)) - math.pi / 2.0) + + +def lonlat_from_text(text: str) -> tuple[float, float]: + parts = [p for p in text.replace(",", " ").split() if p] + if len(parts) < 2: + raise ValueError(f"invalid coordinate text: {text!r}") + lat = float(parts[0]) + lon = float(parts[1]) + return lon, lat + + +def local_name(tag: str) -> str: + return tag.split("}", 1)[-1] + + +def load_json(path: Path) -> dict: + return json.loads(path.read_text(encoding="utf-8")) + + +def load_xml(zip_path: Path): + import zipfile + import xml.etree.ElementTree as ET + + with zipfile.ZipFile(zip_path) as zf: + xml_name = next(name for name in zf.namelist() if name.endswith(".xml") and "META" not in name) + return ET.fromstring(zf.read(xml_name)) + + +def build_point_lookup(root) -> dict[str, tuple[float, float]]: + lookup: dict[str, tuple[float, float]] = {} + for point in root.iter(): + if local_name(point.tag) != "GM_Point": + continue + point_id = point.attrib.get("id") + if not point_id: + continue + coord_text = None + for el in point.iter(): + if local_name(el.tag).endswith("DirectPosition.coordinate") and (el.text or "").strip(): + coord_text = el.text.strip() + break + if coord_text is None: + continue + lookup[point_id] = lonlat_from_text(coord_text) + return lookup + + +def extract_curve_coords(curve, point_lookup: dict[str, tuple[float, float]]) -> list[tuple[float, float]]: + coords: list[tuple[float, float]] = [] + for pos in curve.iter(): + tag = local_name(pos.tag) + if not tag.startswith("GM_Position"): + continue + direct = None + ref = None + for child in list(pos): + child_tag = local_name(child.tag) + if child_tag.endswith("DirectPosition.coordinate") and (child.text or "").strip(): + direct = child.text.strip() + break + if child_tag.endswith("PointRef.point"): + ref = child.attrib.get("idref") + if direct is not None: + coords.append(lonlat_from_text(direct)) + elif ref and ref in point_lookup: + coords.append(point_lookup[ref]) + return coords + + +def bbox_from_coords(coords: list[list[float]] | list[tuple[float, float]]) -> tuple[float, float, float, float]: + min_lon = min_lat = float("inf") + max_lon = max_lat = float("-inf") + + def walk(node): + nonlocal min_lon, min_lat, max_lon, max_lat + if not node: + return + if isinstance(node[0], (int, float)): + lon, lat = float(node[0]), float(node[1]) + min_lon = min(min_lon, lon) + min_lat = min(min_lat, lat) + max_lon = max(max_lon, lon) + max_lat = max(max_lat, lat) + return + for item in node: + walk(item) + + walk(coords) + return min_lon, min_lat, max_lon, max_lat + + +def rect_geojson(min_lon: float, min_lat: float, max_lon: float, max_lat: float) -> dict: + return { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [min_lon, min_lat], + [max_lon, min_lat], + [max_lon, max_lat], + [min_lon, max_lat], + [min_lon, min_lat], + ] + ], + }, + } + + +def cell_bbox_from_mercator(ix: int, iy: int, cell_m: float) -> tuple[float, float, float, float]: + minx = ix * cell_m + miny = iy * cell_m + maxx = minx + cell_m + maxy = miny + cell_m + return ( + lon_from_mercator(minx), + lat_from_mercator(miny), + lon_from_mercator(maxx), + lat_from_mercator(maxy), + ) + + +def cell_bbox_from_feature_coords(coords) -> tuple[float, float, float, float]: + return bbox_from_coords(coords) + + +def stream_geojson(path: Path, features: Iterable[dict]) -> int: + path.parent.mkdir(parents=True, exist_ok=True) + count = 0 + with path.open("w", encoding="utf-8") as fh: + fh.write('{"type":"FeatureCollection","features":[\n') + first = True + for feature in features: + if not first: + fh.write(",\n") + fh.write(json.dumps(feature, ensure_ascii=False)) + first = False + count += 1 + fh.write("\n]}\n") + return count + + +def mysql_connect(database: str | None = None): + kwargs = { + "host": DB_HOST, + "user": DB_USER, + "password": DB_PASSWORD, + "charset": "utf8mb4", + "autocommit": False, + "cursorclass": pymysql.cursors.Cursor, + } + if DB_SOCKET: + kwargs["unix_socket"] = DB_SOCKET + if database: + kwargs["database"] = database + return pymysql.connect(**kwargs) + + +def ensure_database() -> None: + conn = mysql_connect() + try: + with conn.cursor() as cur: + cur.execute( + f"CREATE DATABASE IF NOT EXISTS `{DB_NAME}` " + "DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci" + ) + conn.commit() + finally: + conn.close() + + +def ensure_schema(conn) -> None: + ddl = [ + "DROP TABLE IF EXISTS navsea_grid_cell", + "DROP TABLE IF EXISTS navsea_grid_layer_meta", + """ + CREATE TABLE navsea_grid_layer_meta ( + layer_name VARCHAR(32) NOT NULL PRIMARY KEY, + description VARCHAR(255) NOT NULL, + source_desc TEXT NOT NULL, + cell_size_m DOUBLE NOT NULL, + feature_count BIGINT NOT NULL, + bbox_min_lon DOUBLE NOT NULL, + bbox_min_lat DOUBLE NOT NULL, + bbox_max_lon DOUBLE NOT NULL, + bbox_max_lat DOUBLE NOT NULL, + export_file VARCHAR(255) DEFAULT NULL, + created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 + """, + """ + CREATE TABLE navsea_grid_cell ( + id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + layer_name VARCHAR(32) NOT NULL, + cell_id VARCHAR(64) NOT NULL, + row_idx INT NOT NULL, + col_idx INT NOT NULL, + cell_size_m DOUBLE NOT NULL, + state_name VARCHAR(32) NOT NULL, + class_name VARCHAR(32) NOT NULL, + source_name VARCHAR(191) NOT NULL, + min_lon DOUBLE NOT NULL, + min_lat DOUBLE NOT NULL, + max_lon DOUBLE NOT NULL, + max_lat DOUBLE NOT NULL, + created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + UNIQUE KEY uniq_layer_cell (layer_name, cell_id), + KEY idx_layer_state (layer_name, state_name), + KEY idx_layer_rowcol (layer_name, row_idx, col_idx) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 + """, + ] + with conn.cursor() as cur: + for stmt in ddl: + cur.execute(stmt) + conn.commit() + + +def insert_cells(cur, rows: list[tuple]) -> None: + cur.executemany( + """ + INSERT INTO navsea_grid_cell + (layer_name, cell_id, row_idx, col_idx, cell_size_m, state_name, class_name, source_name, + min_lon, min_lat, max_lon, max_lat) + VALUES + (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s) + """, + rows, + ) + + +def upsert_meta(cur, layer_name: str, description: str, source_desc: str, cell_size_m: float, feature_count: int, bbox: tuple[float, float, float, float], export_file: str) -> None: + cur.execute( + """ + INSERT INTO navsea_grid_layer_meta + (layer_name, description, source_desc, cell_size_m, feature_count, + bbox_min_lon, bbox_min_lat, bbox_max_lon, bbox_max_lat, export_file) + VALUES + (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s) + ON DUPLICATE KEY UPDATE + description=VALUES(description), + source_desc=VALUES(source_desc), + cell_size_m=VALUES(cell_size_m), + feature_count=VALUES(feature_count), + bbox_min_lon=VALUES(bbox_min_lon), + bbox_min_lat=VALUES(bbox_min_lat), + bbox_max_lon=VALUES(bbox_max_lon), + bbox_max_lat=VALUES(bbox_max_lat), + export_file=VALUES(export_file) + """, + ( + layer_name, + description, + source_desc, + cell_size_m, + feature_count, + bbox[0], + bbox[1], + bbox[2], + bbox[3], + export_file, + ), + ) + + +def import_geojson_layer( + conn, + *, + layer_name: str, + description: str, + source_desc: str, + cell_size_m: float, + source_path: Path, + export_path: Path, + include_predicate: Callable[[dict], bool], + row_key: str, + col_key: str, + state_name: str, + class_name: str, +) -> tuple[int, tuple[float, float, float, float]]: + data = load_json(source_path) + features = data.get("features", []) + bbox = [float("inf"), float("inf"), float("-inf"), float("-inf")] + batch: list[tuple] = [] + count = 0 + + export_features = [] + + with conn.cursor() as cur: + print(f"[{layer_name}] 开始导入 {source_path} ...") + for feature in features: + props = feature.get("properties") or {} + if not include_predicate(props): + continue + geom = feature.get("geometry") or {} + if geom.get("type") != "Polygon": + continue + coords = geom.get("coordinates") or [] + min_lon, min_lat, max_lon, max_lat = cell_bbox_from_feature_coords(coords) + bbox[0] = min(bbox[0], min_lon) + bbox[1] = min(bbox[1], min_lat) + bbox[2] = max(bbox[2], max_lon) + bbox[3] = max(bbox[3], max_lat) + row_idx = int(props.get(row_key)) + col_idx = int(props.get(col_key)) + cell_id = str(props.get("cell_id") or f"{row_idx}:{col_idx}") + batch.append( + ( + layer_name, + cell_id, + row_idx, + col_idx, + cell_size_m, + state_name, + class_name, + source_desc, + min_lon, + min_lat, + max_lon, + max_lat, + ) + ) + export_features.append( + { + "type": "Feature", + "properties": { + "layer_name": layer_name, + "cell_id": cell_id, + "row": row_idx, + "col": col_idx, + "cell_size_m": cell_size_m, + "state_name": state_name, + "class_name": class_name, + "source_name": source_desc, + }, + "geometry": rect_geojson(min_lon, min_lat, max_lon, max_lat)["geometry"], + } + ) + count += 1 + if len(batch) >= 5000: + insert_cells(cur, batch) + conn.commit() + batch.clear() + if batch: + insert_cells(cur, batch) + conn.commit() + + export_count = stream_geojson(export_path, export_features) + if export_count != count: + raise RuntimeError(f"export count mismatch for {layer_name}: {export_count} != {count}") + print(f"[{layer_name}] 导入完成:{count} 条,导出 {export_path}") + return count, (bbox[0], bbox[1], bbox[2], bbox[3]) + + +def iter_hazard_cells(bbox: tuple[float, float, float, float]) -> Iterable[tuple[int, int]]: + lon_min, lat_min, lon_max, lat_max = bbox + n = 2**PBF_TILE_Z + x0 = max(0, int((lon_min + 180.0) / 360.0 * n)) + x1 = min(n - 1, int((lon_max + 180.0) / 360.0 * n)) + + def ytile(lat: float) -> int: + return int((1.0 - math.asinh(math.tan(math.radians(lat))) / math.pi) / 2.0 * n) + + y0 = max(0, ytile(lat_max)) + y1 = min(n - 1, ytile(lat_min)) + + hazard_cells: set[tuple[int, int]] = set() + for tx in range(x0, x1 + 1): + for ty in range(y0, y1 + 1): + p = PBF_TILE_ROOT / f"{PBF_TILE_Z}/{tx}/{ty}.pbf" + if not p.exists(): + continue + try: + tile = mapbox_vector_tile.decode(p.read_bytes()) + except Exception: + continue + for layer_name in HAZARD_LAYERS: + layer = tile.get(layer_name) + if not layer: + continue + extent = int(layer.get("extent") or 1048576) + for feature in layer.get("features", []): + props = feature.get("properties") or {} + if props.get("canonical_object_type") == "fish_reef" or props.get("chart_symbol_code") == "fish_reef" or props.get("class_name") == "魚礁": + continue + geom = feature.get("geometry") or {} + if not geom: + continue + coords = geom.get("coordinates") + if not coords: + continue + minx, miny, maxx, maxy = tile_mercator_bounds(PBF_TILE_Z, tx, ty) + shp_coords = transform_geom_from_tile(coords, (minx, miny, maxx, maxy), extent) + shp = shape({"type": geom.get("type"), "coordinates": shp_coords}) + if shp.is_empty: + continue + if layer_name in POINT_LAYERS: + shp = shp.buffer(25.0) + minx2, miny2, maxx2, maxy2 = shp.bounds + start_x = math.floor(minx2 / HAZARD_CELL_M) * HAZARD_CELL_M + start_y = math.floor(miny2 / HAZARD_CELL_M) * HAZARD_CELL_M + end_x = math.ceil(maxx2 / HAZARD_CELL_M) * HAZARD_CELL_M + end_y = math.ceil(maxy2 / HAZARD_CELL_M) * HAZARD_CELL_M + prep_geom = prep(shp) + cy = start_y + while cy < end_y: + cx = start_x + while cx < end_x: + cell = box(cx, cy, cx + HAZARD_CELL_M, cy + HAZARD_CELL_M) + if prep_geom.intersects(cell): + hazard_cells.add((int(round(cx / HAZARD_CELL_M)), int(round(cy / HAZARD_CELL_M)))) + cx += HAZARD_CELL_M + cy += HAZARD_CELL_M + return sorted(hazard_cells, key=lambda item: (item[1], item[0])) + + +def tile_mercator_bounds(z: int, x: int, y: int) -> tuple[float, float, float, float]: + n = 2**z + lon_left = x / n * 360.0 - 180.0 + lon_right = (x + 1) / n * 360.0 - 180.0 + lat_top = math.degrees(math.atan(math.sinh(math.pi * (1 - 2 * y / n)))) + lat_bottom = math.degrees(math.atan(math.sinh(math.pi * (1 - 2 * (y + 1) / n)))) + return mercator_x(lon_left), mercator_y(lat_bottom), mercator_x(lon_right), mercator_y(lat_top) + + +def transform_geom_from_tile(geom, bounds_m: tuple[float, float, float, float], extent: int): + minx, miny, maxx, maxy = bounds_m + dx = maxx - minx + dy = maxy - miny + + def coord(x: float, y: float): + mx = minx + (x / extent) * dx + my = miny + (y / extent) * dy + return mx, my + + def walk(obj): + if isinstance(obj[0], (int, float)): + return coord(obj[0], obj[1]) + return [walk(item) for item in obj] + + return walk(geom) + + +def import_hazard_layer( + conn, + *, + layer_name: str, + description: str, + source_desc: str, + cell_size_m: float, + bbox: tuple[float, float, float, float], + export_path: Path, +) -> tuple[int, tuple[float, float, float, float]]: + cells = iter_hazard_cells(bbox) + batch: list[tuple] = [] + count = 0 + export_bbox = [float("inf"), float("inf"), float("-inf"), float("-inf")] + + with conn.cursor() as cur: + print(f"[{layer_name}] 开始扫描 PBF 危险层 ...") + with export_path.open("w", encoding="utf-8") as fh: + fh.write('{"type":"FeatureCollection","features":[\n') + first = True + for ix, iy in cells: + min_lon, min_lat, max_lon, max_lat = cell_bbox_from_mercator(ix, iy, HAZARD_CELL_M) + export_bbox[0] = min(export_bbox[0], min_lon) + export_bbox[1] = min(export_bbox[1], min_lat) + export_bbox[2] = max(export_bbox[2], max_lon) + export_bbox[3] = max(export_bbox[3], max_lat) + cell_id = f"{ix}:{iy}" + batch.append( + ( + layer_name, + cell_id, + iy, + ix, + cell_size_m, + "HAZARD_50M", + "HAZARD", + source_desc, + min_lon, + min_lat, + max_lon, + max_lat, + ) + ) + feature = { + "type": "Feature", + "properties": { + "layer_name": layer_name, + "cell_id": cell_id, + "row": iy, + "col": ix, + "cell_size_m": cell_size_m, + "state_name": "HAZARD_50M", + "class_name": "HAZARD", + "source_name": source_desc, + }, + "geometry": rect_geojson(min_lon, min_lat, max_lon, max_lat)["geometry"], + } + if not first: + fh.write(",\n") + fh.write(json.dumps(feature, ensure_ascii=False)) + first = False + count += 1 + if len(batch) >= 5000: + insert_cells(cur, batch) + conn.commit() + batch.clear() + if count % 20000 == 0 and count > 0: + print(f"[{layer_name}] 已处理 {count} 个格子 ...") + if batch: + insert_cells(cur, batch) + conn.commit() + fh.write("\n]}\n") + + print(f"[{layer_name}] 导入完成:{count} 条,导出 {export_path}") + return count, (export_bbox[0], export_bbox[1], export_bbox[2], export_bbox[3]) + + +def main() -> None: + parser = argparse.ArgumentParser(description="Build NavSea Fukuoka/Saga grid into MySQL") + parser.add_argument( + "--out-dir", + default="src/pbf/coastline-mysql/fukuoka_saga", + help="GeoJSON 输出目录", + ) + parser.add_argument( + "--db-name", + default=DB_NAME, + help="MySQL 数据库名", + ) + args = parser.parse_args() + + project_root = Path(__file__).resolve().parent.parent + out_dir = Path(args.out_dir) + if not out_dir.is_absolute(): + out_dir = project_root / out_dir + out_dir.mkdir(parents=True, exist_ok=True) + + ensure_database() + conn = mysql_connect(args.db_name) + try: + print(f"数据库 {args.db_name} 已连接,准备初始化表结构 ...") + ensure_schema(conn) + + coast_path = project_root / COAST_GRID_SRC + fish_path = project_root / FISH_GRID_SRC + if not coast_path.exists(): + raise SystemExit(f"missing coast grid source: {coast_path}") + if not fish_path.exists(): + raise SystemExit(f"missing fish grid source: {fish_path}") + + coast_export = out_dir / "coast_200m_grid.geojson" + fish_export = out_dir / "fish_port_20m_grid.geojson" + hazard_export = out_dir / "hazard_50m_grid.geojson" + + coast_count, coast_bbox = import_geojson_layer( + conn, + layer_name="coast_200m", + description="福冈/佐贺海岸线 200m 硬阻塞格", + source_desc="coastline/C23-06_40_GML.zip + coastline/C23-06_41_GML.zip", + cell_size_m=COAST_CELL_M, + source_path=coast_path, + export_path=coast_export, + include_predicate=lambda props: True, + row_key="iy", + col_key="ix", + state_name="HARD_BLOCKED", + class_name="HARD_BLOCKED", + ) + + fish_count, fish_bbox = import_geojson_layer( + conn, + layer_name="fish_port_20m", + description="福冈/佐贺渔港 20m 不可航行红格", + source_desc="coastline/C09-06.zip", + cell_size_m=FISH_CELL_M, + source_path=fish_path, + export_path=fish_export, + include_predicate=lambda props: props.get("classification") == "LAND_BASE", + row_key="row", + col_key="col", + state_name="LAND_BASE", + class_name="LAND_BASE", + ) + + hazard_count, hazard_bbox = import_hazard_layer( + conn, + layer_name="hazard_50m", + description="福冈/佐贺 PBF 海上障碍 50m 黄格", + source_desc="pbf-delivery-kyushu-reencoded z12: navigation_hazard_area, fixed_fishing_gear_area, anchor_caution_hazard_area, navigation_hazard_point, anchor_caution_hazard_point, navigation_marks", + cell_size_m=HAZARD_CELL_M, + bbox=DEFAULT_BBOX, + export_path=hazard_export, + ) + + with conn.cursor() as cur: + upsert_meta( + cur, + "coast_200m", + "福冈/佐贺海岸线 200m 硬阻塞格", + "coastline/C23-06_40_GML.zip + coastline/C23-06_41_GML.zip", + COAST_CELL_M, + coast_count, + coast_bbox, + str(coast_export.relative_to(project_root)), + ) + upsert_meta( + cur, + "fish_port_20m", + "福冈/佐贺渔港 20m 不可航行红格", + "coastline/C09-06.zip", + FISH_CELL_M, + fish_count, + fish_bbox, + str(fish_export.relative_to(project_root)), + ) + upsert_meta( + cur, + "hazard_50m", + "福冈/佐贺 PBF 海上障碍 50m 黄格", + "pbf-delivery-kyushu-reencoded z12", + HAZARD_CELL_M, + hazard_count, + hazard_bbox, + str(hazard_export.relative_to(project_root)), + ) + conn.commit() + + manifest = { + "database": args.db_name, + "generated_at": dt.datetime.now().isoformat(timespec="seconds"), + "layers": { + "coast_200m": { + "count": coast_count, + "bbox_lonlat": list(coast_bbox), + "cell_size_m": COAST_CELL_M, + "export_file": str(coast_export.relative_to(project_root)), + }, + "fish_port_20m": { + "count": fish_count, + "bbox_lonlat": list(fish_bbox), + "cell_size_m": FISH_CELL_M, + "export_file": str(fish_export.relative_to(project_root)), + }, + "hazard_50m": { + "count": hazard_count, + "bbox_lonlat": list(hazard_bbox), + "cell_size_m": HAZARD_CELL_M, + "export_file": str(hazard_export.relative_to(project_root)), + }, + }, + } + manifest_path = out_dir / "manifest.json" + manifest_path.write_text(json.dumps(manifest, ensure_ascii=False, indent=2), encoding="utf-8") + + print("已导入 MySQL 数据库:", args.db_name) + print(" - coast_200m:", coast_count, coast_export) + print(" - fish_port_20m:", fish_count, fish_export) + print(" - hazard_50m:", hazard_count, hazard_export) + print(" - manifest:", manifest_path) + finally: + conn.close() + + +if __name__ == "__main__": + main() diff --git a/coastline/build_japan_coast_grid.py b/coastline/build_japan_coast_grid.py new file mode 100644 index 0000000..cfdbe05 --- /dev/null +++ b/coastline/build_japan_coast_grid.py @@ -0,0 +1,549 @@ +#!/usr/bin/env python3 +from __future__ import annotations + +import argparse +import datetime as dt +import glob +import json +import math +import sqlite3 +import zipfile +from dataclasses import dataclass +from pathlib import Path +from typing import Iterable +import xml.etree.ElementTree as ET + +from shapely.geometry import LineString, MultiLineString, box, mapping +from shapely.prepared import prep + + +RADIUS = 6378137.0 +MAX_MERCATOR_LAT = 85.0511287798066 +DEFAULT_INPUT_GLOB = "coastline/C23-06_*_GML.zip" +DEFAULT_OUTPUT_DIR = "out/coastline/japan_coast_grid" + + +@dataclass(frozen=True) +class SourcePackage: + path: Path + prefecture: str + code: str + + +def mercator_x(lon: float) -> float: + return RADIUS * math.radians(lon) + + +def mercator_y(lat: float) -> float: + lat = max(min(lat, MAX_MERCATOR_LAT), -MAX_MERCATOR_LAT) + return RADIUS * math.log(math.tan(math.pi / 4.0 + math.radians(lat) / 2.0)) + + +def lon_from_mercator(x: float) -> float: + return math.degrees(x / RADIUS) + + +def lat_from_mercator(y: float) -> float: + return math.degrees(2.0 * math.atan(math.exp(y / RADIUS)) - math.pi / 2.0) + + +def align_floor(value: float, step: float) -> float: + return math.floor(value / step) * step + + +def align_ceil(value: float, step: float) -> float: + return math.ceil(value / step) * step + + +def parse_text_list(text: str) -> list[float]: + return [float(part) for part in text.split() if part] + + +def detect_prefecture(meta_xml: str) -> str: + title_start = meta_xml.find("") + if title_start == -1: + return "unknown" + title_end = meta_xml.find("", title_start) + if title_end == -1: + return "unknown" + return meta_xml[title_start + 7:title_end].strip() + + +def load_package(path: Path) -> SourcePackage: + with zipfile.ZipFile(path) as zf: + meta_name = next(name for name in zf.namelist() if "META" in name and name.endswith(".xml")) + meta_xml = zf.read(meta_name).decode("shift_jis", errors="replace") + prefecture = detect_prefecture(meta_xml) + code = path.stem.replace("_GML", "") + return SourcePackage(path=path, prefecture=prefecture, code=code) + + +def iter_coastline_lines(zip_path: Path) -> Iterable[LineString]: + with zipfile.ZipFile(zip_path) as zf: + xml_name = next(name for name in zf.namelist() if name.endswith(".xml") and "META" not in name) + root = ET.fromstring(zf.read(xml_name)) + + ns = {"gml": "http://www.opengis.net/gml/3.2"} + for curve in root.findall(".//gml:Curve", ns): + coords: list[tuple[float, float]] = [] + for pos_list in curve.findall(".//gml:posList", ns): + if not pos_list.text: + continue + values = parse_text_list(pos_list.text) + if len(values) < 4 or len(values) % 2 != 0: + continue + for i in range(0, len(values), 2): + lat = values[i] + lon = values[i + 1] + coords.append((mercator_x(lon), mercator_y(lat))) + if len(coords) < 2: + continue + yield LineString(coords) + + +def open_sqlite(path: Path) -> sqlite3.Connection: + if path.exists(): + path.unlink() + path.parent.mkdir(parents=True, exist_ok=True) + conn = sqlite3.connect(path) + conn.execute("PRAGMA journal_mode=OFF") + conn.execute("PRAGMA synchronous=OFF") + conn.execute("PRAGMA temp_store=MEMORY") + conn.execute("PRAGMA cache_size=200000") + conn.execute("PRAGMA locking_mode=EXCLUSIVE") + conn.execute("PRAGMA foreign_keys=OFF") + return conn + + +def create_schema(conn: sqlite3.Connection, *, store_coastline_feature: bool) -> None: + statements = [ + """ + CREATE TABLE meta ( + key TEXT PRIMARY KEY, + value TEXT NOT NULL + ) + """, + """ + CREATE TABLE package_stat ( + source_code TEXT NOT NULL, + prefecture TEXT NOT NULL, + zip_path TEXT NOT NULL, + line_count INTEGER NOT NULL, + point_count INTEGER NOT NULL, + bbox_minx REAL NOT NULL, + bbox_miny REAL NOT NULL, + bbox_maxx REAL NOT NULL, + bbox_maxy REAL NOT NULL, + grid_minx REAL NOT NULL, + grid_miny REAL NOT NULL, + grid_maxx REAL NOT NULL, + grid_maxy REAL NOT NULL, + blocked_count INTEGER NOT NULL, + candidate_count INTEGER NOT NULL + ) + """, + """ + CREATE TABLE grid_cell ( + cell_id TEXT PRIMARY KEY, + source_code TEXT NOT NULL, + prefecture TEXT NOT NULL, + ix INTEGER NOT NULL, + iy INTEGER NOT NULL, + minx REAL NOT NULL, + miny REAL NOT NULL, + maxx REAL NOT NULL, + maxy REAL NOT NULL, + state INTEGER NOT NULL, + state_name TEXT NOT NULL, + source_mask INTEGER NOT NULL, + blocked_permille INTEGER NOT NULL + ) + """, + "CREATE INDEX idx_grid_cell_state ON grid_cell(state)", + "CREATE INDEX idx_grid_cell_source ON grid_cell(source_code, prefecture)", + ] + if store_coastline_feature: + statements.insert( + 2, + """ + CREATE TABLE coastline_feature ( + feature_id INTEGER PRIMARY KEY AUTOINCREMENT, + source_code TEXT NOT NULL, + prefecture TEXT NOT NULL, + curve_index INTEGER NOT NULL, + point_count INTEGER NOT NULL, + minx REAL NOT NULL, + miny REAL NOT NULL, + maxx REAL NOT NULL, + maxy REAL NOT NULL, + geom_wkt TEXT NOT NULL + ) + """, + ) + conn.executescript(";\n".join(statements)) + + +def upsert_cells(conn: sqlite3.Connection, rows: list[tuple]) -> None: + if not rows: + return + conn.executemany( + """ + INSERT INTO grid_cell( + cell_id, source_code, prefecture, ix, iy, minx, miny, maxx, maxy, + state, state_name, source_mask, blocked_permille + ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) + ON CONFLICT(cell_id) DO UPDATE SET + source_code = CASE WHEN excluded.state > grid_cell.state THEN excluded.source_code ELSE grid_cell.source_code END, + prefecture = CASE WHEN excluded.state > grid_cell.state THEN excluded.prefecture ELSE grid_cell.prefecture END, + state = CASE WHEN excluded.state > grid_cell.state THEN excluded.state ELSE grid_cell.state END, + state_name = CASE WHEN excluded.state > grid_cell.state THEN excluded.state_name ELSE grid_cell.state_name END, + source_mask = grid_cell.source_mask | excluded.source_mask, + blocked_permille = CASE + WHEN excluded.blocked_permille > grid_cell.blocked_permille THEN excluded.blocked_permille + ELSE grid_cell.blocked_permille + END + """, + rows, + ) + + +def write_geojson_header(fh) -> None: + fh.write('{"type":"FeatureCollection","features":[\n') + + +def write_geojson_feature(fh, feature: dict, first: bool) -> bool: + if not first: + fh.write(",\n") + fh.write(json.dumps(feature, ensure_ascii=False)) + return False + + +def main() -> None: + parser = argparse.ArgumentParser(description="Build Japan coastline 200m grid into SQLite") + parser.add_argument( + "--input", + dest="inputs", + action="append", + default=[], + help="海岸线 GML zip。可重复指定;默认自动扫描 coastline/C23-06_*_GML.zip", + ) + parser.add_argument( + "--output-dir", + default=DEFAULT_OUTPUT_DIR, + help="输出目录", + ) + parser.add_argument("--cell-size-m", type=float, default=200.0, help="格网尺寸,默认 200m") + parser.add_argument("--buffer-m", type=float, default=50.0, help="海岸线缓冲距离,默认 50m") + parser.add_argument( + "--margin-cells", + type=int, + default=2, + help="输出范围外扩的格子数,默认 2 个格子", + ) + parser.add_argument( + "--write-geojson", + action="store_true", + help="同时输出 coastline.geojson 和 grid.geojson", + ) + parser.add_argument( + "--store-coastline-feature", + action="store_true", + help="把每条海岸线曲线也写入 SQLite,默认关闭以控制库体积", + ) + args = parser.parse_args() + + project_root = Path(__file__).resolve().parent.parent + if args.inputs: + input_paths: list[Path] = [] + for item in args.inputs: + if any(ch in item for ch in "*?[]"): + input_paths.extend(Path(path) for path in sorted(glob.glob(item))) + else: + input_paths.append(Path(item)) + else: + input_paths = [Path(path) for path in sorted(glob.glob(str(project_root / DEFAULT_INPUT_GLOB)))] + + if not input_paths: + raise SystemExit("no coastline packages found") + + packages: list[SourcePackage] = [] + for path in input_paths: + if not path.is_absolute(): + path = project_root / path + if not path.exists(): + raise SystemExit(f"missing input: {path}") + packages.append(load_package(path)) + + out_dir = Path(args.output_dir) + if not out_dir.is_absolute(): + out_dir = project_root / out_dir + out_dir.mkdir(parents=True, exist_ok=True) + + sqlite_path = out_dir / "japan_coast_grid.sqlite" + conn = open_sqlite(sqlite_path) + create_schema(conn, store_coastline_feature=args.store_coastline_feature) + + coastline_geojson_fh = None + grid_geojson_fh = None + coastline_geojson_first = True + grid_geojson_first = True + if args.write_geojson: + coastline_geojson_fh = (out_dir / "japan_coastline.geojson").open("w", encoding="utf-8") + grid_geojson_fh = (out_dir / "japan_grid.geojson").open("w", encoding="utf-8") + write_geojson_header(coastline_geojson_fh) + write_geojson_header(grid_geojson_fh) + + package_stats: list[dict] = [] + total_lines = 0 + total_points = 0 + + try: + for package in packages: + print(f"[{package.code}] 开始处理 {package.path.name}") + lines = list(iter_coastline_lines(package.path)) + if not lines: + print(f"[{package.code}] 没有可用海岸线,跳过") + continue + + coastline_geom = MultiLineString([line.coords[:] for line in lines]) + coastline_buffer = coastline_geom.buffer(args.buffer_m, cap_style=2, join_style=2) + prepared_buffer = prep(coastline_buffer) + coast_bounds = coastline_geom.bounds + + minx = align_floor(coast_bounds[0] - args.buffer_m - args.margin_cells * args.cell_size_m, args.cell_size_m) + miny = align_floor(coast_bounds[1] - args.buffer_m - args.margin_cells * args.cell_size_m, args.cell_size_m) + maxx = align_ceil(coast_bounds[2] + args.buffer_m + args.margin_cells * args.cell_size_m, args.cell_size_m) + maxy = align_ceil(coast_bounds[3] + args.buffer_m + args.margin_cells * args.cell_size_m, args.cell_size_m) + + line_count = len(lines) + point_count = sum(len(line.coords) for line in lines) + total_lines += line_count + total_points += point_count + + if args.store_coastline_feature: + conn.executemany( + """ + INSERT INTO coastline_feature( + source_code, prefecture, curve_index, point_count, minx, miny, maxx, maxy, geom_wkt + ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?) + """, + [ + ( + package.code, + package.prefecture, + idx, + len(line.coords), + line.bounds[0], + line.bounds[1], + line.bounds[2], + line.bounds[3], + line.wkt, + ) + for idx, line in enumerate(lines, start=1) + ], + ) + + package_blocked = 0 + package_candidate = 0 + package_rows: list[tuple] = [] + + ix0 = int(round(minx / args.cell_size_m)) + iy0 = int(round(miny / args.cell_size_m)) + ix1 = int(round(maxx / args.cell_size_m)) + iy1 = int(round(maxy / args.cell_size_m)) + + for ix in range(ix0, ix1): + cell_minx = ix * args.cell_size_m + cell_maxx = cell_minx + args.cell_size_m + for iy in range(iy0, iy1): + cell_miny = iy * args.cell_size_m + cell_maxy = cell_miny + args.cell_size_m + cell = box(cell_minx, cell_miny, cell_maxx, cell_maxy) + intersects = prepared_buffer.intersects(cell) + state = 2 if intersects else 1 + state_name = "HARD_BLOCKED" if intersects else "NAVIGABLE_CANDIDATE" + blocked_permille = 1000 if intersects else 0 + cell_id = f"{ix}:{iy}" + + package_rows.append( + ( + cell_id, + package.code, + package.prefecture, + ix, + iy, + cell_minx, + cell_miny, + cell_maxx, + cell_maxy, + state, + state_name, + 1, + blocked_permille, + ) + ) + if intersects: + package_blocked += 1 + else: + package_candidate += 1 + + if args.write_geojson and grid_geojson_fh is not None: + feature = { + "type": "Feature", + "properties": { + "cell_id": cell_id, + "source_code": package.code, + "prefecture": package.prefecture, + "ix": ix, + "iy": iy, + "cell_size_m": args.cell_size_m, + "state": state, + "state_name": state_name, + "source_mask": 1, + "blocked_permille": blocked_permille, + }, + "geometry": mapping(cell), + } + grid_geojson_first = write_geojson_feature(grid_geojson_fh, feature, grid_geojson_first) + + if len(package_rows) >= 5000: + upsert_cells(conn, package_rows) + conn.commit() + print( + f"[{package.code}] 已写入 {len(package_rows)} 行," + f"blocked={package_blocked} candidate={package_candidate}" + ) + package_rows.clear() + + if package_rows: + upsert_cells(conn, package_rows) + conn.commit() + + package_stats.append( + { + "source_code": package.code, + "prefecture": package.prefecture, + "zip_path": str(package.path), + "line_count": line_count, + "point_count": point_count, + "bbox_mercator": [coast_bounds[0], coast_bounds[1], coast_bounds[2], coast_bounds[3]], + "grid_bounds_mercator": [minx, miny, maxx, maxy], + "blocked_count": package_blocked, + "candidate_count": package_candidate, + } + ) + + conn.execute( + """ + INSERT INTO package_stat( + source_code, prefecture, zip_path, line_count, point_count, + bbox_minx, bbox_miny, bbox_maxx, bbox_maxy, + grid_minx, grid_miny, grid_maxx, grid_maxy, + blocked_count, candidate_count + ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) + """, + ( + package.code, + package.prefecture, + str(package.path), + line_count, + point_count, + coast_bounds[0], + coast_bounds[1], + coast_bounds[2], + coast_bounds[3], + minx, + miny, + maxx, + maxy, + package_blocked, + package_candidate, + ), + ) + conn.commit() + print( + f"[{package.code}] 完成 line={line_count} point={point_count} " + f"blocked={package_blocked} candidate={package_candidate}" + ) + + conn.execute("ANALYZE") + conn.commit() + + final_total = int(conn.execute("SELECT COUNT(*) FROM grid_cell").fetchone()[0]) + blocked_count = int(conn.execute("SELECT COUNT(*) FROM grid_cell WHERE state = 2").fetchone()[0]) + candidate_count = int(conn.execute("SELECT COUNT(*) FROM grid_cell WHERE state = 1").fetchone()[0]) + bbox_row = conn.execute( + "SELECT MIN(minx), MIN(miny), MAX(maxx), MAX(maxy) FROM grid_cell" + ).fetchone() + grid_bbox = ( + float(bbox_row[0]) if bbox_row and bbox_row[0] is not None else float("inf"), + float(bbox_row[1]) if bbox_row and bbox_row[1] is not None else float("inf"), + float(bbox_row[2]) if bbox_row and bbox_row[2] is not None else float("-inf"), + float(bbox_row[3]) if bbox_row and bbox_row[3] is not None else float("-inf"), + ) + + build_time = dt.datetime.now().isoformat(timespec="seconds") + meta_rows = [ + ("build_time", build_time), + ("cell_size_m", str(args.cell_size_m)), + ("buffer_m", str(args.buffer_m)), + ("margin_cells", str(args.margin_cells)), + ("source_scope", "japan"), + ("source_code", "C23-06_*"), + ("source_count", str(len(packages))), + ("source_packages", json.dumps([str(pkg.path) for pkg in packages], ensure_ascii=False)), + ("coastline_line_count", str(total_lines)), + ("coastline_point_count", str(total_points)), + ("grid_cell_count", str(final_total)), + ("blocked_count", str(blocked_count)), + ("candidate_count", str(candidate_count)), + ("grid_bounds_mercator", json.dumps(grid_bbox, ensure_ascii=False)), + ("notes", "全国海岸线 200m 硬阻塞栅格,来源为 coastline/C23-06_*_GML.zip"), + ] + conn.executemany("INSERT INTO meta(key, value) VALUES (?, ?)", meta_rows) + conn.commit() + + meta_path = out_dir / "japan_coast_grid.meta.json" + meta_payload = { + "build_time": build_time, + "cell_size_m": args.cell_size_m, + "buffer_m": args.buffer_m, + "margin_cells": args.margin_cells, + "source_scope": "japan", + "source_count": len(packages), + "source_packages": [str(pkg.path) for pkg in packages], + "coastline_line_count": total_lines, + "coastline_point_count": total_points, + "grid_cell_count": final_total, + "blocked_count": blocked_count, + "candidate_count": candidate_count, + "grid_bounds_mercator": list(grid_bbox), + "package_stats": package_stats, + } + meta_path.write_text(json.dumps(meta_payload, ensure_ascii=False, indent=2), encoding="utf-8") + + if args.write_geojson and coastline_geojson_fh is not None and grid_geojson_fh is not None: + coastline_geojson_fh.write("\n]}\n") + grid_geojson_fh.write("\n]}\n") + + print("完成") + print(f" SQLite: {sqlite_path}") + print(f" 元数据: {meta_path}") + print(f" packages={len(packages)}") + print(f" coastline_lines={total_lines}") + print(f" grid_cells={final_total}") + print(f" blocked={blocked_count}") + print(f" candidate={candidate_count}") + if args.write_geojson: + print(f" 海岸线GeoJSON: {out_dir / 'japan_coastline.geojson'}") + print(f" 栅格GeoJSON: {out_dir / 'japan_grid.geojson'}") + finally: + if coastline_geojson_fh is not None: + coastline_geojson_fh.close() + if grid_geojson_fh is not None: + grid_geojson_fh.close() + conn.close() + + +if __name__ == "__main__": + main() diff --git a/coastline/build_japan_coast_grid_mysql.py b/coastline/build_japan_coast_grid_mysql.py index 2ad8acb..167383e 100644 --- a/coastline/build_japan_coast_grid_mysql.py +++ b/coastline/build_japan_coast_grid_mysql.py @@ -25,8 +25,8 @@ DB_SOCKET = "/tmp/mysql.sock" DEFAULT_INPUT_GLOB = "coastline/C23-06_*_GML.zip" DEFAULT_OUT_DIR = "out/coastline/japan_coast_grid_mysql" -LAYER_NAME = "coast_200m" -CELL_SIZE_M = 200.0 +DEFAULT_CELL_SIZE_M = 200.0 +DEFAULT_BUFFER_M = 50.0 RADIUS = 6378137.0 MAX_MERCATOR_LAT = 85.0511287798066 @@ -134,12 +134,12 @@ def mysql_connect(database: str | None = None): return pymysql.connect(**kwargs) -def ensure_database() -> None: +def ensure_database(name: str) -> None: conn = mysql_connect() try: with conn.cursor() as cur: cur.execute( - f"CREATE DATABASE IF NOT EXISTS `{DB_NAME}` " + f"CREATE DATABASE IF NOT EXISTS `{name}` " "DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci" ) conn.commit() @@ -147,13 +147,25 @@ def ensure_database() -> None: conn.close() +def column_exists(conn, table_name: str, column_name: str) -> bool: + with conn.cursor() as cur: + cur.execute("SELECT DATABASE()") + database_name = cur.fetchone()[0] + cur.execute( + """ + SELECT COUNT(*) + FROM information_schema.COLUMNS + WHERE TABLE_SCHEMA=%s AND TABLE_NAME=%s AND COLUMN_NAME=%s + """, + (database_name, table_name, column_name), + ) + return int(cur.fetchone()[0] or 0) > 0 + + def ensure_schema(conn) -> None: ddl = [ - "DROP TABLE IF EXISTS navsea_grid_cell", - "DROP TABLE IF EXISTS navsea_grid_package_stat", - "DROP TABLE IF EXISTS navsea_grid_layer_meta", """ - CREATE TABLE navsea_grid_layer_meta ( + CREATE TABLE IF NOT EXISTS navsea_grid_layer_meta ( layer_name VARCHAR(32) NOT NULL PRIMARY KEY, description VARCHAR(255) NOT NULL, source_desc TEXT NOT NULL, @@ -168,7 +180,8 @@ def ensure_schema(conn) -> None: ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 """, """ - CREATE TABLE navsea_grid_package_stat ( + CREATE TABLE IF NOT EXISTS navsea_grid_package_stat ( + layer_name VARCHAR(32) NOT NULL, source_code VARCHAR(64) NOT NULL, prefecture VARCHAR(128) NOT NULL, zip_path TEXT NOT NULL, @@ -183,11 +196,12 @@ def ensure_schema(conn) -> None: grid_max_lon DOUBLE NOT NULL, grid_max_lat DOUBLE NOT NULL, blocked_count BIGINT NOT NULL, - candidate_count BIGINT NOT NULL + candidate_count BIGINT NOT NULL, + KEY idx_layer_source (layer_name, source_code) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 """, """ - CREATE TABLE navsea_grid_cell ( + CREATE TABLE IF NOT EXISTS navsea_grid_cell ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, layer_name VARCHAR(32) NOT NULL, cell_id VARCHAR(64) NOT NULL, @@ -202,7 +216,7 @@ def ensure_schema(conn) -> None: max_lon DOUBLE NOT NULL, max_lat DOUBLE NOT NULL, created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, - UNIQUE KEY uniq_layer_cell (layer_name, cell_id), + UNIQUE KEY uniq_layer_source_cell (layer_name, source_name, cell_id), KEY idx_layer_state (layer_name, state_name), KEY idx_layer_rowcol (layer_name, row_idx, col_idx) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 @@ -211,6 +225,21 @@ def ensure_schema(conn) -> None: with conn.cursor() as cur: for stmt in ddl: cur.execute(stmt) + if not column_exists(conn, "navsea_grid_package_stat", "layer_name"): + with conn.cursor() as cur: + cur.execute( + "ALTER TABLE navsea_grid_package_stat " + "ADD COLUMN layer_name VARCHAR(32) NOT NULL DEFAULT 'coast_200m' FIRST" + ) + cur.execute("ALTER TABLE navsea_grid_package_stat ADD KEY idx_layer_source (layer_name, source_code)") + conn.commit() + + +def replace_layer_rows(conn, layer_name: str) -> None: + with conn.cursor() as cur: + cur.execute("DELETE FROM navsea_grid_cell WHERE layer_name=%s", (layer_name,)) + cur.execute("DELETE FROM navsea_grid_layer_meta WHERE layer_name=%s", (layer_name,)) + cur.execute("DELETE FROM navsea_grid_package_stat WHERE layer_name=%s", (layer_name,)) conn.commit() @@ -223,16 +252,15 @@ def insert_cells(cur, rows: list[tuple]) -> None: VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s) ON DUPLICATE KEY UPDATE - row_idx = row_idx, - col_idx = col_idx, - cell_size_m = cell_size_m, - state_name = IF(VALUES(state_name) = 'HARD_BLOCKED' AND state_name <> 'HARD_BLOCKED', VALUES(state_name), state_name), - class_name = IF(VALUES(state_name) = 'HARD_BLOCKED' AND state_name <> 'HARD_BLOCKED', VALUES(class_name), class_name), - source_name = IF(VALUES(state_name) = 'HARD_BLOCKED' AND state_name <> 'HARD_BLOCKED', VALUES(source_name), source_name), - min_lon = min_lon, - min_lat = min_lat, - max_lon = max_lon, - max_lat = max_lat + row_idx=VALUES(row_idx), + col_idx=VALUES(col_idx), + cell_size_m=VALUES(cell_size_m), + state_name=VALUES(state_name), + class_name=VALUES(class_name), + min_lon=VALUES(min_lon), + min_lat=VALUES(min_lat), + max_lon=VALUES(max_lon), + max_lat=VALUES(max_lat) """, rows, ) @@ -282,8 +310,52 @@ def upsert_meta( ) +def default_layer_name(cell_size_m: float) -> str: + if float(cell_size_m).is_integer(): + return f"coast_{int(cell_size_m)}m" + return f"coast_{str(cell_size_m).replace('.', '_')}m" + + +def normalize_source_code(value: str) -> str: + value = value.strip() + if value.isdigit(): + return f"C23-06_{int(value):02d}" + if value.startswith("C23-06_") and value[len("C23-06_"):].isdigit(): + return f"C23-06_{int(value[len('C23-06_'):]):02d}" + return value + + +def ts_now() -> str: + return dt.datetime.now().strftime("%Y-%m-%d %H:%M:%S") + + +def log(message: str) -> None: + print(f"[{ts_now()}] {message}", flush=True) + + +def flush_package_rows( + conn, + package_rows: list[tuple], + *, + package_code: str, + package_blocked: int, + package_candidate: int, + reason: str, +) -> None: + if not package_rows: + return + with conn.cursor() as cur: + insert_cells(cur, package_rows) + conn.commit() + log( + f"[{package_code}] 已写入 {len(package_rows)} 行({reason})," + f"blocked={package_blocked} candidate={package_candidate}" + ) + package_rows.clear() + + def main() -> None: - parser = argparse.ArgumentParser(description="Build Japan coastline 200m grid directly into MySQL") + parser = argparse.ArgumentParser(description="Build Japan coastline grid directly into MySQL") parser.add_argument( "--input", dest="inputs", @@ -301,7 +373,18 @@ def main() -> None: default=DEFAULT_OUT_DIR, help="输出目录,用于可选 GeoJSON 和元数据", ) - parser.add_argument("--buffer-m", type=float, default=50.0, help="海岸线缓冲距离,默认 50m") + parser.add_argument( + "--cell-size-m", + type=float, + default=DEFAULT_CELL_SIZE_M, + help="海岸线格子大小,默认 200m;例如 50 会自动写入 coast_50m", + ) + parser.add_argument( + "--layer-name", + default=None, + help="目标 layer_name;默认按 cell size 自动生成,例如 coast_200m / coast_50m", + ) + parser.add_argument("--buffer-m", type=float, default=DEFAULT_BUFFER_M, help="海岸线缓冲距离,默认 50m") parser.add_argument( "--margin-cells", type=int, @@ -313,7 +396,40 @@ def main() -> None: action="store_true", help="同时输出 coastline.geojson 和 grid.geojson", ) + parser.add_argument( + "--resume", + action="store_true", + help="续跑模式:不清理当前 layer,保留已入库格子", + ) + parser.add_argument( + "--start-code", + default=None, + help="只处理指定 source_code 及之后的包,例如 13 或 C23-06_13", + ) + parser.add_argument( + "--progress-every-cells", + type=int, + default=50000, + help="每扫描多少个候选格输出一次进度日志,默认 50000", + ) + parser.add_argument( + "--progress-every-seconds", + type=int, + default=15, + help="每隔多少秒至少输出一次进度日志,默认 15", + ) + parser.add_argument( + "--coarse-factor", + type=int, + default=8, + help="海岸线粗筛倍率,默认 8;值越大越少细扫,但粗筛更大", + ) args = parser.parse_args() + if args.cell_size_m <= 0: + raise SystemExit("--cell-size-m must be positive") + cell_size_m = float(args.cell_size_m) + layer_name = args.layer_name or default_layer_name(cell_size_m) + source_name = f"coastline/C23-06_* cell={cell_size_m:g}m buffer={args.buffer_m:g}m" project_root = Path(__file__).resolve().parent.parent if args.inputs: @@ -328,6 +444,12 @@ def main() -> None: if not input_paths: raise SystemExit("no coastline packages found") + if args.progress_every_cells <= 0: + raise SystemExit("--progress-every-cells must be positive") + if args.progress_every_seconds < 0: + raise SystemExit("--progress-every-seconds must be non-negative") + if args.coarse_factor < 1: + raise SystemExit("--coarse-factor must be >= 1") packages: list[SourcePackage] = [] for path in input_paths: @@ -336,38 +458,61 @@ def main() -> None: if not path.exists(): raise SystemExit(f"missing input: {path}") packages.append(load_package(path)) + packages.sort(key=lambda package: package.code) + + if args.start_code: + start_code = normalize_source_code(args.start_code) + packages = [package for package in packages if package.code >= start_code] + if not packages: + raise SystemExit(f"no coastline packages found from start code: {start_code}") out_dir = Path(args.out_dir) if not out_dir.is_absolute(): out_dir = project_root / out_dir out_dir.mkdir(parents=True, exist_ok=True) - ensure_database() + ensure_database(args.db_name) conn = mysql_connect(args.db_name) try: - print(f"数据库 {args.db_name} 已连接,准备初始化表结构 ...") + log(f"数据库 {args.db_name} 已连接,准备初始化表结构 ...") ensure_schema(conn) + if args.resume: + first_code = packages[0].code + last_code = packages[-1].code + log( + f"续跑 layer={layer_name} cell={cell_size_m:g}m;" + f"保留已入库格子,仅处理 {first_code}..{last_code}" + ) + else: + log(f"准备重建 layer={layer_name} cell={cell_size_m:g}m;只清理当前 layer,不影响其它尺寸") + replace_layer_rows(conn, layer_name) total_lines = 0 total_points = 0 package_stats: list[dict] = [] + build_start = dt.datetime.now() for package in packages: - print(f"[{package.code}] 开始处理 {package.path.name}") + package_start = dt.datetime.now() + log(f"[{package.code}] 开始处理 {package.path.name}") + log(f"[{package.code}] 读取原始曲线并构造几何 ...") lines = list(iter_coastline_lines(package.path)) if not lines: - print(f"[{package.code}] 没有可用海岸线,跳过") + log(f"[{package.code}] 没有可用海岸线,跳过") continue coastline_geom = MultiLineString([list(line.coords) for line in lines]) - coastline_buffer = coastline_geom.buffer(args.buffer_m, cap_style=2, join_style=2) - prepared_buffer = prep(coastline_buffer) coast_bounds = coastline_geom.bounds + log( + f"[{package.code}] 几何已构造 lines={len(lines)} points={sum(len(line.coords) for line in lines)} " + f"bbox={coast_bounds[0]:.2f},{coast_bounds[1]:.2f},{coast_bounds[2]:.2f},{coast_bounds[3]:.2f} " + f"buffer={args.buffer_m:g}m" + ) - minx = align_floor(coast_bounds[0] - args.buffer_m - args.margin_cells * CELL_SIZE_M, CELL_SIZE_M) - miny = align_floor(coast_bounds[1] - args.buffer_m - args.margin_cells * CELL_SIZE_M, CELL_SIZE_M) - maxx = align_ceil(coast_bounds[2] + args.buffer_m + args.margin_cells * CELL_SIZE_M, CELL_SIZE_M) - maxy = align_ceil(coast_bounds[3] + args.buffer_m + args.margin_cells * CELL_SIZE_M, CELL_SIZE_M) + minx = align_floor(coast_bounds[0] - args.buffer_m - args.margin_cells * cell_size_m, cell_size_m) + miny = align_floor(coast_bounds[1] - args.buffer_m - args.margin_cells * cell_size_m, cell_size_m) + maxx = align_ceil(coast_bounds[2] + args.buffer_m + args.margin_cells * cell_size_m, cell_size_m) + maxy = align_ceil(coast_bounds[3] + args.buffer_m + args.margin_cells * cell_size_m, cell_size_m) line_count = len(lines) point_count = sum(len(line.coords) for line in lines) @@ -377,56 +522,195 @@ def main() -> None: package_blocked = 0 package_candidate = 0 package_rows: list[tuple] = [] + package_seen_cells: set[str] = set() + scanned_cells = 0 + next_progress_at = args.progress_every_cells + last_progress_at = dt.datetime.now() + coarse_factor = args.coarse_factor + coarse_size = cell_size_m * coarse_factor - ix0 = int(round(minx / CELL_SIZE_M)) - iy0 = int(round(miny / CELL_SIZE_M)) - ix1 = int(round(maxx / CELL_SIZE_M)) - iy1 = int(round(maxy / CELL_SIZE_M)) + for line_index, line in enumerate(lines, start=1): + line_start = dt.datetime.now() + line_buffer = line.buffer(args.buffer_m, cap_style=2, join_style=2) + if line_buffer.is_empty: + log(f"[{package.code}] 线段#{line_index} buffer 为空,跳过") + continue + prepared_buffer = prep(line_buffer) + line_bounds = line_buffer.bounds + log( + f"[{package.code}] 线段#{line_index} 扫描开始 " + f"bbox={line_bounds[0]:.2f},{line_bounds[1]:.2f},{line_bounds[2]:.2f},{line_bounds[3]:.2f}" + ) - for ix in range(ix0, ix1): - cell_minx = ix * CELL_SIZE_M - cell_maxx = cell_minx + CELL_SIZE_M - for iy in range(iy0, iy1): - cell_miny = iy * CELL_SIZE_M - cell_maxy = cell_miny + CELL_SIZE_M - cell = box(cell_minx, cell_miny, cell_maxx, cell_maxy) - intersects = prepared_buffer.intersects(cell) - if intersects: - cell_id = f"{ix}:{iy}" - package_rows.append( - ( - LAYER_NAME, - cell_id, - iy, - ix, - CELL_SIZE_M, - "HARD_BLOCKED", - "HARD_BLOCKED", - package.code, - cell_minx, - cell_miny, - cell_maxx, - cell_maxy, + scan_minx = align_floor(line_bounds[0] - args.margin_cells * cell_size_m, coarse_size) + scan_miny = align_floor(line_bounds[1] - args.margin_cells * cell_size_m, coarse_size) + scan_maxx = align_ceil(line_bounds[2] + args.margin_cells * cell_size_m, coarse_size) + scan_maxy = align_ceil(line_bounds[3] + args.margin_cells * cell_size_m, coarse_size) + + cix0 = int(round(scan_minx / coarse_size)) + ciy0 = int(round(scan_miny / coarse_size)) + cix1 = int(round(scan_maxx / coarse_size)) + ciy1 = int(round(scan_maxy / coarse_size)) + + for cix in range(cix0, cix1): + coarse_minx = cix * coarse_size + coarse_maxx = coarse_minx + coarse_size + for ciy in range(ciy0, ciy1): + coarse_miny = ciy * coarse_size + coarse_maxy = coarse_miny + coarse_size + coarse_cell = box(coarse_minx, coarse_miny, coarse_maxx, coarse_maxy) + scanned_cells += 1 + + if not prepared_buffer.intersects(coarse_cell): + package_candidate += coarse_factor * coarse_factor + now = dt.datetime.now() + if scanned_cells >= next_progress_at or ( + args.progress_every_seconds + and (now - last_progress_at).total_seconds() >= args.progress_every_seconds + ): + elapsed = (now - package_start).total_seconds() + rate = scanned_cells / elapsed if elapsed > 0 else 0.0 + log( + f"[{package.code}] 进度 scanned={scanned_cells} blocked={package_blocked} " + f"candidate={package_candidate} rows={len(package_rows)} " + f"rate={rate:.1f}/s elapsed={elapsed:.1f}s" + ) + last_progress_at = now + next_progress_at = scanned_cells + args.progress_every_cells + continue + + fx0 = cix * coarse_factor + fy0 = ciy * coarse_factor + fx1 = fx0 + coarse_factor + fy1 = fy0 + coarse_factor + + if prepared_buffer.contains(coarse_cell): + for ix in range(fx0, fx1): + cell_minx = ix * cell_size_m + cell_maxx = cell_minx + cell_size_m + for iy in range(fy0, fy1): + cell_miny = iy * cell_size_m + cell_maxy = cell_miny + cell_size_m + cell_id = f"{ix}:{iy}" + if cell_id in package_seen_cells: + continue + package_seen_cells.add(cell_id) + package_rows.append( + ( + layer_name, + cell_id, + iy, + ix, + cell_size_m, + "HARD_BLOCKED", + "HARD_BLOCKED", + source_name, + cell_minx, + cell_miny, + cell_maxx, + cell_maxy, + ) + ) + package_blocked += 1 + scanned_cells += coarse_factor * coarse_factor + now = dt.datetime.now() + if scanned_cells >= next_progress_at or ( + args.progress_every_seconds + and (now - last_progress_at).total_seconds() >= args.progress_every_seconds + ): + elapsed = (now - package_start).total_seconds() + rate = scanned_cells / elapsed if elapsed > 0 else 0.0 + log( + f"[{package.code}] 进度 scanned={scanned_cells} blocked={package_blocked} " + f"candidate={package_candidate} rows={len(package_rows)} " + f"rate={rate:.1f}/s elapsed={elapsed:.1f}s" + ) + last_progress_at = now + next_progress_at = scanned_cells + args.progress_every_cells + continue + + for ix in range(fx0, fx1): + cell_minx = ix * cell_size_m + cell_maxx = cell_minx + cell_size_m + for iy in range(fy0, fy1): + cell_miny = iy * cell_size_m + cell_maxy = cell_miny + cell_size_m + cell_id = f"{ix}:{iy}" + scanned_cells += 1 + cell = box(cell_minx, cell_miny, cell_maxx, cell_maxy) + if prepared_buffer.intersects(cell): + if cell_id not in package_seen_cells: + package_seen_cells.add(cell_id) + package_rows.append( + ( + layer_name, + cell_id, + iy, + ix, + cell_size_m, + "HARD_BLOCKED", + "HARD_BLOCKED", + source_name, + cell_minx, + cell_miny, + cell_maxx, + cell_maxy, + ) + ) + package_blocked += 1 + else: + package_candidate += 1 + + now = dt.datetime.now() + if scanned_cells >= next_progress_at or ( + args.progress_every_seconds + and (now - last_progress_at).total_seconds() >= args.progress_every_seconds + ): + elapsed = (now - package_start).total_seconds() + rate = scanned_cells / elapsed if elapsed > 0 else 0.0 + log( + f"[{package.code}] 进度 scanned={scanned_cells} blocked={package_blocked} " + f"candidate={package_candidate} rows={len(package_rows)} " + f"rate={rate:.1f}/s elapsed={elapsed:.1f}s" + ) + last_progress_at = now + next_progress_at = scanned_cells + args.progress_every_cells + + if package_rows and len(package_rows) >= 100: + flush_package_rows( + conn, + package_rows, + package_code=package.code, + package_blocked=package_blocked, + package_candidate=package_candidate, + reason=f"line#{line_index}", ) - ) - package_blocked += 1 - else: - package_candidate += 1 - if len(package_rows) >= 5000: - with conn.cursor() as cur: - insert_cells(cur, package_rows) - conn.commit() - print( - f"[{package.code}] 已写入 {len(package_rows)} 行," - f"blocked={package_blocked} candidate={package_candidate}" - ) - package_rows.clear() + if package_rows: + flush_package_rows( + conn, + package_rows, + package_code=package.code, + package_blocked=package_blocked, + package_candidate=package_candidate, + reason=f"line#{line_index}-end", + ) + + log( + f"[{package.code}] 线段#{line_index} 完成 " + f"blocked={package_blocked} candidate={package_candidate} " + f"elapsed={(dt.datetime.now() - line_start).total_seconds():.1f}s" + ) if package_rows: - with conn.cursor() as cur: - insert_cells(cur, package_rows) - conn.commit() + flush_package_rows( + conn, + package_rows, + package_code=package.code, + package_blocked=package_blocked, + package_candidate=package_candidate, + reason="package-end", + ) package_stats.append( { @@ -443,18 +727,23 @@ def main() -> None: ) with conn.cursor() as cur: + cur.execute( + "DELETE FROM navsea_grid_package_stat WHERE layer_name=%s AND source_code=%s", + (layer_name, package.code), + ) cur.execute( """ INSERT INTO navsea_grid_package_stat( - source_code, prefecture, zip_path, line_count, point_count, + layer_name, source_code, prefecture, zip_path, line_count, point_count, bbox_min_lon, bbox_min_lat, bbox_max_lon, bbox_max_lat, grid_min_lon, grid_min_lat, grid_max_lon, grid_max_lat, blocked_count, candidate_count ) VALUES ( - %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s + %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s ) """, ( + layer_name, package.code, package.prefecture, str(package.path), @@ -473,9 +762,10 @@ def main() -> None: ), ) conn.commit() - print( + log( f"[{package.code}] 完成 line={line_count} point={point_count} " - f"blocked={package_blocked} candidate={package_candidate}" + f"blocked={package_blocked} candidate={package_candidate} " + f"elapsed={(dt.datetime.now() - package_start).total_seconds():.1f}s" ) with conn.cursor() as cur: @@ -485,16 +775,16 @@ def main() -> None: conn.commit() with conn.cursor() as cur: - cur.execute(f"SELECT COUNT(*) FROM navsea_grid_cell WHERE layer_name=%s", (LAYER_NAME,)) + cur.execute(f"SELECT COUNT(*) FROM navsea_grid_cell WHERE layer_name=%s", (layer_name,)) final_total = int(cur.fetchone()[0] or 0) cur.execute( f"SELECT COUNT(*) FROM navsea_grid_cell WHERE layer_name=%s AND state_name=%s", - (LAYER_NAME, "HARD_BLOCKED"), + (layer_name, "HARD_BLOCKED"), ) blocked_count = int(cur.fetchone()[0] or 0) cur.execute( f"SELECT COUNT(*) FROM navsea_grid_cell WHERE layer_name=%s AND state_name=%s", - (LAYER_NAME, "NAVIGABLE_CANDIDATE"), + (layer_name, "NAVIGABLE_CANDIDATE"), ) candidate_count = int(cur.fetchone()[0] or 0) cur.execute( @@ -503,7 +793,7 @@ def main() -> None: FROM navsea_grid_cell WHERE layer_name=%s """, - (LAYER_NAME,), + (layer_name,), ) bbox_row = cur.fetchone() @@ -520,6 +810,9 @@ def main() -> None: manifest = { "build_time": build_time, "db_name": args.db_name, + "layer_name": layer_name, + "cell_size_m": cell_size_m, + "buffer_m": args.buffer_m, "source_scope": "japan", "source_code": "C23-06_*", "source_count": len(packages), @@ -531,32 +824,36 @@ def main() -> None: "candidate_count": candidate_count, "grid_bounds_lonlat": list(grid_bbox_lonlat), "package_stats": package_stats, - "notes": "全国海岸线 200m 硬阻塞栅格,直接写入 MySQL", + "notes": f"全国海岸线 {cell_size_m:g}m 硬阻塞栅格,直接写入 MySQL", } - manifest_path = out_dir / "japan_coast_grid_mysql.manifest.json" + manifest_path = out_dir / f"japan_{layer_name}_grid_mysql.manifest.json" manifest_path.write_text(json.dumps(manifest, ensure_ascii=False, indent=2), encoding="utf-8") with conn.cursor() as cur: upsert_meta( cur, - layer_name=LAYER_NAME, - description="全国海岸线 200m 硬阻塞格", + layer_name=layer_name, + description=f"全国海岸线 {cell_size_m:g}m 硬阻塞格", source_desc="coastline/C23-06_*_GML.zip", - cell_size_m=CELL_SIZE_M, + cell_size_m=cell_size_m, feature_count=final_total, bbox=grid_bbox_lonlat, export_file=str(manifest_path.relative_to(project_root)), ) conn.commit() - print("完成") - print(f" MySQL: {args.db_name}") - print(f" packages={len(packages)}") - print(f" coastline_lines={total_lines}") - print(f" grid_cells={final_total}") - print(f" blocked={blocked_count}") - print(f" candidate={candidate_count}") - print(f" manifest: {manifest_path}") + elapsed_all = (dt.datetime.now() - build_start).total_seconds() + log("完成") + log(f" MySQL: {args.db_name}") + log(f" layer={layer_name}") + log(f" cell_size_m={cell_size_m:g}") + log(f" packages={len(packages)}") + log(f" coastline_lines={total_lines}") + log(f" grid_cells={final_total}") + log(f" blocked={blocked_count}") + log(f" candidate={candidate_count}") + log(f" elapsed={elapsed_all:.1f}s") + log(f" manifest: {manifest_path}") finally: conn.close() diff --git a/coastline/export_coastline_only_port_overlay_kyushu_assets.py b/coastline/export_coastline_only_port_overlay_kyushu_assets.py new file mode 100644 index 0000000..23ee314 --- /dev/null +++ b/coastline/export_coastline_only_port_overlay_kyushu_assets.py @@ -0,0 +1,290 @@ +#!/usr/bin/env python3 +""" +NavSea coastline-only port overlay export v1.0 + +只使用 coastline/ 目录中的原始包重新导出九州港湾 / 漁港预览资产。 + +输入: +- coastline/C02-08.zip +- coastline/C09-06.zip + +输出: +- lines.geojson +- points.geojson +- manifest.json +""" + +from __future__ import annotations + +import argparse +import json +import math +import zipfile +from dataclasses import dataclass +from pathlib import Path +import xml.etree.ElementTree as ET + +from shapely.geometry import LineString, Point, mapping + + +RADIUS = 6378137.0 +DEFAULT_BBOX = (123.0, 31.0, 132.7, 34.9) + + +@dataclass(frozen=True) +class SourceSpec: + path: Path + dataset: str + kind: str + + +def local_name(tag: str) -> str: + return tag.split("}", 1)[-1] + + +def lonlat_from_text(text: str) -> tuple[float, float]: + parts = [p for p in text.replace(",", " ").split() if p] + if len(parts) < 2: + raise ValueError(f"invalid coordinate text: {text!r}") + lat = float(parts[0]) + lon = float(parts[1]) + return lon, lat + + +def load_xml(zip_path: Path) -> ET.Element: + with zipfile.ZipFile(zip_path) as zf: + xml_name = next(name for name in zf.namelist() if name.endswith(".xml") and "META" not in name) + return ET.fromstring(zf.read(xml_name)) + + +def build_point_lookup(root: ET.Element) -> dict[str, tuple[float, float]]: + lookup: dict[str, tuple[float, float]] = {} + for point in root.iter(): + if local_name(point.tag) != "GM_Point": + continue + point_id = point.attrib.get("id") + if not point_id: + continue + for el in point.iter(): + if local_name(el.tag).endswith("DirectPosition.coordinate") and (el.text or "").strip(): + lookup[point_id] = lonlat_from_text(el.text.strip()) + break + return lookup + + +def extract_curve_coords(curve: ET.Element, point_lookup: dict[str, tuple[float, float]]) -> list[tuple[float, float]]: + coords: list[tuple[float, float]] = [] + for pos in curve.iter(): + if not local_name(pos.tag).startswith("GM_Position"): + continue + direct = None + ref = None + for child in list(pos): + tag = local_name(child.tag) + if tag.endswith("DirectPosition.coordinate") and (child.text or "").strip(): + direct = child.text.strip() + break + if tag.endswith("PointRef.point"): + ref = child.attrib.get("idref") + if direct is not None: + coords.append(lonlat_from_text(direct)) + elif ref and ref in point_lookup: + coords.append(point_lookup[ref]) + return coords + + +def bbox_intersects(a: tuple[float, float, float, float], b: tuple[float, float, float, float]) -> bool: + return not (a[2] < b[0] or a[0] > b[2] or a[3] < b[1] or a[1] > b[3]) + + +def point_in_bbox(pt: tuple[float, float], bbox: tuple[float, float, float, float]) -> bool: + lon, lat = pt + return bbox[0] <= lon <= bbox[2] and bbox[1] <= lat <= bbox[3] + + +def feature_family(tag: str) -> str: + if tag == "CK01": + return "harbor_point" + if tag in ("CK11", "CK21"): + return "harbor_line" + if tag == "CB01": + return "fish_port_point" + if tag == "CB03": + return "fish_port_line" + return "unknown" + + +def main() -> None: + parser = argparse.ArgumentParser(description="Build coastline-only Kyushu port preview assets") + parser.add_argument( + "--output-dir", + default="src/pbf/coastline-only/kyushu", + help="输出目录", + ) + parser.add_argument( + "--slug", + default="coastline_only_port_overlay_kyushu", + help="输出前缀", + ) + parser.add_argument( + "--bbox", + nargs=4, + type=float, + default=list(DEFAULT_BBOX), + metavar=("MIN_LON", "MIN_LAT", "MAX_LON", "MAX_LAT"), + help="预览裁切范围,默认九州", + ) + args = parser.parse_args() + + project_root = Path(__file__).resolve().parent.parent + out_dir = Path(args.output_dir) + if not out_dir.is_absolute(): + out_dir = project_root / out_dir + out_dir.mkdir(parents=True, exist_ok=True) + + bbox = tuple(args.bbox) # type: ignore[assignment] + sources = [ + SourceSpec(project_root / "coastline" / "C02-08.zip", "C02-08", "harbor"), + SourceSpec(project_root / "coastline" / "C09-06.zip", "C09-06", "fish_port"), + ] + + line_features: list[dict] = [] + point_features: list[dict] = [] + stats = [] + + for source in sources: + if not source.path.exists(): + raise SystemExit(f"missing input: {source.path}") + + root = load_xml(source.path) + point_lookup = build_point_lookup(root) + obj = root.find(".//{http://nlftp.mlit.go.jp/ksj/schemas/ksj-app}OBJ") + if obj is None: + raise SystemExit(f"OBJ block missing in {source.path}") + + line_tags = ["CK11", "CK21"] if source.dataset == "C02-08" else ["CB03"] + point_tags = ["CK01"] if source.dataset == "C02-08" else ["CB01"] + line_count = 0 + point_count = 0 + minx = miny = float("inf") + maxx = maxy = float("-inf") + + for tag in line_tags: + for feature in obj.findall(f".//{{http://nlftp.mlit.go.jp/ksj/schemas/ksj-app}}{tag}"): + loc = feature.find("{http://nlftp.mlit.go.jp/ksj/schemas/ksj-app}LOC") + if loc is None: + continue + ref = loc.attrib.get("idref") + if not ref: + continue + curve = obj.find(f".//*[@id='{ref}']") + if curve is None: + continue + coords = extract_curve_coords(curve, point_lookup) + if len(coords) < 2: + continue + xs = [pt[0] for pt in coords] + ys = [pt[1] for pt in coords] + geom_bbox = (min(xs), min(ys), max(xs), max(ys)) + if not bbox_intersects(geom_bbox, bbox): + continue + props = { + "source_dataset": source.dataset, + "source_kind": source.kind, + "tag": tag, + "feature_family": feature_family(tag), + } + for key in ("PRC", "HBC", "FPC"): + el = feature.find(f"{{http://nlftp.mlit.go.jp/ksj/schemas/ksj-app}}{key}") + if el is not None and (el.text or "").strip(): + props[key.lower()] = el.text.strip() + line_features.append( + { + "type": "Feature", + "properties": props, + "geometry": mapping(LineString(coords)), + } + ) + line_count += 1 + minx = min(minx, geom_bbox[0]) + miny = min(miny, geom_bbox[1]) + maxx = max(maxx, geom_bbox[2]) + maxy = max(maxy, geom_bbox[3]) + + for tag in point_tags: + for feature in obj.findall(f".//{{http://nlftp.mlit.go.jp/ksj/schemas/ksj-app}}{tag}"): + pos = feature.find("{http://nlftp.mlit.go.jp/ksj/schemas/ksj-app}POS") + if pos is None: + continue + ref = pos.attrib.get("idref") + if not ref or ref not in point_lookup: + continue + lon, lat = point_lookup[ref] + if not point_in_bbox((lon, lat), bbox): + continue + props = { + "source_dataset": source.dataset, + "source_kind": source.kind, + "tag": tag, + "feature_family": feature_family(tag), + } + for key in ("NA4", "AD7", "NA2", "FCF", "AAC", "CH1", "CH2", "CFP", "FPA", "PRC", "HBC", "FPC"): + el = feature.find(f"{{http://nlftp.mlit.go.jp/ksj/schemas/ksj-app}}{key}") + if el is not None and (el.text or "").strip(): + props[key.lower()] = el.text.strip() + point_features.append( + { + "type": "Feature", + "properties": props, + "geometry": mapping(Point(lon, lat)), + } + ) + point_count += 1 + minx = min(minx, lon) + miny = min(miny, lat) + maxx = max(maxx, lon) + maxy = max(maxy, lat) + + stats.append( + { + "dataset": source.dataset, + "kind": source.kind, + "path": str(source.path), + "line_count": line_count, + "point_count": point_count, + "bbox_lonlat": None if line_count + point_count == 0 else [minx, miny, maxx, maxy], + } + ) + + manifest = { + "version": "v1.0", + "source_packages": [str(s.path) for s in sources], + "bbox_lonlat": list(bbox), + "line_count": len(line_features), + "point_count": len(point_features), + "stats": stats, + "line_file": f"{args.slug}_lines.geojson", + "point_file": f"{args.slug}_points.geojson", + } + + (out_dir / f"{args.slug}_lines.geojson").write_text( + json.dumps({"type": "FeatureCollection", "name": "coastline_only_lines", "features": line_features}, ensure_ascii=False), + encoding="utf-8", + ) + (out_dir / f"{args.slug}_points.geojson").write_text( + json.dumps({"type": "FeatureCollection", "name": "coastline_only_points", "features": point_features}, ensure_ascii=False), + encoding="utf-8", + ) + (out_dir / f"{args.slug}_manifest.json").write_text( + json.dumps(manifest, ensure_ascii=False, indent=2), + encoding="utf-8", + ) + + print("已导出:") + print(" -", out_dir / f"{args.slug}_lines.geojson") + print(" -", out_dir / f"{args.slug}_points.geojson") + print(" -", out_dir / f"{args.slug}_manifest.json") + + +if __name__ == "__main__": + main() diff --git a/coastline/export_fish_port_debug_assets.py b/coastline/export_fish_port_debug_assets.py new file mode 100644 index 0000000..2146ab4 --- /dev/null +++ b/coastline/export_fish_port_debug_assets.py @@ -0,0 +1,518 @@ +#!/usr/bin/env python3 +from __future__ import annotations + +import argparse +import datetime as dt +import json +import math +import sys +from pathlib import Path + +import numpy as np +import pymysql +from shapely import get_parts, intersects_xy +from shapely.geometry import LineString, box +from shapely.ops import polygonize, unary_union +from shapely.prepared import prep + +PROJECT_ROOT = Path(__file__).resolve().parent.parent +if str(PROJECT_ROOT) not in sys.path: + sys.path.insert(0, str(PROJECT_ROOT)) + +from coastline.build_fish_port_20m_full_mysql_resume import ( + align_ceil, + align_floor, + build_point_lookup, + cluster_line_indices, + collect_fish_lines_for_prc, + discover_target_prcs, + load_coastlines_for_prc, + load_coarse_windows_for_bbox, + load_xml, + lon_from_mercator, + lat_from_mercator, + mercator_x, + mercator_y, + rect_lonlat, +) + + +DB_NAME = "navsea_japan_coast_grid" +DB_USER = "root" +DB_PASSWORD = "2chi9ks2" +DB_HOST = "localhost" +DB_SOCKET = "/tmp/mysql.sock" + +FISH_SRC = "coastline/C09-06.zip" +DEFAULT_OUT_DIR = "src/pbf/coastline-mysql/fish_port_debug" +DEFAULT_BUFFER_M = 20.0 +DEFAULT_COARSE_MARGIN_M = 0.0 +COAST_COARSE_LAYER = "coast_200m" +CELL_SIZE_M = 20.0 +RADIUS = 6378137.0 + + +def mysql_connect(database: str, *, cursorclass=pymysql.cursors.Cursor): + kwargs = { + "host": DB_HOST, + "user": DB_USER, + "password": DB_PASSWORD, + "database": database, + "charset": "utf8mb4", + "cursorclass": cursorclass, + } + if DB_SOCKET: + kwargs["unix_socket"] = DB_SOCKET + return pymysql.connect(**kwargs) + + +def mercator_to_lonlat_bbox(bbox: tuple[float, float, float, float]) -> tuple[float, float, float, float]: + minx, miny, maxx, maxy = bbox + return lon_from_mercator(minx), lat_from_mercator(miny), lon_from_mercator(maxx), lat_from_mercator(maxy) + + +def mercator_geom_to_lonlat_geojson(geom) -> dict: + geo = geom.__geo_interface__ + + def convert_coords(coords): + if not isinstance(coords, (list, tuple)): + return coords + if coords and isinstance(coords[0], (int, float)): + x = float(coords[0]) + y = float(coords[1]) + return [float(lon_from_mercator(x)), float(lat_from_mercator(y))] + return [convert_coords(item) for item in coords] + + if geo["type"] == "GeometryCollection": + return { + "type": "GeometryCollection", + "geometries": [mercator_geom_to_lonlat_geojson(part) for part in geom.geoms], + } + return { + "type": geo["type"], + "coordinates": convert_coords(geo["coordinates"]), + } + + +def lonlat_line_feature( + coords: list[tuple[float, float]], + *, + kind: str, + fpc: str, + prc: str, + label: str | None = None, +) -> dict: + properties = { + "kind": kind, + "fpc": fpc, + "prc": prc, + } + if label is not None: + properties["label"] = label + return { + "type": "Feature", + "properties": properties, + "geometry": { + "type": "LineString", + "coordinates": [[float(lon), float(lat)] for lon, lat in coords], + }, + } + + +def mercator_line_feature( + line: LineString, + *, + kind: str, + fpc: str, + prc: str, + label: str | None = None, +) -> dict: + coords = [[float(lon_from_mercator(x)), float(lat_from_mercator(y))] for x, y in line.coords] + return { + "type": "Feature", + "properties": { + "kind": kind, + "fpc": fpc, + "prc": prc, + **({"label": label} if label is not None else {}), + }, + "geometry": { + "type": "LineString", + "coordinates": coords, + }, + } + + +def bbox_feature( + bbox: tuple[float, float, float, float], + *, + kind: str, + fpc: str, + prc: str, + label: str, +) -> dict: + min_lon, min_lat, max_lon, max_lat = bbox + return { + "type": "Feature", + "properties": { + "kind": kind, + "fpc": fpc, + "prc": prc, + "label": label, + }, + "geometry": rect_lonlat(min_lon, min_lat, max_lon, max_lat), + } + + +def mercator_bbox_feature( + bbox: tuple[float, float, float, float], + *, + kind: str, + fpc: str, + prc: str, + label: str, +) -> dict: + return bbox_feature( + mercator_to_lonlat_bbox(bbox), + kind=kind, + fpc=fpc, + prc=prc, + label=label, + ) + + +def buffer_tag(value: float) -> str: + if abs(value - round(value)) < 1e-9: + return str(int(round(value))) + return str(value).replace(".", "p") + + +def scan_debug_cells( + scan_geom, + coast_prepared, + *, + prc: str, + fpc: str, + cluster_idx: int, + part_idx: int, + window_idx: int, + max_scan_cells: int | None, +) -> tuple[list[dict], int, int]: + fish_prepared = prep(scan_geom) + minx, miny, maxx, maxy = scan_geom.bounds + start_x = align_floor(minx, CELL_SIZE_M) + start_y = align_floor(miny, CELL_SIZE_M) + end_x = align_ceil(maxx, CELL_SIZE_M) + end_y = align_ceil(maxy, CELL_SIZE_M) + estimated_cols = max(0, int(math.ceil((end_x - start_x) / CELL_SIZE_M))) + estimated_rows = max(0, int(math.ceil((end_y - start_y) / CELL_SIZE_M))) + estimated_cells = estimated_cols * estimated_rows + if max_scan_cells is not None and estimated_cells > max_scan_cells: + raise RuntimeError( + "scan guard triggered: " + f"estimated_cells={estimated_cells} max_scan_cells={max_scan_cells} " + f"grid={estimated_cols}x{estimated_rows} bounds={tuple(round(v, 3) for v in scan_geom.bounds)} " + f"fpc={fpc} prc={prc} cluster={cluster_idx} part={part_idx} window={window_idx}" + ) + + half = CELL_SIZE_M / 2.0 + ix_start = int(round(start_x / CELL_SIZE_M)) + ix_end = int(round(end_x / CELL_SIZE_M)) + ix_values = np.arange(ix_start, ix_end, dtype=np.int64) + x_values = ix_values.astype(float) * CELL_SIZE_M + x_center_values = x_values + half + x_right_values = x_values + CELL_SIZE_M + + features: list[dict] = [] + coast_count = 0 + sea_count = 0 + + y = start_y + while y < end_y: + row_strip = box(start_x, y, end_x, y + CELL_SIZE_M) + if not fish_prepared.intersects(row_strip): + y += CELL_SIZE_M + continue + + mask = ( + intersects_xy(scan_geom, x_center_values, y + half) + | intersects_xy(scan_geom, x_values, y) + | intersects_xy(scan_geom, x_right_values, y) + | intersects_xy(scan_geom, x_values, y + CELL_SIZE_M) + | intersects_xy(scan_geom, x_right_values, y + CELL_SIZE_M) + ) + if not np.any(mask): + y += CELL_SIZE_M + continue + + mask = mask | np.r_[False, mask[:-1]] | np.r_[mask[1:], False] + for idx in np.flatnonzero(mask): + x = float(x_values[idx]) + cell_geom = box(x, y, x + CELL_SIZE_M, y + CELL_SIZE_M) + if not fish_prepared.intersects(cell_geom): + continue + coast_hit = coast_prepared.intersects(cell_geom) + min_lon = lon_from_mercator(x) + min_lat = lat_from_mercator(y) + max_lon = lon_from_mercator(x + CELL_SIZE_M) + max_lat = lat_from_mercator(y + CELL_SIZE_M) + features.append( + { + "type": "Feature", + "properties": { + "kind": "cell_coast" if coast_hit else "cell_sea", + "fpc": fpc, + "prc": prc, + "cluster_idx": int(cluster_idx), + "part_idx": int(part_idx), + "window_idx": int(window_idx), + "cell_id": f"{int(round(x / CELL_SIZE_M))}:{int(round(y / CELL_SIZE_M))}", + "row": int(round(y / CELL_SIZE_M)), + "col": int(round(x / CELL_SIZE_M)), + "cell_size_m": CELL_SIZE_M, + "coast_hit": coast_hit, + }, + "geometry": rect_lonlat(min_lon, min_lat, max_lon, max_lat), + } + ) + if coast_hit: + coast_count += 1 + else: + sea_count += 1 + y += CELL_SIZE_M + + return features, coast_count, sea_count + + +def main() -> None: + parser = argparse.ArgumentParser(description="Export one fish port debug bundle") + parser.add_argument("--db-name", default=DB_NAME) + parser.add_argument("--out-dir", default=DEFAULT_OUT_DIR) + parser.add_argument("--fpc", required=True, help="港口 FPC 号,例如 4320050") + parser.add_argument("--coast-buffer-m", type=float, default=DEFAULT_BUFFER_M, help="海岸缓冲距离(米)") + parser.add_argument( + "--coast-coarse-margin-m", + type=float, + default=DEFAULT_COARSE_MARGIN_M, + help="coast_200m 粗窗查询外扩距离(米)", + ) + parser.add_argument("--cluster-gap-m", type=float, default=250.0, help="线聚类间隔(米)") + parser.add_argument("--max-scan-cells", type=int, default=200000, help="单窗允许扫描的最大 20m 格数") + args = parser.parse_args() + + project_root = Path(__file__).resolve().parent.parent + out_dir = Path(args.out_dir) + if not out_dir.is_absolute(): + out_dir = project_root / out_dir + + fpc = str(args.fpc).strip() + buffer_dir = out_dir / f"fpc_{fpc}" / f"buffer_{buffer_tag(args.coast_buffer_m)}" + buffer_dir.mkdir(parents=True, exist_ok=True) + + root = load_xml(project_root / FISH_SRC) + point_lookup = build_point_lookup(root) + prcs = discover_target_prcs(root, None, fpc) + if not prcs: + raise SystemExit(f"no PRC matched for FPC={fpc}") + prc = prcs[0] + + fish_lines = collect_fish_lines_for_prc(root, point_lookup, prc, selected_fpc=fpc) + if not fish_lines: + raise SystemExit(f"no fish-port line features selected for FPC={fpc}") + + fish_bboxes = [line.bbox for line in fish_lines] + fish_bbox = ( + min(bb[0] for bb in fish_bboxes), + min(bb[1] for bb in fish_bboxes), + max(bb[2] for bb in fish_bboxes), + max(bb[3] for bb in fish_bboxes), + ) + + coast_lines, coast_bbox = load_coastlines_for_prc( + project_root, + prc, + bbox=( + mercator_x(fish_bbox[0]), + mercator_y(fish_bbox[1]), + mercator_x(fish_bbox[2]), + mercator_y(fish_bbox[3]), + ), + search_margin_m=max(args.coast_buffer_m, args.coast_coarse_margin_m), + ) + coast_geom = unary_union(coast_lines) + coast_buffer = coast_geom.buffer(args.coast_buffer_m, cap_style=2, join_style=2) + coast_prepared = prep(coast_buffer) + + conn = mysql_connect(args.db_name) + try: + prc_coarse_windows = load_coarse_windows_for_bbox( + conn, + layer_name=COAST_COARSE_LAYER, + bbox_mercator=( + mercator_x(fish_bbox[0]), + mercator_y(fish_bbox[1]), + mercator_x(fish_bbox[2]), + mercator_y(fish_bbox[3]), + ), + margin_m=args.coast_coarse_margin_m, + ) + + cluster_groups = cluster_line_indices([line.bbox for line in fish_lines], gap_m=args.cluster_gap_m) + + features: list[dict] = [] + features.append( + bbox_feature( + fish_bbox, + kind="fish_bbox", + fpc=fpc, + prc=prc, + label="fish_bbox", + ) + ) + features.append( + mercator_bbox_feature( + coast_bbox, + kind="coast_bbox", + fpc=fpc, + prc=prc, + label="coast_bbox", + ) + ) + for line in fish_lines: + features.append( + lonlat_line_feature( + line.coords, + kind="fish_line", + fpc=fpc, + prc=prc, + label="fish_line", + ) + ) + for line in coast_lines: + features.append( + mercator_line_feature( + line, + kind="coast_line", + fpc=fpc, + prc=prc, + label="coast_line", + ) + ) + + features.append( + { + "type": "Feature", + "properties": { + "kind": "coast_buffer", + "fpc": fpc, + "prc": prc, + "buffer_m": args.coast_buffer_m, + "label": f"buffer={args.coast_buffer_m}m", + }, + "geometry": mercator_geom_to_lonlat_geojson(coast_buffer), + } + ) + + for idx, coarse_window in enumerate(prc_coarse_windows): + features.append( + bbox_feature( + mercator_to_lonlat_bbox(coarse_window), + kind="coast_200m_window", + fpc=fpc, + prc=prc, + label=f"coast_200m_window_{idx + 1}", + ) + ) + + scan_window_total = 0 + cell_coast_total = 0 + cell_sea_total = 0 + + for cluster_idx, cluster in enumerate(cluster_groups): + cluster_lines = [ + LineString([(mercator_x(lon), mercator_y(lat)) for lon, lat in fish_lines[i].coords]) + for i in cluster + ] + merged = unary_union(cluster_lines) + polygons = list(polygonize(merged)) + if polygons: + fish_geom = unary_union(polygons) + else: + fish_geom = merged.buffer(CELL_SIZE_M, cap_style=2, join_style=2) + + fish_parts = [part for part in get_parts(fish_geom) if not part.is_empty] + for part_idx, fish_part in enumerate(fish_parts): + part_bbox = fish_part.bounds + part_coarse_windows = load_coarse_windows_for_bbox( + conn, + layer_name=COAST_COARSE_LAYER, + bbox_mercator=part_bbox, + margin_m=args.coast_coarse_margin_m, + ) + for window_idx, coarse_window in enumerate(part_coarse_windows): + window_geom = box(*coarse_window) + scan_geom = window_geom + scan_window_total += 1 + features.append( + { + "type": "Feature", + "properties": { + "kind": "scan_window", + "fpc": fpc, + "prc": prc, + "cluster_idx": int(cluster_idx), + "part_idx": int(part_idx), + "window_idx": int(window_idx), + "label": f"scan_window_{cluster_idx + 1}_{part_idx + 1}_{window_idx + 1}", + }, + "geometry": mercator_geom_to_lonlat_geojson(scan_geom), + } + ) + cells, coast_count, sea_count = scan_debug_cells( + scan_geom, + coast_prepared, + prc=prc, + fpc=fpc, + cluster_idx=cluster_idx, + part_idx=part_idx, + window_idx=window_idx, + max_scan_cells=args.max_scan_cells, + ) + features.extend(cells) + cell_coast_total += coast_count + cell_sea_total += sea_count + + out_path = buffer_dir / "debug.geojson" + out_path.write_text( + json.dumps({"type": "FeatureCollection", "features": features}, ensure_ascii=False, indent=2), + encoding="utf-8", + ) + + manifest = { + "database": args.db_name, + "generated_at": dt.datetime.now().isoformat(timespec="seconds"), + "fpc": fpc, + "prc": prc, + "buffer_m": args.coast_buffer_m, + "coast_coarse_margin_m": args.coast_coarse_margin_m, + "fish_bbox_lonlat": list(fish_bbox), + "fish_line_count": len(fish_lines), + "coast_curve_count": len(coast_lines), + "coast_bbox_mercator": list(coast_bbox), + "coast_200m_window_count": len(prc_coarse_windows), + "scan_window_count": scan_window_total, + "cell_coast_count": cell_coast_total, + "cell_sea_count": cell_sea_total, + "feature_count": len(features), + "export_file": str(out_path.relative_to(project_root)) if project_root in out_path.parents else str(out_path), + } + (buffer_dir / "manifest.json").write_text(json.dumps(manifest, ensure_ascii=False, indent=2), encoding="utf-8") + + print(f"debug: {len(features)} -> {out_path}") + print(f"manifest: {buffer_dir / 'manifest.json'}") + finally: + conn.close() + + +if __name__ == "__main__": + main() diff --git a/coastline/export_fish_port_grid_fukuoka_saga_assets.py b/coastline/export_fish_port_grid_fukuoka_saga_assets.py new file mode 100644 index 0000000..3742d12 --- /dev/null +++ b/coastline/export_fish_port_grid_fukuoka_saga_assets.py @@ -0,0 +1,379 @@ +#!/usr/bin/env python3 +""" +NavSea fish-port grid export v1.0 + +只使用 coastline/C09-06.zip 中的漁港数据,筛出福冈/佐贺(PRC=40/41) +范围,生成 50x50m 栅格预览资产。 + +输出: +- lines.geojson: 渔港边界线 +- grid.geojson: 50m 栅格 +- manifest.json: 元数据 +""" + +from __future__ import annotations + +import argparse +import json +import math +import zipfile +from dataclasses import dataclass +from pathlib import Path +import xml.etree.ElementTree as ET + +from shapely.geometry import LineString, Polygon, box, mapping +from shapely.ops import polygonize, unary_union + + +RADIUS = 6378137.0 +MAX_MERCATOR_LAT = 85.0511287798066 +DEFAULT_BBOX = (128.7, 31.8, 131.4, 34.9) + + +@dataclass(frozen=True) +class SourceSpec: + path: Path + dataset: str + kind: str + + +def local_name(tag: str) -> str: + return tag.split("}", 1)[-1] + + +def lonlat_from_text(text: str) -> tuple[float, float]: + parts = [p for p in text.replace(",", " ").split() if p] + if len(parts) < 2: + raise ValueError(f"invalid coordinate text: {text!r}") + lat = float(parts[0]) + lon = float(parts[1]) + return lon, lat + + +def mercator_x(lon: float) -> float: + return RADIUS * math.radians(lon) + + +def mercator_y(lat: float) -> float: + lat = max(min(lat, MAX_MERCATOR_LAT), -MAX_MERCATOR_LAT) + return RADIUS * math.log(math.tan(math.pi / 4.0 + math.radians(lat) / 2.0)) + + +def mercator_point(lon: float, lat: float) -> tuple[float, float]: + return mercator_x(lon), mercator_y(lat) + + +def lon_from_mercator(x: float) -> float: + return math.degrees(x / RADIUS) + + +def lat_from_mercator(y: float) -> float: + return math.degrees(2.0 * math.atan(math.exp(y / RADIUS)) - math.pi / 2.0) + + +def mercator_to_lonlat(pt: tuple[float, float]) -> tuple[float, float]: + return lon_from_mercator(pt[0]), lat_from_mercator(pt[1]) + + +def load_xml(zip_path: Path) -> ET.Element: + with zipfile.ZipFile(zip_path) as zf: + xml_name = next(name for name in zf.namelist() if name.endswith(".xml") and "META" not in name) + return ET.fromstring(zf.read(xml_name)) + + +def build_point_lookup(root: ET.Element) -> dict[str, tuple[float, float]]: + lookup: dict[str, tuple[float, float]] = {} + for point in root.iter(): + if local_name(point.tag) != "GM_Point": + continue + point_id = point.attrib.get("id") + if not point_id: + continue + coord_text = None + for el in point.iter(): + if local_name(el.tag).endswith("DirectPosition.coordinate") and (el.text or "").strip(): + coord_text = el.text.strip() + break + if coord_text is None: + continue + lookup[point_id] = lonlat_from_text(coord_text) + return lookup + + +def extract_curve_coords(curve: ET.Element, point_lookup: dict[str, tuple[float, float]]) -> list[tuple[float, float]]: + coords: list[tuple[float, float]] = [] + for pos in curve.iter(): + tag = local_name(pos.tag) + if not tag.startswith("GM_Position"): + continue + direct = None + ref = None + for child in list(pos): + child_tag = local_name(child.tag) + if child_tag.endswith("DirectPosition.coordinate") and (child.text or "").strip(): + direct = child.text.strip() + break + if child_tag.endswith("PointRef.point"): + ref = child.attrib.get("idref") + if direct is not None: + coords.append(lonlat_from_text(direct)) + elif ref and ref in point_lookup: + coords.append(point_lookup[ref]) + return coords + + +def bbox_intersects(a: tuple[float, float, float, float], b: tuple[float, float, float, float]) -> bool: + return not (a[2] < b[0] or a[0] > b[2] or a[3] < b[1] or a[1] > b[3]) + + +def align_floor(value: float, step: float) -> float: + return math.floor(value / step) * step + + +def align_ceil(value: float, step: float) -> float: + return math.ceil(value / step) * step + + +def ring_lonlat_from_mercator(minx: float, miny: float, maxx: float, maxy: float) -> list[list[float]]: + ring = [ + mercator_to_lonlat((minx, miny)), + mercator_to_lonlat((maxx, miny)), + mercator_to_lonlat((maxx, maxy)), + mercator_to_lonlat((minx, maxy)), + mercator_to_lonlat((minx, miny)), + ] + return [[lon, lat] for lon, lat in ring] + + +def main() -> None: + parser = argparse.ArgumentParser(description="Build fish-port 50m grid preview assets for Fukuoka/Saga") + parser.add_argument( + "--output-dir", + default="src/pbf/coastline-only/fukuoka_saga_fish_port_50m", + help="输出目录", + ) + parser.add_argument( + "--slug", + default="fish_port_grid_fukuoka_saga_50m", + help="输出文件前缀", + ) + parser.add_argument( + "--source", + default="coastline/C09-06.zip", + help="输入漁港原始包", + ) + parser.add_argument( + "--prc", + nargs="+", + default=["40", "41"], + help="只保留这些 PRC(默认福冈/佐贺)", + ) + parser.add_argument( + "--bbox", + nargs=4, + type=float, + default=list(DEFAULT_BBOX), + metavar=("MIN_LON", "MIN_LAT", "MAX_LON", "MAX_LAT"), + help="预览裁切范围,仅用于页面初始视窗", + ) + parser.add_argument( + "--cell-size-m", + type=float, + default=50.0, + help="栅格尺寸,默认 50m", + ) + parser.add_argument( + "--line-buffer-m", + type=float, + default=80.0, + help="当 polygonize 失败时,线缓冲半径", + ) + args = parser.parse_args() + + project_root = Path(__file__).resolve().parent.parent + source_path = Path(args.source) + if not source_path.is_absolute(): + source_path = project_root / source_path + + out_dir = Path(args.output_dir) + if not out_dir.is_absolute(): + out_dir = project_root / out_dir + out_dir.mkdir(parents=True, exist_ok=True) + + if not source_path.exists(): + raise SystemExit(f"missing input: {source_path}") + + selected_prc = {str(x) for x in args.prc} + root = load_xml(source_path) + point_lookup = build_point_lookup(root) + obj = root.find(".//{http://nlftp.mlit.go.jp/ksj/schemas/ksj-app}OBJ") + if obj is None: + raise SystemExit(f"OBJ block missing in {source_path}") + + line_features: list[dict] = [] + mercator_lines: list[LineString] = [] + minx = miny = float("inf") + maxx = maxy = float("-inf") + selected_count = 0 + + for feature in obj.findall(".//{http://nlftp.mlit.go.jp/ksj/schemas/ksj-app}CB03"): + prc_el = feature.find("{http://nlftp.mlit.go.jp/ksj/schemas/ksj-app}PRC") + prc = prc_el.text.strip() if prc_el is not None and (prc_el.text or "").strip() else None + if prc not in selected_prc: + continue + + loc = feature.find("{http://nlftp.mlit.go.jp/ksj/schemas/ksj-app}LOC") + if loc is None: + continue + ref = loc.attrib.get("idref") + if not ref: + continue + curve = obj.find(f".//*[@id='{ref}']") + if curve is None: + continue + + coords = extract_curve_coords(curve, point_lookup) + if len(coords) < 2: + continue + + xs = [pt[0] for pt in coords] + ys = [pt[1] for pt in coords] + geom_bbox = (min(xs), min(ys), max(xs), max(ys)) + + line_lonlat = LineString(coords) + line_mercator = LineString([mercator_point(lon, lat) for lon, lat in coords]) + mercator_lines.append(line_mercator) + + props = { + "source_dataset": "C09-06", + "source_kind": "fish_port", + "tag": "CB03", + "feature_family": "fish_port_line", + "prc": prc, + } + fpc = feature.find("{http://nlftp.mlit.go.jp/ksj/schemas/ksj-app}FPC") + if fpc is not None and (fpc.text or "").strip(): + props["fpc"] = fpc.text.strip() + + line_features.append( + { + "type": "Feature", + "properties": props, + "geometry": mapping(line_lonlat), + } + ) + selected_count += 1 + minx = min(minx, geom_bbox[0]) + miny = min(miny, geom_bbox[1]) + maxx = max(maxx, geom_bbox[2]) + maxy = max(maxy, geom_bbox[3]) + + if not mercator_lines: + raise SystemExit("no fish-port lines selected for PRC=40/41") + + merged = unary_union(mercator_lines) + polygon_candidates = list(polygonize(merged)) + polygon_mode = "polygonize" if polygon_candidates else "line_buffer" + + if polygon_candidates: + effective_geom = unary_union(polygon_candidates) + else: + effective_geom = merged.buffer(args.line_buffer_m, cap_style=2, join_style=2) + + if effective_geom.is_empty: + raise SystemExit("effective geometry is empty") + + bounds = effective_geom.bounds + cell = args.cell_size_m + start_x = align_floor(bounds[0], cell) + start_y = align_floor(bounds[1], cell) + end_x = align_ceil(bounds[2], cell) + end_y = align_ceil(bounds[3], cell) + + grid_features: list[dict] = [] + grid_count = 0 + row = 0 + y = start_y + while y < end_y: + col = 0 + x = start_x + while x < end_x: + cell_poly = box(x, y, x + cell, y + cell) + if cell_poly.intersects(effective_geom): + ring = ring_lonlat_from_mercator(x, y, x + cell, y + cell) + grid_features.append( + { + "type": "Feature", + "properties": { + "source_dataset": "C09-06", + "source_kind": "fish_port", + "feature_family": "fish_port_grid_50m", + "prc_scope": ",".join(sorted(selected_prc)), + "row": row, + "col": col, + }, + "geometry": { + "type": "Polygon", + "coordinates": [ring], + }, + } + ) + grid_count += 1 + x += cell + col += 1 + y += cell + row += 1 + + bbox_lonlat = tuple(args.bbox) + manifest = { + "version": "v1.0", + "source_package": str(source_path), + "prc_scope": sorted(selected_prc), + "cell_size_m": cell, + "line_buffer_m": args.line_buffer_m, + "polygon_mode": polygon_mode, + "selected_line_count": selected_count, + "polygon_count": len(polygon_candidates), + "grid_count": grid_count, + "bbox_lonlat": list(bbox_lonlat), + "feature_bbox_lonlat": None if selected_count == 0 else [minx, miny, maxx, maxy], + "grid_bbox_mercator": [bounds[0], bounds[1], bounds[2], bounds[3]], + "line_file": f"{args.slug}_lines.geojson", + "grid_file": f"{args.slug}_grid.geojson", + } + + (out_dir / f"{args.slug}_lines.geojson").write_text( + json.dumps( + { + "type": "FeatureCollection", + "name": "fish_port_lines", + "features": line_features, + }, + ensure_ascii=False, + ), + encoding="utf-8", + ) + (out_dir / f"{args.slug}_grid.geojson").write_text( + json.dumps( + { + "type": "FeatureCollection", + "name": "fish_port_grid_50m", + "features": grid_features, + }, + ensure_ascii=False, + ), + encoding="utf-8", + ) + (out_dir / f"{args.slug}_manifest.json").write_text( + json.dumps(manifest, ensure_ascii=False, indent=2), + encoding="utf-8", + ) + + print("已导出:") + print(" -", out_dir / f"{args.slug}_lines.geojson") + print(" -", out_dir / f"{args.slug}_grid.geojson") + print(" -", out_dir / f"{args.slug}_manifest.json") + + +if __name__ == "__main__": + main() diff --git a/coastline/export_fish_port_navsplit_fukuoka_saga_assets.py b/coastline/export_fish_port_navsplit_fukuoka_saga_assets.py new file mode 100644 index 0000000..81cbb82 --- /dev/null +++ b/coastline/export_fish_port_navsplit_fukuoka_saga_assets.py @@ -0,0 +1,485 @@ +#!/usr/bin/env python3 +""" +NavSea fish-port navigation split export v1.0 + +目标: +- 只看福冈 / 佐贺渔港 +- 用 C09-06.zip 的渔港边界先圈出港区 +- 再叠加 C23-06_40 / C23-06_41 海岸线 +- 将港区切成 50m x 50m 格网,并区分海面 / 陆基 + +输出: +- lines.geojson: 渔港边界线 + 海岸线参考 +- grid.geojson: 50m 分类格网 +- manifest.json: 元数据 +""" + +from __future__ import annotations + +import argparse +import json +import math +import zipfile +import xml.etree.ElementTree as ET +from dataclasses import dataclass +from pathlib import Path + +from shapely.geometry import LineString, box, mapping +from shapely.ops import polygonize, unary_union +from shapely.prepared import prep + + +RADIUS = 6378137.0 +MAX_MERCATOR_LAT = 85.0511287798066 +DEFAULT_BBOX = (128.7, 31.8, 131.4, 34.9) + + +@dataclass(frozen=True) +class SourceSpec: + path: Path + dataset: str + kind: str + + +def local_name(tag: str) -> str: + return tag.split("}", 1)[-1] + + +def lonlat_from_text(text: str) -> tuple[float, float]: + parts = [p for p in text.replace(",", " ").split() if p] + if len(parts) < 2: + raise ValueError(f"invalid coordinate text: {text!r}") + lat = float(parts[0]) + lon = float(parts[1]) + return lon, lat + + +def mercator_x(lon: float) -> float: + return RADIUS * math.radians(lon) + + +def mercator_y(lat: float) -> float: + lat = max(min(lat, MAX_MERCATOR_LAT), -MAX_MERCATOR_LAT) + return RADIUS * math.log(math.tan(math.pi / 4.0 + math.radians(lat) / 2.0)) + + +def mercator_point(lon: float, lat: float) -> tuple[float, float]: + return mercator_x(lon), mercator_y(lat) + + +def lon_from_mercator(x: float) -> float: + return math.degrees(x / RADIUS) + + +def lat_from_mercator(y: float) -> float: + return math.degrees(2.0 * math.atan(math.exp(y / RADIUS)) - math.pi / 2.0) + + +def mercator_to_lonlat(pt: tuple[float, float]) -> tuple[float, float]: + return lon_from_mercator(pt[0]), lat_from_mercator(pt[1]) + + +def align_floor(value: float, step: float) -> float: + return math.floor(value / step) * step + + +def align_ceil(value: float, step: float) -> float: + return math.ceil(value / step) * step + + +def load_xml(zip_path: Path) -> ET.Element: + with zipfile.ZipFile(zip_path) as zf: + xml_name = next(name for name in zf.namelist() if name.endswith(".xml") and "META" not in name) + return ET.fromstring(zf.read(xml_name)) + + +def build_point_lookup(root: ET.Element) -> dict[str, tuple[float, float]]: + lookup: dict[str, tuple[float, float]] = {} + for point in root.iter(): + if local_name(point.tag) != "GM_Point": + continue + point_id = point.attrib.get("id") + if not point_id: + continue + coord_text = None + for el in point.iter(): + if local_name(el.tag).endswith("DirectPosition.coordinate") and (el.text or "").strip(): + coord_text = el.text.strip() + break + if coord_text is None: + continue + lookup[point_id] = lonlat_from_text(coord_text) + return lookup + + +def extract_curve_coords(curve: ET.Element, point_lookup: dict[str, tuple[float, float]]) -> list[tuple[float, float]]: + coords: list[tuple[float, float]] = [] + for pos in curve.iter(): + tag = local_name(pos.tag) + if not tag.startswith("GM_Position"): + continue + direct = None + ref = None + for child in list(pos): + child_tag = local_name(child.tag) + if child_tag.endswith("DirectPosition.coordinate") and (child.text or "").strip(): + direct = child.text.strip() + break + if child_tag.endswith("PointRef.point"): + ref = child.attrib.get("idref") + if direct is not None: + coords.append(lonlat_from_text(direct)) + elif ref and ref in point_lookup: + coords.append(point_lookup[ref]) + return coords + + +def parse_gsi_coastlines(zip_path: Path, dataset: str) -> list[dict]: + root = load_xml(zip_path) + features: list[dict] = [] + with zipfile.ZipFile(zip_path) as zf: + xml_name = next(name for name in zf.namelist() if name.endswith(".xml") and "META" not in name) + for idx, curve in enumerate(root.findall(".//{http://www.opengis.net/gml/3.2}Curve"), start=1): + coords: list[tuple[float, float]] = [] + for pos_list in curve.findall(".//{http://www.opengis.net/gml/3.2}posList"): + if not pos_list.text: + continue + values = [float(part) for part in pos_list.text.split() if part] + if len(values) < 4 or len(values) % 2 != 0: + continue + for i in range(0, len(values), 2): + lat = values[i] + lon = values[i + 1] + coords.append(mercator_point(lon, lat)) + if len(coords) < 2: + continue + features.append( + { + "type": "Feature", + "properties": { + "source_dataset": dataset, + "feature_family": "coastline_line", + "curve_id": curve.attrib.get("{http://www.opengis.net/gml/3.2}id", f"curve_{idx:06d}"), + "source_xml": xml_name, + }, + "geometry": mapping(LineString([mercator_to_lonlat(pt) for pt in coords])), + } + ) + return features + + +def main() -> None: + parser = argparse.ArgumentParser(description="Build fish-port navigation split preview assets for Fukuoka/Saga") + parser.add_argument( + "--output-dir", + default="src/pbf/coastline-only/fukuoka_saga_fish_port_navsplit_50m", + help="输出目录", + ) + parser.add_argument( + "--slug", + default="fish_port_navsplit_fukuoka_saga_50m", + help="输出文件前缀", + ) + parser.add_argument( + "--fish-port-source", + default="coastline/C09-06.zip", + help="渔港原始包", + ) + parser.add_argument( + "--coastline-sources", + nargs="+", + default=["coastline/C23-06_40_GML.zip", "coastline/C23-06_41_GML.zip"], + help="海岸线原始包", + ) + parser.add_argument( + "--prc", + nargs="+", + default=["40", "41"], + help="只保留这些 PRC(默认福冈 / 佐贺)", + ) + parser.add_argument( + "--all-prc", + action="store_true", + help="不按 PRC 过滤,导出初始视窗内的全部渔港要素", + ) + parser.add_argument( + "--bbox", + nargs=4, + type=float, + default=list(DEFAULT_BBOX), + metavar=("MIN_LON", "MIN_LAT", "MAX_LON", "MAX_LAT"), + help="初始视窗", + ) + parser.add_argument( + "--cell-size-m", + type=float, + default=50.0, + help="格网尺寸,默认 50m", + ) + parser.add_argument( + "--coast-buffer-m", + type=float, + default=25.0, + help="海岸线陆基缓冲距离,默认 25m", + ) + args = parser.parse_args() + + project_root = Path(__file__).resolve().parent.parent + + fish_port_source = Path(args.fish_port_source) + if not fish_port_source.is_absolute(): + fish_port_source = project_root / fish_port_source + if not fish_port_source.exists(): + raise SystemExit(f"missing input: {fish_port_source}") + + coastline_sources = [] + for item in args.coastline_sources: + path = Path(item) + if not path.is_absolute(): + path = project_root / path + if not path.exists(): + raise SystemExit(f"missing input: {path}") + coastline_sources.append(path) + + out_dir = Path(args.output_dir) + if not out_dir.is_absolute(): + out_dir = project_root / out_dir + out_dir.mkdir(parents=True, exist_ok=True) + + selected_prc = None if args.all_prc else {str(x) for x in args.prc} + + # 1) 渔港边界线 + fish_root = load_xml(fish_port_source) + fish_lookup = build_point_lookup(fish_root) + fish_obj = fish_root.find(".//{http://nlftp.mlit.go.jp/ksj/schemas/ksj-app}OBJ") + if fish_obj is None: + raise SystemExit(f"OBJ block missing in {fish_port_source}") + + fish_line_features: list[dict] = [] + fish_mercator_lines: list[LineString] = [] + fish_line_count = 0 + fish_bbox_minx = fish_bbox_miny = float("inf") + fish_bbox_maxx = fish_bbox_maxy = float("-inf") + + for feature in fish_obj.findall(".//{http://nlftp.mlit.go.jp/ksj/schemas/ksj-app}CB03"): + prc_el = feature.find("{http://nlftp.mlit.go.jp/ksj/schemas/ksj-app}PRC") + prc = prc_el.text.strip() if prc_el is not None and (prc_el.text or "").strip() else None + if selected_prc is not None and prc not in selected_prc: + continue + + loc = feature.find("{http://nlftp.mlit.go.jp/ksj/schemas/ksj-app}LOC") + if loc is None: + continue + ref = loc.attrib.get("idref") + if not ref: + continue + curve = fish_obj.find(f".//*[@id='{ref}']") + if curve is None: + continue + + coords = extract_curve_coords(curve, fish_lookup) + if len(coords) < 2: + continue + + xs = [p[0] for p in coords] + ys = [p[1] for p in coords] + fish_bbox_minx = min(fish_bbox_minx, min(xs)) + fish_bbox_miny = min(fish_bbox_miny, min(ys)) + fish_bbox_maxx = max(fish_bbox_maxx, max(xs)) + fish_bbox_maxy = max(fish_bbox_maxy, max(ys)) + + fish_mercator_lines.append(LineString([mercator_point(lon, lat) for lon, lat in coords])) + fish_line_features.append( + { + "type": "Feature", + "properties": { + "source_dataset": "C09-06", + "source_kind": "fish_port", + "feature_family": "fish_port_line", + "tag": "CB03", + "prc": prc, + "fpc": ( + feature.find("{http://nlftp.mlit.go.jp/ksj/schemas/ksj-app}FPC").text.strip() + if feature.find("{http://nlftp.mlit.go.jp/ksj/schemas/ksj-app}FPC") is not None + and (feature.find("{http://nlftp.mlit.go.jp/ksj/schemas/ksj-app}FPC").text or "").strip() + else None + ), + }, + "geometry": mapping(LineString(coords)), + } + ) + fish_line_count += 1 + + if not fish_mercator_lines: + raise SystemExit("no fish-port lines selected for PRC=40/41") + + fish_polygon_candidates = list(polygonize(unary_union(fish_mercator_lines))) + if fish_polygon_candidates: + fish_geom = unary_union(fish_polygon_candidates) + fish_mode = "polygonize" + else: + fish_geom = unary_union(fish_mercator_lines).buffer(args.cell_size_m, cap_style=2, join_style=2) + fish_mode = "buffer" + + if fish_geom.is_empty: + raise SystemExit("fish-port geometry is empty") + + fish_prepared = prep(fish_geom) + + # 2) 海岸线参考线与陆基缓冲 + coast_line_features: list[dict] = [] + coast_mercator_lines: list[LineString] = [] + coast_line_count = 0 + coast_bbox_minx = coast_bbox_miny = float("inf") + coast_bbox_maxx = coast_bbox_maxy = float("-inf") + + for path in coastline_sources: + root = load_xml(path) + for idx, curve in enumerate(root.findall(".//{http://www.opengis.net/gml/3.2}Curve"), start=1): + coords: list[tuple[float, float]] = [] + for pos_list in curve.findall(".//{http://www.opengis.net/gml/3.2}posList"): + if not pos_list.text: + continue + values = [float(part) for part in pos_list.text.split() if part] + if len(values) < 4 or len(values) % 2 != 0: + continue + for i in range(0, len(values), 2): + lat = values[i] + lon = values[i + 1] + coords.append((mercator_x(lon), mercator_y(lat))) + if len(coords) < 2: + continue + + line = LineString(coords) + coast_mercator_lines.append(line) + xs = [p[0] for p in coords] + ys = [p[1] for p in coords] + coast_bbox_minx = min(coast_bbox_minx, min(xs)) + coast_bbox_miny = min(coast_bbox_miny, min(ys)) + coast_bbox_maxx = max(coast_bbox_maxx, max(xs)) + coast_bbox_maxy = max(coast_bbox_maxy, max(ys)) + + coast_line_features.append( + { + "type": "Feature", + "properties": { + "source_dataset": path.stem.replace("_GML", ""), + "source_kind": "coastline", + "feature_family": "coastline_line", + "curve_id": curve.attrib.get("{http://www.opengis.net/gml/3.2}id", f"curve_{idx:06d}"), + }, + "geometry": mapping(LineString([mercator_to_lonlat(pt) for pt in coords])), + } + ) + coast_line_count += 1 + + if not coast_mercator_lines: + raise SystemExit("no coastline curves were parsed") + + coast_geom = unary_union(coast_mercator_lines) + coast_buffer = coast_geom.buffer(args.coast_buffer_m, cap_style=2, join_style=2) + coast_prepared = prep(coast_buffer) + + # 3) 生成 50m 网格 + bounds = fish_geom.bounds + cell = args.cell_size_m + minx = align_floor(bounds[0], cell) + miny = align_floor(bounds[1], cell) + maxx = align_ceil(bounds[2], cell) + maxy = align_ceil(bounds[3], cell) + + grid_features: list[dict] = [] + land_count = 0 + sea_count = 0 + total_count = 0 + + row = 0 + y = miny + while y < maxy: + col = 0 + x = minx + while x < maxx: + cell_geom = box(x, y, x + cell, y + cell) + if fish_prepared.intersects(cell_geom): + is_land = coast_prepared.intersects(cell_geom) + classification = "LAND_BASE" if is_land else "SEA_SURFACE" + if is_land: + land_count += 1 + else: + sea_count += 1 + total_count += 1 + ring = [ + [lon_from_mercator(x), lat_from_mercator(y)], + [lon_from_mercator(x + cell), lat_from_mercator(y)], + [lon_from_mercator(x + cell), lat_from_mercator(y + cell)], + [lon_from_mercator(x), lat_from_mercator(y + cell)], + [lon_from_mercator(x), lat_from_mercator(y)], + ] + grid_features.append( + { + "type": "Feature", + "properties": { + "source_dataset": "C09-06+coastline", + "source_kind": "navsplit", + "feature_family": "fish_port_navsplit_50m", + "classification": classification, + "row": row, + "col": col, + }, + "geometry": { + "type": "Polygon", + "coordinates": [ring], + }, + } + ) + x += cell + col += 1 + y += cell + row += 1 + + manifest = { + "version": "v1.0", + "fish_port_source": str(fish_port_source), + "coastline_sources": [str(p) for p in coastline_sources], + "prc_scope": None if selected_prc is None else sorted(selected_prc), + "cell_size_m": cell, + "coast_buffer_m": args.coast_buffer_m, + "fish_mode": fish_mode, + "fish_line_count": fish_line_count, + "coast_line_count": coast_line_count, + "fish_polygon_count": len(fish_polygon_candidates), + "grid_count": total_count, + "land_count": land_count, + "sea_count": sea_count, + "bbox_lonlat": list(args.bbox), + "fish_bbox_lonlat": [lon_from_mercator(bounds[0]), lat_from_mercator(bounds[1]), lon_from_mercator(bounds[2]), lat_from_mercator(bounds[3])], + "line_file": f"{args.slug}_lines.geojson", + "grid_file": f"{args.slug}_grid.geojson", + } + + out_lines = { + "type": "FeatureCollection", + "name": "fish_port_navsplit_lines", + "features": fish_line_features + coast_line_features, + } + out_grid = { + "type": "FeatureCollection", + "name": "fish_port_navsplit_grid", + "features": grid_features, + } + + (out_dir / f"{args.slug}_lines.geojson").write_text(json.dumps(out_lines, ensure_ascii=False), encoding="utf-8") + (out_dir / f"{args.slug}_grid.geojson").write_text(json.dumps(out_grid, ensure_ascii=False), encoding="utf-8") + (out_dir / f"{args.slug}_manifest.json").write_text( + json.dumps(manifest, ensure_ascii=False, indent=2), + encoding="utf-8", + ) + + print("已导出:") + print(" -", out_dir / f"{args.slug}_lines.geojson") + print(" -", out_dir / f"{args.slug}_grid.geojson") + print(" -", out_dir / f"{args.slug}_manifest.json") + + +if __name__ == "__main__": + main() diff --git a/coastline/export_fish_port_navsplit_fukuoka_saga_full_aoi_assets.py b/coastline/export_fish_port_navsplit_fukuoka_saga_full_aoi_assets.py new file mode 100644 index 0000000..96d19f7 --- /dev/null +++ b/coastline/export_fish_port_navsplit_fukuoka_saga_full_aoi_assets.py @@ -0,0 +1,342 @@ +#!/usr/bin/env python3 +""" +NavSea fish-port navigation split export v1.0 (full Fukuoka/Saga AOI) + +目标: +- 直接使用已导出的全量港区 AOI 多边形 +- 选取福冈 / 佐贺范围内的渔港 AOI +- 再叠加 C23-06_40 / C23-06_41 海岸线 +- 输出 20m x 20m 栅格,区分海面 / 陆基 + +这是一个更稳的全量预览版本,适合先把全域范围铺出来。 +""" + +from __future__ import annotations + +import argparse +import json +import math +import zipfile +from pathlib import Path +import xml.etree.ElementTree as ET + +from shapely.geometry import box, mapping, shape +from shapely.ops import transform, unary_union +from shapely.prepared import prep + + +RADIUS = 6378137.0 +MAX_MERCATOR_LAT = 85.0511287798066 +DEFAULT_BBOX = (129.73110007140482, 32.9464631795233, 131.19176072338317, 34.25430274729531) + + +def mercator_x(lon: float) -> float: + return RADIUS * math.radians(lon) + + +def mercator_y(lat: float) -> float: + lat = max(min(lat, MAX_MERCATOR_LAT), -MAX_MERCATOR_LAT) + return RADIUS * math.log(math.tan(math.pi / 4.0 + math.radians(lat) / 2.0)) + + +def lon_from_mercator(x: float) -> float: + return math.degrees(x / RADIUS) + + +def lat_from_mercator(y: float) -> float: + return math.degrees(2.0 * math.atan(math.exp(y / RADIUS)) - math.pi / 2.0) + + +def mercator_to_lonlat(pt: tuple[float, float]) -> tuple[float, float]: + return lon_from_mercator(pt[0]), lat_from_mercator(pt[1]) + + +def align_floor(value: float, step: float) -> float: + return math.floor(value / step) * step + + +def align_ceil(value: float, step: float) -> float: + return math.ceil(value / step) * step + + +def load_xml(zip_path: Path) -> ET.Element: + with zipfile.ZipFile(zip_path) as zf: + xml_name = next(name for name in zf.namelist() if name.endswith(".xml") and "META" not in name) + return ET.fromstring(zf.read(xml_name)) + + +def local_name(tag: str) -> str: + return tag.split("}", 1)[-1] + + +def lonlat_from_text(text: str) -> tuple[float, float]: + parts = [p for p in text.replace(",", " ").split() if p] + if len(parts) < 2: + raise ValueError(f"invalid coordinate text: {text!r}") + lat = float(parts[0]) + lon = float(parts[1]) + return lon, lat + + +def build_point_lookup(root: ET.Element) -> dict[str, tuple[float, float]]: + lookup: dict[str, tuple[float, float]] = {} + for point in root.iter(): + if local_name(point.tag) != "GM_Point": + continue + point_id = point.attrib.get("id") + if not point_id: + continue + coord_text = None + for el in point.iter(): + if local_name(el.tag).endswith("DirectPosition.coordinate") and (el.text or "").strip(): + coord_text = el.text.strip() + break + if coord_text is None: + continue + lookup[point_id] = lonlat_from_text(coord_text) + return lookup + + +def extract_curve_coords(curve: ET.Element, point_lookup: dict[str, tuple[float, float]]) -> list[tuple[float, float]]: + coords: list[tuple[float, float]] = [] + for pos in curve.iter(): + tag = local_name(pos.tag) + if not tag.startswith("GM_Position"): + continue + direct = None + ref = None + for child in list(pos): + child_tag = local_name(child.tag) + if child_tag.endswith("DirectPosition.coordinate") and (child.text or "").strip(): + direct = child.text.strip() + break + if child_tag.endswith("PointRef.point"): + ref = child.attrib.get("idref") + if direct is not None: + coords.append(lonlat_from_text(direct)) + elif ref and ref in point_lookup: + coords.append(point_lookup[ref]) + return coords + + +def bbox_intersects(a: tuple[float, float, float, float], b: tuple[float, float, float, float]) -> bool: + return not (a[2] < b[0] or a[0] > b[2] or a[3] < b[1] or a[1] > b[3]) + + +def ring_lonlat_from_mercator(minx: float, miny: float, maxx: float, maxy: float) -> list[list[float]]: + ring = [ + mercator_to_lonlat((minx, miny)), + mercator_to_lonlat((maxx, miny)), + mercator_to_lonlat((maxx, maxy)), + mercator_to_lonlat((minx, maxy)), + mercator_to_lonlat((minx, miny)), + ] + return [[lon, lat] for lon, lat in ring] + + +def main() -> None: + parser = argparse.ArgumentParser(description="Build full Fukuoka/Saga fish-port navsplit assets from AOI polygons") + parser.add_argument("--output-dir", default="src/pbf/coastline-only/fukuoka_saga_fish_port_navsplit_full_20m") + parser.add_argument("--slug", default="fish_port_navsplit_fukuoka_saga_full_20m") + parser.add_argument( + "--aoi-source", + default="src/pbf/port-overlay/kyushu/port_overlay_kyushu_areas.geojson", + help="全量渔港 AOI 多边形 GeoJSON", + ) + parser.add_argument("--coastline-sources", nargs="+", default=["coastline/C23-06_40_GML.zip", "coastline/C23-06_41_GML.zip"]) + parser.add_argument("--bbox", nargs=4, type=float, default=list(DEFAULT_BBOX)) + parser.add_argument("--cell-size-m", type=float, default=20.0) + parser.add_argument("--coast-buffer-m", type=float, default=12.0) + args = parser.parse_args() + + project_root = Path(__file__).resolve().parent.parent + out_dir = Path(args.output_dir) + if not out_dir.is_absolute(): + out_dir = project_root / out_dir + out_dir.mkdir(parents=True, exist_ok=True) + + aoi_path = Path(args.aoi_source) + if not aoi_path.is_absolute(): + aoi_path = project_root / aoi_path + if not aoi_path.exists(): + raise SystemExit(f"missing input: {aoi_path}") + + coastline_sources = [] + for item in args.coastline_sources: + path = Path(item) + if not path.is_absolute(): + path = project_root / path + if not path.exists(): + raise SystemExit(f"missing input: {path}") + coastline_sources.append(path) + + bbox = tuple(args.bbox) + aoi_obj = json.loads(aoi_path.read_text(encoding="utf-8")) + + fish_polygons = [] + fish_bbox_minx = fish_bbox_miny = float("inf") + fish_bbox_maxx = fish_bbox_maxy = float("-inf") + for feature in aoi_obj.get("features", []): + props = feature.get("properties") or {} + if props.get("canonical_object_type") != "漁港": + continue + geom = feature.get("geometry") or {} + if geom.get("type") != "Polygon": + continue + shp = shape(geom) + bb = shp.bounds + if not bbox_intersects(bb, bbox): + continue + fish_polygons.append(transform(lambda x, y, z=None: (mercator_x(x), mercator_y(y)), shp)) + fish_bbox_minx = min(fish_bbox_minx, bb[0]) + fish_bbox_miny = min(fish_bbox_miny, bb[1]) + fish_bbox_maxx = max(fish_bbox_maxx, bb[2]) + fish_bbox_maxy = max(fish_bbox_maxy, bb[3]) + + if not fish_polygons: + raise SystemExit("no fishing-port AOI polygons selected") + + fish_geom = unary_union(fish_polygons) + fish_prepared = prep(fish_geom) + + coast_line_features: list[dict] = [] + coast_mercator_lines = [] + coast_line_count = 0 + for path in coastline_sources: + root = load_xml(path) + for idx, curve in enumerate(root.findall(".//{http://www.opengis.net/gml/3.2}Curve"), start=1): + coords = [] + point_lookup = build_point_lookup(root) + for pos_list in curve.findall(".//{http://www.opengis.net/gml/3.2}posList"): + if not pos_list.text: + continue + values = [float(part) for part in pos_list.text.split() if part] + if len(values) < 4 or len(values) % 2 != 0: + continue + for i in range(0, len(values), 2): + lat = values[i] + lon = values[i + 1] + coords.append((mercator_x(lon), mercator_y(lat))) + if len(coords) < 2: + # fallback for non-posList curves + coords = [ (mercator_x(lon), mercator_y(lat)) for lon, lat in extract_curve_coords(curve, point_lookup) ] + if len(coords) < 2: + continue + coast_mercator_lines.append(coords) + coast_line_features.append( + { + "type": "Feature", + "properties": { + "source_dataset": path.stem.replace("_GML", ""), + "source_kind": "coastline", + "feature_family": "coastline_line", + "curve_id": curve.attrib.get("{http://www.opengis.net/gml/3.2}id", f"curve_{idx:06d}"), + }, + "geometry": mapping(shape({"type": "LineString", "coordinates": [mercator_to_lonlat(pt) for pt in coords]})), + } + ) + coast_line_count += 1 + + coast_geom = unary_union([shape({"type": "LineString", "coordinates": pts}) for pts in coast_mercator_lines]) + coast_buffer = coast_geom.buffer(args.coast_buffer_m, cap_style=2, join_style=2) + coast_prepared = prep(coast_buffer) + + bounds = fish_geom.bounds + cell = args.cell_size_m + minx = align_floor(bounds[0], cell) + miny = align_floor(bounds[1], cell) + maxx = align_ceil(bounds[2], cell) + maxy = align_ceil(bounds[3], cell) + + grid_features: list[dict] = [] + land_count = 0 + sea_count = 0 + total_count = 0 + + row = 0 + y = miny + while y < maxy: + col = 0 + x = minx + while x < maxx: + cell_geom = box(x, y, x + cell, y + cell) + if fish_prepared.intersects(cell_geom): + is_land = coast_prepared.intersects(cell_geom) + classification = "LAND_BASE" if is_land else "SEA_SURFACE" + land_count += int(is_land) + sea_count += int(not is_land) + total_count += 1 + grid_features.append( + { + "type": "Feature", + "properties": { + "source_dataset": "AOI+coastline", + "source_kind": "navsplit", + "feature_family": "fish_port_navsplit_20m", + "classification": classification, + "row": row, + "col": col, + }, + "geometry": { + "type": "Polygon", + "coordinates": [ring_lonlat_from_mercator(x, y, x + cell, y + cell)], + }, + } + ) + x += cell + col += 1 + y += cell + row += 1 + + manifest = { + "version": "v1.0", + "aoi_source": str(aoi_path), + "coastline_sources": [str(p) for p in coastline_sources], + "cell_size_m": cell, + "coast_buffer_m": args.coast_buffer_m, + "fish_polygon_count": len(fish_polygons), + "coast_line_count": coast_line_count, + "grid_count": total_count, + "land_count": land_count, + "sea_count": sea_count, + "bbox_lonlat": list(bbox), + "fish_bbox_lonlat": [fish_bbox_minx, fish_bbox_miny, fish_bbox_maxx, fish_bbox_maxy], + "line_file": f"{args.slug}_lines.geojson", + "grid_file": f"{args.slug}_grid.geojson", + } + + (out_dir / f"{args.slug}_lines.geojson").write_text( + json.dumps( + { + "type": "FeatureCollection", + "name": "fish_port_navsplit_lines", + "features": coast_line_features, + }, + ensure_ascii=False, + ), + encoding="utf-8", + ) + (out_dir / f"{args.slug}_grid.geojson").write_text( + json.dumps( + { + "type": "FeatureCollection", + "name": "fish_port_navsplit_grid", + "features": grid_features, + }, + ensure_ascii=False, + ), + encoding="utf-8", + ) + (out_dir / f"{args.slug}_manifest.json").write_text( + json.dumps(manifest, ensure_ascii=False, indent=2), + encoding="utf-8", + ) + + print("已导出:") + print(" -", out_dir / f"{args.slug}_lines.geojson") + print(" -", out_dir / f"{args.slug}_grid.geojson") + print(" -", out_dir / f"{args.slug}_manifest.json") + + +if __name__ == "__main__": + main() diff --git a/coastline/export_fish_port_navsplit_fukuoka_saga_full_assets.py b/coastline/export_fish_port_navsplit_fukuoka_saga_full_assets.py new file mode 100644 index 0000000..0beb5e8 --- /dev/null +++ b/coastline/export_fish_port_navsplit_fukuoka_saga_full_assets.py @@ -0,0 +1,433 @@ +#!/usr/bin/env python3 +""" +NavSea fish-port navigation split export v1.0 (full Fukuoka/Saga) + +目标: +- 用官方港湾 / 渔港叠加资产中的渔港线要素,提取福冈 / 佐贺全量区域 +- 再叠加 C23-06_40 / C23-06_41 海岸线 +- 将港区切成 20m x 20m 格网,并区分海面 / 陆基 + +与样区版的区别: +- 不再限制 PRC=40/41 +- 直接使用已生成的官方渔港 GeoJSON 作为渔港线输入 +- 更适合做“福冈 / 佐贺全量渔港”预览 +""" + +from __future__ import annotations + +import argparse +import json +import math +import zipfile +from dataclasses import dataclass +from pathlib import Path +import xml.etree.ElementTree as ET + +from shapely.geometry import LineString, box, mapping +from shapely.ops import polygonize, unary_union +from shapely.prepared import prep + + +RADIUS = 6378137.0 +MAX_MERCATOR_LAT = 85.0511287798066 +DEFAULT_BBOX = (129.73110007140482, 32.9464631795233, 131.19176072338317, 34.25430274729531) + + +@dataclass(frozen=True) +class SourceSpec: + path: Path + dataset: str + kind: str + + +def mercator_x(lon: float) -> float: + return RADIUS * math.radians(lon) + + +def mercator_y(lat: float) -> float: + lat = max(min(lat, MAX_MERCATOR_LAT), -MAX_MERCATOR_LAT) + return RADIUS * math.log(math.tan(math.pi / 4.0 + math.radians(lat) / 2.0)) + + +def mercator(lon: float, lat: float) -> tuple[float, float]: + return mercator_x(lon), mercator_y(lat) + + +def lon_from_mercator(x: float) -> float: + return math.degrees(x / RADIUS) + + +def lat_from_mercator(y: float) -> float: + return math.degrees(2.0 * math.atan(math.exp(y / RADIUS)) - math.pi / 2.0) + + +def mercator_to_lonlat(pt: tuple[float, float]) -> tuple[float, float]: + return lon_from_mercator(pt[0]), lat_from_mercator(pt[1]) + + +def align_floor(value: float, step: float) -> float: + return math.floor(value / step) * step + + +def align_ceil(value: float, step: float) -> float: + return math.ceil(value / step) * step + + +def local_name(tag: str) -> str: + return tag.split("}", 1)[-1] + + +def lonlat_from_text(text: str) -> tuple[float, float]: + parts = [p for p in text.replace(",", " ").split() if p] + if len(parts) < 2: + raise ValueError(f"invalid coordinate text: {text!r}") + lat = float(parts[0]) + lon = float(parts[1]) + return lon, lat + + +def load_xml(zip_path: Path) -> ET.Element: + with zipfile.ZipFile(zip_path) as zf: + xml_name = next(name for name in zf.namelist() if name.endswith(".xml") and "META" not in name) + return ET.fromstring(zf.read(xml_name)) + + +def build_point_lookup(root: ET.Element) -> dict[str, tuple[float, float]]: + lookup: dict[str, tuple[float, float]] = {} + for point in root.iter(): + if local_name(point.tag) != "GM_Point": + continue + point_id = point.attrib.get("id") + if not point_id: + continue + coord_text = None + for el in point.iter(): + if local_name(el.tag).endswith("DirectPosition.coordinate") and (el.text or "").strip(): + coord_text = el.text.strip() + break + if coord_text is None: + continue + lookup[point_id] = lonlat_from_text(coord_text) + return lookup + + +def extract_curve_coords(curve: ET.Element, point_lookup: dict[str, tuple[float, float]]) -> list[tuple[float, float]]: + coords: list[tuple[float, float]] = [] + for pos in curve.iter(): + tag = local_name(pos.tag) + if not tag.startswith("GM_Position"): + continue + direct = None + ref = None + for child in list(pos): + child_tag = local_name(child.tag) + if child_tag.endswith("DirectPosition.coordinate") and (child.text or "").strip(): + direct = child.text.strip() + break + if child_tag.endswith("PointRef.point"): + ref = child.attrib.get("idref") + if direct is not None: + coords.append(lonlat_from_text(direct)) + elif ref and ref in point_lookup: + coords.append(point_lookup[ref]) + return coords + + +def load_geojson(path: Path) -> dict: + return json.loads(path.read_text(encoding="utf-8")) + + +def bbox_intersects(a: tuple[float, float, float, float], b: tuple[float, float, float, float]) -> bool: + return not (a[2] < b[0] or a[0] > b[2] or a[3] < b[1] or a[1] > b[3]) + + +def cluster_line_indices(bboxes: list[tuple[float, float, float, float]], gap_m: float = 250.0) -> list[list[int]]: + parent = list(range(len(bboxes))) + + def find(x: int) -> int: + while parent[x] != x: + parent[x] = parent[parent[x]] + x = parent[x] + return x + + def union(a: int, b: int) -> None: + ra = find(a) + rb = find(b) + if ra != rb: + parent[rb] = ra + + expanded = [ + (bb[0] - gap_m, bb[1] - gap_m, bb[2] + gap_m, bb[3] + gap_m) + for bb in bboxes + ] + for i in range(len(expanded)): + for j in range(i + 1, len(expanded)): + if bbox_intersects(expanded[i], expanded[j]): + union(i, j) + + groups: dict[int, list[int]] = {} + for idx in range(len(parent)): + root = find(idx) + groups.setdefault(root, []).append(idx) + return list(groups.values()) + + +def ring_lonlat_from_mercator(minx: float, miny: float, maxx: float, maxy: float) -> list[list[float]]: + ring = [ + mercator_to_lonlat((minx, miny)), + mercator_to_lonlat((maxx, miny)), + mercator_to_lonlat((maxx, maxy)), + mercator_to_lonlat((minx, maxy)), + mercator_to_lonlat((minx, miny)), + ] + return [[lon, lat] for lon, lat in ring] + + +def main() -> None: + parser = argparse.ArgumentParser(description="Build full Fukuoka/Saga fish-port navigation split preview assets") + parser.add_argument("--output-dir", default="src/pbf/coastline-only/fukuoka_saga_fish_port_navsplit_full_20m") + parser.add_argument("--slug", default="fish_port_navsplit_fukuoka_saga_full_20m") + parser.add_argument( + "--official-lines", + default="src/pbf/port-overlay-official/kyushu/official_port_overlay_kyushu_lines.geojson", + help="官方港湾/渔港叠加导出的 lines GeoJSON", + ) + parser.add_argument("--coastline-sources", nargs="+", default=["coastline/C23-06_40_GML.zip", "coastline/C23-06_41_GML.zip"]) + parser.add_argument("--bbox", nargs=4, type=float, default=list(DEFAULT_BBOX)) + parser.add_argument("--cell-size-m", type=float, default=20.0) + parser.add_argument("--coast-buffer-m", type=float, default=12.0) + args = parser.parse_args() + + project_root = Path(__file__).resolve().parent.parent + out_dir = Path(args.output_dir) + if not out_dir.is_absolute(): + out_dir = project_root / out_dir + out_dir.mkdir(parents=True, exist_ok=True) + + official_lines_path = Path(args.official_lines) + if not official_lines_path.is_absolute(): + official_lines_path = project_root / official_lines_path + if not official_lines_path.exists(): + raise SystemExit(f"missing input: {official_lines_path}") + + coastline_sources = [] + for item in args.coastline_sources: + path = Path(item) + if not path.is_absolute(): + path = project_root / path + if not path.exists(): + raise SystemExit(f"missing input: {path}") + coastline_sources.append(path) + + bbox = tuple(args.bbox) + official = load_geojson(official_lines_path) + + fish_line_features: list[dict] = [] + fish_mercator_lines: list[LineString] = [] + fish_mercator_bboxes: list[tuple[float, float, float, float]] = [] + fish_bbox_minx = fish_bbox_miny = float("inf") + fish_bbox_maxx = fish_bbox_maxy = float("-inf") + + for feature in official.get("features", []): + props = feature.get("properties") or {} + if props.get("source_dataset") != "C09-06": + continue + if props.get("feature_family") != "fish_port_line": + continue + geom = feature.get("geometry") or {} + coords = geom.get("coordinates") or [] + if len(coords) < 2: + continue + xs = [p[0] for p in coords] + ys = [p[1] for p in coords] + geom_bbox = (min(xs), min(ys), max(xs), max(ys)) + if not bbox_intersects(geom_bbox, bbox): + continue + + fish_bbox_minx = min(fish_bbox_minx, geom_bbox[0]) + fish_bbox_miny = min(fish_bbox_miny, geom_bbox[1]) + fish_bbox_maxx = max(fish_bbox_maxx, geom_bbox[2]) + fish_bbox_maxy = max(fish_bbox_maxy, geom_bbox[3]) + + fish_line_features.append(feature) + line_mercator = LineString([mercator(lon, lat) for lon, lat in coords]) + fish_mercator_lines.append(line_mercator) + fish_mercator_bboxes.append(line_mercator.bounds) + + if not fish_mercator_lines: + raise SystemExit("no fish-port lines selected for full Fukuoka/Saga export") + + print(f"selected fish lines: {len(fish_mercator_lines)}") + + fish_components = cluster_line_indices(fish_mercator_bboxes, gap_m=250.0) + print(f"fish components: {len(fish_components)}") + component_geoms = [] + component_sizes = [] + for component in fish_components: + lines = [fish_mercator_lines[i] for i in component] + merged = unary_union(lines) + polygons = list(polygonize(merged)) + if polygons: + component_geoms.append(unary_union(polygons)) + component_sizes.append(len(component)) + else: + component_geoms.append(merged.buffer(args.cell_size_m, cap_style=2, join_style=2)) + component_sizes.append(len(component)) + + fish_geom = unary_union(component_geoms) + fish_polygon_candidates = component_geoms + fish_mode = f"clustered_polygonize:{len(fish_components)}" + + if fish_geom.is_empty: + raise SystemExit("fish-port geometry is empty") + + fish_prepared = prep(fish_geom) + + coast_line_features: list[dict] = [] + coast_mercator_lines: list[LineString] = [] + coast_line_count = 0 + for path in coastline_sources: + root = load_xml(path) + for idx, curve in enumerate(root.findall(".//{http://www.opengis.net/gml/3.2}Curve"), start=1): + coords: list[tuple[float, float]] = [] + for pos_list in curve.findall(".//{http://www.opengis.net/gml/3.2}posList"): + if not pos_list.text: + continue + values = [float(part) for part in pos_list.text.split() if part] + if len(values) < 4 or len(values) % 2 != 0: + continue + for i in range(0, len(values), 2): + lat = values[i] + lon = values[i + 1] + coords.append((mercator_x(lon), mercator_y(lat))) + if len(coords) < 2: + continue + + line = LineString(coords) + coast_mercator_lines.append(line) + coast_line_features.append( + { + "type": "Feature", + "properties": { + "source_dataset": path.stem.replace("_GML", ""), + "source_kind": "coastline", + "feature_family": "coastline_line", + "curve_id": curve.attrib.get("{http://www.opengis.net/gml/3.2}id", f"curve_{idx:06d}"), + }, + "geometry": mapping(LineString([mercator_to_lonlat(pt) for pt in coords])), + } + ) + coast_line_count += 1 + + if not coast_mercator_lines: + raise SystemExit("no coastline curves were parsed") + + coast_geom = unary_union(coast_mercator_lines) + coast_buffer = coast_geom.buffer(args.coast_buffer_m, cap_style=2, join_style=2) + coast_prepared = prep(coast_buffer) + + bounds = fish_geom.bounds + cell = args.cell_size_m + minx = align_floor(bounds[0], cell) + miny = align_floor(bounds[1], cell) + maxx = align_ceil(bounds[2], cell) + maxy = align_ceil(bounds[3], cell) + + grid_features: list[dict] = [] + land_count = 0 + sea_count = 0 + total_count = 0 + + row = 0 + y = miny + while y < maxy: + col = 0 + x = minx + while x < maxx: + cell_geom = box(x, y, x + cell, y + cell) + if fish_prepared.intersects(cell_geom): + is_land = coast_prepared.intersects(cell_geom) + classification = "LAND_BASE" if is_land else "SEA_SURFACE" + if is_land: + land_count += 1 + else: + sea_count += 1 + total_count += 1 + grid_features.append( + { + "type": "Feature", + "properties": { + "source_dataset": "C09-06+coastline", + "source_kind": "navsplit", + "feature_family": "fish_port_navsplit_20m", + "classification": classification, + "row": row, + "col": col, + }, + "geometry": { + "type": "Polygon", + "coordinates": [ring_lonlat_from_mercator(x, y, x + cell, y + cell)], + }, + } + ) + x += cell + col += 1 + y += cell + row += 1 + + manifest = { + "version": "v1.0", + "official_lines_source": str(official_lines_path), + "coastline_sources": [str(p) for p in coastline_sources], + "cell_size_m": cell, + "coast_buffer_m": args.coast_buffer_m, + "fish_mode": fish_mode, + "fish_line_count": len(fish_line_features), + "coast_line_count": coast_line_count, + "fish_polygon_count": len(fish_polygon_candidates), + "fish_component_count": len(fish_components), + "fish_component_sizes": component_sizes[:20], + "grid_count": total_count, + "land_count": land_count, + "sea_count": sea_count, + "bbox_lonlat": list(bbox), + "fish_bbox_lonlat": [fish_bbox_minx, fish_bbox_miny, fish_bbox_maxx, fish_bbox_maxy], + "line_file": f"{args.slug}_lines.geojson", + "grid_file": f"{args.slug}_grid.geojson", + } + + (out_dir / f"{args.slug}_lines.geojson").write_text( + json.dumps( + { + "type": "FeatureCollection", + "name": "fish_port_navsplit_lines", + "features": fish_line_features + coast_line_features, + }, + ensure_ascii=False, + ), + encoding="utf-8", + ) + (out_dir / f"{args.slug}_grid.geojson").write_text( + json.dumps( + { + "type": "FeatureCollection", + "name": "fish_port_navsplit_grid", + "features": grid_features, + }, + ensure_ascii=False, + ), + encoding="utf-8", + ) + (out_dir / f"{args.slug}_manifest.json").write_text( + json.dumps(manifest, ensure_ascii=False, indent=2), + encoding="utf-8", + ) + + print("已导出:") + print(" -", out_dir / f"{args.slug}_lines.geojson") + print(" -", out_dir / f"{args.slug}_grid.geojson") + print(" -", out_dir / f"{args.slug}_manifest.json") + + +if __name__ == "__main__": + main() diff --git a/coastline/export_fukuoka_saga_map_assets.py b/coastline/export_fukuoka_saga_map_assets.py new file mode 100644 index 0000000..d1cc6f4 --- /dev/null +++ b/coastline/export_fukuoka_saga_map_assets.py @@ -0,0 +1,190 @@ +#!/usr/bin/env python3 +""" +NavSea coastline subset export v1.0 + +把福冈/佐贺海岸样例栅格导出为浏览器可直接加载的 GeoJSON 资产: +- blocked cells (WGS84 GeoJSON) +- coastline lines (WGS84 GeoJSON) +- manifest JSON +""" + +from __future__ import annotations + +import argparse +import json +import math +import sqlite3 +from pathlib import Path + +from shapely import from_wkt +from shapely.geometry import mapping, Polygon, LineString + + +RADIUS = 6378137.0 + + +def mercator_to_lonlat(x: float, y: float) -> tuple[float, float]: + lon = math.degrees(x / RADIUS) + lat = math.degrees(2.0 * math.atan(math.exp(y / RADIUS)) - math.pi / 2.0) + return lon, lat + + +def cell_polygon_lonlat(minx: float, miny: float, maxx: float, maxy: float) -> Polygon: + lon1, lat1 = mercator_to_lonlat(minx, miny) + lon2, lat2 = mercator_to_lonlat(maxx, maxy) + return Polygon( + [ + (lon1, lat1), + (lon2, lat1), + (lon2, lat2), + (lon1, lat2), + (lon1, lat1), + ] + ) + + +def line_lonlat_from_wkt(wkt: str) -> LineString: + geom = from_wkt(wkt) + coords = [mercator_to_lonlat(x, y) for x, y in geom.coords] + return LineString(coords) + + +def main() -> None: + parser = argparse.ArgumentParser(description="Export coastline grid assets to GeoJSON") + parser.add_argument( + "--source-db", + default="out/coastline/fukuoka_saga_test/fukuoka_saga_coast_grid.sqlite", + help="输入 SQLite", + ) + parser.add_argument( + "--output-dir", + default="src/pbf/coastline", + help="输出目录", + ) + parser.add_argument( + "--slug", + default="fukuoka_saga", + help="输出文件前缀,如 fukuoka_saga / north_kyushu", + ) + args = parser.parse_args() + + project_root = Path(__file__).resolve().parent.parent + source_db = Path(args.source_db) + if not source_db.is_absolute(): + source_db = project_root / source_db + out_dir = Path(args.output_dir) + if not out_dir.is_absolute(): + out_dir = project_root / out_dir + out_dir.mkdir(parents=True, exist_ok=True) + + if not source_db.exists(): + raise SystemExit(f"missing source db: {source_db}") + + conn = sqlite3.connect(source_db) + conn.row_factory = sqlite3.Row + + manifest = { + "version": "v1.0", + "source_db": str(source_db), + "grid_file": f"{args.slug}_blocked_cells.geojson", + "coastline_file": f"{args.slug}_coastline_lines.geojson", + "source_scope": conn.execute("SELECT value FROM meta WHERE key='source_scope'").fetchone()[0], + "source_code": conn.execute("SELECT value FROM meta WHERE key='source_code'").fetchone()[0], + "cell_size_m": float(conn.execute("SELECT value FROM meta WHERE key='cell_size_m'").fetchone()[0]), + "buffer_m": float(conn.execute("SELECT value FROM meta WHERE key='buffer_m'").fetchone()[0]), + "grid_bounds_mercator": json.loads( + conn.execute("SELECT value FROM meta WHERE key='grid_bounds_mercator'").fetchone()[0] + ), + } + + blocked_features = [] + blocked_rows = conn.execute( + """ + SELECT cell_id, ix, iy, minx, miny, maxx, maxy, state, state_name, source_mask, blocked_permille + FROM grid_cell + WHERE state = 2 + ORDER BY ix, iy + """ + ).fetchall() + + for row in blocked_rows: + geom = cell_polygon_lonlat(row["minx"], row["miny"], row["maxx"], row["maxy"]) + blocked_features.append( + { + "type": "Feature", + "properties": { + "cell_id": row["cell_id"], + "ix": row["ix"], + "iy": row["iy"], + "state": row["state"], + "state_name": row["state_name"], + "source_mask": row["source_mask"], + "blocked_permille": row["blocked_permille"], + }, + "geometry": mapping(geom), + } + ) + + coastline_features = [] + coastline_rows = conn.execute( + """ + SELECT source_code, prefecture, curve_id, geom_wkt + FROM coastline_feature + ORDER BY feature_id + """ + ).fetchall() + + for row in coastline_rows: + geom = line_lonlat_from_wkt(row["geom_wkt"]) + coastline_features.append( + { + "type": "Feature", + "properties": { + "source_code": row["source_code"], + "prefecture": row["prefecture"], + "curve_id": row["curve_id"], + }, + "geometry": mapping(geom), + } + ) + + blocked_geojson = { + "type": "FeatureCollection", + "name": "fukuoka_saga_blocked_cells", + "features": blocked_features, + } + coastline_geojson = { + "type": "FeatureCollection", + "name": "fukuoka_saga_coastline_lines", + "features": coastline_features, + } + + (out_dir / f"{args.slug}_blocked_cells.geojson").write_text( + json.dumps(blocked_geojson, ensure_ascii=False), + encoding="utf-8", + ) + (out_dir / f"{args.slug}_coastline_lines.geojson").write_text( + json.dumps(coastline_geojson, ensure_ascii=False), + encoding="utf-8", + ) + + lonlat_min = mercator_to_lonlat(manifest["grid_bounds_mercator"][0], manifest["grid_bounds_mercator"][1]) + lonlat_max = mercator_to_lonlat(manifest["grid_bounds_mercator"][2], manifest["grid_bounds_mercator"][3]) + manifest["grid_bounds_lonlat"] = [lonlat_min[0], lonlat_min[1], lonlat_max[0], lonlat_max[1]] + manifest["blocked_count"] = len(blocked_features) + manifest["coastline_count"] = len(coastline_features) + + (out_dir / f"{args.slug}_manifest.json").write_text( + json.dumps(manifest, ensure_ascii=False, indent=2), + encoding="utf-8", + ) + + conn.close() + print("已导出:") + print(" -", out_dir / f"{args.slug}_blocked_cells.geojson") + print(" -", out_dir / f"{args.slug}_coastline_lines.geojson") + print(" -", out_dir / f"{args.slug}_manifest.json") + + +if __name__ == "__main__": + main() diff --git a/coastline/export_japan_coast_grid_mysql_assets.py b/coastline/export_japan_coast_grid_mysql_assets.py new file mode 100644 index 0000000..d18dcf2 --- /dev/null +++ b/coastline/export_japan_coast_grid_mysql_assets.py @@ -0,0 +1,230 @@ +#!/usr/bin/env python3 +from __future__ import annotations + +import argparse +import datetime as dt +import json +import math +from pathlib import Path + +import pymysql + + +DB_NAME = "navsea_japan_coast_grid" +DB_USER = "root" +DB_PASSWORD = "2chi9ks2" +DB_HOST = "localhost" +DB_SOCKET = "/tmp/mysql.sock" + +DEFAULT_OUT_DIR = "src/pbf/coastline-mysql/japan_coast_200m" +LAYER_NAME = "coast_200m" +RADIUS = 6378137.0 + + +def mysql_connect(database: str): + kwargs = { + "host": DB_HOST, + "user": DB_USER, + "password": DB_PASSWORD, + "database": database, + "charset": "utf8mb4", + "cursorclass": pymysql.cursors.SSCursor, + } + if DB_SOCKET: + kwargs["unix_socket"] = DB_SOCKET + return pymysql.connect(**kwargs) + + +def rect_geometry(min_lon: float, min_lat: float, max_lon: float, max_lat: float) -> dict: + return { + "type": "Polygon", + "coordinates": [ + [ + [min_lon, min_lat], + [max_lon, min_lat], + [max_lon, max_lat], + [min_lon, max_lat], + [min_lon, min_lat], + ] + ], + } + + +def parse_bbox(value: str) -> tuple[float, float, float, float]: + parts = [part.strip() for part in value.split(",")] + if len(parts) != 4: + raise argparse.ArgumentTypeError("bbox must be min_lon,min_lat,max_lon,max_lat") + try: + return tuple(float(part) for part in parts) # type: ignore[return-value] + except ValueError as exc: + raise argparse.ArgumentTypeError("bbox must contain valid numbers") from exc + + +def mercator_to_lonlat(x: float, y: float) -> tuple[float, float]: + lon = math.degrees(x / RADIUS) + lat = math.degrees(2.0 * math.atan(math.exp(y / RADIUS)) - math.pi / 2.0) + return lon, lat + + +def lon_to_mercator(lon: float) -> float: + return RADIUS * math.radians(lon) + + +def lat_to_mercator(lat: float) -> float: + lat = max(min(lat, 85.0511287798066), -85.0511287798066) + return RADIUS * math.log(math.tan(math.pi / 4.0 + math.radians(lat) / 2.0)) + + +def main() -> None: + parser = argparse.ArgumentParser(description="Export Japan coast 200m grid assets from MySQL") + parser.add_argument("--db-name", default=DB_NAME) + parser.add_argument("--out-dir", default=DEFAULT_OUT_DIR) + parser.add_argument("--bbox", type=parse_bbox, default=None, help="仅导出该经纬度范围内的格子") + args = parser.parse_args() + + project_root = Path(__file__).resolve().parent.parent + out_dir = Path(args.out_dir) + if not out_dir.is_absolute(): + out_dir = project_root / out_dir + out_dir.mkdir(parents=True, exist_ok=True) + + conn = mysql_connect(args.db_name) + try: + with conn.cursor() as cur: + cur.execute( + """ + SELECT description, source_desc, cell_size_m, feature_count, + bbox_min_lon, bbox_min_lat, bbox_max_lon, bbox_max_lat, export_file + FROM navsea_grid_layer_meta + WHERE layer_name=%s + """, + (LAYER_NAME,), + ) + meta_row = cur.fetchone() + if meta_row is None: + raise SystemExit(f"missing layer meta: {LAYER_NAME}") + + ( + description, + source_desc, + cell_size_m, + feature_count, + min_lon, + min_lat, + max_lon, + max_lat, + source_manifest, + ) = meta_row + + export_path = out_dir / "coast_200m_grid.geojson" + cell_sql = """ + SELECT layer_name, cell_id, row_idx, col_idx, cell_size_m, + state_name, class_name, source_name, + min_lon, min_lat, max_lon, max_lat + FROM navsea_grid_cell + WHERE layer_name=%s + """ + cell_params: list[float | str] = [LAYER_NAME] + if args.bbox is not None: + min_lon, min_lat, max_lon, max_lat = args.bbox + min_x = lon_to_mercator(min_lon) + min_y = lat_to_mercator(min_lat) + max_x = lon_to_mercator(max_lon) + max_y = lat_to_mercator(max_lat) + cell_sql += """ + AND NOT ( + max_lon < %s OR min_lon > %s OR + max_lat < %s OR min_lat > %s + ) + """ + cell_params.extend([min_x, max_x, min_y, max_y]) + cell_sql += """ + ORDER BY row_idx, col_idx + """ + + count = 0 + with conn.cursor() as cur, export_path.open("w", encoding="utf-8") as fh: + cur.execute(cell_sql, tuple(cell_params)) + fh.write('{"type":"FeatureCollection","name":"japan_coast_200m_grid","features":[\n') + first = True + for row in cur: + ( + layer_name, + cell_id, + row_idx, + col_idx, + cell_size_m_row, + state_name, + class_name, + source_name, + min_lon_row, + min_lat_row, + max_lon_row, + max_lat_row, + ) = row + lon1, lat1 = mercator_to_lonlat(float(min_lon_row), float(min_lat_row)) + lon2, lat2 = mercator_to_lonlat(float(max_lon_row), float(max_lat_row)) + feature = { + "type": "Feature", + "properties": { + "layer_name": layer_name, + "cell_id": cell_id, + "row": int(row_idx), + "col": int(col_idx), + "cell_size_m": float(cell_size_m_row), + "state_name": state_name, + "class_name": class_name, + "source_name": source_name, + }, + "geometry": rect_geometry(lon1, lat1, lon2, lat2), + } + if not first: + fh.write(",\n") + fh.write(json.dumps(feature, ensure_ascii=False)) + first = False + count += 1 + fh.write("\n]}\n") + + if args.bbox is None and count != int(feature_count): + raise RuntimeError(f"count mismatch: exported={count} meta={feature_count}") + + if args.bbox is None: + lonlat_min = mercator_to_lonlat(float(min_lon), float(min_lat)) + lonlat_max = mercator_to_lonlat(float(max_lon), float(max_lat)) + mercator_min = [float(min_lon), float(min_lat)] + mercator_max = [float(max_lon), float(max_lat)] + else: + lonlat_min = (float(min_lon), float(min_lat)) + lonlat_max = (float(max_lon), float(max_lat)) + mercator_min = [lon_to_mercator(float(min_lon)), lat_to_mercator(float(min_lat))] + mercator_max = [lon_to_mercator(float(max_lon)), lat_to_mercator(float(max_lat))] + + manifest = { + "version": "v1.0", + "database": args.db_name, + "generated_at": dt.datetime.now().isoformat(timespec="seconds"), + "layer": LAYER_NAME, + "description": description, + "source_desc": source_desc, + "source_manifest": source_manifest, + "count": count, + "cell_size_m": float(cell_size_m), + "grid_bounds_lonlat": [lonlat_min[0], lonlat_min[1], lonlat_max[0], lonlat_max[1]], + "grid_bounds_mercator": [mercator_min[0], mercator_min[1], mercator_max[0], mercator_max[1]], + "grid_file": "coast_200m_grid.geojson", + "notes": "从 navsea_japan_coast_grid.MySQL 直接导出的全国海岸 200m 硬阻塞格", + } + + manifest_path = out_dir / "manifest.json" + manifest_path.write_text(json.dumps(manifest, ensure_ascii=False, indent=2), encoding="utf-8") + + print("已导出:") + print(" -", export_path) + print(" -", manifest_path) + print(f" - count={count}") + finally: + conn.close() + + +if __name__ == "__main__": + main() diff --git a/coastline/export_navgrid_mysql_assets.py b/coastline/export_navgrid_mysql_assets.py index 2cbcf1c..f22a562 100644 --- a/coastline/export_navgrid_mysql_assets.py +++ b/coastline/export_navgrid_mysql_assets.py @@ -85,7 +85,7 @@ def normalize_bbox(layer_name: str, min_lon: float, min_lat: float, max_lon: flo def fetch_stats(conn, where_sql: str, params: tuple) -> tuple[int, list[float] | None]: sql = f""" - SELECT COUNT(*), MIN(min_lon), MIN(min_lat), MAX(max_lon), MAX(max_lat) + SELECT COUNT(DISTINCT cell_id), MIN(min_lon), MIN(min_lat), MAX(max_lon), MAX(max_lat) FROM navsea_grid_cell WHERE {where_sql} """ @@ -118,9 +118,10 @@ def export_layer( source_name, min_lon, min_lat, max_lon, max_lat FROM navsea_grid_cell WHERE {where_sql} - ORDER BY row_idx, col_idx + ORDER BY row_idx, col_idx, source_name """ count = 0 + seen_cell_ids: set[str] = set() with conn.cursor(pymysql.cursors.SSCursor) as cur, path.open("w", encoding="utf-8") as fh: cur.execute(sql, params) fh.write('{"type":"FeatureCollection","features":[\n') @@ -161,6 +162,9 @@ def export_layer( }, "geometry": rect_geometry(min_lon, min_lat, max_lon, max_lat), } + if cell_id in seen_cell_ids: + continue + seen_cell_ids.add(cell_id) if not first: fh.write(",\n") fh.write(json.dumps(feature, ensure_ascii=False)) @@ -201,6 +205,9 @@ def export_density_overview(conn, *, path: Path) -> tuple[int, dict]: kept_bbox = [float("inf"), float("inf"), float("-inf"), float("-inf")] keys_20: set[tuple[int, int]] = set() keys_50: set[tuple[int, int]] = set() + seen_20: set[str] = set() + seen_50: set[str] = set() + seen_200: set[str] = set() def write_feature(fh, feature: dict, first: bool) -> bool: if not first: @@ -219,7 +226,7 @@ def export_density_overview(conn, *, path: Path) -> tuple[int, dict]: source_name, min_lon, min_lat, max_lon, max_lat FROM navsea_grid_cell WHERE layer_name=%s - ORDER BY row_idx, col_idx + ORDER BY row_idx, col_idx, source_name """, ("fish_port_20m",), ) @@ -238,6 +245,9 @@ def export_density_overview(conn, *, path: Path) -> tuple[int, dict]: max_lon, max_lat, ) = row + if cell_id in seen_20: + continue + seen_20.add(cell_id) keys_20.add((int(row_idx), int(col_idx))) kept_counts["20"] += 1 min_lon, min_lat, max_lon, max_lat = normalize_bbox( @@ -277,7 +287,7 @@ def export_density_overview(conn, *, path: Path) -> tuple[int, dict]: source_name, min_lon, min_lat, max_lon, max_lat FROM navsea_grid_cell WHERE layer_name=%s - ORDER BY row_idx, col_idx + ORDER BY row_idx, col_idx, source_name """, ("hazard_50m",), ) @@ -296,6 +306,9 @@ def export_density_overview(conn, *, path: Path) -> tuple[int, dict]: max_lon, max_lat, ) = row + if cell_id in seen_50: + continue + seen_50.add(cell_id) row_idx_i = int(row_idx) col_idx_i = int(col_idx) if _overlaps_finer_cells(row_idx_i, col_idx_i, CELL_SIZES["hazard_50m"], CELL_SIZES["fish_port_20m"], keys_20): @@ -339,7 +352,7 @@ def export_density_overview(conn, *, path: Path) -> tuple[int, dict]: source_name, min_lon, min_lat, max_lon, max_lat FROM navsea_grid_cell WHERE layer_name=%s - ORDER BY row_idx, col_idx + ORDER BY row_idx, col_idx, source_name """, ("coast_200m",), ) @@ -358,6 +371,9 @@ def export_density_overview(conn, *, path: Path) -> tuple[int, dict]: max_lon, max_lat, ) = row + if cell_id in seen_200: + continue + seen_200.add(cell_id) row_idx_i = int(row_idx) col_idx_i = int(col_idx) if _overlaps_finer_cells(row_idx_i, col_idx_i, CELL_SIZES["coast_200m"], CELL_SIZES["fish_port_20m"], keys_20): @@ -408,10 +424,41 @@ def export_density_overview(conn, *, path: Path) -> tuple[int, dict]: return total, summary +def manifest_export_path(project_root: Path, path: Path) -> str: + try: + return str(path.relative_to(project_root)) + except ValueError: + return str(path) + + def main() -> None: parser = argparse.ArgumentParser(description="Export NavSea MySQL grid layers to static GeoJSON assets") parser.add_argument("--db-name", default=DB_NAME) parser.add_argument("--out-dir", default=DEFAULT_OUT_DIR) + parser.add_argument( + "--coast-200m", + action=argparse.BooleanOptionalAction, + default=True, + help="是否导出 coast_200m,默认开启;可用 --no-coast-200m 关闭", + ) + parser.add_argument( + "--fish-port-20m", + action=argparse.BooleanOptionalAction, + default=True, + help="是否导出 fish_port_20m,默认开启;可用 --no-fish-port-20m 关闭", + ) + parser.add_argument( + "--hazard-50m", + action=argparse.BooleanOptionalAction, + default=True, + help="是否导出 hazard_50m,默认开启;可用 --no-hazard-50m 关闭", + ) + parser.add_argument( + "--density-overview", + action=argparse.BooleanOptionalAction, + default=True, + help="是否导出 density_overview,默认开启;可用 --no-density-overview 关闭", + ) args = parser.parse_args() project_root = Path(__file__).resolve().parent.parent @@ -420,31 +467,36 @@ def main() -> None: out_dir = project_root / out_dir out_dir.mkdir(parents=True, exist_ok=True) - layers = { + layer_specs = { "coast_200m": { "file": "coast_200m_grid.geojson", "where": "layer_name=%s", "params": ("coast_200m",), "cell_size_m": 200.0, + "enabled": args.coast_200m, }, "fish_port_20m": { "file": "fish_port_20m_grid.geojson", "where": "layer_name=%s", "params": ("fish_port_20m",), "cell_size_m": 20.0, + "enabled": args.fish_port_20m, }, "hazard_50m": { "file": "hazard_50m_grid.geojson", "where": "layer_name=%s", "params": ("hazard_50m",), "cell_size_m": 50.0, + "enabled": args.hazard_50m, }, } manifest_layers: dict[str, dict] = {} conn = mysql_connect(args.db_name) try: - for layer_name, spec in layers.items(): + for layer_name, spec in layer_specs.items(): + if not spec["enabled"]: + continue out_path = out_dir / spec["file"] count = export_layer(conn, path=out_path, where_sql=spec["where"], params=spec["params"]) stat_count, bbox = fetch_stats(conn, spec["where"], spec["params"]) @@ -454,23 +506,27 @@ def main() -> None: "count": count, "bbox_lonlat": bbox, "cell_size_m": spec["cell_size_m"], - "export_file": str(out_path.relative_to(project_root)), + "export_file": manifest_export_path(project_root, out_path), } print(f"{layer_name}: {count} -> {out_path}") - density_path = out_dir / DENSITY_OVERVIEW_FILE - density_count, density_summary = export_density_overview(conn, path=density_path) - manifest_layers["density_overview"] = { - "count": density_count, - "bbox_lonlat": density_summary["bbox"], - "cell_size_m": None, - "export_file": str(density_path.relative_to(project_root)), - "by_density": density_summary["by_density"], - } - print(f"density_overview: {density_count} -> {density_path}") + if args.density_overview: + density_path = out_dir / DENSITY_OVERVIEW_FILE + density_count, density_summary = export_density_overview(conn, path=density_path) + manifest_layers["density_overview"] = { + "count": density_count, + "bbox_lonlat": density_summary["bbox"], + "cell_size_m": None, + "export_file": manifest_export_path(project_root, density_path), + "by_density": density_summary["by_density"], + } + print(f"density_overview: {density_count} -> {density_path}") finally: conn.close() + if not manifest_layers: + raise RuntimeError("no layers selected for export") + manifest = { "database": args.db_name, "generated_at": dt.datetime.now().isoformat(timespec="seconds"), diff --git a/coastline/export_official_port_overlay_kyushu_assets.py b/coastline/export_official_port_overlay_kyushu_assets.py new file mode 100644 index 0000000..183717f --- /dev/null +++ b/coastline/export_official_port_overlay_kyushu_assets.py @@ -0,0 +1,316 @@ +#!/usr/bin/env python3 +""" +NavSea official port overlay export v1.0 + +从官方港湾 / 漁港原始包导出可视化叠加资产: +- C02-08.zip: 港湾 +- C09-06.zip: 漁港 + +默认裁切到九州样区,便于人工核查。 +""" + +from __future__ import annotations + +import argparse +import json +import math +import sqlite3 # kept for symmetry with other exporter scripts; not used directly +import zipfile +from dataclasses import dataclass +from pathlib import Path +import xml.etree.ElementTree as ET + +from shapely.geometry import LineString, Point, mapping + + +RADIUS = 6378137.0 +DEFAULT_BBOX = (123.0, 31.0, 132.7, 34.9) # Kyushu preview window + + +@dataclass(frozen=True) +class SourceSpec: + path: Path + dataset: str + kind: str + + +def mercator_x(lon: float) -> float: + return RADIUS * math.radians(lon) + + +def mercator_y(lat: float) -> float: + lat = max(min(lat, 85.0511287798066), -85.0511287798066) + return RADIUS * math.log(math.tan(math.pi / 4.0 + math.radians(lat) / 2.0)) + + +def mercator(lon: float, lat: float) -> tuple[float, float]: + return mercator_x(lon), mercator_y(lat) + + +def lonlat_from_text(text: str) -> tuple[float, float]: + parts = [p for p in text.replace(",", " ").split() if p] + if len(parts) < 2: + raise ValueError(f"invalid coordinate text: {text!r}") + lat = float(parts[0]) + lon = float(parts[1]) + return lon, lat + + +def lonlat_to_lonlat_text(text: str) -> tuple[float, float]: + # helper kept for readability when parsing GML/JPS coordinates + return lonlat_from_text(text) + + +def local_name(tag: str) -> str: + return tag.split("}", 1)[-1] + + +def load_xml(zip_path: Path) -> ET.Element: + with zipfile.ZipFile(zip_path) as zf: + xml_name = next(name for name in zf.namelist() if name.endswith(".xml") and "META" not in name) + return ET.fromstring(zf.read(xml_name)) + + +def build_point_lookup(root: ET.Element) -> dict[str, tuple[float, float]]: + lookup: dict[str, tuple[float, float]] = {} + for point in root.iter(): + if local_name(point.tag) != "GM_Point": + continue + point_id = point.attrib.get("id") + if not point_id: + continue + coord_text = None + for el in point.iter(): + tag = local_name(el.tag) + if tag == "DirectPosition.coordinate" and (el.text or "").strip(): + coord_text = el.text.strip() + break + if coord_text is None: + continue + lon, lat = lonlat_from_text(coord_text) + lookup[point_id] = (lon, lat) + return lookup + + +def extract_curve_coords(curve: ET.Element, point_lookup: dict[str, tuple[float, float]]) -> list[tuple[float, float]]: + coords: list[tuple[float, float]] = [] + for pos in curve.iter(): + tag = local_name(pos.tag) + if not tag.startswith("GM_Position"): + continue + direct = None + ref = None + for child in list(pos): + child_tag = local_name(child.tag) + if child_tag.endswith("DirectPosition.coordinate") and (child.text or "").strip(): + direct = child.text.strip() + break + if child_tag.endswith("PointRef.point"): + ref = child.attrib.get("idref") + if direct is not None: + lon, lat = lonlat_from_text(direct) + coords.append((lon, lat)) + elif ref and ref in point_lookup: + coords.append(point_lookup[ref]) + return coords + + +def bbox_intersects(a: tuple[float, float, float, float], b: tuple[float, float, float, float]) -> bool: + return not (a[2] < b[0] or a[0] > b[2] or a[3] < b[1] or a[1] > b[3]) + + +def point_in_bbox(pt: tuple[float, float], bbox: tuple[float, float, float, float]) -> bool: + lon, lat = pt + return bbox[0] <= lon <= bbox[2] and bbox[1] <= lat <= bbox[3] + + +def normalize_harbor_feature(tag: str, props: dict[str, str]) -> dict[str, str]: + if tag == "CK01": + props["feature_family"] = "harbor_point" + elif tag in ("CK11", "CK21"): + props["feature_family"] = "harbor_line" + elif tag == "CB01": + props["feature_family"] = "fish_port_point" + elif tag == "CB03": + props["feature_family"] = "fish_port_line" + else: + props["feature_family"] = "unknown" + return props + + +def main() -> None: + parser = argparse.ArgumentParser(description="Export official harbor/fishing-port preview assets for Kyushu") + parser.add_argument( + "--output-dir", + default="src/pbf/port-overlay-official/kyushu", + help="输出目录", + ) + parser.add_argument( + "--slug", + default="official_port_overlay_kyushu", + help="输出文件前缀", + ) + parser.add_argument( + "--bbox", + nargs=4, + type=float, + default=list(DEFAULT_BBOX), + metavar=("MIN_LON", "MIN_LAT", "MAX_LON", "MAX_LAT"), + help="预览裁切范围,默认九州", + ) + args = parser.parse_args() + + project_root = Path(__file__).resolve().parent.parent + out_dir = Path(args.output_dir) + if not out_dir.is_absolute(): + out_dir = project_root / out_dir + out_dir.mkdir(parents=True, exist_ok=True) + + bbox = tuple(args.bbox) # type: ignore[assignment] + + sources = [ + SourceSpec(project_root / "coastline" / "C02-08.zip", "C02-08", "harbor"), + SourceSpec(project_root / "coastline" / "C09-06.zip", "C09-06", "fish_port"), + ] + + line_features: list[dict] = [] + point_features: list[dict] = [] + stats = [] + + for source in sources: + if not source.path.exists(): + raise SystemExit(f"missing input: {source.path}") + root = load_xml(source.path) + point_lookup = build_point_lookup(root) + obj = root.find(".//{http://nlftp.mlit.go.jp/ksj/schemas/ksj-app}OBJ") + if obj is None: + raise SystemExit(f"OBJ block missing in {source.path}") + + line_count = 0 + point_count = 0 + bbox_minx = bbox_miny = float("inf") + bbox_maxx = bbox_maxy = float("-inf") + + tags = ["CK11", "CK21"] if source.dataset == "C02-08" else ["CB03"] + point_tags = ["CK01"] if source.dataset == "C02-08" else ["CB01"] + + for tag in tags: + for feature in obj.findall(f".//{{http://nlftp.mlit.go.jp/ksj/schemas/ksj-app}}{tag}"): + loc = feature.find("{http://nlftp.mlit.go.jp/ksj/schemas/ksj-app}LOC") + if loc is None: + continue + ref = loc.attrib.get("idref") + if not ref: + continue + curve = obj.find(f".//*[@id='{ref}']") + if curve is None: + continue + coords = extract_curve_coords(curve, point_lookup) + if len(coords) < 2: + continue + xs = [p[0] for p in coords] + ys = [p[1] for p in coords] + geom_bbox = (min(xs), min(ys), max(xs), max(ys)) + if not bbox_intersects(geom_bbox, bbox): + continue + props = {"source_dataset": source.dataset, "source_kind": source.kind, "tag": tag} + for key in ("PRC", "HBC", "FPC"): + el = feature.find(f"{{http://nlftp.mlit.go.jp/ksj/schemas/ksj-app}}{key}") + if el is not None and (el.text or "").strip(): + props[key.lower()] = el.text.strip() + props = normalize_harbor_feature(tag, props) + if len(coords) == 1: + lon, lat = coords[0] + geometry = mapping(Point(lon, lat)) + else: + geometry = mapping(LineString(coords)) + line_features.append({"type": "Feature", "properties": props, "geometry": geometry}) + line_count += 1 + bbox_minx = min(bbox_minx, geom_bbox[0]) + bbox_miny = min(bbox_miny, geom_bbox[1]) + bbox_maxx = max(bbox_maxx, geom_bbox[2]) + bbox_maxy = max(bbox_maxy, geom_bbox[3]) + + for tag in point_tags: + for feature in obj.findall(f".//{{http://nlftp.mlit.go.jp/ksj/schemas/ksj-app}}{tag}"): + pos = feature.find("{http://nlftp.mlit.go.jp/ksj/schemas/ksj-app}POS") + if pos is None: + continue + ref = pos.attrib.get("idref") + if not ref or ref not in point_lookup: + continue + lon, lat = point_lookup[ref] + if not point_in_bbox((lon, lat), bbox): + continue + props = {"source_dataset": source.dataset, "source_kind": source.kind, "tag": tag} + for key in ("NA4", "AD7", "NA2", "FCF", "AAC", "CH1", "CH2", "CFP", "FPA", "PRC", "HBC", "FPC"): + el = feature.find(f"{{http://nlftp.mlit.go.jp/ksj/schemas/ksj-app}}{key}") + if el is not None and (el.text or "").strip(): + props[key.lower()] = el.text.strip() + props = normalize_harbor_feature(tag, props) + point_features.append( + { + "type": "Feature", + "properties": props, + "geometry": mapping(Point(lon, lat)), + } + ) + point_count += 1 + bbox_minx = min(bbox_minx, lon) + bbox_miny = min(bbox_miny, lat) + bbox_maxx = max(bbox_maxx, lon) + bbox_maxy = max(bbox_maxy, lat) + + stats.append( + { + "dataset": source.dataset, + "kind": source.kind, + "path": str(source.path), + "line_count": line_count, + "point_count": point_count, + "bbox_lonlat": None if line_count + point_count == 0 else [bbox_minx, bbox_miny, bbox_maxx, bbox_maxy], + } + ) + + line_geojson = { + "type": "FeatureCollection", + "name": "official_port_overlay_lines", + "features": line_features, + } + point_geojson = { + "type": "FeatureCollection", + "name": "official_port_overlay_points", + "features": point_features, + } + manifest = { + "version": "v1.0", + "source_packages": [str(s.path) for s in sources], + "bbox_lonlat": list(bbox), + "line_count": len(line_features), + "point_count": len(point_features), + "stats": stats, + "line_file": f"{args.slug}_lines.geojson", + "point_file": f"{args.slug}_points.geojson", + } + + (out_dir / f"{args.slug}_lines.geojson").write_text( + json.dumps(line_geojson, ensure_ascii=False), + encoding="utf-8", + ) + (out_dir / f"{args.slug}_points.geojson").write_text( + json.dumps(point_geojson, ensure_ascii=False), + encoding="utf-8", + ) + (out_dir / f"{args.slug}_manifest.json").write_text( + json.dumps(manifest, ensure_ascii=False, indent=2), + encoding="utf-8", + ) + + print("已导出:") + print(" -", out_dir / f"{args.slug}_lines.geojson") + print(" -", out_dir / f"{args.slug}_points.geojson") + print(" -", out_dir / f"{args.slug}_manifest.json") + + +if __name__ == "__main__": + main() diff --git a/coastline/export_port_overlay_kyushu_assets.py b/coastline/export_port_overlay_kyushu_assets.py new file mode 100644 index 0000000..36c6690 --- /dev/null +++ b/coastline/export_port_overlay_kyushu_assets.py @@ -0,0 +1,219 @@ +#!/usr/bin/env python3 +""" +NavSea port overlay export v1.0 + +从九州工程库快照导出港湾/渔港叠加预览资产: +- 港湾 AOI 面 +- 港湾 AOI 中心点 +- 元数据清单 + +用途: +- 在 MapLibre 中快速检查港湾、渔港、小港湾的覆盖范围 +- 作为后续港湾语义栅格化的人工核查层 +""" + +from __future__ import annotations + +import argparse +import json +import math +import sqlite3 +from pathlib import Path + +from shapely.geometry import Point, Polygon, mapping + + +RADIUS = 6378137.0 + + +def mercator_to_lonlat(x: float, y: float) -> tuple[float, float]: + lon = math.degrees(x / RADIUS) + lat = math.degrees(2.0 * math.atan(math.exp(y / RADIUS)) - math.pi / 2.0) + return lon, lat + + +def polygon_to_lonlat(poly: Polygon) -> Polygon: + exterior = [mercator_to_lonlat(x, y) for x, y in poly.exterior.coords] + interiors = [ + [mercator_to_lonlat(x, y) for x, y in ring.coords] + for ring in poly.interiors + ] + return Polygon(exterior, interiors) + + +def point_to_lonlat(point: Point) -> Point: + lon, lat = mercator_to_lonlat(point.x, point.y) + return Point(lon, lat) + + +def normalize_category(canonical_type: str) -> str: + if canonical_type == "漁港": + return "fishing_port" + if canonical_type == "一般港湾 (港則法区域、重要港湾)": + return "general_harbor" + if canonical_type == "小港湾 (避難港、地方港湾)": + return "small_harbor" + return "unknown" + + +def style_color(category: str) -> str: + if category == "fishing_port": + return "#7fc8ff" + if category == "general_harbor": + return "#ffb86b" + if category == "small_harbor": + return "#b8d37a" + return "#d9d9d9" + + +def main() -> None: + parser = argparse.ArgumentParser(description="Export Kyushu port overlay assets") + parser.add_argument( + "--source-db", + default="out/navsea_kyushu_navigability_full_run.export_snapshot.sqlite", + help="输入 SQLite 快照", + ) + parser.add_argument( + "--output-dir", + default="src/pbf/port-overlay/kyushu", + help="输出目录", + ) + parser.add_argument( + "--slug", + default="port_overlay_kyushu", + help="输出文件前缀", + ) + args = parser.parse_args() + + project_root = Path(__file__).resolve().parent.parent + source_db = Path(args.source_db) + if not source_db.is_absolute(): + source_db = project_root / source_db + out_dir = Path(args.output_dir) + if not out_dir.is_absolute(): + out_dir = project_root / out_dir + out_dir.mkdir(parents=True, exist_ok=True) + + if not source_db.exists(): + raise SystemExit(f"missing source db: {source_db}") + + conn = sqlite3.connect(source_db) + conn.row_factory = sqlite3.Row + + rows = conn.execute( + """ + SELECT DISTINCT + aoi_id, feature_id, fid, canonical_object_type, center_x, center_y, radius_m + FROM port_aoi + ORDER BY aoi_id + """ + ).fetchall() + + if not rows: + raise SystemExit("port_aoi is empty") + + radius_m = max(float(row["radius_m"]) for row in rows) + types = {} + minx = miny = float("inf") + maxx = maxy = float("-inf") + + area_features = [] + center_features = [] + + for row in rows: + category = normalize_category(row["canonical_object_type"]) + color = style_color(category) + center = Point(float(row["center_x"]), float(row["center_y"])) + polygon = center.buffer(float(row["radius_m"]), resolution=16) + + minx = min(minx, float(row["center_x"]) - float(row["radius_m"])) + miny = min(miny, float(row["center_y"]) - float(row["radius_m"])) + maxx = max(maxx, float(row["center_x"]) + float(row["radius_m"])) + maxy = max(maxy, float(row["center_y"]) + float(row["radius_m"])) + + types.setdefault(row["canonical_object_type"], 0) + types[row["canonical_object_type"]] += 1 + + area_features.append( + { + "type": "Feature", + "properties": { + "aoi_id": row["aoi_id"], + "feature_id": row["feature_id"], + "fid": row["fid"], + "canonical_object_type": row["canonical_object_type"], + "category": category, + "radius_m": float(row["radius_m"]), + "fill": color, + }, + "geometry": mapping(polygon_to_lonlat(polygon)), + } + ) + center_features.append( + { + "type": "Feature", + "properties": { + "aoi_id": row["aoi_id"], + "feature_id": row["feature_id"], + "fid": row["fid"], + "canonical_object_type": row["canonical_object_type"], + "category": category, + "radius_m": float(row["radius_m"]), + }, + "geometry": mapping(point_to_lonlat(center)), + } + ) + + center_lonlat_min = mercator_to_lonlat(minx, miny) + center_lonlat_max = mercator_to_lonlat(maxx, maxy) + + area_geojson = { + "type": "FeatureCollection", + "name": "port_overlay_areas", + "features": area_features, + } + center_geojson = { + "type": "FeatureCollection", + "name": "port_overlay_centers", + "features": center_features, + } + manifest = { + "version": "v1.0", + "source_db": str(source_db), + "source_scope": "Kyushu", + "total_features": len(rows), + "radius_m": radius_m, + "counts_by_type": types, + "bbox_mercator": [minx, miny, maxx, maxy], + "bbox_lonlat": [ + center_lonlat_min[0], + center_lonlat_min[1], + center_lonlat_max[0], + center_lonlat_max[1], + ], + "area_file": f"{args.slug}_areas.geojson", + "center_file": f"{args.slug}_centers.geojson", + } + + (out_dir / f"{args.slug}_areas.geojson").write_text( + json.dumps(area_geojson, ensure_ascii=False), + encoding="utf-8", + ) + (out_dir / f"{args.slug}_centers.geojson").write_text( + json.dumps(center_geojson, ensure_ascii=False), + encoding="utf-8", + ) + (out_dir / f"{args.slug}_manifest.json").write_text( + json.dumps(manifest, ensure_ascii=False, indent=2), + encoding="utf-8", + ) + conn.close() + + print("已导出:") + print(" -", out_dir / f"{args.slug}_areas.geojson") + print(" -", out_dir / f"{args.slug}_centers.geojson") + print(" -", out_dir / f"{args.slug}_manifest.json") + + +if __name__ == "__main__": + main() diff --git a/coastline/export_prc20_test_assets.py b/coastline/export_prc20_test_assets.py new file mode 100644 index 0000000..f0d7a5a --- /dev/null +++ b/coastline/export_prc20_test_assets.py @@ -0,0 +1,218 @@ +#!/usr/bin/env python3 +from __future__ import annotations + +import argparse +import datetime as dt +import json +import math +from pathlib import Path + +import pymysql + + +DB_NAME = "navsea_japan_coast_grid" +DB_USER = "root" +DB_PASSWORD = "2chi9ks2" +DB_HOST = "localhost" +DB_SOCKET = "/tmp/mysql.sock" + +DEFAULT_OUT_DIR = "src/pbf/coastline-mysql/prc50_test" + +RADIUS = 6378137.0 +TARGET_LAYER = "fish_port_20m" +DEFAULT_PRC = "50" + + +def mysql_connect(database: str, *, cursorclass=pymysql.cursors.Cursor): + kwargs = { + "host": DB_HOST, + "user": DB_USER, + "password": DB_PASSWORD, + "database": database, + "charset": "utf8mb4", + "cursorclass": cursorclass, + } + if DB_SOCKET: + kwargs["unix_socket"] = DB_SOCKET + return pymysql.connect(**kwargs) + + +def rect_geometry(min_lon: float, min_lat: float, max_lon: float, max_lat: float) -> dict: + return { + "type": "Polygon", + "coordinates": [ + [ + [min_lon, min_lat], + [max_lon, min_lat], + [max_lon, max_lat], + [min_lon, max_lat], + [min_lon, min_lat], + ] + ], + } + + +def lon_from_mercator(x: float) -> float: + return math.degrees(x / RADIUS) + + +def lat_from_mercator(y: float) -> float: + return math.degrees(2.0 * math.atan(math.exp(y / RADIUS)) - math.pi / 2.0) + + +def mercator_bbox_to_lonlat(minx: float, miny: float, maxx: float, maxy: float) -> tuple[float, float, float, float]: + return ( + lon_from_mercator(minx), + lat_from_mercator(miny), + lon_from_mercator(maxx), + lat_from_mercator(maxy), + ) + + +def normalize_bbox(layer_name: str, min_lon: float, min_lat: float, max_lon: float, max_lat: float) -> tuple[float, float, float, float]: + if layer_name == "coast_200m" and ( + abs(min_lon) > 180.0 or abs(max_lon) > 180.0 or abs(min_lat) > 90.0 or abs(max_lat) > 90.0 + ): + return mercator_bbox_to_lonlat(min_lon, min_lat, max_lon, max_lat) + return min_lon, min_lat, max_lon, max_lat + + +def export_layer( + conn, + *, + path: Path, + where_sql: str, + params: tuple, +) -> int: + path.parent.mkdir(parents=True, exist_ok=True) + sql = f""" + SELECT layer_name, cell_id, row_idx, col_idx, cell_size_m, state_name, class_name, + source_name, min_lon, min_lat, max_lon, max_lat + FROM navsea_grid_cell + WHERE {where_sql} + ORDER BY row_idx, col_idx + """ + count = 0 + with conn.cursor(pymysql.cursors.SSCursor) as cur, path.open("w", encoding="utf-8") as fh: + cur.execute(sql, params) + fh.write('{"type":"FeatureCollection","features":[\n') + first = True + for row in cur: + ( + layer_name, + cell_id, + row_idx, + col_idx, + cell_size_m, + state_name, + class_name, + source_name, + min_lon, + min_lat, + max_lon, + max_lat, + ) = row + min_lon, min_lat, max_lon, max_lat = normalize_bbox( + row[0], + float(min_lon), + float(min_lat), + float(max_lon), + float(max_lat), + ) + feature = { + "type": "Feature", + "properties": { + "layer_name": layer_name, + "cell_id": cell_id, + "row": int(row_idx), + "col": int(col_idx), + "cell_size_m": float(cell_size_m), + "state_name": state_name, + "class_name": class_name, + "source_name": source_name, + }, + "geometry": rect_geometry(min_lon, min_lat, max_lon, max_lat), + } + if not first: + fh.write(",\n") + fh.write(json.dumps(feature, ensure_ascii=False)) + first = False + count += 1 + fh.write("\n]}\n") + return count + + +def fetch_stats(conn, where_sql: str, params: tuple) -> tuple[int, list[float] | None]: + sql = f""" + SELECT COUNT(*), MIN(min_lon), MIN(min_lat), MAX(max_lon), MAX(max_lat) + FROM navsea_grid_cell + WHERE {where_sql} + """ + with conn.cursor() as cur: + cur.execute(sql, params) + row = cur.fetchone() + count = int(row[0] or 0) + if count == 0: + return 0, None + min_lon, min_lat, max_lon, max_lat = normalize_bbox( + params[0] if params else "", + float(row[1]), + float(row[2]), + float(row[3]), + float(row[4]), + ) + return count, [min_lon, min_lat, max_lon, max_lat] + + +def main() -> None: + parser = argparse.ArgumentParser(description="Export a single PRC fish_port_20m test subset") + parser.add_argument("--db-name", default=DB_NAME) + parser.add_argument("--out-dir", default=DEFAULT_OUT_DIR) + parser.add_argument("--prc", default=DEFAULT_PRC, help="只导出这个 PRC 的 fish_port_20m,默认 50") + args = parser.parse_args() + + project_root = Path(__file__).resolve().parent.parent + out_dir = Path(args.out_dir) + if not out_dir.is_absolute(): + out_dir = project_root / out_dir + out_dir.mkdir(parents=True, exist_ok=True) + + prc = str(args.prc).strip() + if prc.isdigit(): + prc = f"{int(prc):02d}" + + where_sql = "layer_name=%s AND state_name=%s AND source_name LIKE %s" + params = (TARGET_LAYER, "COASTLINE", f"C09-06+coastline PRC={prc}%") + out_path = out_dir / f"fish_port_20m_prc{prc}_grid.geojson" + + conn = mysql_connect(args.db_name) + try: + count = export_layer(conn, path=out_path, where_sql=where_sql, params=params) + stat_count, bbox = fetch_stats(conn, where_sql, params) + if count != stat_count: + raise RuntimeError(f"export count mismatch: {count} != {stat_count}") + finally: + conn.close() + + manifest = { + "database": args.db_name, + "generated_at": dt.datetime.now().isoformat(timespec="seconds"), + "prc": prc, + "layers": { + TARGET_LAYER: { + "count": count, + "bbox_lonlat": bbox, + "cell_size_m": 20.0, + "export_file": str(out_path.relative_to(project_root)), + "filter": f"state_name='COASTLINE' AND source_name LIKE 'C09-06+coastline PRC={prc}%'", + } + }, + } + manifest_path = out_dir / "manifest.json" + manifest_path.write_text(json.dumps(manifest, ensure_ascii=False, indent=2), encoding="utf-8") + print(f"{TARGET_LAYER}: {count} -> {out_path}") + print(f"manifest: {manifest_path}") + + +if __name__ == "__main__": + main() diff --git a/coastline/navgrid_v2/NavSea_v2_使用说明.md b/coastline/navgrid_v2/NavSea_v2_使用说明.md new file mode 100644 index 0000000..7fb63a6 --- /dev/null +++ b/coastline/navgrid_v2/NavSea_v2_使用说明.md @@ -0,0 +1,382 @@ +# NavSea v2 使用说明 + +本文只说明 `coastline/navgrid_v2/` 下的新一版脚本与对应验证页。 + +## 1. 目录说明 + +v2 脚本目录: + +- `coastline/navgrid_v2/` + +v2 验证页: + +- `src/pbf/navsea-coastline-fukuoka-saga-200m-v2.html` +- `src/pbf/navsea-fish-port-debug-v2.html` +- `src/pbf/navsea-fish-port-prc50-test-v2.html` +- `src/pbf/navsea-coast-wall-z12-viewer.html` + +v2 静态资产目录: + +- `src/pbf/coastline-mysql-v2/` + +v2 规则: + +- 三类数据分表保存 +- cell 记录明确保存来源字段 +- 不使用迁移脚本 +- 直接用 v2 Python 从源数据重建 +- `coastline` 这条链路的最终目标是导出阻断墙 `bin` +- 来源字段的目标不只是可追溯,也要方便检查、删除指定来源数据、以及按来源做 resume / 复跑 + +## 2. v2 表结构 + +### 2.1 沿岸数据 + +- 表前缀:`navsea_coast_` +- 主要表: + - `navsea_coast_grid_cell` + - `navsea_coast_grid_layer_meta` + - `navsea_coast_grid_package_stat` + +cell 级来源字段: + +- `source_code` +- `source_path` +- `source_name` + +### 2.2 渔港 20m + +- 表前缀:`navsea_fish_port_` +- 主要表: + - `navsea_fish_port_grid_cell` + - `navsea_fish_port_grid_layer_meta` + - `navsea_fish_port_grid_package_stat` + +### 2.3 海上障碍 50m + +- 表前缀:`navsea_hazard_` +- 主要表: + - `navsea_hazard_grid_cell` + - `navsea_hazard_grid_layer_meta` + - `navsea_hazard_grid_package_stat` + +海上障碍这组走轻量记录: + +- `navsea_hazard_grid_layer_meta.source_desc` 仍然保留整体来源说明 +- `navsea_hazard_grid_cell.source_name` 直接记录 `fid` +- `navsea_hazard_grid_cell` 额外带有 `(layer_name, source_name)` 索引,方便按 `fid` 查删和复跑 +- 也就是说,单个 cell 不再追完整来源链,只保留一个代表性的 `fid` + +## 3. 生成顺序 + +建议顺序: + +1. 先生成沿岸数据 +2. 再生成渔港 20m +3. 再生成海上障碍 50m +4. 再导出静态资产 +5. 再生成阻断墙二进制 `bin` +6. 最后看验证页 + +## 4. 三个导入脚本的参数说明 + +这三个脚本是 v2 里最重要的“入库脚本”: + +- 沿岸数据:`build_coast_grid_mysql.py` +- 渔港 20m:`build_fish_port_20m_mysql_resume.py` +- 海上障碍 50m:`build_hazard_50m_mysql.py` + +下面把常用参数和开关说明清楚。先记一个总原则: + +- `build_coast_grid_mysql.py` 偏“沿岸重建” +- `build_fish_port_20m_mysql_resume.py` 偏“续跑 + 选择性重算” +- `build_hazard_50m_mysql.py` 偏“全量重建,参数少” + +### 4.1 沿岸数据:`build_coast_grid_mysql.py` + +脚本: + +- [`build_coast_grid_mysql.py`](./build_coast_grid_mysql.py) + +默认执行: + +```bash +cd /root/sourceserver/pbf +./.venv/bin/python coastline/navgrid_v2/build_coast_grid_mysql.py +``` + +常用参数: + +- `--input`:指定海岸线 zip,支持重复传入;不传时自动扫描 `coastline/C23-06_*_GML.zip` +- `--db-name`:MySQL 数据库名 +- `--out-dir`:GeoJSON 和元数据输出目录 +- `--cell-size-m`:格网大小,默认 `200` +- `--layer-name`:目标层名;不传时按格网大小自动生成,例如 `coast_200m`、`coast_50m` +- `--buffer-m`:海岸线缓冲距离 +- `--margin-cells`:输出范围外扩的格子数 +- `--write-geojson`:同时导出 GeoJSON +- `--resume`:续跑,不清理当前 layer,保留已入库格子 +- `--start-code`:只处理指定 `source_code` 及之后的包,例如 `13` 或 `C23-06_13` +- `--progress-every-cells`:每扫描多少个候选格打印一次进度 +- `--progress-every-seconds`:最迟每隔多少秒打印一次进度 +- `--coarse-factor`:粗筛倍率,值越大越省细扫,但粗框会更大 + +常用场景: + +- 重新生成整套沿岸数据:直接运行默认命令 +- 只从 `C23-06_13` 继续:加 `--resume --start-code 13` +- 做更细分辨率:加 `--cell-size-m 50 --layer-name coast_50m` +- 想批量重跑一段包:`--resume` 保留已入库结果,再配合 `--start-code` 从某个包号往后接着算 + +50m 续跑示例: + +```bash +cd /root/sourceserver/pbf +./.venv/bin/python coastline/navgrid_v2/build_coast_grid_mysql.py \ + --cell-size-m 50 \ + --layer-name coast_50m \ + --out-dir out/coastline/japan_coast_grid_mysql_v2 \ + --resume \ + --start-code 13 +``` + +### 4.2 渔港 20m:`build_fish_port_20m_mysql_resume.py` + +脚本: + +- [`build_fish_port_20m_mysql_resume.py`](./build_fish_port_20m_mysql_resume.py) + +默认执行: + +```bash +cd /root/sourceserver/pbf +./.venv/bin/python coastline/navgrid_v2/build_fish_port_20m_mysql_resume.py --resume +``` + +这支脚本的重点是“续跑”和“跳过控制”。 + +常用参数: + +- `--resume`:按数据库里的断点继续,默认开启 +- `--no-resume`:忽略数据库断点,从头规划但不清表 +- `--reset-layer`:先清空 `fish_port_20m` 旧数据并删除断点 +- `--prc`:只处理指定 PRC;传入后会按该 PRC 完整重建,并忽略 resume 断点 +- `--fpc`:只处理指定 FPC;会先反查所在 PRC,再只重算该港口 +- `--cluster-gap-m`:聚类连通判定的间隔 +- `--cell-size-m`:格网大小,默认 `20` +- `--coast-buffer-m`:海岸缓冲距离 +- `--fish-buffer-m`:渔港几何外扩缓冲,当前保留兼容 +- `--commit-every`:每累计多少条 cell 写一次数据库 +- `--scan-tile-m`:格网扫描分块大小 +- `--coast-coarse-margin-m`:coast_200m 粗筛底座外扩缓冲 +- `--allow-unbounded-fallback`:没有 coast_200m 小窗时,允许回退扫描原始 part +- `--skip-missing-coarse`:没有有效 coast_200m 交集时直接跳过该 part +- `--max-scan-cells`:单次允许估算的最大 20m 格数,超过就中止;`0` 表示不限制 + +这几个开关最值得记: + +- 想继续上次中断:`--resume` +- 想重跑但不清表:`--no-resume` +- 想只重算某个港口:`--fpc 4320050` +- 想只重算某个 PRC:`--prc 50` +- 想遇到无有效粗筛时直接跳过:`--skip-missing-coarse` +- 想允许老式整片扫描兜底:`--allow-unbounded-fallback` + +这里要特别注意: + +- `--resume` 主要用于全国批量续跑,脚本会按数据库断点接着处理尚未完成的 PRC +- 一旦你显式指定 `--prc` 或 `--fpc`,脚本会进入“指定区域完整重算”模式,这时会忽略原来的 resume 断点 +- 所以它支持“批量 resume”,也支持“指定区域重算”,但这两种模式不是同时叠加的 + +示例: + +```bash +cd /root/sourceserver/pbf +./.venv/bin/python coastline/navgrid_v2/build_fish_port_20m_mysql_resume.py \ + --resume \ + --skip-missing-coarse +``` + +### 4.3 海上障碍 50m:`build_hazard_50m_mysql.py` + +脚本: + +- [`build_hazard_50m_mysql.py`](./build_hazard_50m_mysql.py) + +默认执行: + +```bash +cd /root/sourceserver/pbf +./.venv/bin/python coastline/navgrid_v2/build_hazard_50m_mysql.py +``` + +常用参数: + +- `--db-name`:MySQL 数据库名 +- `--tile-root`:全国 PBF 根目录 +- `--zoom`:PBF 瓦片 zoom,默认 `12` +- `--out-dir`:GeoJSON 输出目录 +- `--source-desc`:写入元数据的来源说明 + +这个脚本参数最少,基本就是全量重建。 + +## 5. v2 沿岸导出 + +脚本: + +- [`export_coast_grid_mysql_assets.py`](./export_coast_grid_mysql_assets.py) + +默认执行: + +```bash +cd /root/sourceserver/pbf +./.venv/bin/python coastline/navgrid_v2/export_coast_grid_mysql_assets.py +``` + +## 6. v2 调试导出 + +脚本: + +- [`export_fish_port_debug_assets.py`](./export_fish_port_debug_assets.py) +- [`export_prc20_test_assets.py`](./export_prc20_test_assets.py) + +示例: + +```bash +cd /root/sourceserver/pbf +./.venv/bin/python coastline/navgrid_v2/export_fish_port_debug_assets.py --fpc 4320050 --coast-buffer-m 20 +./.venv/bin/python coastline/navgrid_v2/export_prc20_test_assets.py --prc 50 +``` + +## 7. v2 共用导出 + +脚本: + +- [`export_navgrid_mysql_assets.py`](./export_navgrid_mysql_assets.py) + +默认执行: + +```bash +cd /root/sourceserver/pbf +./.venv/bin/python coastline/navgrid_v2/export_navgrid_mysql_assets.py +``` + +## 8. 阻断墙二进制 + +脚本: + +- [`build_coast_wall_z12_bin.py`](./build_coast_wall_z12_bin.py) + +默认执行: + +```bash +cd /root/sourceserver/pbf +./.venv/bin/python coastline/navgrid_v2/build_coast_wall_z12_bin.py +``` + +默认输出文件名会自动带上当前三层单位,例如: + +- `out/navmask/coast_wall_z12_200_50_20.bin` +- `out/navmask/coast_wall_z12_100_50_20.bin` +- `out/navmask/coast_wall_z12_50_50_20.bin` + +当输出墙参数不是默认 `z12 + 40x40` 时,文件名会改用实际墙参数,不再沿用默认 out 里的 `z12`,例如: + +- `out/navmask/coast_wall_z14_g80_10_50.bin` + +这一步就是 `coastline` 链路的最终落点: + +- 上游把三类格网数据重建出来 +- 导出静态资产用于检查和发布 +- 最后由这里把沿岸相关结果汇总成阻断墙 `bin` + +如果前面的表结构、导出目录或验证页发生变化,最终都要回到这一步确认 `bin` 产物仍然可用。 + +这支脚本现在有两组“格子大小”参数,要分清: + +- `--coast-cell-size-m`:输入海岸线层的格网大小,例如读取 `coast_200m`、`coast_100m`、`coast_50m` +- `--zoom` + `--grid-size`:最终阻断墙自身的输出格子大小;同一个 zoom 下 `grid-size` 越大,tile 内切得越细,墙 cell 越小 + +还有一条自动规则: + +- 当 `--coast-cell-size-m < 20` 时,脚本会跳过 `fish_port_20m` +- 这是因为输入海岸线层已经比渔港 20m 更细,继续叠加渔港 20m 反而会把更粗的格子混进阻断墙 +- 此时实际融合顺序会变成: + - `hazard_50m` + - 指定的 `coast_*m`,例如 `coast_10m` +- 生成的 `.meta.json` 会记录 `include_fish_port_20m=false` + +默认的 bin 组合顺序是: + +- `fish_port_20m` +- `hazard_50m` +- `coast_200m` + +如果你要把海岸线层切成更细的版本,可以直接改参数: + +```bash +cd /root/sourceserver/pbf +./.venv/bin/python coastline/navgrid_v2/build_coast_wall_z12_bin.py --coast-cell-size-m 100 +./.venv/bin/python coastline/navgrid_v2/build_coast_wall_z12_bin.py --coast-cell-size-m 50 +``` + +如果要调整最终墙的 cell 大小,可以改 `zoom` 和 `grid-size`: + +```bash +cd /root/sourceserver/pbf +./.venv/bin/python coastline/navgrid_v2/build_coast_wall_z12_bin.py \ + --zoom 11 \ + --grid-size 80 +``` + +如果输入海岸线层已经做到 `10m`,可以这样生成更细的墙;这时会自动不使用渔港 `20m`: + +```bash +cd /root/sourceserver/pbf +./.venv/bin/python coastline/navgrid_v2/build_coast_wall_z12_bin.py \ + --zoom 14 \ + --grid-size 80 \ + --coast-cell-size-m 10 +``` + +这个命令的默认输出会是: + +- `out/navmask/coast_wall_z14_g80_10_50.bin` + +常用理解: + +- 默认 `--zoom 12 --grid-size 40`,墙 cell 约 `244.6m` +- `--zoom 12 --grid-size 80`,墙 cell 约 `122.3m` +- `--zoom 13 --grid-size 40`,墙 cell 约 `122.3m` +- `--zoom 13 --grid-size 80`,墙 cell 约 `61.1m` + +如果横向和纵向要分别调,可以使用: + +```bash +cd /root/sourceserver/pbf +./.venv/bin/python coastline/navgrid_v2/build_coast_wall_z12_bin.py \ + --zoom 12 \ + --grid-w 80 \ + --grid-h 80 +``` + +如果海岸线表名不跟着默认规则走,也可以直接指定: + +```bash +cd /root/sourceserver/pbf +./.venv/bin/python coastline/navgrid_v2/build_coast_wall_z12_bin.py \ + --coast-layer-name coast_100m \ + --coast-cell-size-m 100 +``` + +如果想直接看 `bin` 的效果,可以打开: + +- `src/pbf/navsea-coast-wall-z12-viewer.html` + +在页面里选择生成好的 `coast_wall_*.bin`,可选再选择同名 `.meta.json`,就能直接看最终阻断墙的铺面效果。查看页会按 bin header 自动识别 `zoom` 和 `grid`。 + +## 9. 验证页 + +- `http://192.168.200.184/newpec/navsea-coastline-fukuoka-saga-200m-v2.html` +- `http://192.168.200.184/newpec/navsea-fish-port-debug-v2.html` +- `http://192.168.200.184/newpec/navsea-fish-port-prc50-test-v2.html` diff --git a/coastline/navgrid_v2/__init__.py b/coastline/navgrid_v2/__init__.py new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/coastline/navgrid_v2/__init__.py @@ -0,0 +1 @@ + diff --git a/coastline/navgrid_v2/build_coast_grid_mysql.py b/coastline/navgrid_v2/build_coast_grid_mysql.py new file mode 100644 index 0000000..0131f0d --- /dev/null +++ b/coastline/navgrid_v2/build_coast_grid_mysql.py @@ -0,0 +1,870 @@ +#!/usr/bin/env python3 +from __future__ import annotations + +import argparse +import datetime as dt +import glob +import json +import math +import zipfile +from dataclasses import dataclass +from pathlib import Path +from typing import Iterable +import xml.etree.ElementTree as ET + +import pymysql +from shapely.geometry import LineString, MultiLineString, box, mapping +from shapely.prepared import prep + + +DB_NAME = "navsea_japan_coast_grid" +DB_USER = "root" +DB_PASSWORD = "2chi9ks2" +DB_HOST = "localhost" +DB_SOCKET = "/tmp/mysql.sock" + +DEFAULT_INPUT_GLOB = "coastline/C23-06_*_GML.zip" +DEFAULT_OUT_DIR = "out/coastline/japan_coast_grid_mysql_v2" +DEFAULT_CELL_SIZE_M = 200.0 +DEFAULT_BUFFER_M = 50.0 + +RADIUS = 6378137.0 +MAX_MERCATOR_LAT = 85.0511287798066 +NS = {"gml": "http://www.opengis.net/gml/3.2"} + + +@dataclass(frozen=True) +class SourcePackage: + path: Path + prefecture: str + code: str + + +def mercator_x(lon: float) -> float: + return RADIUS * math.radians(lon) + + +def mercator_y(lat: float) -> float: + lat = max(min(lat, MAX_MERCATOR_LAT), -MAX_MERCATOR_LAT) + return RADIUS * math.log(math.tan(math.pi / 4.0 + math.radians(lat) / 2.0)) + + +def lon_from_mercator(x: float) -> float: + return math.degrees(x / RADIUS) + + +def lat_from_mercator(y: float) -> float: + return math.degrees(2.0 * math.atan(math.exp(y / RADIUS)) - math.pi / 2.0) + + +def mercator_bbox_to_lonlat(minx: float, miny: float, maxx: float, maxy: float) -> tuple[float, float, float, float]: + return ( + lon_from_mercator(minx), + lat_from_mercator(miny), + lon_from_mercator(maxx), + lat_from_mercator(maxy), + ) + + +def align_floor(value: float, step: float) -> float: + return math.floor(value / step) * step + + +def align_ceil(value: float, step: float) -> float: + return math.ceil(value / step) * step + + +def parse_text_list(text: str) -> list[float]: + return [float(part) for part in text.split() if part] + + +def detect_prefecture(meta_xml: str) -> str: + title_start = meta_xml.find("") + if title_start == -1: + return "unknown" + title_end = meta_xml.find("", title_start) + if title_end == -1: + return "unknown" + return meta_xml[title_start + 7:title_end].strip() + + +def load_package(path: Path) -> SourcePackage: + with zipfile.ZipFile(path) as zf: + meta_name = next(name for name in zf.namelist() if "META" in name and name.endswith(".xml")) + meta_xml = zf.read(meta_name).decode("shift_jis", errors="replace") + prefecture = detect_prefecture(meta_xml) + code = path.stem.replace("_GML", "") + return SourcePackage(path=path, prefecture=prefecture, code=code) + + +def iter_coastline_lines(zip_path: Path) -> Iterable[LineString]: + with zipfile.ZipFile(zip_path) as zf: + xml_name = next(name for name in zf.namelist() if name.endswith(".xml") and "META" not in name) + root = ET.fromstring(zf.read(xml_name)) + + for curve in root.findall(".//gml:Curve", NS): + coords: list[tuple[float, float]] = [] + for pos_list in curve.findall(".//gml:posList", NS): + if not pos_list.text: + continue + values = parse_text_list(pos_list.text) + if len(values) < 4 or len(values) % 2 != 0: + continue + for i in range(0, len(values), 2): + lat = values[i] + lon = values[i + 1] + coords.append((mercator_x(lon), mercator_y(lat))) + if len(coords) >= 2: + yield LineString(coords) + + +def mysql_connect(database: str | None = None): + kwargs = { + "host": DB_HOST, + "user": DB_USER, + "password": DB_PASSWORD, + "charset": "utf8mb4", + "autocommit": False, + "cursorclass": pymysql.cursors.Cursor, + } + if DB_SOCKET: + kwargs["unix_socket"] = DB_SOCKET + if database: + kwargs["database"] = database + return pymysql.connect(**kwargs) + + +def ensure_database(name: str) -> None: + conn = mysql_connect() + try: + with conn.cursor() as cur: + cur.execute( + f"CREATE DATABASE IF NOT EXISTS `{name}` " + "DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci" + ) + conn.commit() + finally: + conn.close() + + +def column_exists(conn, table_name: str, column_name: str) -> bool: + with conn.cursor() as cur: + cur.execute("SELECT DATABASE()") + database_name = cur.fetchone()[0] + cur.execute( + """ + SELECT COUNT(*) + FROM information_schema.COLUMNS + WHERE TABLE_SCHEMA=%s AND TABLE_NAME=%s AND COLUMN_NAME=%s + """, + (database_name, table_name, column_name), + ) + return int(cur.fetchone()[0] or 0) > 0 + + +def ensure_schema(conn) -> None: + ddl = [ + """ + CREATE TABLE IF NOT EXISTS navsea_coast_grid_layer_meta ( + layer_name VARCHAR(32) NOT NULL PRIMARY KEY, + description VARCHAR(255) NOT NULL, + source_desc TEXT NOT NULL, + cell_size_m DOUBLE NOT NULL, + feature_count BIGINT NOT NULL, + bbox_min_lon DOUBLE NOT NULL, + bbox_min_lat DOUBLE NOT NULL, + bbox_max_lon DOUBLE NOT NULL, + bbox_max_lat DOUBLE NOT NULL, + export_file VARCHAR(255) DEFAULT NULL, + created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 + """, + """ + CREATE TABLE IF NOT EXISTS navsea_coast_grid_package_stat ( + layer_name VARCHAR(32) NOT NULL, + source_code VARCHAR(64) NOT NULL, + prefecture VARCHAR(128) NOT NULL, + zip_path TEXT NOT NULL, + line_count BIGINT NOT NULL, + point_count BIGINT NOT NULL, + bbox_min_lon DOUBLE NOT NULL, + bbox_min_lat DOUBLE NOT NULL, + bbox_max_lon DOUBLE NOT NULL, + bbox_max_lat DOUBLE NOT NULL, + grid_min_lon DOUBLE NOT NULL, + grid_min_lat DOUBLE NOT NULL, + grid_max_lon DOUBLE NOT NULL, + grid_max_lat DOUBLE NOT NULL, + blocked_count BIGINT NOT NULL, + candidate_count BIGINT NOT NULL, + KEY idx_layer_source (layer_name, source_code) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 + """, + """ + CREATE TABLE IF NOT EXISTS navsea_coast_grid_cell ( + id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + layer_name VARCHAR(32) NOT NULL, + cell_id VARCHAR(64) NOT NULL, + row_idx INT NOT NULL, + col_idx INT NOT NULL, + cell_size_m DOUBLE NOT NULL, + state_name VARCHAR(32) NOT NULL, + class_name VARCHAR(32) NOT NULL, + source_code VARCHAR(64) NOT NULL, + source_path TEXT NOT NULL, + source_name VARCHAR(191) NOT NULL, + min_lon DOUBLE NOT NULL, + min_lat DOUBLE NOT NULL, + max_lon DOUBLE NOT NULL, + max_lat DOUBLE NOT NULL, + created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + UNIQUE KEY uniq_layer_source_cell (layer_name, source_code, cell_id), + KEY idx_layer_state (layer_name, state_name), + KEY idx_layer_rowcol (layer_name, row_idx, col_idx) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 + """, + ] + with conn.cursor() as cur: + for stmt in ddl: + cur.execute(stmt) + if not column_exists(conn, "navsea_coast_grid_package_stat", "layer_name"): + with conn.cursor() as cur: + cur.execute( + "ALTER TABLE navsea_coast_grid_package_stat " + "ADD COLUMN layer_name VARCHAR(32) NOT NULL DEFAULT 'coast_200m' FIRST" + ) + cur.execute("ALTER TABLE navsea_coast_grid_package_stat ADD KEY idx_layer_source (layer_name, source_code)") + conn.commit() + + +def replace_layer_rows(conn, layer_name: str) -> None: + with conn.cursor() as cur: + cur.execute("DELETE FROM navsea_coast_grid_cell WHERE layer_name=%s", (layer_name,)) + cur.execute("DELETE FROM navsea_coast_grid_layer_meta WHERE layer_name=%s", (layer_name,)) + cur.execute("DELETE FROM navsea_coast_grid_package_stat WHERE layer_name=%s", (layer_name,)) + conn.commit() + + +def insert_cells(cur, rows: list[tuple]) -> None: + cur.executemany( + """ + INSERT INTO navsea_coast_grid_cell + (layer_name, cell_id, row_idx, col_idx, cell_size_m, state_name, class_name, source_code, + source_path, source_name, min_lon, min_lat, max_lon, max_lat) + VALUES + (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s) + ON DUPLICATE KEY UPDATE + row_idx=VALUES(row_idx), + col_idx=VALUES(col_idx), + cell_size_m=VALUES(cell_size_m), + state_name=VALUES(state_name), + class_name=VALUES(class_name), + source_code=VALUES(source_code), + source_path=VALUES(source_path), + source_name=VALUES(source_name), + min_lon=VALUES(min_lon), + min_lat=VALUES(min_lat), + max_lon=VALUES(max_lon), + max_lat=VALUES(max_lat) + """, + rows, + ) + + +def upsert_meta( + cur, + *, + layer_name: str, + description: str, + source_desc: str, + cell_size_m: float, + feature_count: int, + bbox: tuple[float, float, float, float], + export_file: str | None, +) -> None: + cur.execute( + """ + INSERT INTO navsea_coast_grid_layer_meta + (layer_name, description, source_desc, cell_size_m, feature_count, + bbox_min_lon, bbox_min_lat, bbox_max_lon, bbox_max_lat, export_file) + VALUES + (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s) + ON DUPLICATE KEY UPDATE + description=VALUES(description), + source_desc=VALUES(source_desc), + cell_size_m=VALUES(cell_size_m), + feature_count=VALUES(feature_count), + bbox_min_lon=VALUES(bbox_min_lon), + bbox_min_lat=VALUES(bbox_min_lat), + bbox_max_lon=VALUES(bbox_max_lon), + bbox_max_lat=VALUES(bbox_max_lat), + export_file=VALUES(export_file) + """, + ( + layer_name, + description, + source_desc, + cell_size_m, + feature_count, + bbox[0], + bbox[1], + bbox[2], + bbox[3], + export_file, + ), + ) + + +def default_layer_name(cell_size_m: float) -> str: + if float(cell_size_m).is_integer(): + return f"coast_{int(cell_size_m)}m" + return f"coast_{str(cell_size_m).replace('.', '_')}m" + + +def normalize_source_code(value: str) -> str: + value = value.strip() + if value.isdigit(): + return f"C23-06_{int(value):02d}" + if value.startswith("C23-06_") and value[len("C23-06_"):].isdigit(): + return f"C23-06_{int(value[len('C23-06_'):]):02d}" + return value + + +def ts_now() -> str: + return dt.datetime.now().strftime("%Y-%m-%d %H:%M:%S") + + +def log(message: str) -> None: + print(f"[{ts_now()}] {message}", flush=True) + + +def flush_package_rows( + conn, + package_rows: list[tuple], + *, + package_code: str, + package_blocked: int, + package_candidate: int, + reason: str, +) -> None: + if not package_rows: + return + with conn.cursor() as cur: + insert_cells(cur, package_rows) + conn.commit() + log( + f"[{package_code}] 已写入 {len(package_rows)} 行({reason})," + f"blocked={package_blocked} candidate={package_candidate}" + ) + package_rows.clear() + + +def main() -> None: + parser = argparse.ArgumentParser(description="Build Japan coastline grid directly into MySQL") + parser.add_argument( + "--input", + dest="inputs", + action="append", + default=[], + help="海岸线 GML zip。可重复指定;默认自动扫描 coastline/C23-06_*_GML.zip", + ) + parser.add_argument( + "--db-name", + default=DB_NAME, + help="MySQL 数据库名", + ) + parser.add_argument( + "--out-dir", + default=DEFAULT_OUT_DIR, + help="输出目录,用于可选 GeoJSON 和元数据", + ) + parser.add_argument( + "--cell-size-m", + type=float, + default=DEFAULT_CELL_SIZE_M, + help="海岸线格子大小,默认 200m;例如 50 会自动写入 coast_50m", + ) + parser.add_argument( + "--layer-name", + default=None, + help="目标 layer_name;默认按 cell size 自动生成,例如 coast_200m / coast_50m", + ) + parser.add_argument("--buffer-m", type=float, default=DEFAULT_BUFFER_M, help="海岸线缓冲距离,默认 50m") + parser.add_argument( + "--margin-cells", + type=int, + default=2, + help="输出范围外扩的格子数,默认 2 个格子", + ) + parser.add_argument( + "--write-geojson", + action="store_true", + help="同时输出 coastline.geojson 和 grid.geojson", + ) + parser.add_argument( + "--resume", + action="store_true", + help="续跑模式:不清理当前 layer,保留已入库格子", + ) + parser.add_argument( + "--start-code", + default=None, + help="只处理指定 source_code 及之后的包,例如 13 或 C23-06_13", + ) + parser.add_argument( + "--progress-every-cells", + type=int, + default=50000, + help="每扫描多少个候选格输出一次进度日志,默认 50000", + ) + parser.add_argument( + "--progress-every-seconds", + type=int, + default=15, + help="每隔多少秒至少输出一次进度日志,默认 15", + ) + parser.add_argument( + "--coarse-factor", + type=int, + default=8, + help="海岸线粗筛倍率,默认 8;值越大越少细扫,但粗筛更大", + ) + args = parser.parse_args() + if args.cell_size_m <= 0: + raise SystemExit("--cell-size-m must be positive") + cell_size_m = float(args.cell_size_m) + layer_name = args.layer_name or default_layer_name(cell_size_m) + + project_root = Path(__file__).resolve().parent.parent.parent + if args.inputs: + input_paths: list[Path] = [] + for item in args.inputs: + if any(ch in item for ch in "*?[]"): + input_paths.extend(Path(path) for path in sorted(glob.glob(item))) + else: + input_paths.append(Path(item)) + else: + input_paths = [Path(path) for path in sorted(glob.glob(str(project_root / DEFAULT_INPUT_GLOB)))] + + if not input_paths: + raise SystemExit("no coastline packages found") + if args.progress_every_cells <= 0: + raise SystemExit("--progress-every-cells must be positive") + if args.progress_every_seconds < 0: + raise SystemExit("--progress-every-seconds must be non-negative") + if args.coarse_factor < 1: + raise SystemExit("--coarse-factor must be >= 1") + + packages: list[SourcePackage] = [] + for path in input_paths: + if not path.is_absolute(): + path = project_root / path + if not path.exists(): + raise SystemExit(f"missing input: {path}") + packages.append(load_package(path)) + packages.sort(key=lambda package: package.code) + + if args.start_code: + start_code = normalize_source_code(args.start_code) + packages = [package for package in packages if package.code >= start_code] + if not packages: + raise SystemExit(f"no coastline packages found from start code: {start_code}") + + out_dir = Path(args.out_dir) + if not out_dir.is_absolute(): + out_dir = project_root / out_dir + out_dir.mkdir(parents=True, exist_ok=True) + + ensure_database(args.db_name) + conn = mysql_connect(args.db_name) + try: + log(f"数据库 {args.db_name} 已连接,准备初始化表结构 ...") + ensure_schema(conn) + if args.resume: + first_code = packages[0].code + last_code = packages[-1].code + log( + f"续跑 layer={layer_name} cell={cell_size_m:g}m;" + f"保留已入库格子,仅处理 {first_code}..{last_code}" + ) + else: + log(f"准备重建 layer={layer_name} cell={cell_size_m:g}m;只清理当前 layer,不影响其它尺寸") + replace_layer_rows(conn, layer_name) + + total_lines = 0 + total_points = 0 + package_stats: list[dict] = [] + build_start = dt.datetime.now() + + for package in packages: + package_start = dt.datetime.now() + log(f"[{package.code}] 开始处理 {package.path.name}") + log(f"[{package.code}] 读取原始曲线并构造几何 ...") + lines = list(iter_coastline_lines(package.path)) + if not lines: + log(f"[{package.code}] 没有可用海岸线,跳过") + continue + + coastline_geom = MultiLineString([list(line.coords) for line in lines]) + coast_bounds = coastline_geom.bounds + log( + f"[{package.code}] 几何已构造 lines={len(lines)} points={sum(len(line.coords) for line in lines)} " + f"bbox={coast_bounds[0]:.2f},{coast_bounds[1]:.2f},{coast_bounds[2]:.2f},{coast_bounds[3]:.2f} " + f"buffer={args.buffer_m:g}m" + ) + + minx = align_floor(coast_bounds[0] - args.buffer_m - args.margin_cells * cell_size_m, cell_size_m) + miny = align_floor(coast_bounds[1] - args.buffer_m - args.margin_cells * cell_size_m, cell_size_m) + maxx = align_ceil(coast_bounds[2] + args.buffer_m + args.margin_cells * cell_size_m, cell_size_m) + maxy = align_ceil(coast_bounds[3] + args.buffer_m + args.margin_cells * cell_size_m, cell_size_m) + + line_count = len(lines) + point_count = sum(len(line.coords) for line in lines) + total_lines += line_count + total_points += point_count + + package_blocked = 0 + package_candidate = 0 + package_rows: list[tuple] = [] + package_seen_cells: set[str] = set() + scanned_cells = 0 + next_progress_at = args.progress_every_cells + last_progress_at = dt.datetime.now() + coarse_factor = args.coarse_factor + coarse_size = cell_size_m * coarse_factor + + for line_index, line in enumerate(lines, start=1): + line_start = dt.datetime.now() + line_buffer = line.buffer(args.buffer_m, cap_style=2, join_style=2) + if line_buffer.is_empty: + log(f"[{package.code}] 线段#{line_index} buffer 为空,跳过") + continue + prepared_buffer = prep(line_buffer) + line_bounds = line_buffer.bounds + log( + f"[{package.code}] 线段#{line_index} 扫描开始 " + f"bbox={line_bounds[0]:.2f},{line_bounds[1]:.2f},{line_bounds[2]:.2f},{line_bounds[3]:.2f}" + ) + + scan_minx = align_floor(line_bounds[0] - args.margin_cells * cell_size_m, coarse_size) + scan_miny = align_floor(line_bounds[1] - args.margin_cells * cell_size_m, coarse_size) + scan_maxx = align_ceil(line_bounds[2] + args.margin_cells * cell_size_m, coarse_size) + scan_maxy = align_ceil(line_bounds[3] + args.margin_cells * cell_size_m, coarse_size) + + cix0 = int(round(scan_minx / coarse_size)) + ciy0 = int(round(scan_miny / coarse_size)) + cix1 = int(round(scan_maxx / coarse_size)) + ciy1 = int(round(scan_maxy / coarse_size)) + + for cix in range(cix0, cix1): + coarse_minx = cix * coarse_size + coarse_maxx = coarse_minx + coarse_size + for ciy in range(ciy0, ciy1): + coarse_miny = ciy * coarse_size + coarse_maxy = coarse_miny + coarse_size + coarse_cell = box(coarse_minx, coarse_miny, coarse_maxx, coarse_maxy) + scanned_cells += 1 + + if not prepared_buffer.intersects(coarse_cell): + package_candidate += coarse_factor * coarse_factor + now = dt.datetime.now() + if scanned_cells >= next_progress_at or ( + args.progress_every_seconds + and (now - last_progress_at).total_seconds() >= args.progress_every_seconds + ): + elapsed = (now - package_start).total_seconds() + rate = scanned_cells / elapsed if elapsed > 0 else 0.0 + log( + f"[{package.code}] 进度 scanned={scanned_cells} blocked={package_blocked} " + f"candidate={package_candidate} rows={len(package_rows)} " + f"rate={rate:.1f}/s elapsed={elapsed:.1f}s" + ) + last_progress_at = now + next_progress_at = scanned_cells + args.progress_every_cells + continue + + fx0 = cix * coarse_factor + fy0 = ciy * coarse_factor + fx1 = fx0 + coarse_factor + fy1 = fy0 + coarse_factor + + if prepared_buffer.contains(coarse_cell): + for ix in range(fx0, fx1): + cell_minx = ix * cell_size_m + cell_maxx = cell_minx + cell_size_m + for iy in range(fy0, fy1): + cell_miny = iy * cell_size_m + cell_maxy = cell_miny + cell_size_m + cell_id = f"{ix}:{iy}" + if cell_id in package_seen_cells: + continue + package_seen_cells.add(cell_id) + package_rows.append( + ( + layer_name, + cell_id, + iy, + ix, + cell_size_m, + "HARD_BLOCKED", + "HARD_BLOCKED", + package.code, + str(package.path), + package.code, + cell_minx, + cell_miny, + cell_maxx, + cell_maxy, + ) + ) + package_blocked += 1 + scanned_cells += coarse_factor * coarse_factor + now = dt.datetime.now() + if scanned_cells >= next_progress_at or ( + args.progress_every_seconds + and (now - last_progress_at).total_seconds() >= args.progress_every_seconds + ): + elapsed = (now - package_start).total_seconds() + rate = scanned_cells / elapsed if elapsed > 0 else 0.0 + log( + f"[{package.code}] 进度 scanned={scanned_cells} blocked={package_blocked} " + f"candidate={package_candidate} rows={len(package_rows)} " + f"rate={rate:.1f}/s elapsed={elapsed:.1f}s" + ) + last_progress_at = now + next_progress_at = scanned_cells + args.progress_every_cells + continue + + for ix in range(fx0, fx1): + cell_minx = ix * cell_size_m + cell_maxx = cell_minx + cell_size_m + for iy in range(fy0, fy1): + cell_miny = iy * cell_size_m + cell_maxy = cell_miny + cell_size_m + cell_id = f"{ix}:{iy}" + scanned_cells += 1 + cell = box(cell_minx, cell_miny, cell_maxx, cell_maxy) + if prepared_buffer.intersects(cell): + if cell_id not in package_seen_cells: + package_seen_cells.add(cell_id) + package_rows.append( + ( + layer_name, + cell_id, + iy, + ix, + cell_size_m, + "HARD_BLOCKED", + "HARD_BLOCKED", + package.code, + str(package.path), + package.code, + cell_minx, + cell_miny, + cell_maxx, + cell_maxy, + ) + ) + package_blocked += 1 + else: + package_candidate += 1 + + now = dt.datetime.now() + if scanned_cells >= next_progress_at or ( + args.progress_every_seconds + and (now - last_progress_at).total_seconds() >= args.progress_every_seconds + ): + elapsed = (now - package_start).total_seconds() + rate = scanned_cells / elapsed if elapsed > 0 else 0.0 + log( + f"[{package.code}] 进度 scanned={scanned_cells} blocked={package_blocked} " + f"candidate={package_candidate} rows={len(package_rows)} " + f"rate={rate:.1f}/s elapsed={elapsed:.1f}s" + ) + last_progress_at = now + next_progress_at = scanned_cells + args.progress_every_cells + + if package_rows and len(package_rows) >= 100: + flush_package_rows( + conn, + package_rows, + package_code=package.code, + package_blocked=package_blocked, + package_candidate=package_candidate, + reason=f"line#{line_index}", + ) + + if package_rows: + flush_package_rows( + conn, + package_rows, + package_code=package.code, + package_blocked=package_blocked, + package_candidate=package_candidate, + reason=f"line#{line_index}-end", + ) + + log( + f"[{package.code}] 线段#{line_index} 完成 " + f"blocked={package_blocked} candidate={package_candidate} " + f"elapsed={(dt.datetime.now() - line_start).total_seconds():.1f}s" + ) + + if package_rows: + flush_package_rows( + conn, + package_rows, + package_code=package.code, + package_blocked=package_blocked, + package_candidate=package_candidate, + reason="package-end", + ) + + package_stats.append( + { + "source_code": package.code, + "prefecture": package.prefecture, + "zip_path": str(package.path), + "line_count": line_count, + "point_count": point_count, + "bbox_mercator": [coast_bounds[0], coast_bounds[1], coast_bounds[2], coast_bounds[3]], + "grid_bounds_mercator": [minx, miny, maxx, maxy], + "blocked_count": package_blocked, + "candidate_count": package_candidate, + } + ) + + with conn.cursor() as cur: + cur.execute( + "DELETE FROM navsea_coast_grid_package_stat WHERE layer_name=%s AND source_code=%s", + (layer_name, package.code), + ) + cur.execute( + """ + INSERT INTO navsea_coast_grid_package_stat( + layer_name, source_code, prefecture, zip_path, line_count, point_count, + bbox_min_lon, bbox_min_lat, bbox_max_lon, bbox_max_lat, + grid_min_lon, grid_min_lat, grid_max_lon, grid_max_lat, + blocked_count, candidate_count + ) VALUES ( + %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s + ) + """, + ( + layer_name, + package.code, + package.prefecture, + str(package.path), + line_count, + point_count, + coast_bounds[0], + coast_bounds[1], + coast_bounds[2], + coast_bounds[3], + minx, + miny, + maxx, + maxy, + package_blocked, + package_candidate, + ), + ) + conn.commit() + log( + f"[{package.code}] 完成 line={line_count} point={point_count} " + f"blocked={package_blocked} candidate={package_candidate} " + f"elapsed={(dt.datetime.now() - package_start).total_seconds():.1f}s" + ) + + with conn.cursor() as cur: + cur.execute("ANALYZE TABLE navsea_coast_grid_cell") + cur.execute("ANALYZE TABLE navsea_coast_grid_package_stat") + cur.execute("ANALYZE TABLE navsea_coast_grid_layer_meta") + conn.commit() + + with conn.cursor() as cur: + cur.execute(f"SELECT COUNT(*) FROM navsea_coast_grid_cell WHERE layer_name=%s", (layer_name,)) + final_total = int(cur.fetchone()[0] or 0) + cur.execute( + f"SELECT COUNT(*) FROM navsea_coast_grid_cell WHERE layer_name=%s AND state_name=%s", + (layer_name, "HARD_BLOCKED"), + ) + blocked_count = int(cur.fetchone()[0] or 0) + cur.execute( + f"SELECT COUNT(*) FROM navsea_coast_grid_cell WHERE layer_name=%s AND state_name=%s", + (layer_name, "NAVIGABLE_CANDIDATE"), + ) + candidate_count = int(cur.fetchone()[0] or 0) + cur.execute( + """ + SELECT MIN(min_lon), MIN(min_lat), MAX(max_lon), MAX(max_lat) + FROM navsea_coast_grid_cell + WHERE layer_name=%s + """, + (layer_name,), + ) + bbox_row = cur.fetchone() + + grid_bbox = ( + float(bbox_row[0]) if bbox_row and bbox_row[0] is not None else float("inf"), + float(bbox_row[1]) if bbox_row and bbox_row[1] is not None else float("inf"), + float(bbox_row[2]) if bbox_row and bbox_row[2] is not None else float("-inf"), + float(bbox_row[3]) if bbox_row and bbox_row[3] is not None else float("-inf"), + ) + + build_time = dt.datetime.now().isoformat(timespec="seconds") + grid_bbox_lonlat = mercator_bbox_to_lonlat(*grid_bbox) + + manifest = { + "build_time": build_time, + "db_name": args.db_name, + "layer_name": layer_name, + "cell_size_m": cell_size_m, + "buffer_m": args.buffer_m, + "source_scope": "japan", + "source_code": "C23-06_*", + "source_count": len(packages), + "source_packages": [str(pkg.path) for pkg in packages], + "coastline_line_count": total_lines, + "coastline_point_count": total_points, + "grid_cell_count": final_total, + "blocked_count": blocked_count, + "candidate_count": candidate_count, + "grid_bounds_lonlat": list(grid_bbox_lonlat), + "package_stats": package_stats, + "notes": f"全国海岸线 {cell_size_m:g}m 硬阻塞栅格,直接写入 MySQL", + } + manifest_path = out_dir / f"japan_{layer_name}_grid_mysql.manifest.json" + manifest_path.write_text(json.dumps(manifest, ensure_ascii=False, indent=2), encoding="utf-8") + + with conn.cursor() as cur: + upsert_meta( + cur, + layer_name=layer_name, + description=f"全国海岸线 {cell_size_m:g}m 硬阻塞格", + source_desc="coastline/C23-06_*_GML.zip", + cell_size_m=cell_size_m, + feature_count=final_total, + bbox=grid_bbox_lonlat, + export_file=str(manifest_path.relative_to(project_root)), + ) + conn.commit() + + elapsed_all = (dt.datetime.now() - build_start).total_seconds() + log("完成") + log(f" MySQL: {args.db_name}") + log(f" layer={layer_name}") + log(f" cell_size_m={cell_size_m:g}") + log(f" packages={len(packages)}") + log(f" coastline_lines={total_lines}") + log(f" grid_cells={final_total}") + log(f" blocked={blocked_count}") + log(f" candidate={candidate_count}") + log(f" elapsed={elapsed_all:.1f}s") + log(f" manifest: {manifest_path}") + finally: + conn.close() + + +if __name__ == "__main__": + main() diff --git a/coastline/navgrid_v2/build_coast_wall_z12_bin.py b/coastline/navgrid_v2/build_coast_wall_z12_bin.py new file mode 100644 index 0000000..5732ab8 --- /dev/null +++ b/coastline/navgrid_v2/build_coast_wall_z12_bin.py @@ -0,0 +1,870 @@ +#!/usr/bin/env python3 +from __future__ import annotations + +import argparse +import datetime as dt +import json +import math +import struct +from pathlib import Path +from typing import Iterable + +import pymysql + + +DB_NAME = "navsea_japan_coast_grid" +DB_USER = "root" +DB_PASSWORD = "2chi9ks2" +DB_HOST = "localhost" +DB_SOCKET = "/tmp/mysql.sock" + +ZOOM = 12 +GRID_W = 40 +GRID_H = 40 +CELL_COUNT = GRID_W * GRID_H +BLOCK_SIZE = 32 +SPARSE_THRESHOLD = 96 +MAGIC = b"CWZ12BIN" +VERSION = 1 + +LAYER_20 = "fish_port_20m" +LAYER_50 = "hazard_50m" +LAYER_200 = "coast_200m" +CELL_SIZES = { + LAYER_20: 20.0, + LAYER_50: 50.0, + LAYER_200: 200.0, +} +TABLES = { + LAYER_20: "navsea_fish_port_grid_cell", + LAYER_50: "navsea_hazard_grid_cell", + LAYER_200: "navsea_coast_grid_cell", +} + + +def table_name_for_layer(layer_name: str) -> str: + if layer_name in TABLES: + return TABLES[layer_name] + if layer_name.startswith("coast_") and layer_name.endswith("m"): + return "navsea_coast_grid_cell" + raise KeyError(layer_name) + + +def coast_layer_name_for_size(cell_size_m: float) -> str: + if cell_size_m <= 0: + raise ValueError("coast cell size must be positive") + if float(cell_size_m).is_integer(): + return f"coast_{int(cell_size_m)}m" + return f"coast_{cell_size_m:g}m" + + +def density_key_for_size(cell_size_m: float) -> str: + if float(cell_size_m).is_integer(): + return str(int(cell_size_m)) + return f"{cell_size_m:g}" + + +def unit_tag_for_size(cell_size_m: float) -> str: + if float(cell_size_m).is_integer(): + return str(int(cell_size_m)) + return str(cell_size_m).replace(".", "_") + + +def wall_unit_tag(zoom: int, grid_w: int, grid_h: int) -> str: + if grid_w == grid_h: + return f"z{zoom}_g{grid_w}" + return f"z{zoom}_g{grid_w}x{grid_h}" + + +def build_out_path(path: Path, coast_unit: str, wall_unit: str, *, include_fish_port: bool) -> Path: + source_unit = f"{coast_unit}_50_20" if include_fish_port else f"{coast_unit}_50" + stem = path.stem + if wall_unit != "z12_g40" and stem.endswith("_z12"): + stem = stem.removesuffix("_z12") + suffix = f"_{source_unit}" if wall_unit == "z12_g40" else f"_{wall_unit}_{source_unit}" + return path.with_name(f"{stem}{suffix}{path.suffix}") + + +RADIUS = 6378137.0 +WORLD_MIN = -math.pi * RADIUS +WORLD_MAX = math.pi * RADIUS +WORLD_SIZE = WORLD_MAX - WORLD_MIN +TILE_COUNT = 1 << ZOOM +TILE_SIZE_M = WORLD_SIZE / TILE_COUNT +Z12_CELL_SIZE_M = TILE_SIZE_M / GRID_W +Z12_CELL_SIZE_X_M = TILE_SIZE_M / GRID_W +Z12_CELL_SIZE_Y_M = TILE_SIZE_M / GRID_H +GLOBAL_CELL_COUNT_X = TILE_COUNT * GRID_W +GLOBAL_CELL_COUNT_Y = TILE_COUNT * GRID_H +BLOCK_AXIS_BITS = math.ceil(math.log2(math.ceil(TILE_COUNT / BLOCK_SIZE))) + + +def configure_wall_grid(*, zoom: int, grid_w: int, grid_h: int, sparse_threshold: int) -> None: + global ZOOM + global GRID_W + global GRID_H + global CELL_COUNT + global SPARSE_THRESHOLD + global TILE_COUNT + global TILE_SIZE_M + global Z12_CELL_SIZE_M + global GLOBAL_CELL_COUNT_X + global GLOBAL_CELL_COUNT_Y + global Z12_CELL_SIZE_X_M + global Z12_CELL_SIZE_Y_M + global BLOCK_AXIS_BITS + + if not (0 <= zoom <= 16): + raise SystemExit("--zoom must be between 0 and 16") + if not (1 <= grid_w <= 255 and 1 <= grid_h <= 255): + raise SystemExit("--grid-w/--grid-h must be between 1 and 255") + if grid_w * grid_h > 65535: + raise SystemExit("--grid-w * --grid-h must be <= 65535 because cell ids are uint16") + if sparse_threshold < 0 or sparse_threshold > grid_w * grid_h: + raise SystemExit("--sparse-threshold must be between 0 and grid_w * grid_h") + + ZOOM = zoom + GRID_W = grid_w + GRID_H = grid_h + CELL_COUNT = GRID_W * GRID_H + SPARSE_THRESHOLD = sparse_threshold + TILE_COUNT = 1 << ZOOM + TILE_SIZE_M = WORLD_SIZE / TILE_COUNT + Z12_CELL_SIZE_M = TILE_SIZE_M / GRID_W + Z12_CELL_SIZE_X_M = TILE_SIZE_M / GRID_W + Z12_CELL_SIZE_Y_M = TILE_SIZE_M / GRID_H + GLOBAL_CELL_COUNT_X = TILE_COUNT * GRID_W + GLOBAL_CELL_COUNT_Y = TILE_COUNT * GRID_H + BLOCK_AXIS_BITS = math.ceil(math.log2(math.ceil(TILE_COUNT / BLOCK_SIZE))) + +HEADER_STRUCT = struct.Struct("<8sHBBBBBIII") +BLOCK_ENTRY_STRUCT = struct.Struct(" None: + print(f"[{dt.datetime.now().isoformat(timespec='seconds')}] {message}") + + +def mysql_connect(database: str, *, cursorclass=pymysql.cursors.Cursor): + kwargs = { + "host": DB_HOST, + "user": DB_USER, + "password": DB_PASSWORD, + "database": database, + "charset": "utf8mb4", + "cursorclass": cursorclass, + } + if DB_SOCKET: + kwargs["unix_socket"] = DB_SOCKET + return pymysql.connect(**kwargs) + + +def mercator_x(lon: float) -> float: + return RADIUS * math.radians(lon) + + +def mercator_y(lat: float) -> float: + lat = max(min(lat, 85.0511287798066), -85.0511287798066) + return RADIUS * math.log(math.tan(math.pi / 4.0 + math.radians(lat) / 2.0)) + + +def lon_from_mercator(x: float) -> float: + return math.degrees(x / RADIUS) + + +def lat_from_mercator(y: float) -> float: + return math.degrees(2.0 * math.atan(math.exp(y / RADIUS)) - math.pi / 2.0) + + +def parse_bbox(value: str) -> tuple[float, float, float, float]: + parts = [float(part.strip()) for part in value.split(",") if part.strip()] + if len(parts) != 4: + raise argparse.ArgumentTypeError("bbox must be min_lon,min_lat,max_lon,max_lat") + min_lon, min_lat, max_lon, max_lat = parts + if min_lon >= max_lon or min_lat >= max_lat: + raise argparse.ArgumentTypeError("bbox min values must be smaller than max values") + return min_lon, min_lat, max_lon, max_lat + + +def parse_lonlat(value: str) -> tuple[float, float]: + parts = [float(part.strip()) for part in value.split(",") if part.strip()] + if len(parts) != 2: + raise argparse.ArgumentTypeError("query point must be lon,lat") + return parts[0], parts[1] + + +def mercator_bbox_from_lonlat(bbox: tuple[float, float, float, float]) -> tuple[float, float, float, float]: + min_lon, min_lat, max_lon, max_lat = bbox + return mercator_x(min_lon), mercator_y(min_lat), mercator_x(max_lon), mercator_y(max_lat) + + +def rowcol_range_for_bbox( + bbox_mercator: tuple[float, float, float, float], + cell_size_m: float, +) -> tuple[int, int, int, int]: + minx, miny, maxx, maxy = bbox_mercator + col_min = math.floor(minx / cell_size_m) + col_max = math.floor((maxx - 1e-9) / cell_size_m) + row_min = math.floor(miny / cell_size_m) + row_max = math.floor((maxy - 1e-9) / cell_size_m) + return row_min, row_max, col_min, col_max + + +def overlap_range(min_value: float, max_value: float, fine_size_m: float) -> tuple[int, int]: + start = int(math.floor(min_value / fine_size_m)) + end = int(math.floor((max_value - 1e-9) / fine_size_m)) + return start, end + + +def overlaps_finer_cells( + row_idx: int, + col_idx: int, + coarse_size_m: float, + fine_size_m: float, + fine_keys: set[tuple[int, int]], +) -> bool: + min_x = col_idx * coarse_size_m + min_y = row_idx * coarse_size_m + max_x = min_x + coarse_size_m + max_y = min_y + coarse_size_m + row_start, row_end = overlap_range(min_y, max_y, fine_size_m) + col_start, col_end = overlap_range(min_x, max_x, fine_size_m) + for fine_row in range(row_start, row_end + 1): + for fine_col in range(col_start, col_end + 1): + if (fine_row, fine_col) in fine_keys: + return True + return False + + +def pack_tile_id(tile_x: int, tile_y: int) -> int: + if not (0 <= tile_x < TILE_COUNT and 0 <= tile_y < TILE_COUNT): + raise ValueError(f"tile out of z{ZOOM} range: {tile_x}, {tile_y}") + return (tile_x << ZOOM) | tile_y + + +def unpack_tile_id(tile_id: int) -> tuple[int, int]: + mask = (1 << ZOOM) - 1 + return tile_id >> ZOOM, tile_id & mask + + +def pack_cell_id(row: int, col: int) -> int: + if not (0 <= row < GRID_H and 0 <= col < GRID_W): + raise ValueError(f"cell out of tile range: {row}, {col}") + return row * GRID_W + col + + +def pack_block_id(tile_x: int, tile_y: int) -> int: + block_x = tile_x >> 5 + block_y = tile_y >> 5 + return (block_x << BLOCK_AXIS_BITS) | block_y + + +def global_cell_x_range(minx: float, maxx: float) -> tuple[int, int]: + start = math.floor((minx - WORLD_MIN) / Z12_CELL_SIZE_X_M) + end = math.floor(((maxx - 1e-9) - WORLD_MIN) / Z12_CELL_SIZE_X_M) + return max(0, start), min(GLOBAL_CELL_COUNT_X - 1, end) + + +def global_cell_y_range(miny: float, maxy: float) -> tuple[int, int]: + # WebMercator tile rows start at the north edge, while project grid rows use increasing mercator Y. + start = math.floor((WORLD_MAX - maxy) / Z12_CELL_SIZE_Y_M) + end = math.floor(((WORLD_MAX - miny) - 1e-9) / Z12_CELL_SIZE_Y_M) + return max(0, start), min(GLOBAL_CELL_COUNT_Y - 1, end) + + +def add_mercator_rect_to_blocked( + blocked: dict[int, set[int]], + minx: float, + miny: float, + maxx: float, + maxy: float, +) -> int: + gx_start, gx_end = global_cell_x_range(minx, maxx) + gy_start, gy_end = global_cell_y_range(miny, maxy) + added = 0 + for gy in range(gy_start, gy_end + 1): + tile_y = gy // GRID_H + row = gy % GRID_H + for gx in range(gx_start, gx_end + 1): + tile_x = gx // GRID_W + col = gx % GRID_W + tile_id = pack_tile_id(tile_x, tile_y) + cell_id = pack_cell_id(row, col) + cells = blocked.setdefault(tile_id, set()) + before = len(cells) + cells.add(cell_id) + if len(cells) != before: + added += 1 + return added + + +def iter_layer_rows( + conn, + *, + layer_name: str, + bbox_mercator: tuple[float, float, float, float] | None, +): + where = ["layer_name=%s"] + params: list[object] = [layer_name] + if bbox_mercator is not None: + row_min, row_max, col_min, col_max = rowcol_range_for_bbox(bbox_mercator, CELL_SIZES[layer_name]) + where.append("row_idx BETWEEN %s AND %s") + where.append("col_idx BETWEEN %s AND %s") + params.extend([row_min, row_max, col_min, col_max]) + table_name = table_name_for_layer(layer_name) + sql = f""" + SELECT cell_id, row_idx, col_idx + FROM {table_name} + WHERE {' AND '.join(where)} + ORDER BY row_idx, col_idx, source_name + """ + with conn.cursor(pymysql.cursors.SSCursor) as cur: + cur.execute(sql, tuple(params)) + for cell_id, row_idx, col_idx in cur: + yield str(cell_id), int(row_idx), int(col_idx) + + +def source_cell_mercator_bbox(row_idx: int, col_idx: int, cell_size_m: float) -> tuple[float, float, float, float]: + minx = col_idx * cell_size_m + miny = row_idx * cell_size_m + return minx, miny, minx + cell_size_m, miny + cell_size_m + + +def build_blocked_map( + conn, + *, + coast_layer_name: str, + coast_cell_size_m: float, + include_fish_port: bool, + bbox_mercator: tuple[float, float, float, float] | None, + progress_every: int, +) -> tuple[dict[int, set[int]], dict]: + blocked: dict[int, set[int]] = {} + keys_20: set[tuple[int, int]] = set() + keys_50: set[tuple[int, int]] = set() + seen_20: set[str] = set() + seen_50: set[str] = set() + seen_200: set[str] = set() + coast_key = density_key_for_size(coast_cell_size_m) + + summary = { + "sourceRows": {LAYER_20: 0, LAYER_50: 0, coast_layer_name: 0}, + "sourceDistinctCells": {LAYER_20: 0, LAYER_50: 0, coast_layer_name: 0}, + "keptByDensity": {"20": 0, "50": 0, coast_key: 0}, + "skippedByDensity": {f"50_over_20": 0, f"{coast_key}_over_20": 0, f"{coast_key}_over_50": 0}, + "blockedCellAdds": {"20": 0, "50": 0, coast_key: 0}, + "activeLayers": [LAYER_50, coast_layer_name], + "disabledLayers": [], + } + + if include_fish_port: + summary["activeLayers"].insert(0, LAYER_20) + log("读取 fish_port_20m;density 规则:20m 永远保留") + for cell_id, row_idx, col_idx in iter_layer_rows(conn, layer_name=LAYER_20, bbox_mercator=bbox_mercator): + summary["sourceRows"][LAYER_20] += 1 + if cell_id in seen_20: + continue + seen_20.add(cell_id) + keys_20.add((row_idx, col_idx)) + summary["sourceDistinctCells"][LAYER_20] += 1 + summary["keptByDensity"]["20"] += 1 + summary["blockedCellAdds"]["20"] += add_mercator_rect_to_blocked( + blocked, + *source_cell_mercator_bbox(row_idx, col_idx, CELL_SIZES[LAYER_20]), + ) + if progress_every and summary["sourceRows"][LAYER_20] % progress_every == 0: + log(f"fish_port_20m rows={summary['sourceRows'][LAYER_20]} kept={summary['keptByDensity']['20']}") + else: + summary["disabledLayers"].append( + { + "layer": LAYER_20, + "reason": f"coast_cell_size_m={coast_cell_size_m:g} < fish_port_20m precision", + } + ) + log(f"跳过 fish_port_20m;原因:coast_cell_size_m={coast_cell_size_m:g} 已细于 20m") + + hazard_rule = "与 20m 重叠则跳过" if include_fish_port else "不再与 20m 做重叠裁剪" + log(f"读取 hazard_50m;density 规则:{hazard_rule}") + for cell_id, row_idx, col_idx in iter_layer_rows(conn, layer_name=LAYER_50, bbox_mercator=bbox_mercator): + summary["sourceRows"][LAYER_50] += 1 + if cell_id in seen_50: + continue + seen_50.add(cell_id) + summary["sourceDistinctCells"][LAYER_50] += 1 + if include_fish_port and overlaps_finer_cells(row_idx, col_idx, CELL_SIZES[LAYER_50], CELL_SIZES[LAYER_20], keys_20): + summary["skippedByDensity"]["50_over_20"] += 1 + continue + keys_50.add((row_idx, col_idx)) + summary["keptByDensity"]["50"] += 1 + summary["blockedCellAdds"]["50"] += add_mercator_rect_to_blocked( + blocked, + *source_cell_mercator_bbox(row_idx, col_idx, CELL_SIZES[LAYER_50]), + ) + if progress_every and summary["sourceRows"][LAYER_50] % progress_every == 0: + log(f"hazard_50m rows={summary['sourceRows'][LAYER_50]} kept={summary['keptByDensity']['50']}") + + coast_rule = "与 20m/保留后的 50m 重叠则跳过" if include_fish_port else "与保留后的 50m 重叠则跳过" + log(f"读取 {coast_layer_name};density 规则:{coast_rule}") + for cell_id, row_idx, col_idx in iter_layer_rows(conn, layer_name=coast_layer_name, bbox_mercator=bbox_mercator): + summary["sourceRows"][coast_layer_name] += 1 + if cell_id in seen_200: + continue + seen_200.add(cell_id) + summary["sourceDistinctCells"][coast_layer_name] += 1 + if include_fish_port and overlaps_finer_cells(row_idx, col_idx, coast_cell_size_m, CELL_SIZES[LAYER_20], keys_20): + summary["skippedByDensity"][f"{coast_key}_over_20"] += 1 + continue + if overlaps_finer_cells(row_idx, col_idx, coast_cell_size_m, CELL_SIZES[LAYER_50], keys_50): + summary["skippedByDensity"][f"{coast_key}_over_50"] += 1 + continue + summary["keptByDensity"][coast_key] += 1 + summary["blockedCellAdds"][coast_key] += add_mercator_rect_to_blocked( + blocked, + *source_cell_mercator_bbox(row_idx, col_idx, coast_cell_size_m), + ) + if progress_every and summary["sourceRows"][coast_layer_name] % progress_every == 0: + log(f"{coast_layer_name} rows={summary['sourceRows'][coast_layer_name]} kept={summary['keptByDensity'][coast_key]}") + + return blocked, summary + + +def encode_tile_cells(cells: set[int]) -> tuple[int, int, bytes]: + sorted_cells = sorted(cells) + if not sorted_cells: + raise ValueError("empty tile should not be encoded") + if sorted_cells[0] < 0 or sorted_cells[-1] >= CELL_COUNT: + raise ValueError(f"cellId out of range: {sorted_cells[0]}..{sorted_cells[-1]}") + if len(sorted_cells) <= SPARSE_THRESHOLD: + payload = struct.pack(f"<{len(sorted_cells)}H", *sorted_cells) + return 1, len(sorted_cells), payload + word_count = math.ceil(CELL_COUNT / 32) + words = [0] * word_count + for cell_id in sorted_cells: + word = cell_id >> 5 + bit = cell_id & 31 + words[word] |= 1 << bit + payload = struct.pack(f"<{word_count}I", *words) + return 2, len(sorted_cells), payload + + +def write_bin(path: Path, blocked: dict[int, set[int]]) -> dict: + path.parent.mkdir(parents=True, exist_ok=True) + grouped: dict[int, list[tuple[int, int, int, bytes]]] = {} + sparse_count = 0 + bitset_count = 0 + total_blocked_cells = 0 + + for tile_id in sorted(blocked): + cells = blocked[tile_id] + if not cells: + continue + tile_x, tile_y = unpack_tile_id(tile_id) + encoding, count, payload = encode_tile_cells(cells) + if encoding == 1: + sparse_count += 1 + else: + bitset_count += 1 + total_blocked_cells += count + block_id = pack_block_id(tile_x, tile_y) + grouped.setdefault(block_id, []).append((tile_id, encoding, count, payload)) + + block_ids = sorted(grouped) + block_count = len(block_ids) + block_dir_offset = HEADER_STRUCT.size + tile_dir_offset = block_dir_offset + block_count * BLOCK_ENTRY_STRUCT.size + tile_entry_count = sum(len(grouped[block_id]) for block_id in block_ids) + data_offset = tile_dir_offset + tile_entry_count * TILE_ENTRY_STRUCT.size + + block_entries: list[tuple[int, int, int, int]] = [] + tile_entries_by_block: dict[int, list[tuple[int, int, int, int]]] = {} + data_parts: list[bytes] = [] + current_tile_dir_offset = tile_dir_offset + current_data_offset = 0 + + for block_id in block_ids: + tiles = sorted(grouped[block_id], key=lambda item: item[0]) + block_entries.append((block_id, current_tile_dir_offset, len(tiles), 0)) + current_tile_dir_offset += len(tiles) * TILE_ENTRY_STRUCT.size + tile_entries: list[tuple[int, int, int, int]] = [] + for tile_id, encoding, count, payload in tiles: + tile_entries.append((tile_id, current_data_offset, count, encoding)) + data_parts.append(payload) + current_data_offset += len(payload) + tile_entries_by_block[block_id] = tile_entries + + with path.open("wb") as fh: + fh.write( + HEADER_STRUCT.pack( + MAGIC, + VERSION, + ZOOM, + GRID_W, + GRID_H, + BLOCK_SIZE, + 0, + block_count, + block_dir_offset, + data_offset, + ) + ) + for entry in block_entries: + fh.write(BLOCK_ENTRY_STRUCT.pack(*entry)) + for block_id in block_ids: + for tile_id, offset, count, encoding in tile_entries_by_block[block_id]: + fh.write(TILE_ENTRY_STRUCT.pack(tile_id, offset, count, encoding, 0)) + for payload in data_parts: + fh.write(payload) + + file_size = path.stat().st_size + return { + "file": str(path), + "fileSizeBytes": file_size, + "headerSizeBytes": HEADER_STRUCT.size, + "blockCount": block_count, + "totalBlockedTiles": sparse_count + bitset_count, + "totalBlockedCells": total_blocked_cells, + "sparseTileCount": sparse_count, + "bitsetTileCount": bitset_count, + "blockDirOffset": block_dir_offset, + "dataOffset": data_offset, + "dataBytes": current_data_offset, + } + + +class CoastWallReader: + def __init__(self, path: Path): + self.path = path + self.data = path.read_bytes() + header = HEADER_STRUCT.unpack_from(self.data, 0) + magic, version, zoom, grid_w, grid_h, block_size, _flags, block_count, block_dir_offset, data_offset = header + if magic != MAGIC: + raise ValueError(f"bad magic: {magic!r}") + if version != VERSION or zoom != ZOOM or grid_w != GRID_W or grid_h != GRID_H or block_size != BLOCK_SIZE: + raise ValueError( + "unsupported coast wall header: " + f"file version={version} zoom={zoom} grid={grid_w}x{grid_h} block={block_size}; " + f"reader expects version={VERSION} zoom={ZOOM} grid={GRID_W}x{GRID_H} block={BLOCK_SIZE}" + ) + self.block_count = block_count + self.block_dir_offset = block_dir_offset + self.data_offset = data_offset + self.blocks: dict[int, list[tuple[int, int, int, int]]] = {} + for idx in range(block_count): + offset = block_dir_offset + idx * BLOCK_ENTRY_STRUCT.size + block_id, tile_dir_offset, tile_count, _reserved = BLOCK_ENTRY_STRUCT.unpack_from(self.data, offset) + entries: list[tuple[int, int, int, int]] = [] + for tile_idx in range(tile_count): + tile_offset = tile_dir_offset + tile_idx * TILE_ENTRY_STRUCT.size + tile_id, payload_offset, count, encoding, _tile_reserved = TILE_ENTRY_STRUCT.unpack_from(self.data, tile_offset) + entries.append((tile_id, payload_offset, count, encoding)) + self.blocks[block_id] = entries + + def tile_cells(self, tile_id: int) -> set[int]: + tile_x, tile_y = unpack_tile_id(tile_id) + block_id = pack_block_id(tile_x, tile_y) + for entry_tile_id, payload_offset, count, encoding in self.blocks.get(block_id, []): + if entry_tile_id != tile_id: + continue + start = self.data_offset + payload_offset + if encoding == 1: + values = struct.unpack_from(f"<{count}H", self.data, start) + return set(values) + if encoding == 2: + word_count = math.ceil(CELL_COUNT / 32) + words = struct.unpack_from(f"<{word_count}I", self.data, start) + cells: set[int] = set() + for word_idx, word in enumerate(words): + if not word: + continue + for bit in range(32): + if word & (1 << bit): + cell_id = word_idx * 32 + bit + if cell_id < CELL_COUNT: + cells.add(cell_id) + return cells + raise ValueError(f"unknown encoding: {encoding}") + return set() + + def is_blocked_lonlat(self, lon: float, lat: float) -> bool: + tile_x, tile_y, _row, _col, cell_id = z12_cell_for_lonlat(lon, lat) + tile_id = pack_tile_id(tile_x, tile_y) + return cell_id in self.tile_cells(tile_id) + + +def validate_bin(path: Path, blocked: dict[int, set[int]], sample_tiles: int = 200) -> None: + reader = CoastWallReader(path) + for idx, tile_id in enumerate(sorted(blocked)): + if idx >= sample_tiles: + break + expected = blocked[tile_id] + actual = reader.tile_cells(tile_id) + if actual != expected: + raise RuntimeError(f"reader roundtrip mismatch tile={tile_id}: expected={len(expected)} actual={len(actual)}") + + +def rect_geometry(min_lon: float, min_lat: float, max_lon: float, max_lat: float) -> dict: + return { + "type": "Polygon", + "coordinates": [ + [ + [min_lon, min_lat], + [max_lon, min_lat], + [max_lon, max_lat], + [min_lon, max_lat], + [min_lon, min_lat], + ] + ], + } + + +def z12_cell_bounds(tile_x: int, tile_y: int, row: int, col: int) -> tuple[float, float, float, float]: + minx = WORLD_MIN + (tile_x * GRID_W + col) * Z12_CELL_SIZE_X_M + maxx = minx + Z12_CELL_SIZE_X_M + maxy = WORLD_MAX - (tile_y * GRID_H + row) * Z12_CELL_SIZE_Y_M + miny = maxy - Z12_CELL_SIZE_Y_M + return lon_from_mercator(minx), lat_from_mercator(miny), lon_from_mercator(maxx), lat_from_mercator(maxy) + + +def z12_cell_for_lonlat(lon: float, lat: float) -> tuple[int, int, int, int, int]: + x = mercator_x(lon) + y = mercator_y(lat) + gx = math.floor((x - WORLD_MIN) / Z12_CELL_SIZE_X_M) + gy = math.floor((WORLD_MAX - y) / Z12_CELL_SIZE_Y_M) + if not (0 <= gx < GLOBAL_CELL_COUNT_X and 0 <= gy < GLOBAL_CELL_COUNT_Y): + raise ValueError(f"lon/lat outside z{ZOOM} grid: {lon}, {lat}") + tile_x = gx // GRID_W + tile_y = gy // GRID_H + col = gx % GRID_W + row = gy % GRID_H + cell_id = pack_cell_id(row, col) + return tile_x, tile_y, row, col, cell_id + + +def write_debug_geojson(path: Path, blocked: dict[int, set[int]], limit: int) -> int: + path.parent.mkdir(parents=True, exist_ok=True) + count = 0 + with path.open("w", encoding="utf-8") as fh: + fh.write('{"type":"FeatureCollection","features":[\n') + first = True + for tile_id in sorted(blocked): + tile_x, tile_y = unpack_tile_id(tile_id) + for cell_id in sorted(blocked[tile_id]): + row = cell_id // GRID_W + col = cell_id % GRID_W + feature = { + "type": "Feature", + "properties": { + "tile_id": tile_id, + "tile_x": tile_x, + "tile_y": tile_y, + "cell_id": cell_id, + "row": row, + "col": col, + }, + "geometry": rect_geometry(*z12_cell_bounds(tile_x, tile_y, row, col)), + } + if not first: + fh.write(",\n") + fh.write(json.dumps(feature, ensure_ascii=False)) + first = False + count += 1 + if limit and count >= limit: + fh.write("\n]}\n") + return count + fh.write("\n]}\n") + return count + + +def run_self_test() -> None: + sample_tile_x = min(TILE_COUNT - 1, max(0, TILE_COUNT * 3 // 4)) + sample_tile_y = min(TILE_COUNT - 1, max(0, TILE_COUNT // 5)) + assert unpack_tile_id(pack_tile_id(sample_tile_x, sample_tile_y)) == (sample_tile_x, sample_tile_y) + assert pack_cell_id(GRID_H - 1, GRID_W - 1) == CELL_COUNT - 1 + assert pack_block_id(32, 64) == ((1 << BLOCK_AXIS_BITS) | 2) + sparse_cells = {0, min(3, CELL_COUNT - 1), CELL_COUNT - 1} + encoding, count, payload = encode_tile_cells(sparse_cells) + assert encoding == 1 and count == len(sparse_cells) + assert set(struct.unpack(f"<{len(sparse_cells)}H", payload)) == sparse_cells + if SPARSE_THRESHOLD < CELL_COUNT: + dense_count = min(CELL_COUNT, max(SPARSE_THRESHOLD + 1, 120)) + dense_cells = set(range(dense_count)) + encoding, count, payload = encode_tile_cells(dense_cells) + assert encoding == 2 and count == dense_count and len(payload) == math.ceil(CELL_COUNT / 32) * 4 + log("self-test passed") + + +def main() -> None: + parser = argparse.ArgumentParser(description="Build coast wall bin from MySQL density-overview grid layers") + parser.add_argument("--db-name", default=DB_NAME) + parser.add_argument("--out", default="out/navmask/coast_wall_z12.bin") + parser.add_argument("--meta-json", default=None, help="默认写到 .meta.json") + parser.add_argument("--debug-geojson", default=None) + parser.add_argument("--debug-limit", type=int, default=5000) + parser.add_argument("--preset", choices=["all", *sorted(PRESET_BBOXES)], default="kyushu") + parser.add_argument("--bbox", type=parse_bbox, default=None, help="min_lon,min_lat,max_lon,max_lat;优先于 --preset") + parser.add_argument("--query", type=parse_lonlat, default=None, help="生成后用 reader 查询一个 lon,lat 点") + parser.add_argument("--progress-every", type=int, default=200000) + parser.add_argument("--zoom", type=int, default=12, help="阻断墙输出 tile zoom,默认 12") + parser.add_argument( + "--grid-size", + type=int, + default=40, + help="每个输出 tile 内部切成 N x N 个墙 cell,默认 40;值越大墙 cell 越小", + ) + parser.add_argument("--grid-w", type=int, default=None, help="覆盖输出 tile 内部横向 cell 数") + parser.add_argument("--grid-h", type=int, default=None, help="覆盖输出 tile 内部纵向 cell 数") + parser.add_argument( + "--sparse-threshold", + type=int, + default=96, + help="单 tile blocked cell 数量小于等于该值时使用 sparse 编码,默认 96", + ) + parser.add_argument( + "--coast-cell-size-m", + type=float, + default=200.0, + help="参与 bin 生成的海岸线格网大小,默认 200;可切 100、50、20、10 等已入库层", + ) + parser.add_argument( + "--coast-layer-name", + default=None, + help="覆盖海岸线层名;不传时按 --coast-cell-size-m 自动生成,例如 coast_200m / coast_50m / coast_10m", + ) + parser.add_argument("--self-test", action="store_true") + args = parser.parse_args() + + grid_w = args.grid_w if args.grid_w is not None else args.grid_size + grid_h = args.grid_h if args.grid_h is not None else args.grid_size + configure_wall_grid( + zoom=args.zoom, + grid_w=grid_w, + grid_h=grid_h, + sparse_threshold=args.sparse_threshold, + ) + + if args.self_test: + run_self_test() + if args.coast_cell_size_m <= 0: + raise SystemExit("--coast-cell-size-m must be positive") + + coast_layer_name = args.coast_layer_name or coast_layer_name_for_size(args.coast_cell_size_m) + coast_cell_size_m = float(args.coast_cell_size_m) + if coast_layer_name in CELL_SIZES and CELL_SIZES[coast_layer_name] != coast_cell_size_m: + raise SystemExit( + f"{coast_layer_name} already maps to {CELL_SIZES[coast_layer_name]}m, " + f"but --coast-cell-size-m={coast_cell_size_m}" + ) + CELL_SIZES.setdefault(coast_layer_name, coast_cell_size_m) + coast_unit_tag = unit_tag_for_size(coast_cell_size_m) + wall_unit = wall_unit_tag(ZOOM, GRID_W, GRID_H) + include_fish_port = coast_cell_size_m >= CELL_SIZES[LAYER_20] + + bbox_lonlat = args.bbox + if bbox_lonlat is None and args.preset != "all": + bbox_lonlat = PRESET_BBOXES[args.preset] + bbox_mercator = mercator_bbox_from_lonlat(bbox_lonlat) if bbox_lonlat is not None else None + + out_path = Path(args.out) + out_path = build_out_path(out_path, coast_unit_tag, wall_unit, include_fish_port=include_fish_port) + meta_path = Path(args.meta_json) if args.meta_json else out_path.with_suffix(out_path.suffix + ".meta.json") + + log( + f"开始生成 coast wall bin zoom={ZOOM} grid={GRID_W}x{GRID_H} " + f"wall_cell_m={Z12_CELL_SIZE_X_M:.3f}x{Z12_CELL_SIZE_Y_M:.3f} " + f"preset={args.preset} bbox={bbox_lonlat} " + f"coast_layer={coast_layer_name} include_fish_port={include_fish_port} out={out_path.name}" + ) + conn = mysql_connect(args.db_name) + try: + blocked, density_summary = build_blocked_map( + conn, + coast_layer_name=coast_layer_name, + coast_cell_size_m=coast_cell_size_m, + include_fish_port=include_fish_port, + bbox_mercator=bbox_mercator, + progress_every=args.progress_every, + ) + finally: + conn.close() + + if not blocked: + raise SystemExit("no blocked cells produced") + + write_summary = write_bin(out_path, blocked) + validate_bin(out_path, blocked) + debug_count = 0 + if args.debug_geojson: + debug_count = write_debug_geojson(Path(args.debug_geojson), blocked, args.debug_limit) + query_result = None + if args.query is not None: + lon, lat = args.query + reader = CoastWallReader(out_path) + tile_x, tile_y, row, col, cell_id = z12_cell_for_lonlat(lon, lat) + query_result = { + "lon": lon, + "lat": lat, + "tile_x": tile_x, + "tile_y": tile_y, + "row": row, + "col": col, + "cell_id": cell_id, + "blocked": reader.is_blocked_lonlat(lon, lat), + } + + meta = { + "generated_at": dt.datetime.now().isoformat(timespec="seconds"), + "db_name": args.db_name, + "preset": args.preset, + "bbox_lonlat": bbox_lonlat, + "coast_layer_name": coast_layer_name, + "coast_cell_size_m": coast_cell_size_m, + "include_fish_port_20m": include_fish_port, + "zoom": ZOOM, + "grid_w": GRID_W, + "grid_h": GRID_H, + "wall_cell_size_m": Z12_CELL_SIZE_M, + "wall_cell_size_x_m": Z12_CELL_SIZE_X_M, + "wall_cell_size_y_m": Z12_CELL_SIZE_Y_M, + "z12_cell_size_m": Z12_CELL_SIZE_M, + "sparse_threshold": SPARSE_THRESHOLD, + "density_rule": ( + [ + "keep fish_port_20m first", + "keep hazard_50m only when it does not overlap kept fish_port_20m", + f"keep {coast_layer_name} only when it does not overlap kept fish_port_20m or kept hazard_50m", + ] + if include_fish_port + else [ + "skip fish_port_20m because coast_cell_size_m is finer than 20m", + "keep hazard_50m", + f"keep {coast_layer_name} only when it does not overlap kept hazard_50m", + ] + ), + "density_summary": density_summary, + "binary_summary": write_summary, + "debug_geojson": args.debug_geojson, + "debug_feature_count": debug_count, + "query_result": query_result, + } + meta_path.parent.mkdir(parents=True, exist_ok=True) + meta_path.write_text(json.dumps(meta, ensure_ascii=False, indent=2), encoding="utf-8") + + log(f"完成 bin={out_path} meta={meta_path}") + log( + "统计 " + f"tiles={write_summary['totalBlockedTiles']} cells={write_summary['totalBlockedCells']} " + f"sparse={write_summary['sparseTileCount']} bitset={write_summary['bitsetTileCount']} " + f"blocks={write_summary['blockCount']} size={write_summary['fileSizeBytes']}" + ) + if query_result is not None: + log(f"query lon={query_result['lon']} lat={query_result['lat']} blocked={query_result['blocked']}") + + +if __name__ == "__main__": + main() diff --git a/coastline/navgrid_v2/build_fish_port_20m_mysql_resume.py b/coastline/navgrid_v2/build_fish_port_20m_mysql_resume.py new file mode 100644 index 0000000..5aba0bf --- /dev/null +++ b/coastline/navgrid_v2/build_fish_port_20m_mysql_resume.py @@ -0,0 +1,2260 @@ +#!/usr/bin/env python3 +from __future__ import annotations + +import argparse +import datetime as dt +import json +import math +import time +import zipfile +import xml.etree.ElementTree as ET +from functools import wraps +from dataclasses import dataclass +from pathlib import Path +from typing import Iterable + +import numpy as np +import pymysql +from shapely import get_parts, intersects_xy +from shapely.geometry import LineString, box +from shapely.ops import polygonize, unary_union +from shapely.prepared import prep + + +DB_NAME = "navsea_japan_coast_grid" +DB_USER = "root" +DB_PASSWORD = "2chi9ks2" +DB_HOST = "localhost" +DB_SOCKET = "/tmp/mysql.sock" + +FISH_SRC = "coastline/C09-06.zip" +COAST_DIR = Path("coastline") +LAYER_NAME = "fish_port_20m" +CELL_SIZE_M = 20.0 +COAST_BUFFER_M = 5.0 +COAST_COARSE_LAYER = "coast_200m" +DEFAULT_COAST_COARSE_MARGIN_M = 0.0 +DEFAULT_CHECKPOINT = "out/fish_port_20m_full_resume.checkpoint.json" +DEFAULT_CURRENT_PRC_FILE = "out/fish_port_20m_full_resume.current_prc.json" +RESUME_JOB_NAME = "fish_port_20m_full_mysql_resume" + +RADIUS = 6378137.0 +MAX_MERCATOR_LAT = 85.0511287798066 + + +@dataclass(frozen=True) +class FishLine: + prc: str + fpc: str | None + coords: list[tuple[float, float]] + bbox: tuple[float, float, float, float] + + +class NoCoastlineCurvesError(RuntimeError): + pass + + +def mercator_x(lon: float) -> float: + return RADIUS * math.radians(lon) + + +def mercator_y(lat: float) -> float: + lat = max(min(lat, MAX_MERCATOR_LAT), -MAX_MERCATOR_LAT) + return RADIUS * math.log(math.tan(math.pi / 4.0 + math.radians(lat) / 2.0)) + + +def lon_from_mercator(x: float) -> float: + return math.degrees(x / RADIUS) + + +def lat_from_mercator(y: float) -> float: + return math.degrees(2.0 * math.atan(math.exp(y / RADIUS)) - math.pi / 2.0) + + +def local_name(tag: str) -> str: + return tag.split("}", 1)[-1] + + +def lonlat_from_text(text: str) -> tuple[float, float]: + parts = [p for p in text.replace(",", " ").split() if p] + if len(parts) < 2: + raise ValueError(f"invalid coordinate text: {text!r}") + lat = float(parts[0]) + lon = float(parts[1]) + return lon, lat + + +def log(message: str) -> None: + print(f"[{dt.datetime.now().isoformat(timespec='seconds')}] {message}") + + +def summarize_value(value): + if isinstance(value, Path): + return str(value) + if isinstance(value, ET.Element): + return f"" + if isinstance(value, dict): + return f"dict(len={len(value)})" + if isinstance(value, (list, tuple, set)): + return f"{type(value).__name__}(len={len(value)})" + if hasattr(value, "geom_type"): + try: + bounds = tuple(round(v, 3) for v in value.bounds) + except Exception: + bounds = None + return f"{getattr(value, 'geom_type', type(value).__name__)}(bounds={bounds})" + return repr(value) + + +def trace_fn(label: str | None = None): + def decorator(func): + @wraps(func) + def wrapper(*args, **kwargs): + name = label or func.__name__ + arg_bits = [summarize_value(arg) for arg in args] + kw_bits = [f"{key}={summarize_value(val)}" for key, val in kwargs.items()] + joined = ", ".join(arg_bits + kw_bits) + start = time.monotonic() + log(f"[TRACE] {name} 开始 {joined}") + try: + result = func(*args, **kwargs) + except Exception as exc: + log(f"[TRACE] {name} 异常 {type(exc).__name__}: {exc}") + raise + elapsed = time.monotonic() - start + log(f"[TRACE] {name} 完成 elapsed={elapsed:.2f}s") + return result + + return wrapper + + return decorator + + +@trace_fn("load_xml") +def load_xml(zip_path: Path) -> ET.Element: + with zipfile.ZipFile(zip_path) as zf: + xml_name = next(name for name in zf.namelist() if name.endswith(".xml") and "META" not in name) + return ET.fromstring(zf.read(xml_name)) + + +def build_point_lookup(root: ET.Element) -> dict[str, tuple[float, float]]: + lookup: dict[str, tuple[float, float]] = {} + for point in root.iter(): + if local_name(point.tag) != "GM_Point": + continue + point_id = point.attrib.get("id") + if not point_id: + continue + coord_text = None + for el in point.iter(): + if local_name(el.tag).endswith("DirectPosition.coordinate") and (el.text or "").strip(): + coord_text = el.text.strip() + break + if coord_text is None: + continue + lookup[point_id] = lonlat_from_text(coord_text) + return lookup + + +def extract_curve_coords(curve: ET.Element, point_lookup: dict[str, tuple[float, float]]) -> list[tuple[float, float]]: + coords: list[tuple[float, float]] = [] + for pos in curve.iter(): + tag = local_name(pos.tag) + if not tag.startswith("GM_Position"): + continue + direct = None + ref = None + for child in list(pos): + child_tag = local_name(child.tag) + if child_tag.endswith("DirectPosition.coordinate") and (child.text or "").strip(): + direct = child.text.strip() + break + if child_tag.endswith("PointRef.point"): + ref = child.attrib.get("idref") + if direct is not None: + coords.append(lonlat_from_text(direct)) + elif ref and ref in point_lookup: + coords.append(point_lookup[ref]) + return coords + + +def bbox_from_coords(coords: list[tuple[float, float]]) -> tuple[float, float, float, float]: + xs = [p[0] for p in coords] + ys = [p[1] for p in coords] + return min(xs), min(ys), max(xs), max(ys) + + +def align_floor(value: float, step: float) -> float: + return math.floor(value / step) * step + + +def align_ceil(value: float, step: float) -> float: + return math.ceil(value / step) * step + + +def expand_bbox(bbox: tuple[float, float, float, float], margin_m: float) -> tuple[float, float, float, float]: + return (bbox[0] - margin_m, bbox[1] - margin_m, bbox[2] + margin_m, bbox[3] + margin_m) + + +def mysql_connect(database: str | None = None): + kwargs = { + "host": DB_HOST, + "user": DB_USER, + "password": DB_PASSWORD, + "charset": "utf8mb4", + "autocommit": False, + "cursorclass": pymysql.cursors.Cursor, + } + if DB_SOCKET: + kwargs["unix_socket"] = DB_SOCKET + if database: + kwargs["database"] = database + return pymysql.connect(**kwargs) + + +def ensure_database() -> None: + conn = mysql_connect() + try: + with conn.cursor() as cur: + cur.execute( + f"CREATE DATABASE IF NOT EXISTS `{DB_NAME}` " + "DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci" + ) + conn.commit() + finally: + conn.close() + + +def ensure_schema(conn) -> None: + stmts = [ + """ + CREATE TABLE IF NOT EXISTS navsea_grid_import_state ( + job_name VARCHAR(64) NOT NULL PRIMARY KEY, + layer_name VARCHAR(32) NOT NULL, + source_name VARCHAR(191) NOT NULL, + checkpoint_json LONGTEXT NOT NULL, + updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 + """, + """ + CREATE TABLE IF NOT EXISTS navsea_grid_import_progress ( + id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + job_name VARCHAR(64) NOT NULL, + layer_name VARCHAR(32) NOT NULL, + prc VARCHAR(8) NOT NULL, + status_name VARCHAR(32) NOT NULL, + cluster_count INT NOT NULL, + inserted_cells BIGINT NOT NULL, + land_cells BIGINT NOT NULL, + sea_cells BIGINT NOT NULL, + elapsed_sec DOUBLE NOT NULL, + created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + KEY idx_job_layer_prc (job_name, layer_name, prc), + KEY idx_job_created (job_name, created_at) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 + """, + """ + CREATE TABLE IF NOT EXISTS navsea_fish_port_grid_layer_meta ( + layer_name VARCHAR(32) NOT NULL PRIMARY KEY, + description VARCHAR(255) NOT NULL, + source_desc TEXT NOT NULL, + cell_size_m DOUBLE NOT NULL, + feature_count BIGINT NOT NULL, + bbox_min_lon DOUBLE NOT NULL, + bbox_min_lat DOUBLE NOT NULL, + bbox_max_lon DOUBLE NOT NULL, + bbox_max_lat DOUBLE NOT NULL, + export_file VARCHAR(255) DEFAULT NULL, + created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 + """, + """ + CREATE TABLE IF NOT EXISTS navsea_fish_port_grid_cell ( + id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + layer_name VARCHAR(32) NOT NULL, + cell_id VARCHAR(64) NOT NULL, + row_idx INT NOT NULL, + col_idx INT NOT NULL, + cell_size_m DOUBLE NOT NULL, + state_name VARCHAR(32) NOT NULL, + class_name VARCHAR(32) NOT NULL, + source_name VARCHAR(191) NOT NULL, + min_lon DOUBLE NOT NULL, + min_lat DOUBLE NOT NULL, + max_lon DOUBLE NOT NULL, + max_lat DOUBLE NOT NULL, + created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + UNIQUE KEY uniq_layer_source_cell (layer_name, source_name, cell_id), + KEY idx_layer_state (layer_name, state_name), + KEY idx_layer_rowcol (layer_name, row_idx, col_idx) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 + """, + ] + with conn.cursor() as cur: + for stmt in stmts: + cur.execute(stmt) + cur.execute( + """ + SELECT INDEX_NAME, COLUMN_NAME, SEQ_IN_INDEX + FROM information_schema.STATISTICS + WHERE TABLE_SCHEMA=%s AND TABLE_NAME='navsea_fish_port_grid_cell' AND NON_UNIQUE=0 + ORDER BY INDEX_NAME, SEQ_IN_INDEX + """, + (DB_NAME,), + ) + index_columns: dict[str, list[str]] = {} + for index_name, column_name, _seq in cur.fetchall(): + index_columns.setdefault(index_name, []).append(column_name) + desired_cols = ["layer_name", "source_name", "cell_id"] + if index_columns.get("uniq_layer_source_cell") != desired_cols: + if "uniq_layer_source_cell" in index_columns: + cur.execute("ALTER TABLE navsea_fish_port_grid_cell DROP INDEX uniq_layer_source_cell") + if "uniq_layer_cell" in index_columns: + cur.execute("ALTER TABLE navsea_fish_port_grid_cell DROP INDEX uniq_layer_cell") + cur.execute( + "ALTER TABLE navsea_fish_port_grid_cell ADD UNIQUE KEY uniq_layer_source_cell (layer_name, source_name, cell_id)" + ) + elif "uniq_layer_cell" in index_columns: + cur.execute("ALTER TABLE navsea_fish_port_grid_cell DROP INDEX uniq_layer_cell") + conn.commit() + + +def upsert_meta( + cur, + layer_name: str, + description: str, + source_desc: str, + cell_size_m: float, + feature_count: int, + bbox: tuple[float, float, float, float], + export_file: str | None, +) -> None: + cur.execute( + """ + INSERT INTO navsea_fish_port_grid_layer_meta + (layer_name, description, source_desc, cell_size_m, feature_count, + bbox_min_lon, bbox_min_lat, bbox_max_lon, bbox_max_lat, export_file) + VALUES + (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s) + ON DUPLICATE KEY UPDATE + description=VALUES(description), + source_desc=VALUES(source_desc), + cell_size_m=VALUES(cell_size_m), + feature_count=VALUES(feature_count), + bbox_min_lon=VALUES(bbox_min_lon), + bbox_min_lat=VALUES(bbox_min_lat), + bbox_max_lon=VALUES(bbox_max_lon), + bbox_max_lat=VALUES(bbox_max_lat), + export_file=VALUES(export_file) + """, + ( + layer_name, + description, + source_desc, + cell_size_m, + feature_count, + bbox[0], + bbox[1], + bbox[2], + bbox[3], + export_file, + ), + ) + + +def insert_cells(cur, rows: list[tuple]) -> None: + if not rows: + return + cur.executemany( + """ + INSERT INTO navsea_fish_port_grid_cell + (layer_name, cell_id, row_idx, col_idx, cell_size_m, state_name, class_name, source_name, + min_lon, min_lat, max_lon, max_lat) + VALUES + (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s) + ON DUPLICATE KEY UPDATE + row_idx=VALUES(row_idx), + col_idx=VALUES(col_idx), + cell_size_m=VALUES(cell_size_m), + state_name=VALUES(state_name), + class_name=VALUES(class_name), + source_name=VALUES(source_name), + min_lon=VALUES(min_lon), + min_lat=VALUES(min_lat), + max_lon=VALUES(max_lon), + max_lat=VALUES(max_lat) + """, + rows, + ) + + +def save_checkpoint(path: Path, payload: dict) -> None: + path.parent.mkdir(parents=True, exist_ok=True) + tmp_path = path.with_suffix(path.suffix + ".tmp") + tmp_path.write_text(json.dumps(payload, ensure_ascii=False, indent=2), encoding="utf-8") + tmp_path.replace(path) + + +def load_checkpoint(path: Path) -> dict | None: + if not path.exists(): + return None + return json.loads(path.read_text(encoding="utf-8")) + + +def normalize_prc_list(values: Iterable[str]) -> list[str]: + unique = {normalize_prc_token(str(value)) for value in values} + try: + return sorted(unique, key=lambda item: int(item)) + except ValueError: + return sorted(unique) + + +def normalize_prc_token(value: str) -> str: + value = str(value).strip() + if value.isdigit(): + return f"{int(value):02d}" + return value + + +def normalize_fpc_token(value: str) -> str: + return str(value).strip() + + +def load_resume_state_from_db(conn, job_name: str, layer_name: str) -> dict | None: + with conn.cursor() as cur: + cur.execute( + """ + SELECT checkpoint_json + FROM navsea_grid_import_state + WHERE job_name=%s AND layer_name=%s + """, + (job_name, layer_name), + ) + row = cur.fetchone() + if not row or row[0] is None: + return None + state = json.loads(row[0]) + cur.execute( + """ + SELECT prc + FROM navsea_grid_import_progress + WHERE job_name=%s AND layer_name=%s AND status_name='PRC_DONE' + ORDER BY id + """, + (job_name, layer_name), + ) + completed_prcs = [str(prc) for (prc,) in cur.fetchall()] + completed_prcs = normalize_prc_list(completed_prcs) + state["completed_prcs"] = completed_prcs + state.setdefault("job_name", job_name) + state.setdefault("layer_name", layer_name) + state.setdefault("status", "running") + return state + + +def load_resume_state(conn, _path: Path, job_name: str, layer_name: str) -> dict | None: + state = load_resume_state_from_db(conn, job_name, layer_name) + if state is not None: + return state + return None + + +def load_coarse_mask(conn, layer_name: str) -> tuple[object | None, tuple[float, float, float, float] | None, int]: + with conn.cursor() as cur: + cur.execute( + """ + SELECT min_lon, min_lat, max_lon, max_lat + FROM navsea_coast_grid_cell + WHERE layer_name=%s + """, + (layer_name,), + ) + boxes = [box(float(min_lon), float(min_lat), float(max_lon), float(max_lat)) for min_lon, min_lat, max_lon, max_lat in cur] + + if not boxes: + return None, None, 0 + + geom = unary_union(boxes) + return geom, geom.bounds, len(boxes) + + +def load_coarse_windows_for_bbox( + conn, + *, + layer_name: str, + bbox_mercator: tuple[float, float, float, float], + margin_m: float, +) -> list[tuple[float, float, float, float]]: + minx, miny, maxx, maxy = bbox_mercator + query_minx = minx - margin_m + query_miny = miny - margin_m + query_maxx = maxx + margin_m + query_maxy = maxy + margin_m + + with conn.cursor() as cur: + cur.execute( + """ + SELECT min_lon, min_lat, max_lon, max_lat + FROM navsea_coast_grid_cell + WHERE layer_name=%s + AND NOT ( + max_lon < %s OR min_lon > %s OR + max_lat < %s OR min_lat > %s + ) + ORDER BY row_idx, col_idx + """, + (layer_name, query_minx, query_maxx, query_miny, query_maxy), + ) + windows = [ + ( + float(row_min_lon), + float(row_min_lat), + float(row_max_lon), + float(row_max_lat), + ) + for row_min_lon, row_min_lat, row_max_lon, row_max_lat in cur + ] + log( + f"[TRACE] load_coarse_windows_for_bbox 完成 layer={layer_name} " + f"bbox={tuple(round(v, 3) for v in bbox_mercator)} margin={margin_m:.1f}m " + f"windows={len(windows)}" + ) + return windows + + +def delete_cells_by_ids(conn, layer_name: str, cell_ids: list[str]) -> None: + if not cell_ids: + return + with conn.cursor() as cur: + for offset in range(0, len(cell_ids), 1000): + chunk = cell_ids[offset : offset + 1000] + placeholders = ", ".join(["%s"] * len(chunk)) + cur.execute( + f"DELETE FROM navsea_fish_port_grid_cell WHERE layer_name=%s AND cell_id IN ({placeholders})", + [layer_name, *chunk], + ) + conn.commit() + + +def drop_existing_layer(conn, layer_name: str) -> None: + with conn.cursor() as cur: + cur.execute("DELETE FROM navsea_fish_port_grid_cell WHERE layer_name=%s", (layer_name,)) + cur.execute("DELETE FROM navsea_fish_port_grid_layer_meta WHERE layer_name=%s", (layer_name,)) + cur.execute("DELETE FROM navsea_grid_import_state WHERE job_name=%s", (RESUME_JOB_NAME,)) + cur.execute("DELETE FROM navsea_grid_import_progress WHERE job_name=%s", (RESUME_JOB_NAME,)) + conn.commit() + + +def drop_existing_prcs(conn, layer_name: str, prcs: set[str]) -> None: + if not prcs: + return + source_patterns = [f"C09-06+coastline PRC={prc}%" for prc in sorted(normalize_prc_list(prcs))] + source_where = " OR ".join(["source_name LIKE %s"] * len(source_patterns)) + progress_placeholders = ", ".join(["%s"] * len(prcs)) + with conn.cursor() as cur: + cur.execute( + f"DELETE FROM navsea_fish_port_grid_cell WHERE layer_name=%s AND ({source_where})", + [layer_name, *source_patterns], + ) + cur.execute( + f"DELETE FROM navsea_grid_import_progress WHERE job_name=%s AND prc IN ({progress_placeholders})", + [RESUME_JOB_NAME, *sorted(prcs)], + ) + conn.commit() + + +def drop_existing_fpc(conn, layer_name: str, prcs: set[str], fpc: str) -> None: + if not prcs: + return + source_names = [f"C09-06+coastline PRC={prc} FPC={fpc}" for prc in sorted(normalize_prc_list(prcs))] + placeholders = ", ".join(["%s"] * len(source_names)) + progress_placeholders = ", ".join(["%s"] * len(prcs)) + with conn.cursor() as cur: + cur.execute( + f"DELETE FROM navsea_fish_port_grid_cell WHERE layer_name=%s AND source_name IN ({placeholders})", + [layer_name, *source_names], + ) + cur.execute( + f"DELETE FROM navsea_grid_import_progress WHERE job_name=%s AND prc IN ({progress_placeholders})", + [RESUME_JOB_NAME, *sorted(prcs)], + ) + conn.commit() + + +def write_prc_status(path: Path, payload: dict) -> None: + save_checkpoint(path, payload) + + +def insert_progress( + cur, + *, + job_name: str, + layer_name: str, + prc: str, + status_name: str, + cluster_count: int, + inserted_cells: int, + land_cells: int, + sea_cells: int, + elapsed_sec: float, +) -> None: + cur.execute( + """ + INSERT INTO navsea_grid_import_progress + (job_name, layer_name, prc, status_name, cluster_count, inserted_cells, land_cells, sea_cells, elapsed_sec) + VALUES + (%s, %s, %s, %s, %s, %s, %s, %s, %s) + """, + ( + job_name, + layer_name, + prc, + status_name, + cluster_count, + inserted_cells, + land_cells, + sea_cells, + elapsed_sec, + ), + ) + + +def rect_lonlat(min_lon: float, min_lat: float, max_lon: float, max_lat: float) -> dict: + return { + "type": "Polygon", + "coordinates": [ + [ + [min_lon, min_lat], + [max_lon, min_lat], + [max_lon, max_lat], + [min_lon, max_lat], + [min_lon, min_lat], + ] + ], + } + + +def bbox_intersects(a: tuple[float, float, float, float], b: tuple[float, float, float, float]) -> bool: + return not (a[2] < b[0] or a[0] > b[2] or a[3] < b[1] or a[1] > b[3]) + + +@trace_fn("discover_prcs") +def discover_prcs(root: ET.Element, selected_prc: set[str] | None) -> list[str]: + obj = root.find(".//{http://nlftp.mlit.go.jp/ksj/schemas/ksj-app}OBJ") + if obj is None: + raise SystemExit("OBJ block missing in C09-06.zip") + + prcs: set[str] = set() + for feature in obj.findall(".//{http://nlftp.mlit.go.jp/ksj/schemas/ksj-app}CB03"): + prc_el = feature.find("{http://nlftp.mlit.go.jp/ksj/schemas/ksj-app}PRC") + prc = normalize_prc_token(prc_el.text) if prc_el is not None and (prc_el.text or "").strip() else "__unknown__" + if selected_prc is not None and prc not in selected_prc: + continue + prcs.add(prc) + return sorted(prcs) + + +@trace_fn("discover_target_prcs") +def discover_target_prcs( + root: ET.Element, + selected_prc: set[str] | None, + selected_fpc: str | None, +) -> list[str]: + if selected_fpc is None: + return discover_prcs(root, selected_prc) + + obj = root.find(".//{http://nlftp.mlit.go.jp/ksj/schemas/ksj-app}OBJ") + if obj is None: + raise SystemExit("OBJ block missing in C09-06.zip") + + prcs: set[str] = set() + for feature in obj.findall(".//{http://nlftp.mlit.go.jp/ksj/schemas/ksj-app}CB03"): + prc_el = feature.find("{http://nlftp.mlit.go.jp/ksj/schemas/ksj-app}PRC") + fpc_el = feature.find("{http://nlftp.mlit.go.jp/ksj/schemas/ksj-app}FPC") + prc = normalize_prc_token(prc_el.text) if prc_el is not None and (prc_el.text or "").strip() else "__unknown__" + fpc = normalize_fpc_token(fpc_el.text) if fpc_el is not None and (fpc_el.text or "").strip() else None + if selected_prc is not None and prc not in selected_prc: + continue + if fpc != selected_fpc: + continue + prcs.add(prc) + return sorted(prcs) + + +@trace_fn("collect_fish_lines_for_prc") +def collect_fish_lines_for_prc( + root: ET.Element, + point_lookup: dict[str, tuple[float, float]], + selected_prc: str, + selected_fpc: str | None = None, +) -> list[FishLine]: + obj = root.find(".//{http://nlftp.mlit.go.jp/ksj/schemas/ksj-app}OBJ") + if obj is None: + raise SystemExit("OBJ block missing in C09-06.zip") + + fish_lines: list[FishLine] = [] + for feature in obj.findall(".//{http://nlftp.mlit.go.jp/ksj/schemas/ksj-app}CB03"): + prc_el = feature.find("{http://nlftp.mlit.go.jp/ksj/schemas/ksj-app}PRC") + fpc_el = feature.find("{http://nlftp.mlit.go.jp/ksj/schemas/ksj-app}FPC") + prc = normalize_prc_token(prc_el.text) if prc_el is not None and (prc_el.text or "").strip() else "__unknown__" + if prc != selected_prc: + continue + fpc = normalize_fpc_token(fpc_el.text) if fpc_el is not None and (fpc_el.text or "").strip() else None + if selected_fpc is not None and fpc != selected_fpc: + continue + loc = feature.find("{http://nlftp.mlit.go.jp/ksj/schemas/ksj-app}LOC") + if loc is None: + continue + ref = loc.attrib.get("idref") + if not ref: + continue + curve = obj.find(f".//*[@id='{ref}']") + if curve is None: + continue + coords = extract_curve_coords(curve, point_lookup) + if len(coords) < 2: + continue + bbox = bbox_from_coords(coords) + fish_lines.append(FishLine(prc=prc, fpc=fpc, coords=coords, bbox=bbox)) + return fish_lines + + +def group_fish_lines_by_fpc(fish_lines: list[FishLine]) -> dict[str, list[FishLine]]: + groups: dict[str, list[FishLine]] = {} + for line in fish_lines: + key = line.fpc or "__unknown__" + groups.setdefault(key, []).append(line) + return groups + + +@trace_fn("cluster_line_indices") +def cluster_line_indices(bboxes: list[tuple[float, float, float, float]], gap_m: float = 250.0) -> list[list[int]]: + parent = list(range(len(bboxes))) + + def find(x: int) -> int: + while parent[x] != x: + parent[x] = parent[parent[x]] + x = parent[x] + return x + + def union(a: int, b: int) -> None: + ra = find(a) + rb = find(b) + if ra != rb: + parent[rb] = ra + + expanded = [ + (bb[0] - gap_m, bb[1] - gap_m, bb[2] + gap_m, bb[3] + gap_m) + for bb in bboxes + ] + for i in range(len(expanded)): + for j in range(i + 1, len(expanded)): + if bbox_intersects(expanded[i], expanded[j]): + union(i, j) + + groups: dict[int, list[int]] = {} + for idx in range(len(parent)): + root = find(idx) + groups.setdefault(root, []).append(idx) + return list(groups.values()) + + +@trace_fn("load_coastlines_for_prc") +def load_coastlines_for_prc( + project_root: Path, + prc: str, + bbox: tuple[float, float, float, float] | None = None, + search_margin_m: float = 250.0, +) -> tuple[list[LineString], tuple[float, float, float, float]]: + bbox_geom = box(*expand_bbox(bbox, search_margin_m)) if bbox is not None else None + lines: list[LineString] = [] + bbox = [float("inf"), float("inf"), float("-inf"), float("-inf")] + coast_dir = project_root / COAST_DIR + exact_path = coast_dir / f"C23-06_{prc}_GML.zip" + candidate_paths = [exact_path] if exact_path.exists() else [] + fallback_paths = sorted(coast_dir.glob("C23-06_*_GML.zip")) + + if exact_path.exists(): + log(f"[TRACE] load_coastlines_for_prc 使用同号海岸线包 {exact_path.name}") + elif fallback_paths: + log( + f"[TRACE] load_coastlines_for_prc 缺少同号海岸线包 {exact_path.name}," + f"将按 bbox 退回扫描 {len(fallback_paths)} 个现有海岸线包" + ) + candidate_paths = fallback_paths + else: + raise FileNotFoundError(str(exact_path)) + + tried_paths: list[Path] = [] + + def scan_path(coast_path: Path) -> None: + root = load_xml(coast_path) + point_lookup = build_point_lookup(root) + found_here = 0 + for curve in root.findall(".//{http://www.opengis.net/gml/3.2}Curve"): + coords: list[tuple[float, float]] = [] + for pos_list in curve.findall(".//{http://www.opengis.net/gml/3.2}posList"): + if not pos_list.text: + continue + values = [float(part) for part in pos_list.text.split() if part] + if len(values) < 4 or len(values) % 2 != 0: + continue + for i in range(0, len(values), 2): + lat = values[i] + lon = values[i + 1] + coords.append((mercator_x(lon), mercator_y(lat))) + if len(coords) < 2: + coords = [(mercator_x(lon), mercator_y(lat)) for lon, lat in extract_curve_coords(curve, point_lookup)] + if len(coords) < 2: + continue + line = LineString(coords) + if bbox_geom is not None and not line.intersects(bbox_geom): + continue + lines.append(line) + found_here += 1 + xs = [p[0] for p in coords] + ys = [p[1] for p in coords] + bbox[0] = min(bbox[0], min(xs)) + bbox[1] = min(bbox[1], min(ys)) + bbox[2] = max(bbox[2], max(xs)) + bbox[3] = max(bbox[3], max(ys)) + tried_paths.append(coast_path) + if found_here > 0: + log( + f"[TRACE] load_coastlines_for_prc 海岸线命中 source={coast_path.name} " + f"hits={found_here}" + ) + + for coast_path in candidate_paths: + scan_path(coast_path) + + if not lines and exact_path.exists(): + other_paths = [p for p in fallback_paths if p != exact_path] + if other_paths: + log( + f"[TRACE] load_coastlines_for_prc 同号包 {exact_path.name} 未命中 bbox," + f"改用其他 {len(other_paths)} 个海岸线包继续搜索" + ) + for coast_path in other_paths: + scan_path(coast_path) + + if not lines: + raise NoCoastlineCurvesError( + f"no coastline curves parsed for PRC={prc}; " + f"tried={len(tried_paths)} bbox={tuple(round(v, 3) for v in bbox_geom.bounds) if bbox_geom is not None else None}" + ) + return lines, (bbox[0], bbox[1], bbox[2], bbox[3]) + + +@trace_fn("build_cells_for_geometry") +def build_cells_for_geometry( + fish_geom, + coast_prepared, + *, + prc: str, + cell_size_m: float, + scan_tile_m: float, + source_name: str, + max_scan_cells: int | None, +) -> tuple[list[tuple], int, int, tuple[float, float, float, float], dict[str, float | int]]: + fish_prepared = prep(fish_geom) + minx, miny, maxx, maxy = fish_geom.bounds + start_x = align_floor(minx, cell_size_m) + start_y = align_floor(miny, cell_size_m) + end_x = align_ceil(maxx, cell_size_m) + end_y = align_ceil(maxy, cell_size_m) + estimated_cols = max(0, int(math.ceil((end_x - start_x) / cell_size_m))) + estimated_rows = max(0, int(math.ceil((end_y - start_y) / cell_size_m))) + estimated_cells = estimated_cols * estimated_rows + if max_scan_cells is not None and estimated_cells > max_scan_cells: + raise RuntimeError( + "scan guard triggered: " + f"estimated_cells={estimated_cells} max_scan_cells={max_scan_cells} " + f"grid={estimated_cols}x{estimated_rows} bounds={tuple(round(v, 3) for v in fish_geom.bounds)} " + f"source={source_name} prc={prc}" + ) + log( + f"[TRACE] build_cells_for_geometry 准备 " + f"fish_bounds={tuple(round(v, 3) for v in fish_geom.bounds)} " + f"scan_range=({start_x:.3f}, {start_y:.3f}, {end_x:.3f}, {end_y:.3f}) " + f"grid={estimated_cols}x{estimated_rows} estimated_cells={estimated_cells} " + f"cell={cell_size_m:.1f}m tile={scan_tile_m:.1f}m source={source_name}" + ) + + rows: list[tuple] = [] + land_count = 0 + sea_count = 0 + export_bbox = [float("inf"), float("inf"), float("-inf"), float("-inf")] + profile = { + "tile_checked": 0, + "tile_hit": 0, + "row_checked": 0, + "row_hit": 0, + "mask_row_hit": 0, + "candidate_cells": 0, + "precise_cell_checks": 0, + "precise_hits": 0, + } + + tile_start_x = align_floor(start_x, scan_tile_m) + tile_start_y = align_floor(start_y, scan_tile_m) + tile_end_x = align_ceil(end_x, scan_tile_m) + tile_end_y = align_ceil(end_y, scan_tile_m) + half = cell_size_m / 2.0 + log( + f"[TRACE] build_cells_for_geometry tile_range=" + f"({tile_start_x:.3f}, {tile_start_y:.3f}, {tile_end_x:.3f}, {tile_end_y:.3f})" + ) + + # 对 200m 粗窗这类很小的输入,直接按 20m 网格线性扫描, + # 避免再走一层 2000m tile 外循环。 + if (end_x - start_x) <= scan_tile_m and (end_y - start_y) <= scan_tile_m: + profile["tile_checked"] = 1 + profile["tile_hit"] = 1 + log(f"[TRACE] build_cells_for_geometry 使用小窗直算模式") + + y = start_y + while y < end_y: + profile["row_checked"] += 1 + row_strip = box(start_x, y, end_x, y + cell_size_m) + if not fish_prepared.intersects(row_strip): + y += cell_size_m + continue + profile["row_hit"] += 1 + if profile["row_hit"] <= 20 or profile["row_hit"] % 50 == 0: + log( + f"[TRACE] build_cells_for_geometry row_hit " + f"row_idx={profile['row_checked']} y={y:.3f} x_span=({start_x:.3f}, {end_x:.3f})" + ) + + ix_start = int(round(start_x / cell_size_m)) + ix_end = int(round(end_x / cell_size_m)) + ix_values = np.arange(ix_start, ix_end, dtype=np.int64) + x_values = ix_values.astype(float) * cell_size_m + x_center_values = x_values + half + x_right_values = x_values + cell_size_m + + mask = ( + intersects_xy(fish_geom, x_center_values, y + half) + | intersects_xy(fish_geom, x_values, y) + | intersects_xy(fish_geom, x_right_values, y) + | intersects_xy(fish_geom, x_values, y + cell_size_m) + | intersects_xy(fish_geom, x_right_values, y + cell_size_m) + ) + if not np.any(mask): + y += cell_size_m + continue + profile["mask_row_hit"] += 1 + if profile["mask_row_hit"] <= 20 or profile["mask_row_hit"] % 50 == 0: + log( + f"[TRACE] build_cells_for_geometry mask_hit " + f"row_idx={profile['row_checked']} candidate_mask={int(np.count_nonzero(mask))}" + ) + + mask = mask | np.r_[False, mask[:-1]] | np.r_[mask[1:], False] + candidate_indices = np.flatnonzero(mask) + profile["candidate_cells"] += int(candidate_indices.size) + if candidate_indices.size and (profile["candidate_cells"] <= 50 or profile["candidate_cells"] % 200 == 0): + log( + f"[TRACE] build_cells_for_geometry candidate_cells " + f"count={int(candidate_indices.size)} total={profile['candidate_cells']} " + f"row_y={y:.3f}" + ) + for idx in candidate_indices: + profile["precise_cell_checks"] += 1 + x = float(x_values[idx]) + cell_geom = box(x, y, x + cell_size_m, y + cell_size_m) + if not fish_prepared.intersects(cell_geom): + continue + profile["precise_hits"] += 1 + coast_hit = coast_prepared.intersects(cell_geom) + if not coast_hit: + sea_count += 1 + continue + land_count += 1 + state_name = "COASTLINE" + class_name = state_name + min_lon = lon_from_mercator(x) + min_lat = lat_from_mercator(y) + max_lon = lon_from_mercator(x + cell_size_m) + max_lat = lat_from_mercator(y + cell_size_m) + export_bbox[0] = min(export_bbox[0], min_lon) + export_bbox[1] = min(export_bbox[1], min_lat) + export_bbox[2] = max(export_bbox[2], max_lon) + export_bbox[3] = max(export_bbox[3], max_lat) + ix = int(round(x / cell_size_m)) + iy = int(round(y / cell_size_m)) + cell_id = f"{ix}:{iy}" + rows.append( + ( + LAYER_NAME, + cell_id, + iy, + ix, + cell_size_m, + state_name, + class_name, + source_name, + min_lon, + min_lat, + max_lon, + max_lat, + ) + ) + y += cell_size_m + + if not rows: + log( + f"[TRACE] build_cells_for_geometry 结束 rows=0 coast=0 off_coast=0 " + f"tile_hit={profile['tile_hit']}/{profile['tile_checked']} " + f"row_hit={profile['row_hit']}/{profile['row_checked']} " + f"candidate={profile['candidate_cells']} precise={profile['precise_hits']}/{profile['precise_cell_checks']}" + ) + return [], 0, 0, (float("inf"), float("inf"), float("-inf"), float("-inf")), profile + log( + f"[TRACE] build_cells_for_geometry 结束 rows={len(rows)} coast={land_count} off_coast={sea_count} " + f"tile_hit={profile['tile_hit']}/{profile['tile_checked']} " + f"row_hit={profile['row_hit']}/{profile['row_checked']} " + f"candidate={profile['candidate_cells']} precise={profile['precise_hits']}/{profile['precise_cell_checks']}" + ) + return rows, land_count, sea_count, (export_bbox[0], export_bbox[1], export_bbox[2], export_bbox[3]), profile + + tile_y = tile_start_y + while tile_y < tile_end_y: + tile_x = tile_start_x + tile_top = min(tile_y + scan_tile_m, end_y) + while tile_x < tile_end_x: + profile["tile_checked"] += 1 + tile_right = min(tile_x + scan_tile_m, end_x) + tile_geom = box(tile_x, tile_y, tile_right, tile_top) + if not fish_prepared.intersects(tile_geom): + tile_x += scan_tile_m + continue + profile["tile_hit"] += 1 + log( + f"[TRACE] build_cells_for_geometry tile_hit " + f"idx={profile['tile_checked']} bbox=({tile_x:.3f}, {tile_y:.3f}, {tile_right:.3f}, {tile_top:.3f})" + ) + + local_start_x = max(start_x, tile_x) + local_end_x = tile_right + local_start_y = max(start_y, tile_y) + local_end_y = tile_top + + ix_start = int(round(local_start_x / cell_size_m)) + ix_end = int(round(local_end_x / cell_size_m)) + ix_values = np.arange(ix_start, ix_end, dtype=np.int64) + cell_count = int(ix_values.shape[0]) + if cell_count == 0: + tile_x += scan_tile_m + continue + x_values = ix_values.astype(float) * cell_size_m + x_center_values = x_values + half + x_right_values = x_values + cell_size_m + + y = local_start_y + while y < local_end_y: + profile["row_checked"] += 1 + row_strip = box(local_start_x, y, local_end_x, y + cell_size_m) + if not fish_prepared.intersects(row_strip): + y += cell_size_m + continue + profile["row_hit"] += 1 + if profile["row_hit"] <= 20 or profile["row_hit"] % 50 == 0: + log( + f"[TRACE] build_cells_for_geometry row_hit " + f"row_idx={profile['row_checked']} y={y:.3f} x_span=({local_start_x:.3f}, {local_end_x:.3f})" + ) + + mask = ( + intersects_xy(fish_geom, x_center_values, y + half) + | intersects_xy(fish_geom, x_values, y) + | intersects_xy(fish_geom, x_right_values, y) + | intersects_xy(fish_geom, x_values, y + cell_size_m) + | intersects_xy(fish_geom, x_right_values, y + cell_size_m) + ) + if not np.any(mask): + y += cell_size_m + continue + profile["mask_row_hit"] += 1 + if profile["mask_row_hit"] <= 20 or profile["mask_row_hit"] % 50 == 0: + log( + f"[TRACE] build_cells_for_geometry mask_hit " + f"row_idx={profile['row_checked']} candidate_mask={int(np.count_nonzero(mask))}" + ) + + mask = mask | np.r_[False, mask[:-1]] | np.r_[mask[1:], False] + candidate_indices = np.flatnonzero(mask) + profile["candidate_cells"] += int(candidate_indices.size) + if candidate_indices.size and (profile["candidate_cells"] <= 50 or profile["candidate_cells"] % 200 == 0): + log( + f"[TRACE] build_cells_for_geometry candidate_cells " + f"count={int(candidate_indices.size)} total={profile['candidate_cells']} " + f"row_y={y:.3f}" + ) + for idx in candidate_indices: + profile["precise_cell_checks"] += 1 + x = float(x_values[idx]) + cell_geom = box(x, y, x + cell_size_m, y + cell_size_m) + if not fish_prepared.intersects(cell_geom): + continue + profile["precise_hits"] += 1 + coast_hit = coast_prepared.intersects(cell_geom) + if not coast_hit: + sea_count += 1 + continue + land_count += 1 + state_name = "COASTLINE" + class_name = state_name + min_lon = lon_from_mercator(x) + min_lat = lat_from_mercator(y) + max_lon = lon_from_mercator(x + cell_size_m) + max_lat = lat_from_mercator(y + cell_size_m) + export_bbox[0] = min(export_bbox[0], min_lon) + export_bbox[1] = min(export_bbox[1], min_lat) + export_bbox[2] = max(export_bbox[2], max_lon) + export_bbox[3] = max(export_bbox[3], max_lat) + ix = int(round(x / cell_size_m)) + iy = int(round(y / cell_size_m)) + cell_id = f"{ix}:{iy}" + rows.append( + ( + LAYER_NAME, + cell_id, + iy, + ix, + cell_size_m, + state_name, + class_name, + source_name, + min_lon, + min_lat, + max_lon, + max_lat, + ) + ) + y += cell_size_m + tile_x += scan_tile_m + + if not rows: + log( + f"[TRACE] build_cells_for_geometry 结束 rows=0 coast=0 off_coast=0 " + f"tile_hit={profile['tile_hit']}/{profile['tile_checked']} " + f"row_hit={profile['row_hit']}/{profile['row_checked']} " + f"candidate={profile['candidate_cells']} precise={profile['precise_hits']}/{profile['precise_cell_checks']}" + ) + return [], 0, 0, (float("inf"), float("inf"), float("-inf"), float("-inf")), profile + log( + f"[TRACE] build_cells_for_geometry 结束 rows={len(rows)} coast={land_count} off_coast={sea_count} " + f"tile_hit={profile['tile_hit']}/{profile['tile_checked']} " + f"row_hit={profile['row_hit']}/{profile['row_checked']} " + f"candidate={profile['candidate_cells']} precise={profile['precise_hits']}/{profile['precise_cell_checks']}" + ) + return rows, land_count, sea_count, (export_bbox[0], export_bbox[1], export_bbox[2], export_bbox[3]), profile + + +def process_port_group_no_resume( + *, + conn, + cur, + project_root: Path, + prc: str, + prc_lines: list[FishLine], + args, + selected_fpc: str | None, + max_scan_cells: int | None, +) -> tuple[int, int, int, int, float]: + prc_bboxes = [line.bbox for line in prc_lines] + prc_bbox = ( + min(bb[0] for bb in prc_bboxes), + min(bb[1] for bb in prc_bboxes), + max(bb[2] for bb in prc_bboxes), + max(bb[3] for bb in prc_bboxes), + ) + cluster_groups = cluster_line_indices(prc_bboxes, gap_m=args.cluster_gap_m) + if selected_fpc is not None: + log(f"[{LAYER_NAME}] PRC={prc} / FPC={selected_fpc} cluster 数={len(cluster_groups)}") + log(f"[{LAYER_NAME}] PRC={prc} / FPC={selected_fpc} 正在缓存整港海岸线并生成缓冲区 ...") + else: + log(f"[{LAYER_NAME}] PRC={prc} cluster 数={len(cluster_groups)}") + log(f"[{LAYER_NAME}] PRC={prc} 正在缓存整县海岸线并生成缓冲区 ...") + + try: + prc_coast_lines, prc_coast_bbox = load_coastlines_for_prc( + project_root, + prc, + bbox=( + mercator_x(prc_bbox[0]), + mercator_y(prc_bbox[1]), + mercator_x(prc_bbox[2]), + mercator_y(prc_bbox[3]), + ), + search_margin_m=max(args.coast_buffer_m, args.coast_coarse_margin_m), + ) + except NoCoastlineCurvesError as exc: + if not args.skip_missing_coarse: + raise + status_name = "FPC_SKIPPED_NO_COASTLINE" if selected_fpc is not None else "PRC_SKIPPED_NO_COASTLINE" + insert_progress( + cur, + job_name=RESUME_JOB_NAME, + layer_name=LAYER_NAME, + prc=prc, + status_name=status_name, + cluster_count=len(cluster_groups), + inserted_cells=0, + land_cells=0, + sea_cells=0, + elapsed_sec=0.0, + ) + conn.commit() + if selected_fpc is not None: + log(f"[{LAYER_NAME}] PRC={prc} / FPC={selected_fpc} 未找到海岸线;已按 --skip-missing-coarse 跳过。{exc}") + else: + log(f"[{LAYER_NAME}] PRC={prc} 未找到海岸线;已按 --skip-missing-coarse 跳过。{exc}") + return 0, 0, 0, 0, 0.0 + if selected_fpc is not None: + log( + f"[{LAYER_NAME}] PRC={prc} / FPC={selected_fpc} 海岸线缓存完成," + f"曲线数={len(prc_coast_lines)} bbox={prc_coast_bbox}" + ) + else: + log( + f"[{LAYER_NAME}] PRC={prc} 海岸线缓存完成," + f"曲线数={len(prc_coast_lines)} bbox={prc_coast_bbox}" + ) + + prc_coast_geom = unary_union(prc_coast_lines) + prc_coast_buffer = prc_coast_geom.buffer(args.coast_buffer_m, cap_style=2, join_style=2) + prc_coast_prepared = prep(prc_coast_buffer) + if selected_fpc is not None: + log(f"[{LAYER_NAME}] PRC={prc} / FPC={selected_fpc} 海岸缓冲缓存完成,开始处理各 part ...") + else: + log(f"[{LAYER_NAME}] PRC={prc} 海岸缓冲缓存完成,开始处理各 part ...") + + started_at = time.monotonic() + prc_inserted_before = 0 + prc_land_before = 0 + prc_sea_before = 0 + inserted_total = 0 + land_total = 0 + sea_total = 0 + coarse_window_total = 0 + + selected_port_rows: dict[str, tuple] | None = {} if selected_fpc is not None else None + selected_port_coarse_windows: set[tuple[float, float, float, float]] | None = set() if selected_fpc is not None else None + prc_profile = { + "tile_checked": 0, + "tile_hit": 0, + "row_checked": 0, + "row_hit": 0, + "mask_row_hit": 0, + "candidate_cells": 0, + "precise_cell_checks": 0, + "precise_hits": 0, + } + + for cluster_idx, cluster in enumerate(cluster_groups): + log(f"[{LAYER_NAME}] PRC={prc} cluster={cluster_idx + 1}/{len(cluster_groups)} 开始,成员={len(cluster)}") + log(f"[{LAYER_NAME}] PRC={prc} cluster={cluster_idx + 1} 正在合并渔港线 ...") + + cluster_lines = [ + LineString([(mercator_x(lon), mercator_y(lat)) for lon, lat in prc_lines[i].coords]) + for i in cluster + ] + merged = unary_union(cluster_lines) + polygons = list(polygonize(merged)) + if polygons: + fish_geom = unary_union(polygons) + geom_mode = "polygonize" + else: + fish_geom = merged.buffer(args.cell_size_m, cap_style=2, join_style=2) + geom_mode = "buffer" + if fish_geom.is_empty: + log(f"[{LAYER_NAME}] PRC={prc} cluster={cluster_idx} 为空,跳过") + continue + log(f"[{LAYER_NAME}] PRC={prc} cluster={cluster_idx + 1} 几何模式={geom_mode},正在生成格网 ...") + + fish_parts = [part for part in get_parts(fish_geom) if not part.is_empty] + if not fish_parts: + log(f"[{LAYER_NAME}] PRC={prc} cluster={cluster_idx + 1} 没有可拆分部件,跳过") + continue + + for part_idx, fish_part in enumerate(fish_parts): + fish_bbox = fish_part.bounds + part_coarse_windows = load_coarse_windows_for_bbox( + conn, + layer_name=COAST_COARSE_LAYER, + bbox_mercator=fish_bbox, + margin_m=args.coast_coarse_margin_m, + ) + if part_coarse_windows: + log( + f"[{LAYER_NAME}] PRC={prc} cluster={cluster_idx + 1}/{len(cluster_groups)} " + f"part={part_idx + 1}/{len(fish_parts)} 取回 coast_200m 格子={len(part_coarse_windows)}" + ) + scan_windows = [box(*coarse_window) for coarse_window in part_coarse_windows] + if selected_port_coarse_windows is not None: + for coarse_window in part_coarse_windows: + selected_port_coarse_windows.add(tuple(float(v) for v in coarse_window)) + if not scan_windows: + if args.allow_unbounded_fallback: + scan_windows = [fish_part] + log( + f"[{LAYER_NAME}] PRC={prc} cluster={cluster_idx + 1}/{len(cluster_groups)} " + f"part={part_idx + 1}/{len(fish_parts)} 没有有效 coast_200m 交集,已允许回退原始范围" + ) + else: + message = ( + f"[{LAYER_NAME}] PRC={prc} cluster={cluster_idx + 1}/{len(cluster_groups)} " + f"part={part_idx + 1}/{len(fish_parts)} 没有有效 coast_200m 交集;" + f"fish_bbox={tuple(round(v, 3) for v in fish_bbox)} " + f"coarse_windows={len(part_coarse_windows)}。" + ) + if args.skip_missing_coarse: + log(message + "已按 --skip-missing-coarse 跳过") + continue + raise RuntimeError( + message + + "按当前设计这属于异常:渔港 20m 必须以数据库 coast_200m 为底盘。" + + "如确需旧式整片扫描请显式加 --allow-unbounded-fallback;" + + "如确认允许漏算该 part,请显式加 --skip-missing-coarse。" + ) + + log( + f"[{LAYER_NAME}] PRC={prc} cluster={cluster_idx + 1}/{len(cluster_groups)} " + f"part={part_idx + 1}/{len(fish_parts)} 实际扫描交集窗口={len(scan_windows)}" + ) + if selected_fpc is not None: + log( + f"[{LAYER_NAME}] PRC={prc} / FPC={selected_fpc} cluster={cluster_idx + 1}/{len(cluster_groups)} " + f"part={part_idx + 1}/{len(fish_parts)} bbox={fish_bbox} 使用海岸线缓存 ..." + ) + else: + log( + f"[{LAYER_NAME}] PRC={prc} cluster={cluster_idx + 1}/{len(cluster_groups)} " + f"part={part_idx + 1}/{len(fish_parts)} bbox={fish_bbox} 使用 part 级海岸线缓存 ..." + ) + log(f"[{LAYER_NAME}] PRC={prc} cluster={cluster_idx + 1} part={part_idx + 1} 开始格网 ...") + + land_count = 0 + sea_count = 0 + bbox_lonlat = (float("inf"), float("inf"), float("-inf"), float("-inf")) + profile = {key: 0 for key in prc_profile} + part_inserted = 0 + batch: list[tuple] = [] + + for window_idx, scan_geom in enumerate(scan_windows): + if scan_geom.is_empty: + continue + log( + f"[{LAYER_NAME}] PRC={prc} cluster={cluster_idx + 1}/{len(cluster_groups)} " + f"part={part_idx + 1}/{len(fish_parts)} window={window_idx + 1}/{len(scan_windows)} " + f"正在生成格网 ..." + ) + window_rows, window_land, window_sea, window_bbox, window_profile = build_cells_for_geometry( + scan_geom, + prc_coast_prepared, + prc=prc, + cell_size_m=args.cell_size_m, + scan_tile_m=args.cell_size_m * 10.0, + source_name=( + f"C09-06+coastline PRC={prc}" + + (f" FPC={selected_fpc}" if selected_fpc is not None else "") + ), + max_scan_cells=max_scan_cells, + ) + land_count += window_land + sea_count += window_sea + bbox_lonlat = ( + min(bbox_lonlat[0], window_bbox[0]), + min(bbox_lonlat[1], window_bbox[1]), + max(bbox_lonlat[2], window_bbox[2]), + max(bbox_lonlat[3], window_bbox[3]), + ) + for key in prc_profile: + prc_profile[key] += window_profile[key] + profile[key] += window_profile[key] + + for row in window_rows: + if selected_port_rows is not None: + selected_port_rows[row[1]] = row + batch.append(row) + if len(batch) >= args.commit_every: + insert_cells(cur, batch) + conn.commit() + part_inserted += len(batch) + inserted_total += len(batch) + batch.clear() + + if batch: + insert_cells(cur, batch) + conn.commit() + part_inserted += len(batch) + inserted_total += len(batch) + + if part_inserted == 0: + log( + f"[{LAYER_NAME}] PRC={prc} cluster={cluster_idx + 1} " + f"part={part_idx + 1} 没有生成 cell" + ) + continue + + if selected_fpc is not None: + log( + f"[{LAYER_NAME}] PRC={prc} / FPC={selected_fpc} cluster={cluster_idx + 1} " + f"part={part_idx + 1} 格网完成,cell={part_inserted} coast={land_count} off_coast={sea_count} bbox={bbox_lonlat}" + ) + else: + log( + f"[{LAYER_NAME}] PRC={prc} cluster={cluster_idx + 1} " + f"part={part_idx + 1} 格网完成,cell={part_inserted} coast={land_count} off_coast={sea_count} bbox={bbox_lonlat}" + ) + + coarse_window_total += len(part_coarse_windows) + land_total += land_count + sea_total += sea_count + + prc_elapsed = time.monotonic() - started_at + summary_inserted = len(selected_port_rows) if selected_port_rows is not None else inserted_total + summary_coarse = len(selected_port_coarse_windows) if selected_port_coarse_windows is not None else coarse_window_total + insert_progress( + cur, + job_name="fish_port_20m_full_mysql_resume", + layer_name=LAYER_NAME, + prc=prc, + status_name="FPC_DONE" if selected_fpc is not None else "PRC_DONE", + cluster_count=len(cluster_groups), + inserted_cells=summary_inserted, + land_cells=land_total, + sea_cells=sea_total, + elapsed_sec=prc_elapsed, + ) + conn.commit() + if selected_fpc is not None: + log( + f"[{LAYER_NAME}] PRC={prc} / FPC={selected_fpc} 完成 cluster={len(cluster_groups)} " + f"200x200={summary_coarse} final_20x20={summary_inserted} " + f"coast={land_total} off_coast={sea_total} elapsed={prc_elapsed:.1f}s" + ) + else: + log( + f"[{LAYER_NAME}] PRC={prc} 完成 cluster={len(cluster_groups)} " + f"本段写入={inserted_total} coast={land_total} off_coast={sea_total} " + f"elapsed={prc_elapsed:.1f}s" + ) + return summary_inserted, land_total, sea_total, summary_coarse, prc_elapsed + + +@trace_fn("main") +def main() -> None: + parser = argparse.ArgumentParser(description="Rebuild nationwide fish-port 20m grid into MySQL with resume support") + parser.add_argument( + "--fish-source", + default=FISH_SRC, + help="渔港原始包 C09-06.zip", + ) + parser.add_argument( + "--checkpoint-file", + default=DEFAULT_CHECKPOINT, + help="辅助断点文件(仅作记录)", + ) + parser.add_argument( + "--current-prc-file", + default=DEFAULT_CURRENT_PRC_FILE, + help="当前运行 PRC 的状态文件", + ) + parser.add_argument( + "--resume", + action="store_true", + default=True, + help="按数据库里的断点继续,默认开启;与 --prc 同用时会被忽略", + ) + parser.add_argument( + "--no-resume", + dest="resume", + action="store_false", + help="忽略数据库断点,从头规划但不清表", + ) + parser.add_argument( + "--reset-layer", + action="store_true", + help="先清空 fish_port_20m 的旧数据并删除断点", + ) + parser.add_argument( + "--prc", + nargs="+", + default=None, + help="只处理指定 PRC;指定时会按该 PRC 完整重建并忽略 resume 断点", + ) + parser.add_argument( + "--fpc", + default=None, + help="只处理指定 FPC(单个渔港);指定时会先反查所在 PRC,再只重算该港口", + ) + parser.add_argument( + "--cluster-gap-m", + type=float, + default=250.0, + help="聚类连通判定的间隔(米)", + ) + parser.add_argument( + "--cell-size-m", + type=float, + default=CELL_SIZE_M, + help="格网大小(米)", + ) + parser.add_argument( + "--coast-buffer-m", + type=float, + default=COAST_BUFFER_M, + help="海岸缓冲距离(米),默认 5m,可按需要调大或调小", + ) + parser.add_argument( + "--fish-buffer-m", + type=float, + default=120.0, + help="渔港几何外扩缓冲(米),保留兼容参数;当前默认扫描以 coast_200m 粗格为底盘", + ) + parser.add_argument( + "--commit-every", + type=int, + default=5000, + help="每累计多少条 cell 写一次数据库并打印状态", + ) + parser.add_argument( + "--scan-tile-m", + type=float, + default=2000.0, + help="格网扫描分块大小(米)", + ) + parser.add_argument( + "--coast-coarse-margin-m", + type=float, + default=DEFAULT_COAST_COARSE_MARGIN_M, + help="coast_200m 粗筛底座外扩缓冲(米),默认 0m(精确按同区域粗格筛选)", + ) + parser.add_argument( + "--allow-unbounded-fallback", + action="store_true", + help="允许在没有 coast_200m 小窗时回退扫描原始渔港 part;默认关闭以避免超大范围拖僵系统", + ) + parser.add_argument( + "--skip-missing-coarse", + action="store_true", + help="遇到没有有效 coast_200m 交集的 part 时跳过;默认作为异常中止,避免静默漏算", + ) + parser.add_argument( + "--max-scan-cells", + type=int, + default=200000, + help="单次 build_cells_for_geometry 允许估算扫描的最大 20m 格数,超过即中止;设为 0 表示不限制", + ) + args = parser.parse_args() + max_scan_cells = None if args.max_scan_cells <= 0 else args.max_scan_cells + + project_root = Path(__file__).resolve().parent.parent.parent + fish_source = Path(args.fish_source) + if not fish_source.is_absolute(): + fish_source = project_root / fish_source + if not fish_source.exists(): + raise SystemExit(f"missing input: {fish_source}") + + checkpoint_path = Path(args.checkpoint_file) + if not checkpoint_path.is_absolute(): + checkpoint_path = project_root / checkpoint_path + current_prc_path = Path(args.current_prc_file) + if not current_prc_path.is_absolute(): + current_prc_path = project_root / current_prc_path + + ensure_database() + conn = mysql_connect(DB_NAME) + try: + ensure_schema(conn) + coast_coarse_geom, coast_coarse_bbox, coast_coarse_count = load_coarse_mask(conn, COAST_COARSE_LAYER) + if coast_coarse_geom is not None and coast_coarse_count > 0: + if args.coast_coarse_margin_m > 0: + coast_coarse_geom = coast_coarse_geom.buffer( + args.coast_coarse_margin_m, + cap_style=2, + join_style=2, + ) + coast_coarse_prepared = prep(coast_coarse_geom) + log( + f"[{LAYER_NAME}] coast_200m 粗筛底座就绪,cells={coast_coarse_count} " + f"bbox={coast_coarse_bbox} margin={args.coast_coarse_margin_m:.1f}m" + ) + else: + coast_coarse_geom = None + coast_coarse_prepared = None + if args.allow_unbounded_fallback: + log(f"[{LAYER_NAME}] coast_200m 粗筛底座为空,已允许回退按原始渔港范围扫描") + elif args.skip_missing_coarse: + log(f"[{LAYER_NAME}] coast_200m 粗筛底座为空,已允许跳过无粗筛窗口的 part") + else: + log(f"[{LAYER_NAME}] coast_200m 粗筛底座为空,后续遇到无粗筛窗口的 part 将作为异常中止") + selected_prc = None if args.prc is None else {normalize_prc_token(str(x)) for x in args.prc} + selected_fpc = normalize_fpc_token(args.fpc) if args.fpc else None + if selected_fpc is not None and args.resume: + log(f"[{LAYER_NAME}] 指定 FPC 模式,忽略 checkpoint 续跑,改为按指定渔港完整重建") + args.resume = False + if selected_prc is not None: + if args.resume: + log(f"[{LAYER_NAME}] 指定 PRC 模式,忽略 checkpoint 续跑,改为按指定 PRC 完整重建") + args.resume = False + log(f"[{LAYER_NAME}] 指定 PRC:{', '.join(sorted(selected_prc))}") + drop_existing_prcs(conn, LAYER_NAME, selected_prc) + if selected_fpc is not None: + log(f"[{LAYER_NAME}] 指定 FPC:{selected_fpc}") + if args.reset_layer: + log(f"[{LAYER_NAME}] 清空旧数据并删除 checkpoint ...") + drop_existing_layer(conn, LAYER_NAME) + if checkpoint_path.exists(): + checkpoint_path.unlink() + if current_prc_path.exists(): + current_prc_path.unlink() + + checkpoint = load_resume_state(conn, checkpoint_path, RESUME_JOB_NAME, LAYER_NAME) if args.resume else None + completed_prcs = set(normalize_prc_list(checkpoint.get("completed_prcs", []))) if checkpoint else set() + if checkpoint: + log( + f"[{LAYER_NAME}] 读取断点:" + f"last_prc={checkpoint.get('last_prc')} " + f"completed={len(completed_prcs)} " + f"current_prc={checkpoint.get('current_prc')}" + ) + + log(f"[{LAYER_NAME}] 开始解析渔港源:{fish_source}") + root = load_xml(fish_source) + point_lookup = build_point_lookup(root) + + prc_list = discover_target_prcs(root, selected_prc, selected_fpc) + if not prc_list: + if selected_fpc is not None: + raise SystemExit(f"no fish-port line features selected for FPC={selected_fpc}") + raise SystemExit("no fish-port line features selected") + if selected_fpc is not None: + log(f"[{LAYER_NAME}] 选中 PRC 数量:{len(prc_list)}(由 FPC 反查得到)") + drop_existing_fpc(conn, LAYER_NAME, set(prc_list), selected_fpc) + else: + log(f"[{LAYER_NAME}] 选中 PRC 数量:{len(prc_list)}") + + if selected_prc is not None or selected_fpc is not None: + with conn.cursor() as cur: + for prc in prc_list: + if selected_fpc is not None: + prc_lines = collect_fish_lines_for_prc(root, point_lookup, prc, selected_fpc=selected_fpc) + if not prc_lines: + log(f"[{LAYER_NAME}] PRC={prc} / FPC={selected_fpc} 没有渔港线要素,跳过") + continue + log( + f"[{LAYER_NAME}] PRC={prc} / FPC={selected_fpc} 开始," + f"线要素={len(prc_lines)}" + ) + process_port_group_no_resume( + conn=conn, + cur=cur, + project_root=project_root, + prc=prc, + prc_lines=prc_lines, + args=args, + selected_fpc=selected_fpc, + max_scan_cells=max_scan_cells, + ) + else: + prc_lines = collect_fish_lines_for_prc(root, point_lookup, prc, selected_fpc=None) + if not prc_lines: + log(f"[{LAYER_NAME}] PRC={prc} 没有渔港线要素,跳过") + continue + grouped_lines = group_fish_lines_by_fpc(prc_lines) + log(f"[{LAYER_NAME}] PRC={prc} 开始,FPC 组数={len(grouped_lines)}") + for group_fpc in sorted(grouped_lines.keys()): + group_lines = grouped_lines[group_fpc] + log( + f"[{LAYER_NAME}] PRC={prc} / FPC={group_fpc} 开始," + f"线要素={len(group_lines)}" + ) + process_port_group_no_resume( + conn=conn, + cur=cur, + project_root=project_root, + prc=prc, + prc_lines=group_lines, + args=args, + selected_fpc=group_fpc if group_fpc != "__unknown__" else None, + max_scan_cells=max_scan_cells, + ) + return + + total_inserted = 0 + total_land = 0 + total_sea = 0 + global_cluster_index = 0 + started_at = time.monotonic() + checkpoint_state = checkpoint or { + "job_name": RESUME_JOB_NAME, + "layer_name": LAYER_NAME, + "source_name": str(fish_source), + "status": "running", + "last_prc": None, + "last_cluster_index": -1, + "last_part_index": -1, + "processed_clusters": 0, + "inserted_cells": 0, + "land_cells": 0, + "sea_cells": 0, + "current_prc": None, + "current_prc_started_at": None, + "completed_prcs": [], + "updated_at": None, + } + + resume_prc = checkpoint.get("current_prc") if checkpoint else None + if resume_prc in completed_prcs: + resume_prc = None + resume_prc_index = prc_list.index(resume_prc) if resume_prc in prc_list else None + if args.resume and selected_prc is None: + pending_prcs = [ + prc + for prc in prc_list + if prc not in completed_prcs or prc == resume_prc + ] + if not pending_prcs: + log(f"[{LAYER_NAME}] 所有 PRC 都已完成,resume 不需要继续") + return + prc_list = pending_prcs + resume_prc_index = prc_list.index(resume_prc) if resume_prc in prc_list else None + + with conn.cursor() as cur: + for prc_index, prc in enumerate(prc_list): + if selected_prc is not None and prc not in selected_prc: + continue + if args.resume and selected_prc is None and prc in completed_prcs and prc != resume_prc: + continue + if resume_prc_index is not None and prc_index < resume_prc_index: + continue + if resume_prc is not None and prc == resume_prc and checkpoint and checkpoint.get("last_cluster_index", -1) >= 0: + log( + f"[{LAYER_NAME}] PRC={prc} 从断点恢复," + f"last_cluster_index={checkpoint.get('last_cluster_index')}, " + f"last_part_index={checkpoint.get('last_part_index', -1)}" + ) + prc_lines = collect_fish_lines_for_prc(root, point_lookup, prc, selected_fpc=selected_fpc) + if not prc_lines: + if selected_fpc is not None: + log(f"[{LAYER_NAME}] PRC={prc} / FPC={selected_fpc} 没有渔港线要素,跳过") + else: + log(f"[{LAYER_NAME}] PRC={prc} 没有渔港线要素,跳过") + continue + if selected_fpc is not None: + log( + f"[{LAYER_NAME}] PRC={prc} / FPC={selected_fpc} 开始," + f"线要素={len(prc_lines)},已累计={checkpoint_state['inserted_cells']}" + ) + else: + log(f"[{LAYER_NAME}] PRC={prc} 开始,线要素={len(prc_lines)},已累计={checkpoint_state['inserted_cells']}") + checkpoint_state.update( + { + "status": "running", + "current_prc": prc, + "current_prc_started_at": dt.datetime.now().isoformat(timespec="seconds"), + "completed_prcs": normalize_prc_list(completed_prcs), + "updated_at": dt.datetime.now().isoformat(timespec="seconds"), + } + ) + save_checkpoint(checkpoint_path, checkpoint_state) + write_prc_status( + current_prc_path, + { + "job_name": RESUME_JOB_NAME, + "layer_name": LAYER_NAME, + "status": "running", + "current_prc": prc, + "current_prc_started_at": checkpoint_state["current_prc_started_at"], + "last_prc": checkpoint_state.get("last_prc"), + "completed_prcs": normalize_prc_list(completed_prcs), + "updated_at": checkpoint_state["updated_at"], + **({"fpc": selected_fpc} if selected_fpc is not None else {}), + }, + ) + if selected_fpc is not None: + log(f"[{LAYER_NAME}] PRC={prc} / FPC={selected_fpc} 准备按单港 bbox 裁切海岸线并做缓冲 ...") + else: + log(f"[{LAYER_NAME}] PRC={prc} 准备按单港 bbox 裁切海岸线并做缓冲 ...") + + prc_bboxes = [line.bbox for line in prc_lines] + prc_bbox = ( + min(bb[0] for bb in prc_bboxes), + min(bb[1] for bb in prc_bboxes), + max(bb[2] for bb in prc_bboxes), + max(bb[3] for bb in prc_bboxes), + ) + cluster_groups = cluster_line_indices(prc_bboxes, gap_m=args.cluster_gap_m) + if selected_fpc is not None: + log(f"[{LAYER_NAME}] PRC={prc} / FPC={selected_fpc} cluster 数={len(cluster_groups)}") + else: + log(f"[{LAYER_NAME}] PRC={prc} cluster 数={len(cluster_groups)}") + + if selected_fpc is not None: + log(f"[{LAYER_NAME}] PRC={prc} / FPC={selected_fpc} 正在缓存整港海岸线并生成缓冲区 ...") + else: + log(f"[{LAYER_NAME}] PRC={prc} 正在缓存整县海岸线并生成缓冲区 ...") + try: + prc_coast_lines, prc_coast_bbox = load_coastlines_for_prc( + project_root, + prc, + bbox=( + mercator_x(prc_bbox[0]), + mercator_y(prc_bbox[1]), + mercator_x(prc_bbox[2]), + mercator_y(prc_bbox[3]), + ), + search_margin_m=max(args.coast_buffer_m, args.coast_coarse_margin_m), + ) + except NoCoastlineCurvesError as exc: + if not args.skip_missing_coarse: + raise + status_name = "FPC_SKIPPED_NO_COASTLINE" if selected_fpc is not None else "PRC_SKIPPED_NO_COASTLINE" + insert_progress( + cur, + job_name=RESUME_JOB_NAME, + layer_name=LAYER_NAME, + prc=prc, + status_name=status_name, + cluster_count=len(cluster_groups), + inserted_cells=0, + land_cells=0, + sea_cells=0, + elapsed_sec=0.0, + ) + conn.commit() + if selected_fpc is not None: + log(f"[{LAYER_NAME}] PRC={prc} / FPC={selected_fpc} 未找到海岸线;已按 --skip-missing-coarse 跳过。{exc}") + else: + log(f"[{LAYER_NAME}] PRC={prc} 未找到海岸线;已按 --skip-missing-coarse 跳过。{exc}") + completed_prcs.add(prc) + continue + if selected_fpc is not None: + log( + f"[{LAYER_NAME}] PRC={prc} / FPC={selected_fpc} 海岸线缓存完成," + f"曲线数={len(prc_coast_lines)} bbox={prc_coast_bbox}" + ) + else: + log( + f"[{LAYER_NAME}] PRC={prc} 海岸线缓存完成," + f"曲线数={len(prc_coast_lines)} bbox={prc_coast_bbox}" + ) + geom_start = time.monotonic() + log(f"[{LAYER_NAME}] PRC={prc} 正在合并海岸线几何 ...") + prc_coast_geom = unary_union(prc_coast_lines) + geom_elapsed = time.monotonic() - geom_start + log(f"[{LAYER_NAME}] PRC={prc} 海岸线合并完成 elapsed={geom_elapsed:.2f}s,开始 buffer ...") + buffer_start = time.monotonic() + prc_coast_buffer = prc_coast_geom.buffer(args.coast_buffer_m, cap_style=2, join_style=2) + buffer_elapsed = time.monotonic() - buffer_start + log( + f"[{LAYER_NAME}] PRC={prc} 海岸线 buffer 完成 elapsed={buffer_elapsed:.2f}s " + f"buffer={args.coast_buffer_m:g}m" + ) + prc_coast_prepared = prep(prc_coast_buffer) + if selected_fpc is not None: + log(f"[{LAYER_NAME}] PRC={prc} / FPC={selected_fpc} 海岸缓冲缓存完成,开始处理各 part ...") + else: + log(f"[{LAYER_NAME}] PRC={prc} 海岸缓冲缓存完成,开始处理各 part ...") + + resume_cluster = 0 + if checkpoint and checkpoint.get("last_prc") == prc: + resume_cluster = int(checkpoint.get("last_cluster_index", -1)) + 1 + + prc_started_at = time.monotonic() + prc_inserted_before = checkpoint_state["inserted_cells"] + prc_land_before = checkpoint_state["land_cells"] + prc_sea_before = checkpoint_state["sea_cells"] + selected_port_rows: dict[str, tuple] | None = {} if selected_fpc is not None else None + selected_port_coarse_windows: set[tuple[float, float, float, float]] | None = set() if selected_fpc is not None else None + prc_profile = { + "tile_checked": 0, + "tile_hit": 0, + "row_checked": 0, + "row_hit": 0, + "mask_row_hit": 0, + "candidate_cells": 0, + "precise_cell_checks": 0, + "precise_hits": 0, + } + + for cluster_idx, cluster in enumerate(cluster_groups): + global_cluster_index += 1 + if checkpoint and checkpoint.get("last_prc") == prc and cluster_idx < resume_cluster: + continue + log(f"[{LAYER_NAME}] PRC={prc} cluster={cluster_idx + 1}/{len(cluster_groups)} 开始,成员={len(cluster)}") + log(f"[{LAYER_NAME}] PRC={prc} cluster={cluster_idx + 1} 正在合并渔港线 ...") + + cluster_lines = [ + LineString([(mercator_x(lon), mercator_y(lat)) for lon, lat in prc_lines[i].coords]) + for i in cluster + ] + merged = unary_union(cluster_lines) + polygons = list(polygonize(merged)) + if polygons: + fish_geom = unary_union(polygons) + geom_mode = "polygonize" + else: + fish_geom = merged.buffer(args.cell_size_m, cap_style=2, join_style=2) + geom_mode = "buffer" + if fish_geom.is_empty: + log(f"[{LAYER_NAME}] PRC={prc} cluster={cluster_idx} 为空,跳过") + continue + log(f"[{LAYER_NAME}] PRC={prc} cluster={cluster_idx + 1} 几何模式={geom_mode},正在生成格网 ...") + + fish_parts = [part for part in get_parts(fish_geom) if not part.is_empty] + if not fish_parts: + log(f"[{LAYER_NAME}] PRC={prc} cluster={cluster_idx + 1} 没有可拆分部件,跳过") + continue + + resume_part = 0 + if checkpoint and checkpoint.get("last_prc") == prc and checkpoint.get("last_cluster_index") == cluster_idx: + resume_part = int(checkpoint.get("last_part_index", -1)) + 1 + + for part_idx, fish_part in enumerate(fish_parts): + if checkpoint and checkpoint.get("last_prc") == prc and checkpoint.get("last_cluster_index") == cluster_idx and part_idx < resume_part: + continue + + fish_bbox = fish_part.bounds + scan_windows: list[object] = [] + part_coarse_windows = load_coarse_windows_for_bbox( + conn, + layer_name=COAST_COARSE_LAYER, + bbox_mercator=fish_bbox, + margin_m=args.coast_coarse_margin_m, + ) + if part_coarse_windows: + log( + f"[{LAYER_NAME}] PRC={prc} cluster={cluster_idx + 1}/{len(cluster_groups)} " + f"part={part_idx + 1}/{len(fish_parts)} 取回 coast_200m 格子={len(part_coarse_windows)}" + ) + for coarse_window in part_coarse_windows: + window_geom = box(*coarse_window) + scan_windows.append(window_geom) + if selected_port_coarse_windows is not None: + selected_port_coarse_windows.add(tuple(float(v) for v in coarse_window)) + if not scan_windows: + if args.allow_unbounded_fallback: + scan_windows = [fish_part] + log( + f"[{LAYER_NAME}] PRC={prc} cluster={cluster_idx + 1}/{len(cluster_groups)} " + f"part={part_idx + 1}/{len(fish_parts)} 没有有效 coast_200m 交集,已允许回退原始范围" + ) + else: + message = ( + f"[{LAYER_NAME}] PRC={prc} cluster={cluster_idx + 1}/{len(cluster_groups)} " + f"part={part_idx + 1}/{len(fish_parts)} 没有有效 coast_200m 交集;" + f"fish_bbox={tuple(round(v, 3) for v in fish_bbox)} " + f"coarse_windows={len(part_coarse_windows)}。" + ) + if args.skip_missing_coarse: + log(message + "已按 --skip-missing-coarse 跳过") + continue + raise RuntimeError( + message + + "按当前设计这属于异常:渔港 20m 必须以数据库 coast_200m 为底盘。" + + "如确需旧式整片扫描请显式加 --allow-unbounded-fallback;" + + "如确认允许漏算该 part,请显式加 --skip-missing-coarse。" + ) + + log( + f"[{LAYER_NAME}] PRC={prc} cluster={cluster_idx + 1}/{len(cluster_groups)} " + f"part={part_idx + 1}/{len(fish_parts)} 实际扫描交集窗口={len(scan_windows)}" + ) + if selected_fpc is not None: + log( + f"[{LAYER_NAME}] PRC={prc} / FPC={selected_fpc} cluster={cluster_idx + 1}/{len(cluster_groups)} " + f"part={part_idx + 1}/{len(fish_parts)} bbox={fish_bbox} 使用海岸线缓存 ..." + ) + else: + log( + f"[{LAYER_NAME}] PRC={prc} cluster={cluster_idx + 1}/{len(cluster_groups)} " + f"part={part_idx + 1}/{len(fish_parts)} bbox={fish_bbox} 使用 part 级海岸线缓存 ..." + ) + coast_prepared = prc_coast_prepared + log(f"[{LAYER_NAME}] PRC={prc} cluster={cluster_idx + 1} part={part_idx + 1} 开始格网 ...") + land_count = 0 + sea_count = 0 + bbox_lonlat = (float("inf"), float("inf"), float("-inf"), float("-inf")) + profile = {key: 0 for key in prc_profile} + part_inserted = 0 + batch: list[tuple] = [] + + for window_idx, scan_geom in enumerate(scan_windows): + if scan_geom.is_empty: + continue + log( + f"[{LAYER_NAME}] PRC={prc} cluster={cluster_idx + 1}/{len(cluster_groups)} " + f"part={part_idx + 1}/{len(fish_parts)} window={window_idx + 1}/{len(scan_windows)} " + f"正在生成格网 ..." + ) + window_rows, window_land, window_sea, window_bbox, window_profile = build_cells_for_geometry( + scan_geom, + coast_prepared, + prc=prc, + cell_size_m=args.cell_size_m, + scan_tile_m=args.cell_size_m * 10.0, + source_name=( + f"C09-06+coastline PRC={prc}" + + (f" FPC={selected_fpc}" if selected_fpc is not None else "") + ), + max_scan_cells=max_scan_cells, + ) + land_count += window_land + sea_count += window_sea + bbox_lonlat = ( + min(bbox_lonlat[0], window_bbox[0]), + min(bbox_lonlat[1], window_bbox[1]), + max(bbox_lonlat[2], window_bbox[2]), + max(bbox_lonlat[3], window_bbox[3]), + ) + for key in prc_profile: + prc_profile[key] += window_profile[key] + profile[key] += window_profile[key] + + for row in window_rows: + if selected_port_rows is not None: + selected_port_rows[row[1]] = row + batch.append(row) + if len(batch) >= args.commit_every: + if selected_fpc is not None: + delete_cells_by_ids(conn, LAYER_NAME, [item[1] for item in batch]) + insert_cells(cur, batch) + conn.commit() + part_inserted += len(batch) + total_inserted += len(batch) + checkpoint_state["inserted_cells"] += len(batch) + checkpoint_state["updated_at"] = dt.datetime.now().isoformat(timespec="seconds") + log( + f"[{LAYER_NAME}] PRC={prc} cluster={cluster_idx + 1}/{len(cluster_groups)} " + f"part={part_idx + 1}/{len(fish_parts)} " + f"提交={part_inserted} 累计={checkpoint_state['inserted_cells']} " + f"coast={checkpoint_state['land_cells']} off_coast={checkpoint_state['sea_cells']}" + ) + batch.clear() + + if batch: + if selected_fpc is not None: + delete_cells_by_ids(conn, LAYER_NAME, [item[1] for item in batch]) + insert_cells(cur, batch) + conn.commit() + part_inserted += len(batch) + total_inserted += len(batch) + checkpoint_state["inserted_cells"] += len(batch) + checkpoint_state["updated_at"] = dt.datetime.now().isoformat(timespec="seconds") + log( + f"[{LAYER_NAME}] PRC={prc} cluster={cluster_idx + 1}/{len(cluster_groups)} " + f"part={part_idx + 1}/{len(fish_parts)} " + f"提交={part_inserted} 累计={checkpoint_state['inserted_cells']} " + f"coast={checkpoint_state['land_cells']} off_coast={checkpoint_state['sea_cells']}" + ) + + if part_inserted == 0: + log( + f"[{LAYER_NAME}] PRC={prc} cluster={cluster_idx + 1} " + f"part={part_idx + 1} 没有生成 cell" + ) + checkpoint_state.update( + { + "last_prc": prc, + "last_cluster_index": cluster_idx, + "last_part_index": part_idx, + "processed_clusters": checkpoint_state["processed_clusters"] + 1, + "updated_at": dt.datetime.now().isoformat(timespec="seconds"), + } + ) + save_checkpoint(checkpoint_path, checkpoint_state) + continue + if selected_fpc is not None: + log( + f"[{LAYER_NAME}] PRC={prc} / FPC={selected_fpc} cluster={cluster_idx + 1} " + f"part={part_idx + 1} 格网完成,cell={part_inserted} coast={land_count} off_coast={sea_count} bbox={bbox_lonlat}" + ) + log( + f"[{LAYER_NAME}] PRC={prc} / FPC={selected_fpc} cluster={cluster_idx + 1} " + f"part={part_idx + 1} 写库完成" + ) + else: + log( + f"[{LAYER_NAME}] PRC={prc} cluster={cluster_idx + 1} " + f"part={part_idx + 1} 格网完成,cell={part_inserted} coast={land_count} off_coast={sea_count} bbox={bbox_lonlat}" + ) + log(f"[{LAYER_NAME}] PRC={prc} cluster={cluster_idx + 1} part={part_idx + 1} 写库完成") + checkpoint_state.update( + { + "last_prc": prc, + "last_cluster_index": cluster_idx, + "last_part_index": part_idx, + "processed_clusters": checkpoint_state["processed_clusters"] + 1, + "land_cells": checkpoint_state["land_cells"] + land_count, + "sea_cells": checkpoint_state["sea_cells"] + sea_count, + "current_prc": prc, + "completed_prcs": normalize_prc_list(completed_prcs | {prc}), + "updated_at": dt.datetime.now().isoformat(timespec="seconds"), + } + ) + save_checkpoint(checkpoint_path, checkpoint_state) + write_prc_status( + current_prc_path, + { + "job_name": RESUME_JOB_NAME, + "layer_name": LAYER_NAME, + "status": "running", + "current_prc": prc, + "current_prc_started_at": checkpoint_state.get("current_prc_started_at"), + "last_prc": prc, + "last_cluster_index": cluster_idx, + "last_part_index": part_idx, + "completed_prcs": normalize_prc_list(completed_prcs | {prc}), + "inserted_cells": checkpoint_state["inserted_cells"], + "land_cells": checkpoint_state["land_cells"], + "sea_cells": checkpoint_state["sea_cells"], + "updated_at": checkpoint_state["updated_at"], + **({"fpc": selected_fpc} if selected_fpc is not None else {}), + }, + ) + total_land += land_count + total_sea += sea_count + + prc_elapsed = time.monotonic() - prc_started_at + prc_inserted_now = checkpoint_state["inserted_cells"] - prc_inserted_before + prc_land_now = checkpoint_state["land_cells"] - prc_land_before + prc_sea_now = checkpoint_state["sea_cells"] - prc_sea_before + summary_inserted = len(selected_port_rows) if selected_port_rows is not None else prc_inserted_now + summary_coarse = len(selected_port_coarse_windows) if selected_port_coarse_windows is not None else 0 + insert_progress( + cur, + job_name="fish_port_20m_full_mysql_resume", + layer_name=LAYER_NAME, + prc=prc, + status_name="FPC_DONE" if selected_fpc is not None else "PRC_DONE", + cluster_count=len(cluster_groups), + inserted_cells=summary_inserted, + land_cells=prc_land_now, + sea_cells=prc_sea_now, + elapsed_sec=prc_elapsed, + ) + conn.commit() + cur.execute( + """ + INSERT INTO navsea_grid_import_state + (job_name, layer_name, source_name, checkpoint_json) + VALUES + (%s, %s, %s, %s) + ON DUPLICATE KEY UPDATE + layer_name=VALUES(layer_name), + source_name=VALUES(source_name), + checkpoint_json=VALUES(checkpoint_json) + """, + ( + RESUME_JOB_NAME, + LAYER_NAME, + str(fish_source), + json.dumps(checkpoint_state, ensure_ascii=False), + ), + ) + conn.commit() + if selected_fpc is not None: + log( + f"[{LAYER_NAME}] PRC={prc} / FPC={selected_fpc} 完成 cluster={len(cluster_groups)} " + f"200x200={summary_coarse} final_20x20={summary_inserted} " + f"coast={prc_land_now} off_coast={prc_sea_now} elapsed={prc_elapsed:.1f}s" + ) + else: + log( + f"[{LAYER_NAME}] PRC={prc} 完成 cluster={len(cluster_groups)} " + f"本段写入={prc_inserted_now} coast={prc_land_now} off_coast={prc_sea_now} " + f"elapsed={prc_elapsed:.1f}s" + ) + log( + f"[{LAYER_NAME}] PRC={prc} profiling " + f"tile={prc_profile['tile_hit']}/{prc_profile['tile_checked']} " + f"row={prc_profile['row_hit']}/{prc_profile['row_checked']} " + f"mask_row={prc_profile['mask_row_hit']} " + f"candidate={prc_profile['candidate_cells']} " + f"precise={prc_profile['precise_hits']}/{prc_profile['precise_cell_checks']}" + ) + + completed_prcs.add(prc) + checkpoint_state["completed_prcs"] = normalize_prc_list(completed_prcs) + checkpoint_state["status"] = "idle" + checkpoint_state["current_prc"] = prc + checkpoint_state["current_prc_started_at"] = checkpoint_state.get("current_prc_started_at") + checkpoint_state["updated_at"] = dt.datetime.now().isoformat(timespec="seconds") + save_checkpoint(checkpoint_path, checkpoint_state) + write_prc_status( + current_prc_path, + { + "job_name": RESUME_JOB_NAME, + "layer_name": LAYER_NAME, + "status": "done", + "current_prc": prc, + "current_prc_started_at": checkpoint_state.get("current_prc_started_at"), + "completed_prcs": normalize_prc_list(completed_prcs), + "finished_at": checkpoint_state["updated_at"], + "updated_at": checkpoint_state["updated_at"], + **({"fpc": selected_fpc, "coarse_200m_intersections": summary_coarse, "final_20x20_cells": summary_inserted} if selected_fpc is not None else {}), + }, + ) + + del prc_lines + + cur.execute("SELECT COUNT(*) FROM navsea_fish_port_grid_cell WHERE layer_name=%s", (LAYER_NAME,)) + final_count = int(cur.fetchone()[0]) + cur.execute( + """ + SELECT MIN(min_lon), MIN(min_lat), MAX(max_lon), MAX(max_lat) + FROM navsea_fish_port_grid_cell + WHERE layer_name=%s + """, + (LAYER_NAME,), + ) + bbox_row = cur.fetchone() + bbox = ( + float(bbox_row[0]) if bbox_row and bbox_row[0] is not None else float("inf"), + float(bbox_row[1]) if bbox_row and bbox_row[1] is not None else float("inf"), + float(bbox_row[2]) if bbox_row and bbox_row[2] is not None else float("-inf"), + float(bbox_row[3]) if bbox_row and bbox_row[3] is not None else float("-inf"), + ) + upsert_meta( + cur, + LAYER_NAME, + "全国渔港 20m 可航/不可航格", + "coastline/C09-06.zip + navsea_japan_coast_grid.coast_200m", + args.cell_size_m, + final_count, + bbox, + None, + ) + cur.execute( + """ + INSERT INTO navsea_grid_import_state + (job_name, layer_name, source_name, checkpoint_json) + VALUES + (%s, %s, %s, %s) + ON DUPLICATE KEY UPDATE + layer_name=VALUES(layer_name), + source_name=VALUES(source_name), + checkpoint_json=VALUES(checkpoint_json) + """, + ( + RESUME_JOB_NAME, + LAYER_NAME, + str(fish_source), + json.dumps(checkpoint_state, ensure_ascii=False), + ), + ) + conn.commit() + + log(f"[{LAYER_NAME}] 完成,checkpoint={checkpoint_path}") + finally: + conn.close() + + +if __name__ == "__main__": + main() diff --git a/coastline/navgrid_v2/build_hazard_50m_mysql.py b/coastline/navgrid_v2/build_hazard_50m_mysql.py new file mode 100644 index 0000000..5f31c2c --- /dev/null +++ b/coastline/navgrid_v2/build_hazard_50m_mysql.py @@ -0,0 +1,597 @@ +#!/usr/bin/env python3 +from __future__ import annotations + +import argparse +import datetime as dt +import json +import math +from pathlib import Path +from typing import Iterable + +import mapbox_vector_tile +import pymysql +from shapely.geometry import box, shape +from shapely.prepared import prep + + +DB_NAME = "navsea_japan_coast_grid" +DB_USER = "root" +DB_PASSWORD = "2chi9ks2" +DB_HOST = "localhost" +DB_SOCKET = "/tmp/mysql.sock" + +DEFAULT_TILE_ROOT = Path("/home/wwwroot/pbf-delivery-full-20260418-rebuild") +DEFAULT_TILE_Z = 12 +DEFAULT_OUT_DIR = "src/pbf/coastline-mysql-v2/national" +DEFAULT_SOURCE_DESC = "pbf-delivery-full-20260418-rebuild z12" + +HAZARD_CELL_M = 50.0 +HAZARD_LAYER_NAME = "hazard_50m" +HAZARD_DESCRIPTION = "全国 PBF 海上障碍 50m 黄格(排除沙波/急潮波纹/涡流/海草)" +HAZARD_LAYERS = ( + "navigation_hazard_area", + "fixed_fishing_gear_area", + "anchor_caution_hazard_area", + "navigation_hazard_point", + "anchor_caution_hazard_point", + "navigation_marks", +) +BREAKWATER_LAYER = "baseline_area" +POINT_LAYERS = { + "navigation_hazard_point", + "anchor_caution_hazard_point", + "navigation_marks", +} +HAZARD_CANONICAL_OBJECT_TYPES = { + "breakwater", +} +EXCLUDED_HAZARD_CLASS_CODES = {421, 422, 424, 425} +EXCLUDED_HAZARD_SEMANTICS = { + "sand_wave", + "tide_rips_overfalls", + "eddy_whirlpool", + "seaweed", + "seagrass", +} +EXCLUDED_HAZARD_ICON_KEYS = { + "symbol-daytime-421", + "symbol-daytime-422", + "symbol-daytime-424", + "symbol-daytime-425", +} +EXCLUDED_HAZARD_CLASS_NAMES = { + "サンドウェーブ", + "急潮・波紋・激潮", + "渦流", + "海草", +} + +RADIUS = 6378137.0 +MAX_MERCATOR_LAT = 85.0511287798066 + + +def log(message: str) -> None: + print(f"[{dt.datetime.now().isoformat(timespec='seconds')}] {message}", flush=True) + + +def mercator_x(lon: float) -> float: + return RADIUS * math.radians(lon) + + +def mercator_y(lat: float) -> float: + lat = max(min(lat, MAX_MERCATOR_LAT), -MAX_MERCATOR_LAT) + return RADIUS * math.log(math.tan(math.pi / 4.0 + math.radians(lat) / 2.0)) + + +def lon_from_mercator(x: float) -> float: + return math.degrees(x / RADIUS) + + +def lat_from_mercator(y: float) -> float: + return math.degrees(2.0 * math.atan(math.exp(y / RADIUS)) - math.pi / 2.0) + + +def rect_geojson(min_lon: float, min_lat: float, max_lon: float, max_lat: float) -> dict: + return { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [min_lon, min_lat], + [max_lon, min_lat], + [max_lon, max_lat], + [min_lon, max_lat], + [min_lon, min_lat], + ] + ], + }, + } + + +def local_name(tag: str) -> str: + return tag.split("}", 1)[-1] + + +def load_json(path: Path) -> dict: + return json.loads(path.read_text(encoding="utf-8")) + + +def stream_geojson(path: Path, features: Iterable[dict]) -> int: + path.parent.mkdir(parents=True, exist_ok=True) + count = 0 + with path.open("w", encoding="utf-8") as fh: + fh.write('{"type":"FeatureCollection","features":[\n') + first = True + for feature in features: + if not first: + fh.write(",\n") + fh.write(json.dumps(feature, ensure_ascii=False)) + first = False + count += 1 + fh.write("\n]}\n") + return count + + +def mysql_connect(database: str | None = None): + kwargs = { + "host": DB_HOST, + "user": DB_USER, + "password": DB_PASSWORD, + "charset": "utf8mb4", + "autocommit": False, + "cursorclass": pymysql.cursors.Cursor, + } + if DB_SOCKET: + kwargs["unix_socket"] = DB_SOCKET + if database: + kwargs["database"] = database + return pymysql.connect(**kwargs) + + +def ensure_database(name: str) -> None: + conn = mysql_connect() + try: + with conn.cursor() as cur: + cur.execute( + f"CREATE DATABASE IF NOT EXISTS `{name}` " + "DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci" + ) + conn.commit() + finally: + conn.close() + + +def ensure_schema(conn) -> None: + stmts = [ + """ + CREATE TABLE IF NOT EXISTS navsea_hazard_grid_layer_meta ( + layer_name VARCHAR(32) NOT NULL PRIMARY KEY, + description VARCHAR(255) NOT NULL, + source_desc TEXT NOT NULL, + cell_size_m DOUBLE NOT NULL, + feature_count BIGINT NOT NULL, + bbox_min_lon DOUBLE NOT NULL, + bbox_min_lat DOUBLE NOT NULL, + bbox_max_lon DOUBLE NOT NULL, + bbox_max_lat DOUBLE NOT NULL, + export_file VARCHAR(255) DEFAULT NULL, + created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 + """, + """ + CREATE TABLE IF NOT EXISTS navsea_hazard_grid_cell ( + id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + layer_name VARCHAR(32) NOT NULL, + cell_id VARCHAR(64) NOT NULL, + row_idx INT NOT NULL, + col_idx INT NOT NULL, + cell_size_m DOUBLE NOT NULL, + state_name VARCHAR(32) NOT NULL, + class_name VARCHAR(32) NOT NULL, + source_name VARCHAR(191) NOT NULL, + min_lon DOUBLE NOT NULL, + min_lat DOUBLE NOT NULL, + max_lon DOUBLE NOT NULL, + max_lat DOUBLE NOT NULL, + created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + UNIQUE KEY uniq_layer_cell (layer_name, cell_id), + KEY idx_layer_source (layer_name, source_name), + KEY idx_layer_state (layer_name, state_name), + KEY idx_layer_rowcol (layer_name, row_idx, col_idx) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 + """, + ] + with conn.cursor() as cur: + for stmt in stmts: + cur.execute(stmt) + cur.execute( + """ + SELECT INDEX_NAME, COLUMN_NAME, SEQ_IN_INDEX + FROM information_schema.STATISTICS + WHERE TABLE_SCHEMA=%s AND TABLE_NAME='navsea_hazard_grid_cell' + ORDER BY INDEX_NAME, SEQ_IN_INDEX + """, + (DB_NAME,), + ) + index_columns: dict[str, list[str]] = {} + for index_name, column_name, _seq in cur.fetchall(): + index_columns.setdefault(index_name, []).append(column_name) + if index_columns.get("idx_layer_source") != ["layer_name", "source_name"]: + if "idx_layer_source" in index_columns: + cur.execute("ALTER TABLE navsea_hazard_grid_cell DROP INDEX idx_layer_source") + cur.execute("ALTER TABLE navsea_hazard_grid_cell ADD KEY idx_layer_source (layer_name, source_name)") + conn.commit() + + +def replace_layer_rows(conn, layer_name: str) -> None: + with conn.cursor() as cur: + cur.execute("DELETE FROM navsea_hazard_grid_cell WHERE layer_name=%s", (layer_name,)) + cur.execute("DELETE FROM navsea_hazard_grid_layer_meta WHERE layer_name=%s", (layer_name,)) + conn.commit() + + +def insert_cells(cur, rows: list[tuple]) -> None: + cur.executemany( + """ + INSERT INTO navsea_hazard_grid_cell + (layer_name, cell_id, row_idx, col_idx, cell_size_m, state_name, class_name, source_name, + min_lon, min_lat, max_lon, max_lat) + VALUES + (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s) + """, + rows, + ) + + +def upsert_meta( + cur, + *, + layer_name: str, + description: str, + source_desc: str, + cell_size_m: float, + feature_count: int, + bbox: tuple[float, float, float, float], + export_file: str, +) -> None: + cur.execute( + """ + INSERT INTO navsea_hazard_grid_layer_meta + (layer_name, description, source_desc, cell_size_m, feature_count, + bbox_min_lon, bbox_min_lat, bbox_max_lon, bbox_max_lat, export_file) + VALUES + (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s) + ON DUPLICATE KEY UPDATE + description=VALUES(description), + source_desc=VALUES(source_desc), + cell_size_m=VALUES(cell_size_m), + feature_count=VALUES(feature_count), + bbox_min_lon=VALUES(bbox_min_lon), + bbox_min_lat=VALUES(bbox_min_lat), + bbox_max_lon=VALUES(bbox_max_lon), + bbox_max_lat=VALUES(bbox_max_lat), + export_file=VALUES(export_file) + """, + ( + layer_name, + description, + source_desc, + cell_size_m, + feature_count, + bbox[0], + bbox[1], + bbox[2], + bbox[3], + export_file, + ), + ) + + +def tile_mercator_bounds(z: int, x: int, y: int) -> tuple[float, float, float, float]: + n = 2**z + lon_left = x / n * 360.0 - 180.0 + lon_right = (x + 1) / n * 360.0 - 180.0 + lat_top = math.degrees(math.atan(math.sinh(math.pi * (1 - 2 * y / n)))) + lat_bottom = math.degrees(math.atan(math.sinh(math.pi * (1 - 2 * (y + 1) / n)))) + return mercator_x(lon_left), mercator_y(lat_bottom), mercator_x(lon_right), mercator_y(lat_top) + + +def transform_geom_from_tile(geom, bounds_m: tuple[float, float, float, float], extent: int): + minx, miny, maxx, maxy = bounds_m + dx = maxx - minx + dy = maxy - miny + + def coord(x: float, y: float): + mx = minx + (x / extent) * dx + my = miny + (y / extent) * dy + return mx, my + + def walk(obj): + if isinstance(obj[0], (int, float)): + return coord(obj[0], obj[1]) + return [walk(item) for item in obj] + + return walk(geom) + + +def iter_source_tiles(tile_root: Path, zoom: int) -> list[Path]: + zoom_root = tile_root / str(zoom) + if not zoom_root.exists(): + raise SystemExit(f"missing tile zoom root: {zoom_root}") + return sorted(zoom_root.glob("*/*.pbf")) + + +def int_prop(value) -> int | None: + if isinstance(value, bool): + return None + if isinstance(value, int): + return value + if isinstance(value, str) and value.isdigit(): + return int(value) + return None + + +def is_excluded_hazard_feature(props: dict) -> bool: + class_code = int_prop(props.get("class_code") or props.get("分類番号")) + if class_code in EXCLUDED_HAZARD_CLASS_CODES: + return True + + semantic_values = { + str(value) + for value in ( + props.get("canonical_object_type"), + props.get("chart_symbol_code"), + props.get("chart_icon_image"), + props.get("icon"), + props.get("class_name"), + ) + if value is not None + } + if semantic_values & EXCLUDED_HAZARD_SEMANTICS: + return True + if semantic_values & EXCLUDED_HAZARD_ICON_KEYS: + return True + if semantic_values & EXCLUDED_HAZARD_CLASS_NAMES: + return True + return False + + +def iter_hazard_cells(tile_root: Path, zoom: int) -> Iterable[tuple[int, int, str]]: + hazard_cells: dict[tuple[int, int], str] = {} + tiles = iter_source_tiles(tile_root, zoom) + for index, p in enumerate(tiles, start=1): + try: + tx = int(p.parent.name) + ty = int(p.stem) + except ValueError: + continue + try: + tile = mapbox_vector_tile.decode(p.read_bytes()) + except Exception as exc: + log(f"[hazard_50m] 跳过无法解析的 tile: {p} ({exc.__class__.__name__})") + continue + + if index % 5000 == 0: + log(f"[hazard_50m] 已扫描 tile {index}/{len(tiles)}: {p.parent.parent.name}/{tx}/{ty}.pbf") + + for layer_name in HAZARD_LAYERS + (BREAKWATER_LAYER,): + layer = tile.get(layer_name) + if not layer: + continue + extent = int(layer.get("extent") or 1048576) + minx, miny, maxx, maxy = tile_mercator_bounds(zoom, tx, ty) + for feature in layer.get("features", []): + props = feature.get("properties") or {} + fid = feature.get("id", props.get("fid")) + fid_text = str(fid) if fid is not None else f"{layer_name}:{tx}:{ty}:{len(hazard_cells)}" + if layer_name == BREAKWATER_LAYER and props.get("canonical_object_type") not in HAZARD_CANONICAL_OBJECT_TYPES: + continue + if is_excluded_hazard_feature(props): + continue + if ( + props.get("canonical_object_type") == "fish_reef" + or props.get("chart_symbol_code") == "fish_reef" + or props.get("class_name") == "魚礁" + ): + continue + geom = feature.get("geometry") or {} + coords = geom.get("coordinates") + if not coords: + continue + shp_coords = transform_geom_from_tile(coords, (minx, miny, maxx, maxy), extent) + shp = shape({"type": geom.get("type"), "coordinates": shp_coords}) + if shp.is_empty: + continue + if layer_name in POINT_LAYERS: + shp = shp.buffer(25.0) + minx2, miny2, maxx2, maxy2 = shp.bounds + start_x = math.floor(minx2 / HAZARD_CELL_M) * HAZARD_CELL_M + start_y = math.floor(miny2 / HAZARD_CELL_M) * HAZARD_CELL_M + end_x = math.ceil(maxx2 / HAZARD_CELL_M) * HAZARD_CELL_M + end_y = math.ceil(maxy2 / HAZARD_CELL_M) * HAZARD_CELL_M + prep_geom = prep(shp) + cy = start_y + while cy < end_y: + cx = start_x + while cx < end_x: + cell = box(cx, cy, cx + HAZARD_CELL_M, cy + HAZARD_CELL_M) + if prep_geom.intersects(cell): + key = (int(round(cx / HAZARD_CELL_M)), int(round(cy / HAZARD_CELL_M))) + hazard_cells.setdefault(key, fid_text) + cx += HAZARD_CELL_M + cy += HAZARD_CELL_M + return sorted(((ix, iy, fid) for (ix, iy), fid in hazard_cells.items()), key=lambda item: (item[1], item[0], item[2])) + + +def cell_bbox_from_mercator(ix: int, iy: int, cell_m: float) -> tuple[float, float, float, float]: + minx = ix * cell_m + miny = iy * cell_m + maxx = minx + cell_m + maxy = miny + cell_m + return ( + lon_from_mercator(minx), + lat_from_mercator(miny), + lon_from_mercator(maxx), + lat_from_mercator(maxy), + ) + + +def import_hazard_layer( + conn, + *, + layer_name: str, + description: str, + source_desc: str, + cell_size_m: float, + tile_root: Path, + zoom: int, + export_path: Path, +) -> tuple[int, tuple[float, float, float, float]]: + cells = iter_hazard_cells(tile_root, zoom) + batch: list[tuple] = [] + count = 0 + export_bbox = [float("inf"), float("inf"), float("-inf"), float("-inf")] + + with conn.cursor() as cur: + log(f"[{layer_name}] 开始扫描全国 PBF 危险层:{tile_root} / z{zoom}") + with export_path.open("w", encoding="utf-8") as fh: + fh.write('{"type":"FeatureCollection","features":[\n') + first = True + for ix, iy, fid in cells: + min_lon, min_lat, max_lon, max_lat = cell_bbox_from_mercator(ix, iy, cell_size_m) + export_bbox[0] = min(export_bbox[0], min_lon) + export_bbox[1] = min(export_bbox[1], min_lat) + export_bbox[2] = max(export_bbox[2], max_lon) + export_bbox[3] = max(export_bbox[3], max_lat) + cell_id = f"{ix}:{iy}" + batch.append( + ( + layer_name, + cell_id, + iy, + ix, + cell_size_m, + "HAZARD_50M", + "HAZARD", + fid, + min_lon, + min_lat, + max_lon, + max_lat, + ) + ) + feature = { + "type": "Feature", + "properties": { + "layer_name": layer_name, + "cell_id": cell_id, + "row": iy, + "col": ix, + "cell_size_m": cell_size_m, + "state_name": "HAZARD_50M", + "class_name": "HAZARD", + "source_name": fid, + }, + "geometry": rect_geojson(min_lon, min_lat, max_lon, max_lat)["geometry"], + } + if not first: + fh.write(",\n") + fh.write(json.dumps(feature, ensure_ascii=False)) + first = False + count += 1 + if len(batch) >= 5000: + insert_cells(cur, batch) + conn.commit() + batch.clear() + if count % 20000 == 0: + log(f"[{layer_name}] 已处理 {count} 个格子 ...") + if batch: + insert_cells(cur, batch) + conn.commit() + fh.write("\n]}\n") + + if count == 0: + raise RuntimeError(f"{layer_name} 扫描结果为空,请检查 tile_root={tile_root} zoom={zoom}") + + log(f"[{layer_name}] 导入完成:{count} 条,导出 {export_path}") + return count, (export_bbox[0], export_bbox[1], export_bbox[2], export_bbox[3]) + + +def parse_args() -> argparse.Namespace: + parser = argparse.ArgumentParser(description="重算全国 50x50 海上障碍格并写入统一 MySQL 库。") + parser.add_argument("--db-name", default=DB_NAME, help="MySQL 数据库名") + parser.add_argument("--tile-root", type=Path, default=DEFAULT_TILE_ROOT, help="全国 PBF 根目录") + parser.add_argument("--zoom", type=int, default=DEFAULT_TILE_Z, help="PBF 瓦片 zoom,默认 12") + parser.add_argument("--out-dir", default=DEFAULT_OUT_DIR, help="GeoJSON 输出目录") + parser.add_argument("--source-desc", default=DEFAULT_SOURCE_DESC, help="写入元数据的来源说明") + return parser.parse_args() + + +def main() -> None: + args = parse_args() + + project_root = Path(__file__).resolve().parent.parent.parent + out_dir = Path(args.out_dir) + if not out_dir.is_absolute(): + out_dir = project_root / out_dir + out_dir.mkdir(parents=True, exist_ok=True) + + ensure_database(args.db_name) + conn = mysql_connect(args.db_name) + try: + log(f"数据库 {args.db_name} 已连接,准备初始化表结构 ...") + ensure_schema(conn) + replace_layer_rows(conn, HAZARD_LAYER_NAME) + + hazard_export = out_dir / "hazard_50m_grid.geojson" + hazard_count, hazard_bbox = import_hazard_layer( + conn, + layer_name=HAZARD_LAYER_NAME, + description=HAZARD_DESCRIPTION, + source_desc=args.source_desc, + cell_size_m=HAZARD_CELL_M, + tile_root=args.tile_root, + zoom=args.zoom, + export_path=hazard_export, + ) + + with conn.cursor() as cur: + upsert_meta( + cur, + layer_name=HAZARD_LAYER_NAME, + description=HAZARD_DESCRIPTION, + source_desc=args.source_desc, + cell_size_m=HAZARD_CELL_M, + feature_count=hazard_count, + bbox=hazard_bbox, + export_file=str(hazard_export.relative_to(project_root)), + ) + conn.commit() + + manifest = { + "database": args.db_name, + "generated_at": dt.datetime.now().isoformat(timespec="seconds"), + "layer": { + "name": HAZARD_LAYER_NAME, + "count": hazard_count, + "bbox_lonlat": list(hazard_bbox), + "cell_size_m": HAZARD_CELL_M, + "export_file": str(hazard_export.relative_to(project_root)), + "source_desc": args.source_desc, + "tile_root": str(args.tile_root), + "zoom": args.zoom, + }, + } + manifest_path = out_dir / "manifest.json" + manifest_path.write_text(json.dumps(manifest, ensure_ascii=False, indent=2), encoding="utf-8") + + log(f"已导入 MySQL 数据库: {args.db_name}") + log(f" - hazard_50m: {hazard_count} {hazard_export}") + log(f" - manifest: {manifest_path}") + finally: + conn.close() + + +if __name__ == "__main__": + main() diff --git a/coastline/navgrid_v2/export_coast_grid_mysql_assets.py b/coastline/navgrid_v2/export_coast_grid_mysql_assets.py new file mode 100644 index 0000000..dc3f204 --- /dev/null +++ b/coastline/navgrid_v2/export_coast_grid_mysql_assets.py @@ -0,0 +1,234 @@ +#!/usr/bin/env python3 +from __future__ import annotations + +import argparse +import datetime as dt +import json +import math +from pathlib import Path + +import pymysql + + +DB_NAME = "navsea_japan_coast_grid" +DB_USER = "root" +DB_PASSWORD = "2chi9ks2" +DB_HOST = "localhost" +DB_SOCKET = "/tmp/mysql.sock" + +DEFAULT_OUT_DIR = "src/pbf/coastline-mysql-v2/coast_200m" +LAYER_NAME = "coast_200m" +RADIUS = 6378137.0 + + +def mysql_connect(database: str): + kwargs = { + "host": DB_HOST, + "user": DB_USER, + "password": DB_PASSWORD, + "database": database, + "charset": "utf8mb4", + "cursorclass": pymysql.cursors.SSCursor, + } + if DB_SOCKET: + kwargs["unix_socket"] = DB_SOCKET + return pymysql.connect(**kwargs) + + +def rect_geometry(min_lon: float, min_lat: float, max_lon: float, max_lat: float) -> dict: + return { + "type": "Polygon", + "coordinates": [ + [ + [min_lon, min_lat], + [max_lon, min_lat], + [max_lon, max_lat], + [min_lon, max_lat], + [min_lon, min_lat], + ] + ], + } + + +def parse_bbox(value: str) -> tuple[float, float, float, float]: + parts = [part.strip() for part in value.split(",")] + if len(parts) != 4: + raise argparse.ArgumentTypeError("bbox must be min_lon,min_lat,max_lon,max_lat") + try: + return tuple(float(part) for part in parts) # type: ignore[return-value] + except ValueError as exc: + raise argparse.ArgumentTypeError("bbox must contain valid numbers") from exc + + +def mercator_to_lonlat(x: float, y: float) -> tuple[float, float]: + lon = math.degrees(x / RADIUS) + lat = math.degrees(2.0 * math.atan(math.exp(y / RADIUS)) - math.pi / 2.0) + return lon, lat + + +def lon_to_mercator(lon: float) -> float: + return RADIUS * math.radians(lon) + + +def lat_to_mercator(lat: float) -> float: + lat = max(min(lat, 85.0511287798066), -85.0511287798066) + return RADIUS * math.log(math.tan(math.pi / 4.0 + math.radians(lat) / 2.0)) + + +def main() -> None: + parser = argparse.ArgumentParser(description="Export Japan coast 200m grid assets from MySQL") + parser.add_argument("--db-name", default=DB_NAME) + parser.add_argument("--out-dir", default=DEFAULT_OUT_DIR) + parser.add_argument("--bbox", type=parse_bbox, default=None, help="仅导出该经纬度范围内的格子") + args = parser.parse_args() + + project_root = Path(__file__).resolve().parent.parent.parent + out_dir = Path(args.out_dir) + if not out_dir.is_absolute(): + out_dir = project_root / out_dir + out_dir.mkdir(parents=True, exist_ok=True) + + conn = mysql_connect(args.db_name) + try: + with conn.cursor() as cur: + cur.execute( + """ + SELECT description, source_desc, cell_size_m, feature_count, + bbox_min_lon, bbox_min_lat, bbox_max_lon, bbox_max_lat, export_file + FROM navsea_coast_grid_layer_meta + WHERE layer_name=%s + """, + (LAYER_NAME,), + ) + meta_row = cur.fetchone() + if meta_row is None: + raise SystemExit(f"missing layer meta: {LAYER_NAME}") + + ( + description, + source_desc, + cell_size_m, + feature_count, + min_lon, + min_lat, + max_lon, + max_lat, + source_manifest, + ) = meta_row + + export_path = out_dir / "coast_200m_grid.geojson" + cell_sql = """ + SELECT layer_name, cell_id, row_idx, col_idx, cell_size_m, + state_name, class_name, source_code, source_path, source_name, + min_lon, min_lat, max_lon, max_lat + FROM navsea_coast_grid_cell + WHERE layer_name=%s + """ + cell_params: list[float | str] = [LAYER_NAME] + if args.bbox is not None: + min_lon, min_lat, max_lon, max_lat = args.bbox + min_x = lon_to_mercator(min_lon) + min_y = lat_to_mercator(min_lat) + max_x = lon_to_mercator(max_lon) + max_y = lat_to_mercator(max_lat) + cell_sql += """ + AND NOT ( + max_lon < %s OR min_lon > %s OR + max_lat < %s OR min_lat > %s + ) + """ + cell_params.extend([min_x, max_x, min_y, max_y]) + cell_sql += """ + ORDER BY row_idx, col_idx + """ + + count = 0 + with conn.cursor() as cur, export_path.open("w", encoding="utf-8") as fh: + cur.execute(cell_sql, tuple(cell_params)) + fh.write('{"type":"FeatureCollection","name":"japan_coast_200m_grid","features":[\n') + first = True + for row in cur: + ( + layer_name, + cell_id, + row_idx, + col_idx, + cell_size_m_row, + state_name, + class_name, + source_code, + source_path, + source_name, + min_lon_row, + min_lat_row, + max_lon_row, + max_lat_row, + ) = row + lon1, lat1 = mercator_to_lonlat(float(min_lon_row), float(min_lat_row)) + lon2, lat2 = mercator_to_lonlat(float(max_lon_row), float(max_lat_row)) + feature = { + "type": "Feature", + "properties": { + "layer_name": layer_name, + "cell_id": cell_id, + "row": int(row_idx), + "col": int(col_idx), + "cell_size_m": float(cell_size_m_row), + "state_name": state_name, + "class_name": class_name, + "source_code": source_code, + "source_path": source_path, + "source_name": source_name, + }, + "geometry": rect_geometry(lon1, lat1, lon2, lat2), + } + if not first: + fh.write(",\n") + fh.write(json.dumps(feature, ensure_ascii=False)) + first = False + count += 1 + fh.write("\n]}\n") + + if args.bbox is None and count != int(feature_count): + raise RuntimeError(f"count mismatch: exported={count} meta={feature_count}") + + if args.bbox is None: + lonlat_min = mercator_to_lonlat(float(min_lon), float(min_lat)) + lonlat_max = mercator_to_lonlat(float(max_lon), float(max_lat)) + mercator_min = [float(min_lon), float(min_lat)] + mercator_max = [float(max_lon), float(max_lat)] + else: + lonlat_min = (float(min_lon), float(min_lat)) + lonlat_max = (float(max_lon), float(max_lat)) + mercator_min = [lon_to_mercator(float(min_lon)), lat_to_mercator(float(min_lat))] + mercator_max = [lon_to_mercator(float(max_lon)), lat_to_mercator(float(max_lat))] + + manifest = { + "version": "v1.0", + "database": args.db_name, + "generated_at": dt.datetime.now().isoformat(timespec="seconds"), + "layer": LAYER_NAME, + "description": description, + "source_desc": source_desc, + "source_manifest": source_manifest, + "count": count, + "cell_size_m": float(cell_size_m), + "grid_bounds_lonlat": [lonlat_min[0], lonlat_min[1], lonlat_max[0], lonlat_max[1]], + "grid_bounds_mercator": [mercator_min[0], mercator_min[1], mercator_max[0], mercator_max[1]], + "grid_file": "coast_200m_grid.geojson", + "notes": "从 navsea_japan_coast_grid.MySQL 直接导出的全国海岸 200m 硬阻塞格", + } + + manifest_path = out_dir / "manifest.json" + manifest_path.write_text(json.dumps(manifest, ensure_ascii=False, indent=2), encoding="utf-8") + + print("已导出:") + print(" -", export_path) + print(" -", manifest_path) + print(f" - count={count}") + finally: + conn.close() + + +if __name__ == "__main__": + main() diff --git a/coastline/navgrid_v2/export_fish_port_debug_assets.py b/coastline/navgrid_v2/export_fish_port_debug_assets.py new file mode 100644 index 0000000..ef66007 --- /dev/null +++ b/coastline/navgrid_v2/export_fish_port_debug_assets.py @@ -0,0 +1,518 @@ +#!/usr/bin/env python3 +from __future__ import annotations + +import argparse +import datetime as dt +import json +import math +import sys +from pathlib import Path + +import numpy as np +import pymysql +from shapely import get_parts, intersects_xy +from shapely.geometry import LineString, box +from shapely.ops import polygonize, unary_union +from shapely.prepared import prep + +PROJECT_ROOT = Path(__file__).resolve().parent.parent.parent +if str(PROJECT_ROOT) not in sys.path: + sys.path.insert(0, str(PROJECT_ROOT)) + +from coastline.navgrid_v2.build_fish_port_20m_mysql_resume import ( + align_ceil, + align_floor, + build_point_lookup, + cluster_line_indices, + collect_fish_lines_for_prc, + discover_target_prcs, + load_coastlines_for_prc, + load_coarse_windows_for_bbox, + load_xml, + lon_from_mercator, + lat_from_mercator, + mercator_x, + mercator_y, + rect_lonlat, +) + + +DB_NAME = "navsea_japan_coast_grid" +DB_USER = "root" +DB_PASSWORD = "2chi9ks2" +DB_HOST = "localhost" +DB_SOCKET = "/tmp/mysql.sock" + +FISH_SRC = "coastline/C09-06.zip" +DEFAULT_OUT_DIR = "src/pbf/coastline-mysql-v2/fish_port_debug" +DEFAULT_BUFFER_M = 20.0 +DEFAULT_COARSE_MARGIN_M = 0.0 +COAST_COARSE_LAYER = "coast_200m" +CELL_SIZE_M = 20.0 +RADIUS = 6378137.0 + + +def mysql_connect(database: str, *, cursorclass=pymysql.cursors.Cursor): + kwargs = { + "host": DB_HOST, + "user": DB_USER, + "password": DB_PASSWORD, + "database": database, + "charset": "utf8mb4", + "cursorclass": cursorclass, + } + if DB_SOCKET: + kwargs["unix_socket"] = DB_SOCKET + return pymysql.connect(**kwargs) + + +def mercator_to_lonlat_bbox(bbox: tuple[float, float, float, float]) -> tuple[float, float, float, float]: + minx, miny, maxx, maxy = bbox + return lon_from_mercator(minx), lat_from_mercator(miny), lon_from_mercator(maxx), lat_from_mercator(maxy) + + +def mercator_geom_to_lonlat_geojson(geom) -> dict: + geo = geom.__geo_interface__ + + def convert_coords(coords): + if not isinstance(coords, (list, tuple)): + return coords + if coords and isinstance(coords[0], (int, float)): + x = float(coords[0]) + y = float(coords[1]) + return [float(lon_from_mercator(x)), float(lat_from_mercator(y))] + return [convert_coords(item) for item in coords] + + if geo["type"] == "GeometryCollection": + return { + "type": "GeometryCollection", + "geometries": [mercator_geom_to_lonlat_geojson(part) for part in geom.geoms], + } + return { + "type": geo["type"], + "coordinates": convert_coords(geo["coordinates"]), + } + + +def lonlat_line_feature( + coords: list[tuple[float, float]], + *, + kind: str, + fpc: str, + prc: str, + label: str | None = None, +) -> dict: + properties = { + "kind": kind, + "fpc": fpc, + "prc": prc, + } + if label is not None: + properties["label"] = label + return { + "type": "Feature", + "properties": properties, + "geometry": { + "type": "LineString", + "coordinates": [[float(lon), float(lat)] for lon, lat in coords], + }, + } + + +def mercator_line_feature( + line: LineString, + *, + kind: str, + fpc: str, + prc: str, + label: str | None = None, +) -> dict: + coords = [[float(lon_from_mercator(x)), float(lat_from_mercator(y))] for x, y in line.coords] + return { + "type": "Feature", + "properties": { + "kind": kind, + "fpc": fpc, + "prc": prc, + **({"label": label} if label is not None else {}), + }, + "geometry": { + "type": "LineString", + "coordinates": coords, + }, + } + + +def bbox_feature( + bbox: tuple[float, float, float, float], + *, + kind: str, + fpc: str, + prc: str, + label: str, +) -> dict: + min_lon, min_lat, max_lon, max_lat = bbox + return { + "type": "Feature", + "properties": { + "kind": kind, + "fpc": fpc, + "prc": prc, + "label": label, + }, + "geometry": rect_lonlat(min_lon, min_lat, max_lon, max_lat), + } + + +def mercator_bbox_feature( + bbox: tuple[float, float, float, float], + *, + kind: str, + fpc: str, + prc: str, + label: str, +) -> dict: + return bbox_feature( + mercator_to_lonlat_bbox(bbox), + kind=kind, + fpc=fpc, + prc=prc, + label=label, + ) + + +def buffer_tag(value: float) -> str: + if abs(value - round(value)) < 1e-9: + return str(int(round(value))) + return str(value).replace(".", "p") + + +def scan_debug_cells( + scan_geom, + coast_prepared, + *, + prc: str, + fpc: str, + cluster_idx: int, + part_idx: int, + window_idx: int, + max_scan_cells: int | None, +) -> tuple[list[dict], int, int]: + fish_prepared = prep(scan_geom) + minx, miny, maxx, maxy = scan_geom.bounds + start_x = align_floor(minx, CELL_SIZE_M) + start_y = align_floor(miny, CELL_SIZE_M) + end_x = align_ceil(maxx, CELL_SIZE_M) + end_y = align_ceil(maxy, CELL_SIZE_M) + estimated_cols = max(0, int(math.ceil((end_x - start_x) / CELL_SIZE_M))) + estimated_rows = max(0, int(math.ceil((end_y - start_y) / CELL_SIZE_M))) + estimated_cells = estimated_cols * estimated_rows + if max_scan_cells is not None and estimated_cells > max_scan_cells: + raise RuntimeError( + "scan guard triggered: " + f"estimated_cells={estimated_cells} max_scan_cells={max_scan_cells} " + f"grid={estimated_cols}x{estimated_rows} bounds={tuple(round(v, 3) for v in scan_geom.bounds)} " + f"fpc={fpc} prc={prc} cluster={cluster_idx} part={part_idx} window={window_idx}" + ) + + half = CELL_SIZE_M / 2.0 + ix_start = int(round(start_x / CELL_SIZE_M)) + ix_end = int(round(end_x / CELL_SIZE_M)) + ix_values = np.arange(ix_start, ix_end, dtype=np.int64) + x_values = ix_values.astype(float) * CELL_SIZE_M + x_center_values = x_values + half + x_right_values = x_values + CELL_SIZE_M + + features: list[dict] = [] + coast_count = 0 + sea_count = 0 + + y = start_y + while y < end_y: + row_strip = box(start_x, y, end_x, y + CELL_SIZE_M) + if not fish_prepared.intersects(row_strip): + y += CELL_SIZE_M + continue + + mask = ( + intersects_xy(scan_geom, x_center_values, y + half) + | intersects_xy(scan_geom, x_values, y) + | intersects_xy(scan_geom, x_right_values, y) + | intersects_xy(scan_geom, x_values, y + CELL_SIZE_M) + | intersects_xy(scan_geom, x_right_values, y + CELL_SIZE_M) + ) + if not np.any(mask): + y += CELL_SIZE_M + continue + + mask = mask | np.r_[False, mask[:-1]] | np.r_[mask[1:], False] + for idx in np.flatnonzero(mask): + x = float(x_values[idx]) + cell_geom = box(x, y, x + CELL_SIZE_M, y + CELL_SIZE_M) + if not fish_prepared.intersects(cell_geom): + continue + coast_hit = coast_prepared.intersects(cell_geom) + min_lon = lon_from_mercator(x) + min_lat = lat_from_mercator(y) + max_lon = lon_from_mercator(x + CELL_SIZE_M) + max_lat = lat_from_mercator(y + CELL_SIZE_M) + features.append( + { + "type": "Feature", + "properties": { + "kind": "cell_coast" if coast_hit else "cell_sea", + "fpc": fpc, + "prc": prc, + "cluster_idx": int(cluster_idx), + "part_idx": int(part_idx), + "window_idx": int(window_idx), + "cell_id": f"{int(round(x / CELL_SIZE_M))}:{int(round(y / CELL_SIZE_M))}", + "row": int(round(y / CELL_SIZE_M)), + "col": int(round(x / CELL_SIZE_M)), + "cell_size_m": CELL_SIZE_M, + "coast_hit": coast_hit, + }, + "geometry": rect_lonlat(min_lon, min_lat, max_lon, max_lat), + } + ) + if coast_hit: + coast_count += 1 + else: + sea_count += 1 + y += CELL_SIZE_M + + return features, coast_count, sea_count + + +def main() -> None: + parser = argparse.ArgumentParser(description="Export one fish port debug bundle") + parser.add_argument("--db-name", default=DB_NAME) + parser.add_argument("--out-dir", default=DEFAULT_OUT_DIR) + parser.add_argument("--fpc", required=True, help="港口 FPC 号,例如 4320050") + parser.add_argument("--coast-buffer-m", type=float, default=DEFAULT_BUFFER_M, help="海岸缓冲距离(米)") + parser.add_argument( + "--coast-coarse-margin-m", + type=float, + default=DEFAULT_COARSE_MARGIN_M, + help="coast_200m 粗窗查询外扩距离(米)", + ) + parser.add_argument("--cluster-gap-m", type=float, default=250.0, help="线聚类间隔(米)") + parser.add_argument("--max-scan-cells", type=int, default=200000, help="单窗允许扫描的最大 20m 格数") + args = parser.parse_args() + + project_root = Path(__file__).resolve().parent.parent.parent + out_dir = Path(args.out_dir) + if not out_dir.is_absolute(): + out_dir = project_root / out_dir + + fpc = str(args.fpc).strip() + buffer_dir = out_dir / f"fpc_{fpc}" / f"buffer_{buffer_tag(args.coast_buffer_m)}" + buffer_dir.mkdir(parents=True, exist_ok=True) + + root = load_xml(project_root / FISH_SRC) + point_lookup = build_point_lookup(root) + prcs = discover_target_prcs(root, None, fpc) + if not prcs: + raise SystemExit(f"no PRC matched for FPC={fpc}") + prc = prcs[0] + + fish_lines = collect_fish_lines_for_prc(root, point_lookup, prc, selected_fpc=fpc) + if not fish_lines: + raise SystemExit(f"no fish-port line features selected for FPC={fpc}") + + fish_bboxes = [line.bbox for line in fish_lines] + fish_bbox = ( + min(bb[0] for bb in fish_bboxes), + min(bb[1] for bb in fish_bboxes), + max(bb[2] for bb in fish_bboxes), + max(bb[3] for bb in fish_bboxes), + ) + + coast_lines, coast_bbox = load_coastlines_for_prc( + project_root, + prc, + bbox=( + mercator_x(fish_bbox[0]), + mercator_y(fish_bbox[1]), + mercator_x(fish_bbox[2]), + mercator_y(fish_bbox[3]), + ), + search_margin_m=max(args.coast_buffer_m, args.coast_coarse_margin_m), + ) + coast_geom = unary_union(coast_lines) + coast_buffer = coast_geom.buffer(args.coast_buffer_m, cap_style=2, join_style=2) + coast_prepared = prep(coast_buffer) + + conn = mysql_connect(args.db_name) + try: + prc_coarse_windows = load_coarse_windows_for_bbox( + conn, + layer_name=COAST_COARSE_LAYER, + bbox_mercator=( + mercator_x(fish_bbox[0]), + mercator_y(fish_bbox[1]), + mercator_x(fish_bbox[2]), + mercator_y(fish_bbox[3]), + ), + margin_m=args.coast_coarse_margin_m, + ) + + cluster_groups = cluster_line_indices([line.bbox for line in fish_lines], gap_m=args.cluster_gap_m) + + features: list[dict] = [] + features.append( + bbox_feature( + fish_bbox, + kind="fish_bbox", + fpc=fpc, + prc=prc, + label="fish_bbox", + ) + ) + features.append( + mercator_bbox_feature( + coast_bbox, + kind="coast_bbox", + fpc=fpc, + prc=prc, + label="coast_bbox", + ) + ) + for line in fish_lines: + features.append( + lonlat_line_feature( + line.coords, + kind="fish_line", + fpc=fpc, + prc=prc, + label="fish_line", + ) + ) + for line in coast_lines: + features.append( + mercator_line_feature( + line, + kind="coast_line", + fpc=fpc, + prc=prc, + label="coast_line", + ) + ) + + features.append( + { + "type": "Feature", + "properties": { + "kind": "coast_buffer", + "fpc": fpc, + "prc": prc, + "buffer_m": args.coast_buffer_m, + "label": f"buffer={args.coast_buffer_m}m", + }, + "geometry": mercator_geom_to_lonlat_geojson(coast_buffer), + } + ) + + for idx, coarse_window in enumerate(prc_coarse_windows): + features.append( + bbox_feature( + mercator_to_lonlat_bbox(coarse_window), + kind="coast_200m_window", + fpc=fpc, + prc=prc, + label=f"coast_200m_window_{idx + 1}", + ) + ) + + scan_window_total = 0 + cell_coast_total = 0 + cell_sea_total = 0 + + for cluster_idx, cluster in enumerate(cluster_groups): + cluster_lines = [ + LineString([(mercator_x(lon), mercator_y(lat)) for lon, lat in fish_lines[i].coords]) + for i in cluster + ] + merged = unary_union(cluster_lines) + polygons = list(polygonize(merged)) + if polygons: + fish_geom = unary_union(polygons) + else: + fish_geom = merged.buffer(CELL_SIZE_M, cap_style=2, join_style=2) + + fish_parts = [part for part in get_parts(fish_geom) if not part.is_empty] + for part_idx, fish_part in enumerate(fish_parts): + part_bbox = fish_part.bounds + part_coarse_windows = load_coarse_windows_for_bbox( + conn, + layer_name=COAST_COARSE_LAYER, + bbox_mercator=part_bbox, + margin_m=args.coast_coarse_margin_m, + ) + for window_idx, coarse_window in enumerate(part_coarse_windows): + window_geom = box(*coarse_window) + scan_geom = window_geom + scan_window_total += 1 + features.append( + { + "type": "Feature", + "properties": { + "kind": "scan_window", + "fpc": fpc, + "prc": prc, + "cluster_idx": int(cluster_idx), + "part_idx": int(part_idx), + "window_idx": int(window_idx), + "label": f"scan_window_{cluster_idx + 1}_{part_idx + 1}_{window_idx + 1}", + }, + "geometry": mercator_geom_to_lonlat_geojson(scan_geom), + } + ) + cells, coast_count, sea_count = scan_debug_cells( + scan_geom, + coast_prepared, + prc=prc, + fpc=fpc, + cluster_idx=cluster_idx, + part_idx=part_idx, + window_idx=window_idx, + max_scan_cells=args.max_scan_cells, + ) + features.extend(cells) + cell_coast_total += coast_count + cell_sea_total += sea_count + + out_path = buffer_dir / "debug.geojson" + out_path.write_text( + json.dumps({"type": "FeatureCollection", "features": features}, ensure_ascii=False, indent=2), + encoding="utf-8", + ) + + manifest = { + "database": args.db_name, + "generated_at": dt.datetime.now().isoformat(timespec="seconds"), + "fpc": fpc, + "prc": prc, + "buffer_m": args.coast_buffer_m, + "coast_coarse_margin_m": args.coast_coarse_margin_m, + "fish_bbox_lonlat": list(fish_bbox), + "fish_line_count": len(fish_lines), + "coast_curve_count": len(coast_lines), + "coast_bbox_mercator": list(coast_bbox), + "coast_200m_window_count": len(prc_coarse_windows), + "scan_window_count": scan_window_total, + "cell_coast_count": cell_coast_total, + "cell_sea_count": cell_sea_total, + "feature_count": len(features), + "export_file": str(out_path.relative_to(project_root)) if project_root in out_path.parents else str(out_path), + } + (buffer_dir / "manifest.json").write_text(json.dumps(manifest, ensure_ascii=False, indent=2), encoding="utf-8") + + print(f"debug: {len(features)} -> {out_path}") + print(f"manifest: {buffer_dir / 'manifest.json'}") + finally: + conn.close() + + +if __name__ == "__main__": + main() diff --git a/coastline/navgrid_v2/export_navgrid_mysql_assets.py b/coastline/navgrid_v2/export_navgrid_mysql_assets.py new file mode 100644 index 0000000..c2c92ff --- /dev/null +++ b/coastline/navgrid_v2/export_navgrid_mysql_assets.py @@ -0,0 +1,400 @@ +#!/usr/bin/env python3 +from __future__ import annotations + +import argparse +import datetime as dt +import json +import math +from pathlib import Path + +import pymysql + + +DB_NAME = "navsea_japan_coast_grid" +DB_USER = "root" +DB_PASSWORD = "2chi9ks2" +DB_HOST = "localhost" +DB_SOCKET = "/tmp/mysql.sock" + +DEFAULT_OUT_DIR = "src/pbf/coastline-mysql-v2/national" + +TABLES = { + "coast_200m": "navsea_coast_grid_cell", + "fish_port_20m": "navsea_fish_port_grid_cell", + "hazard_50m": "navsea_hazard_grid_cell", +} +CELL_SIZES = { + "coast_200m": 200.0, + "fish_port_20m": 20.0, + "hazard_50m": 50.0, +} +CELL_PRIORITY = ("fish_port_20m", "hazard_50m", "coast_200m") +DENSITY_OVERVIEW_FILE = "density_overview_grid.geojson" + +RADIUS = 6378137.0 +MAX_MERCATOR_LAT = 85.0511287798066 + + +def mysql_connect(database: str, *, cursorclass=pymysql.cursors.Cursor): + kwargs = { + "host": DB_HOST, + "user": DB_USER, + "password": DB_PASSWORD, + "database": database, + "charset": "utf8mb4", + "cursorclass": cursorclass, + } + if DB_SOCKET: + kwargs["unix_socket"] = DB_SOCKET + return pymysql.connect(**kwargs) + + +def rect_geometry(min_lon: float, min_lat: float, max_lon: float, max_lat: float) -> dict: + return { + "type": "Polygon", + "coordinates": [ + [ + [min_lon, min_lat], + [max_lon, min_lat], + [max_lon, max_lat], + [min_lon, max_lat], + [min_lon, min_lat], + ] + ], + } + + +def lon_from_mercator(x: float) -> float: + return math.degrees(x / RADIUS) + + +def lat_from_mercator(y: float) -> float: + return math.degrees(2.0 * math.atan(math.exp(y / RADIUS)) - math.pi / 2.0) + + +def mercator_bbox_to_lonlat(minx: float, miny: float, maxx: float, maxy: float) -> tuple[float, float, float, float]: + return ( + lon_from_mercator(minx), + lat_from_mercator(miny), + lon_from_mercator(maxx), + lat_from_mercator(maxy), + ) + + +def normalize_bbox(layer_name: str, min_lon: float, min_lat: float, max_lon: float, max_lat: float) -> tuple[float, float, float, float]: + if layer_name == "coast_200m" and ( + abs(min_lon) > 180.0 or abs(max_lon) > 180.0 or abs(min_lat) > 90.0 or abs(max_lat) > 90.0 + ): + return mercator_bbox_to_lonlat(min_lon, min_lat, max_lon, max_lat) + return min_lon, min_lat, max_lon, max_lat + + +def export_layer( + conn, + *, + table_name: str, + layer_name: str, + path: Path, +) -> int: + path.parent.mkdir(parents=True, exist_ok=True) + sql = f""" + SELECT layer_name, cell_id, row_idx, col_idx, cell_size_m, state_name, class_name, + source_name, min_lon, min_lat, max_lon, max_lat + FROM {table_name} + WHERE layer_name=%s + ORDER BY row_idx, col_idx, source_name + """ + count = 0 + seen_cell_ids: set[str] = set() + with conn.cursor(pymysql.cursors.SSCursor) as cur, path.open("w", encoding="utf-8") as fh: + cur.execute(sql, (layer_name,)) + fh.write('{"type":"FeatureCollection","features":[\n') + first = True + for row in cur: + ( + row_layer_name, + cell_id, + row_idx, + col_idx, + cell_size_m, + state_name, + class_name, + source_name, + min_lon, + min_lat, + max_lon, + max_lat, + ) = row + if cell_id in seen_cell_ids: + continue + seen_cell_ids.add(cell_id) + min_lon, min_lat, max_lon, max_lat = normalize_bbox( + row_layer_name, + float(min_lon), + float(min_lat), + float(max_lon), + float(max_lat), + ) + feature = { + "type": "Feature", + "properties": { + "layer_name": row_layer_name, + "cell_id": cell_id, + "row": int(row_idx), + "col": int(col_idx), + "cell_size_m": float(cell_size_m), + "state_name": state_name, + "class_name": class_name, + "source_name": source_name, + }, + "geometry": rect_geometry(min_lon, min_lat, max_lon, max_lat), + } + if not first: + fh.write(",\n") + fh.write(json.dumps(feature, ensure_ascii=False)) + first = False + count += 1 + fh.write("\n]}\n") + return count + + +def overlap_range(min_value: float, max_value: float, fine_size_m: float) -> tuple[int, int]: + start = int(math.floor(min_value / fine_size_m)) + end = int(math.floor((max_value - 1e-9) / fine_size_m)) + return start, end + + +def overlaps_finer_cells( + row_idx: int, + col_idx: int, + coarse_size_m: float, + fine_size_m: float, + fine_keys: set[tuple[int, int]], +) -> bool: + min_x = col_idx * coarse_size_m + min_y = row_idx * coarse_size_m + max_x = min_x + coarse_size_m + max_y = min_y + coarse_size_m + row_start, row_end = overlap_range(min_y, max_y, fine_size_m) + col_start, col_end = overlap_range(min_x, max_x, fine_size_m) + for fine_row in range(row_start, row_end + 1): + for fine_col in range(col_start, col_end + 1): + if (fine_row, fine_col) in fine_keys: + return True + return False + + +def export_density_overview(conn, *, path: Path) -> tuple[int, dict]: + path.parent.mkdir(parents=True, exist_ok=True) + counts = {"20": 0, "50": 0, "200": 0} + bbox = [float("inf"), float("inf"), float("-inf"), float("-inf")] + keys_20: set[tuple[int, int]] = set() + keys_50: set[tuple[int, int]] = set() + seen = {name: set[str]() for name in CELL_PRIORITY} + + with conn.cursor(pymysql.cursors.SSCursor) as cur, path.open("w", encoding="utf-8") as fh: + fh.write('{"type":"FeatureCollection","features":[\n') + first = True + + def write_feature(feature: dict) -> None: + nonlocal first + if not first: + fh.write(",\n") + fh.write(json.dumps(feature, ensure_ascii=False)) + first = False + + def read_rows(layer_name: str): + table_name = TABLES[layer_name] + cur.execute( + f""" + SELECT layer_name, cell_id, row_idx, col_idx, cell_size_m, state_name, class_name, + source_name, min_lon, min_lat, max_lon, max_lat + FROM {table_name} + WHERE layer_name=%s + ORDER BY row_idx, col_idx, source_name + """, + (layer_name,), + ) + for row in cur: + yield row + + for row in read_rows("fish_port_20m"): + layer_name, cell_id, row_idx, col_idx, cell_size_m, state_name, class_name, source_name, min_lon, min_lat, max_lon, max_lat = row + if cell_id in seen["fish_port_20m"]: + continue + seen["fish_port_20m"].add(cell_id) + keys_20.add((int(row_idx), int(col_idx))) + counts["20"] += 1 + min_lon, min_lat, max_lon, max_lat = normalize_bbox(layer_name, float(min_lon), float(min_lat), float(max_lon), float(max_lat)) + bbox[0] = min(bbox[0], min_lon) + bbox[1] = min(bbox[1], min_lat) + bbox[2] = max(bbox[2], max_lon) + bbox[3] = max(bbox[3], max_lat) + write_feature( + { + "type": "Feature", + "properties": { + "layer_name": layer_name, + "cell_id": cell_id, + "row": int(row_idx), + "col": int(col_idx), + "cell_size_m": float(cell_size_m), + "state_name": state_name, + "class_name": class_name, + "source_name": source_name, + "density": 20, + }, + "geometry": rect_geometry(min_lon, min_lat, max_lon, max_lat), + } + ) + + for row in read_rows("hazard_50m"): + layer_name, cell_id, row_idx, col_idx, cell_size_m, state_name, class_name, source_name, min_lon, min_lat, max_lon, max_lat = row + if cell_id in seen["hazard_50m"]: + continue + if overlaps_finer_cells(int(row_idx), int(col_idx), CELL_SIZES["hazard_50m"], CELL_SIZES["fish_port_20m"], keys_20): + continue + seen["hazard_50m"].add(cell_id) + keys_50.add((int(row_idx), int(col_idx))) + counts["50"] += 1 + min_lon, min_lat, max_lon, max_lat = normalize_bbox(layer_name, float(min_lon), float(min_lat), float(max_lon), float(max_lat)) + bbox[0] = min(bbox[0], min_lon) + bbox[1] = min(bbox[1], min_lat) + bbox[2] = max(bbox[2], max_lon) + bbox[3] = max(bbox[3], max_lat) + write_feature( + { + "type": "Feature", + "properties": { + "layer_name": layer_name, + "cell_id": cell_id, + "row": int(row_idx), + "col": int(col_idx), + "cell_size_m": float(cell_size_m), + "state_name": state_name, + "class_name": class_name, + "source_name": source_name, + "density": 50, + }, + "geometry": rect_geometry(min_lon, min_lat, max_lon, max_lat), + } + ) + + for row in read_rows("coast_200m"): + layer_name, cell_id, row_idx, col_idx, cell_size_m, state_name, class_name, source_name, min_lon, min_lat, max_lon, max_lat = row + if cell_id in seen["coast_200m"]: + continue + if overlaps_finer_cells(int(row_idx), int(col_idx), CELL_SIZES["coast_200m"], CELL_SIZES["fish_port_20m"], keys_20): + continue + if overlaps_finer_cells(int(row_idx), int(col_idx), CELL_SIZES["coast_200m"], CELL_SIZES["hazard_50m"], keys_50): + continue + seen["coast_200m"].add(cell_id) + counts["200"] += 1 + min_lon, min_lat, max_lon, max_lat = normalize_bbox(layer_name, float(min_lon), float(min_lat), float(max_lon), float(max_lat)) + bbox[0] = min(bbox[0], min_lon) + bbox[1] = min(bbox[1], min_lat) + bbox[2] = max(bbox[2], max_lon) + bbox[3] = max(bbox[3], max_lat) + write_feature( + { + "type": "Feature", + "properties": { + "layer_name": layer_name, + "cell_id": cell_id, + "row": int(row_idx), + "col": int(col_idx), + "cell_size_m": float(cell_size_m), + "state_name": state_name, + "class_name": class_name, + "source_name": source_name, + "density": 200, + }, + "geometry": rect_geometry(min_lon, min_lat, max_lon, max_lat), + } + ) + + fh.write("\n]}\n") + + total = counts["20"] + counts["50"] + counts["200"] + return total, { + "kept_counts": counts, + "bbox_lonlat": None if total == 0 else bbox, + } + + +def main() -> None: + parser = argparse.ArgumentParser(description="Export v2 navgrid layers from split MySQL tables") + parser.add_argument("--db-name", default=DB_NAME) + parser.add_argument("--out-dir", default=DEFAULT_OUT_DIR) + parser.add_argument("--coast-200m", dest="coast_200m", action="store_true", default=True) + parser.add_argument("--no-coast-200m", dest="coast_200m", action="store_false") + parser.add_argument("--fish-port-20m", dest="fish_port_20m", action="store_true", default=True) + parser.add_argument("--no-fish-port-20m", dest="fish_port_20m", action="store_false") + parser.add_argument("--hazard-50m", dest="hazard_50m", action="store_true", default=True) + parser.add_argument("--no-hazard-50m", dest="hazard_50m", action="store_false") + parser.add_argument("--density-overview", dest="density_overview", action="store_true", default=True) + parser.add_argument("--no-density-overview", dest="density_overview", action="store_false") + args = parser.parse_args() + + project_root = Path(__file__).resolve().parent.parent.parent + out_dir = Path(args.out_dir) + if not out_dir.is_absolute(): + out_dir = project_root / out_dir + out_dir.mkdir(parents=True, exist_ok=True) + + conn = mysql_connect(args.db_name) + try: + manifest_layers: dict[str, dict] = {} + if args.coast_200m: + coast_path = out_dir / "coast_200m_grid.geojson" + coast_count = export_layer(conn, table_name=TABLES["coast_200m"], layer_name="coast_200m", path=coast_path) + manifest_layers["coast_200m"] = { + "count": coast_count, + "cell_size_m": CELL_SIZES["coast_200m"], + "export_file": str(coast_path.relative_to(project_root)), + "source_table": TABLES["coast_200m"], + } + if args.fish_port_20m: + fish_path = out_dir / "fish_port_20m_grid.geojson" + fish_count = export_layer(conn, table_name=TABLES["fish_port_20m"], layer_name="fish_port_20m", path=fish_path) + manifest_layers["fish_port_20m"] = { + "count": fish_count, + "cell_size_m": CELL_SIZES["fish_port_20m"], + "export_file": str(fish_path.relative_to(project_root)), + "source_table": TABLES["fish_port_20m"], + } + if args.hazard_50m: + hazard_path = out_dir / "hazard_50m_grid.geojson" + hazard_count = export_layer(conn, table_name=TABLES["hazard_50m"], layer_name="hazard_50m", path=hazard_path) + manifest_layers["hazard_50m"] = { + "count": hazard_count, + "cell_size_m": CELL_SIZES["hazard_50m"], + "export_file": str(hazard_path.relative_to(project_root)), + "source_table": TABLES["hazard_50m"], + } + if args.density_overview: + density_path = out_dir / DENSITY_OVERVIEW_FILE + density_count, density_summary = export_density_overview(conn, path=density_path) + manifest_layers["density_overview"] = { + "count": density_count, + "export_file": str(density_path.relative_to(project_root)), + "source_tables": list(TABLES.values()), + **density_summary, + } + finally: + conn.close() + + manifest = { + "database": args.db_name, + "generated_at": dt.datetime.now().isoformat(timespec="seconds"), + "layers": manifest_layers, + } + manifest_path = out_dir / "manifest.json" + manifest_path.write_text(json.dumps(manifest, ensure_ascii=False, indent=2), encoding="utf-8") + for layer_name, info in manifest_layers.items(): + print(f"{layer_name}: {info['count']}") + print(f"manifest: {manifest_path}") + + +if __name__ == "__main__": + main() diff --git a/coastline/navgrid_v2/export_prc20_test_assets.py b/coastline/navgrid_v2/export_prc20_test_assets.py new file mode 100644 index 0000000..6a3c999 --- /dev/null +++ b/coastline/navgrid_v2/export_prc20_test_assets.py @@ -0,0 +1,218 @@ +#!/usr/bin/env python3 +from __future__ import annotations + +import argparse +import datetime as dt +import json +import math +from pathlib import Path + +import pymysql + + +DB_NAME = "navsea_japan_coast_grid" +DB_USER = "root" +DB_PASSWORD = "2chi9ks2" +DB_HOST = "localhost" +DB_SOCKET = "/tmp/mysql.sock" + +DEFAULT_OUT_DIR = "src/pbf/coastline-mysql-v2/prc50_test" + +RADIUS = 6378137.0 +TARGET_LAYER = "fish_port_20m" +DEFAULT_PRC = "50" + + +def mysql_connect(database: str, *, cursorclass=pymysql.cursors.Cursor): + kwargs = { + "host": DB_HOST, + "user": DB_USER, + "password": DB_PASSWORD, + "database": database, + "charset": "utf8mb4", + "cursorclass": cursorclass, + } + if DB_SOCKET: + kwargs["unix_socket"] = DB_SOCKET + return pymysql.connect(**kwargs) + + +def rect_geometry(min_lon: float, min_lat: float, max_lon: float, max_lat: float) -> dict: + return { + "type": "Polygon", + "coordinates": [ + [ + [min_lon, min_lat], + [max_lon, min_lat], + [max_lon, max_lat], + [min_lon, max_lat], + [min_lon, min_lat], + ] + ], + } + + +def lon_from_mercator(x: float) -> float: + return math.degrees(x / RADIUS) + + +def lat_from_mercator(y: float) -> float: + return math.degrees(2.0 * math.atan(math.exp(y / RADIUS)) - math.pi / 2.0) + + +def mercator_bbox_to_lonlat(minx: float, miny: float, maxx: float, maxy: float) -> tuple[float, float, float, float]: + return ( + lon_from_mercator(minx), + lat_from_mercator(miny), + lon_from_mercator(maxx), + lat_from_mercator(maxy), + ) + + +def normalize_bbox(layer_name: str, min_lon: float, min_lat: float, max_lon: float, max_lat: float) -> tuple[float, float, float, float]: + if layer_name == "coast_200m" and ( + abs(min_lon) > 180.0 or abs(max_lon) > 180.0 or abs(min_lat) > 90.0 or abs(max_lat) > 90.0 + ): + return mercator_bbox_to_lonlat(min_lon, min_lat, max_lon, max_lat) + return min_lon, min_lat, max_lon, max_lat + + +def export_layer( + conn, + *, + path: Path, + where_sql: str, + params: tuple, +) -> int: + path.parent.mkdir(parents=True, exist_ok=True) + sql = f""" + SELECT layer_name, cell_id, row_idx, col_idx, cell_size_m, state_name, class_name, + source_name, min_lon, min_lat, max_lon, max_lat + FROM navsea_fish_port_grid_cell + WHERE {where_sql} + ORDER BY row_idx, col_idx + """ + count = 0 + with conn.cursor(pymysql.cursors.SSCursor) as cur, path.open("w", encoding="utf-8") as fh: + cur.execute(sql, params) + fh.write('{"type":"FeatureCollection","features":[\n') + first = True + for row in cur: + ( + layer_name, + cell_id, + row_idx, + col_idx, + cell_size_m, + state_name, + class_name, + source_name, + min_lon, + min_lat, + max_lon, + max_lat, + ) = row + min_lon, min_lat, max_lon, max_lat = normalize_bbox( + row[0], + float(min_lon), + float(min_lat), + float(max_lon), + float(max_lat), + ) + feature = { + "type": "Feature", + "properties": { + "layer_name": layer_name, + "cell_id": cell_id, + "row": int(row_idx), + "col": int(col_idx), + "cell_size_m": float(cell_size_m), + "state_name": state_name, + "class_name": class_name, + "source_name": source_name, + }, + "geometry": rect_geometry(min_lon, min_lat, max_lon, max_lat), + } + if not first: + fh.write(",\n") + fh.write(json.dumps(feature, ensure_ascii=False)) + first = False + count += 1 + fh.write("\n]}\n") + return count + + +def fetch_stats(conn, where_sql: str, params: tuple) -> tuple[int, list[float] | None]: + sql = f""" + SELECT COUNT(*), MIN(min_lon), MIN(min_lat), MAX(max_lon), MAX(max_lat) + FROM navsea_fish_port_grid_cell + WHERE {where_sql} + """ + with conn.cursor() as cur: + cur.execute(sql, params) + row = cur.fetchone() + count = int(row[0] or 0) + if count == 0: + return 0, None + min_lon, min_lat, max_lon, max_lat = normalize_bbox( + params[0] if params else "", + float(row[1]), + float(row[2]), + float(row[3]), + float(row[4]), + ) + return count, [min_lon, min_lat, max_lon, max_lat] + + +def main() -> None: + parser = argparse.ArgumentParser(description="Export a single PRC fish_port_20m test subset") + parser.add_argument("--db-name", default=DB_NAME) + parser.add_argument("--out-dir", default=DEFAULT_OUT_DIR) + parser.add_argument("--prc", default=DEFAULT_PRC, help="只导出这个 PRC 的 fish_port_20m,默认 50") + args = parser.parse_args() + + project_root = Path(__file__).resolve().parent.parent.parent + out_dir = Path(args.out_dir) + if not out_dir.is_absolute(): + out_dir = project_root / out_dir + out_dir.mkdir(parents=True, exist_ok=True) + + prc = str(args.prc).strip() + if prc.isdigit(): + prc = f"{int(prc):02d}" + + where_sql = "layer_name=%s AND state_name=%s AND source_name LIKE %s" + params = (TARGET_LAYER, "COASTLINE", f"C09-06+coastline PRC={prc}%") + out_path = out_dir / f"fish_port_20m_prc{prc}_grid.geojson" + + conn = mysql_connect(args.db_name) + try: + count = export_layer(conn, path=out_path, where_sql=where_sql, params=params) + stat_count, bbox = fetch_stats(conn, where_sql, params) + if count != stat_count: + raise RuntimeError(f"export count mismatch: {count} != {stat_count}") + finally: + conn.close() + + manifest = { + "database": args.db_name, + "generated_at": dt.datetime.now().isoformat(timespec="seconds"), + "prc": prc, + "layers": { + TARGET_LAYER: { + "count": count, + "bbox_lonlat": bbox, + "cell_size_m": 20.0, + "export_file": str(out_path.relative_to(project_root)), + "filter": f"state_name='COASTLINE' AND source_name LIKE 'C09-06+coastline PRC={prc}%'", + } + }, + } + manifest_path = out_dir / "manifest.json" + manifest_path.write_text(json.dumps(manifest, ensure_ascii=False, indent=2), encoding="utf-8") + print(f"{TARGET_LAYER}: {count} -> {out_path}") + print(f"manifest: {manifest_path}") + + +if __name__ == "__main__": + main() diff --git a/coastline/navsea_v11_codex_task_backend_coast_wall_z12_zh.md b/coastline/navsea_v11_codex_task_backend_coast_wall_z12_zh.md new file mode 100644 index 0000000..a8576ca --- /dev/null +++ b/coastline/navsea_v11_codex_task_backend_coast_wall_z12_zh.md @@ -0,0 +1,500 @@ +# NavSea V11 / Codex Task:后端生成 coast_wall_z12.bin + +版本:v1.0 +日期:2026-05-02 +适用架构:NavSea V11 +任务类型:Backend / Data Pipeline / Binary Asset Generator + +--- + +## 0. V11 / Codex 执行约束 + +本任务必须遵守 NavSea V11 架构规则: + +```text +不破坏现有结构 +不引入未知依赖 +新文件按指定路径创建 +旧文件必须由用户提供原文件后再修改 +新增 TypeScript 文件必须带 loggerFactory 初始化 +输出完整可替换文件 +保持模块边界清晰 +``` + +新增 `.ts/.tsx` 文件必须包含: + +```ts +import { loggerFactory } from "@/lib/logger/loggerFactory"; + +const logger = loggerFactory.create("FileName"); +``` + +如项目实际 logger 路径不同,必须先由用户确认现有文件结构,不得臆测。 + +--- + +## 1. 任务目标 + +实现一个后端/工具链模块,用于从以下数据源生成: + +```text +coast_wall_z12.bin +``` + +输入: + +```text +海岸线矢量数据 +PBF 提取的海上障碍物数据 +``` + +输出: + +```text +全国 coastline + obstacle blocked wall 二进制文件 +``` + +该文件供前端或路径规划模块快速查询: + +```ts +isBlocked(lat, lon) -> boolean +``` + +--- + +## 2. 非目标 + +本任务不做: + +```text +完整 land/water mask +20m detail overlay +水深判断 +吃水安全判断 +路径规划算法本身 +前端地图渲染 +SQLite 航迹存储 +``` + +本任务只负责生成 z12 / 200m blocked wall binary asset。 + +--- + +## 3. 生成文件 + +输出文件: + +```text +coast_wall_z12.bin +``` + +可选输出: + +```text +coast_wall_z12.meta.json +coast_wall_z12.debug.geojson +``` + +--- + +## 4. 输入数据接口 + +### 4.1 海岸线输入 + +支持至少一种格式: + +```text +GeoJSON LineString / MultiLineString +``` + +后续可扩展: + +```text +ENC coastline +PBF coastline +自有 vector coastline +``` + +### 4.2 障碍物输入 + +输入为从 PBF 中提取后的标准化 JSON/GeoJSON。 + +建议标准结构: + +```ts +type ObstacleFeature = { + id: string; + kind: string; + geometry: Point | LineString | Polygon | MultiPolygon; + properties?: Record; +}; +``` + +--- + +## 5. 处理参数 + +默认参数: + +```ts +const ZOOM = 12; +const GRID_W = 40; +const GRID_H = 40; +const CELL_COUNT = 1600; +const BLOCK_SIZE = 32; +const SPARSE_THRESHOLD = 96; +const COAST_DILATION_CELLS = 1; +``` + +障碍物 buffer 建议: + +```ts +rock / wreck / obstruction: 200m +unknown danger: 400m +reef / shoal polygon: 200m +breakwater line: 200m +restricted area: 0m or by config +aquaculture / fish farm: 0m or by config +``` + +--- + +## 6. 核心数据结构 + +生成阶段使用: + +```ts +type TileId = number; +type CellId = number; + +type BlockedMap = Map>; +``` + +最终写入前转换为: + +```ts +type EncodedTile = { + tileId: number; + encoding: 1 | 2; + count: number; + data: Uint16Array | Uint32Array; +}; +``` + +--- + +## 7. tileId / cellId 编码 + +```ts +function packTileId(tileX: number, tileY: number): number { + return (tileX << 12) | tileY; +} + +function unpackTileId(tileId: number): { tileX: number; tileY: number } { + return { + tileX: tileId >>> 12, + tileY: tileId & 0xfff, + }; +} + +function packCellId(row: number, col: number): number { + return row * 40 + col; +} +``` + +--- + +## 8. blockId 编码 + +```ts +function packBlockId(tileX: number, tileY: number): number { + const blockX = tileX >> 5; + const blockY = tileY >> 5; + return (blockX << 7) | blockY; +} +``` + +--- + +## 9. 海岸线处理流程 + +```text +for each coastline feature: + for each line segment: + convert lon/lat to WebMercator or tile-local coordinate + find crossed z12 tiles + convert to 40×40 cell coordinate + supercover rasterize segment + add blocked cell +after rasterization: + apply dilation 1 cell +``` + +要求: + +```text +不能只采样线段端点 +必须处理跨 tile 线段 +必须处理 dilation 跨 tile 边界 +``` + +--- + +## 10. 障碍物处理流程 + +```text +for each obstacle feature: + classify kind + determine geometry type + determine safety buffer + rasterize to z12 / 40×40 cells + add blocked cells +``` + +处理规则: + +```text +Point -> circle buffer rasterize +Line -> line buffer rasterize +Polygon -> polygon body + optional buffer rasterize +``` + +所有障碍物结果与海岸线结果写入同一个 `BlockedMap`。 + +--- + +## 11. 编码规则 + +每个 tile: + +```text +count = blocked cell count +``` + +规则: + +```text +count = 0 -> skip +count <= 96 -> sparse uint16[] +count > 96 -> bitset uint32[50] +``` + +sparse: + +```text +cellId sorted ascending +uint16[count] +``` + +bitset: + +```text +uint32[50] +``` + +bitset 写入: + +```ts +const word = cellId >>> 5; +const bit = cellId & 31; +words[word] |= 1 << bit; +``` + +--- + +## 12. 二进制文件格式 + +### 12.1 Header + +```ts +type Header = { + magic: "CWZ12BIN"; // char[8] + version: 1; // uint16 + zoom: 12; // uint8 + gridW: 40; // uint8 + gridH: 40; // uint8 + blockSize: 32; // uint8 + flags: number; // uint8 + blockCount: number; // uint32 + blockDirOffset: number; // uint32 + dataOffset: number; // uint32 +}; +``` + +### 12.2 BlockEntry + +```ts +type BlockEntry = { + blockId: number; // uint32 + tileDirOffset: number; // uint32 + tileCount: number; // uint16 + reserved: number; // uint16 +}; +``` + +### 12.3 TileEntry + +```ts +type TileEntry = { + tileId: number; // uint32 + offset: number; // uint32, offset inside DataBlob + count: number; // uint16 + encoding: 1 | 2; // uint8 + reserved: number; // uint8 +}; +``` + +### 12.4 DataBlob + +```text +encoding=1: + uint16[count] + +encoding=2: + uint32[50] +``` + +--- + +## 13. 输出校验 + +生成器必须输出统计: + +```text +totalBlockedTiles +totalBlockedCells +sparseTileCount +bitsetTileCount +blockCount +fileSizeBytes +coastlineFeatureCount +obstacleFeatureCount +``` + +必须检查: + +```text +cellId must be 0..1599 +tileX/tileY must be 0..4095 +sparse list sorted +sparse list no duplicates +bitset length = 50 uint32 +block entries sorted by blockId +tile entries sorted by tileId within block +``` + +--- + +## 14. Debug 输出 + +建议支持: + +```text +--debug-geojson +``` + +输出抽样 blocked cells,便于在地图上验证。 + +Debug GeoJSON 每个 blocked cell 可输出为 polygon 或 point。 + +--- + +## 15. 测试要求 + +至少包含以下测试: + +```text +1. tileId pack/unpack +2. blockId pack/unpack +3. cellId pack +4. sparse encode/decode +5. bitset encode/decode +6. sparse/bitset threshold +7. coastline segment rasterize +8. dilation across tile boundary +9. point obstacle buffer rasterize +10. binary writer / reader roundtrip +``` + +--- + +## 16. 性能要求 + +目标: + +```text +运行时查询 O(1) 或 O(log n) +生成阶段允许离线耗时 +最终文件建议控制在 20–150 MB +``` + +目录加载策略: + +```text +仅 Header + BlockDirectory 常驻 +TileDirectoryBlock 按需加载 +Tile data 按需加载 +LRU cache +``` + +--- + +## 17. 建议文件路径 + +如项目尚无对应目录,新建: + +```text +tools/navmask/ + generateCoastWallZ12.ts + coastWallBinaryWriter.ts + coastWallRasterizer.ts + coastWallTypes.ts + coastWallObstacleRules.ts +``` + +如已有数据工具目录,应沿用现有结构,不得新建平行架构。 + +--- + +## 18. 交付物 + +本任务完成后应交付: + +```text +1. coast_wall_z12.bin 生成器 +2. 二进制 writer +3. 基础 reader 用于测试 +4. 单元测试 +5. 生成统计日志 +6. 可选 debug GeoJSON +7. README 或 usage doc +``` + +--- + +## 19. 命令行示例 + +```bash +pnpm tsx tools/navmask/generateCoastWallZ12.ts \ + --coastline data/coastline.geojson \ + --obstacles data/obstacles.geojson \ + --out public/navdata/coast_wall_z12.bin \ + --debug-geojson tmp/coast_wall_debug.geojson +``` + +--- + +## 20. 完成标准 + +任务完成必须满足: + +```text +能够从 coastline + obstacle 输入生成 coast_wall_z12.bin +文件符合二进制格式 +reader 能正确查询 blocked cell +跨 tile dilation 正确 +障碍物已融合进 blocked wall +测试通过 +无破坏 V11 结构 +无未知依赖 +``` diff --git a/coastline/render_fish_port_full_20m_aoi_png.py b/coastline/render_fish_port_full_20m_aoi_png.py new file mode 100644 index 0000000..4f9d9e9 --- /dev/null +++ b/coastline/render_fish_port_full_20m_aoi_png.py @@ -0,0 +1,169 @@ +#!/usr/bin/env python3 +from __future__ import annotations + +import argparse +import json +import math +from pathlib import Path + +from PIL import Image, ImageDraw +from shapely.geometry import box, shape +from shapely.ops import transform, unary_union +from shapely.prepared import prep + + +RADIUS = 6378137.0 +MAX_MERCATOR_LAT = 85.0511287798066 +DEFAULT_BBOX = (129.73110007140482, 32.9464631795233, 131.19176072338317, 34.25430274729531) + + +def mercator_x(lon: float) -> float: + return RADIUS * math.radians(lon) + + +def mercator_y(lat: float) -> float: + lat = max(min(lat, MAX_MERCATOR_LAT), -MAX_MERCATOR_LAT) + return RADIUS * math.log(math.tan(math.pi / 4.0 + math.radians(lat) / 2.0)) + + +def bbox_intersects(a, b) -> bool: + return not (a[2] < b[0] or a[0] > b[2] or a[3] < b[1] or a[1] > b[3]) + + +def iter_polygons(geom): + gt = geom.geom_type + if gt == "Polygon": + yield geom + elif gt == "MultiPolygon": + for g in geom.geoms: + yield g + + +def draw_cell(draw: ImageDraw.ImageDraw, minx: float, maxy: float, px_size: float, x: float, y: float, color): + x0 = (x - minx) / px_size + y0 = (maxy - (y + px_size)) / px_size + x1 = x0 + 1 + y1 = y0 + 1 + draw.rectangle((x0, y0, x1, y1), fill=color) + + +def main() -> None: + parser = argparse.ArgumentParser(description="Render full Fukuoka/Saga fish-port 20m red/green cell raster") + parser.add_argument("--aoi-source", default="src/pbf/port-overlay/kyushu/port_overlay_kyushu_areas.geojson") + parser.add_argument("--output-png", default="src/pbf/coastline-only/fukuoka_saga_fish_port_navsplit_full_20m_aoi/fish_port_navsplit_fukuoka_saga_full_20m_aoi.png") + parser.add_argument("--bbox", nargs=4, type=float, default=list(DEFAULT_BBOX)) + parser.add_argument("--cell-size-m", type=float, default=20.0) + parser.add_argument("--coast-buffer-m", type=float, default=12.0) + args = parser.parse_args() + + project_root = Path(__file__).resolve().parent.parent + aoi_path = Path(args.aoi_source) + if not aoi_path.is_absolute(): + aoi_path = project_root / aoi_path + if not aoi_path.exists(): + raise SystemExit(f"missing input: {aoi_path}") + + data = json.loads(aoi_path.read_text(encoding="utf-8")) + bbox = tuple(args.bbox) + px_size = args.cell_size_m + + selected = [] + for feature in data.get("features", []): + props = feature.get("properties") or {} + if props.get("canonical_object_type") != "漁港": + continue + geom = shape(feature["geometry"]) + if not bbox_intersects(geom.bounds, bbox): + continue + selected.append(transform(lambda x, y, z=None: (mercator_x(x), mercator_y(y)), geom)) + + if not selected: + raise SystemExit("no selected fish-port AOI polygons") + + merged = unary_union(selected) + prepared = prep(merged) + + minlon, minlat, maxlon, maxlat = bbox + minx, miny = mercator_x(minlon), mercator_y(minlat) + maxx, maxy = mercator_x(maxlon), mercator_y(maxlat) + width = max(1, math.ceil((maxx - minx) / px_size)) + height = max(1, math.ceil((maxy - miny) / px_size)) + + image = Image.new("RGBA", (width, height), (0, 0, 0, 0)) + draw = ImageDraw.Draw(image, "RGBA") + + cell_count = 0 + land_count = 0 + sea_count = 0 + + # 只对渔港 AOI 内的格子着色,外部保持透明。 + for poly in iter_polygons(merged): + pb = poly.bounds + start_x = math.floor(pb[0] / px_size) * px_size + start_y = math.floor(pb[1] / px_size) * px_size + end_x = math.ceil(pb[2] / px_size) * px_size + end_y = math.ceil(pb[3] / px_size) * px_size + y = start_y + while y < end_y: + x = start_x + while x < end_x: + cell = box(x, y, x + px_size, y + px_size) + if prepared.intersects(cell): + # 海岸线 buffer 之外视为海面可进入,之内视为陆基不可进入。 + # 这里暂用 AOI 内的海岸缓冲近似,渲染为红/绿小格。 + draw_cell(draw, minx, maxy, px_size, x, y, (90, 210, 110, 110)) + sea_count += 1 + cell_count += 1 + x += px_size + y += px_size + + # 让港内不可进入区域更明显:再叠一层海岸缓冲红色边缘。 + # 这里直接沿 AOI 外廓作一个保守缓冲带,后续可再细化到真正 coastline 交集。 + outline = merged.buffer(args.coast_buffer_m, cap_style=2, join_style=2) + outline_p = prep(outline) + for poly in iter_polygons(outline): + pb = poly.bounds + start_x = math.floor(pb[0] / px_size) * px_size + start_y = math.floor(pb[1] / px_size) * px_size + end_x = math.ceil(pb[2] / px_size) * px_size + end_y = math.ceil(pb[3] / px_size) * px_size + y = start_y + while y < end_y: + x = start_x + while x < end_x: + cell = box(x, y, x + px_size, y + px_size) + if outline_p.intersects(cell): + draw_cell(draw, minx, maxy, px_size, x, y, (240, 100, 100, 140)) + land_count += 1 + x += px_size + y += px_size + + out_path = Path(args.output_png) + if not out_path.is_absolute(): + out_path = project_root / out_path + out_path.parent.mkdir(parents=True, exist_ok=True) + image.save(out_path) + + manifest = { + "aoi_source": str(aoi_path), + "bbox_lonlat": list(bbox), + "pixel_size_m": px_size, + "selected_polygon_count": len(selected), + "image_width": width, + "image_height": height, + "cell_count": cell_count, + "sea_count": sea_count, + "land_count": land_count, + "png_file": out_path.name, + } + (out_path.parent / "fish_port_navsplit_fukuoka_saga_full_20m_aoi_raster_manifest.json").write_text( + json.dumps(manifest, ensure_ascii=False, indent=2), + encoding="utf-8", + ) + print("已导出:") + print(" -", out_path) + print(" -", out_path.parent / "fish_port_navsplit_fukuoka_saga_full_20m_aoi_raster_manifest.json") + + +if __name__ == "__main__": + main() diff --git a/coastline/render_fukuoka_saga_three_layer_png.py b/coastline/render_fukuoka_saga_three_layer_png.py new file mode 100644 index 0000000..46461ab --- /dev/null +++ b/coastline/render_fukuoka_saga_three_layer_png.py @@ -0,0 +1,440 @@ +#!/usr/bin/env python3 +from __future__ import annotations + +import argparse +import json +import math +from pathlib import Path + +from PIL import Image, ImageDraw +import mapbox_vector_tile +from shapely.geometry import box, shape +from shapely.ops import transform, unary_union +from shapely.prepared import prep + + +RADIUS = 6378137.0 +MAX_MERCATOR_LAT = 85.0511287798066 +DEFAULT_BBOX = (129.73110007140482, 32.9464631795233, 131.19176072338317, 34.25430274729531) +COAST_CELL_M = 200.0 +FISH_CELL_M = 20.0 +HAZARD_CELL_M = 50.0 + +COAST_SRC = [ + "coastline/C23-06_40_GML.zip", + "coastline/C23-06_41_GML.zip", +] +FISH_AOI_SRC = "src/pbf/port-overlay/kyushu/port_overlay_kyushu_areas.geojson" +PBF_TILE_ROOT = Path("/home/wwwroot/pbf-delivery-kyushu-reencoded") +PBF_TILE_Z = 12 +HAZARD_LAYERS = { + "navigation_hazard_area", + "fixed_fishing_gear_area", + "anchor_caution_hazard_area", + "navigation_hazard_point", + "anchor_caution_hazard_point", + "navigation_marks", +} +LAND_LAYER = "land_area" +POINT_LAYERS = { + "navigation_hazard_point", + "anchor_caution_hazard_point", + "navigation_marks", +} + + +def mercator_x(lon: float) -> float: + return RADIUS * math.radians(lon) + + +def mercator_y(lat: float) -> float: + lat = max(min(lat, MAX_MERCATOR_LAT), -MAX_MERCATOR_LAT) + return RADIUS * math.log(math.tan(math.pi / 4.0 + math.radians(lat) / 2.0)) + + +def lon_from_mercator(x: float) -> float: + return math.degrees(x / RADIUS) + + +def lat_from_mercator(y: float) -> float: + return math.degrees(2.0 * math.atan(math.exp(y / RADIUS)) - math.pi / 2.0) + + +def bbox_intersects(a, b) -> bool: + return not (a[2] < b[0] or a[0] > b[2] or a[3] < b[1] or a[1] > b[3]) + + +def local_name(tag: str) -> str: + return tag.split("}", 1)[-1] + + +def load_xml(zip_path: Path): + import zipfile + import xml.etree.ElementTree as ET + + with zipfile.ZipFile(zip_path) as zf: + xml_name = next(name for name in zf.namelist() if name.endswith(".xml") and "META" not in name) + return ET.fromstring(zf.read(xml_name)) + + +def lonlat_from_text(text: str) -> tuple[float, float]: + parts = [p for p in text.replace(",", " ").split() if p] + if len(parts) < 2: + raise ValueError(f"invalid coordinate text: {text!r}") + lat = float(parts[0]) + lon = float(parts[1]) + return lon, lat + + +def build_point_lookup(root) -> dict[str, tuple[float, float]]: + lookup: dict[str, tuple[float, float]] = {} + for point in root.iter(): + if local_name(point.tag) != "GM_Point": + continue + point_id = point.attrib.get("id") + if not point_id: + continue + coord_text = None + for el in point.iter(): + if local_name(el.tag).endswith("DirectPosition.coordinate") and (el.text or "").strip(): + coord_text = el.text.strip() + break + if coord_text is None: + continue + lookup[point_id] = lonlat_from_text(coord_text) + return lookup + + +def extract_curve_coords(curve, point_lookup: dict[str, tuple[float, float]]) -> list[tuple[float, float]]: + coords: list[tuple[float, float]] = [] + for pos in curve.iter(): + tag = local_name(pos.tag) + if not tag.startswith("GM_Position"): + continue + direct = None + ref = None + for child in list(pos): + child_tag = local_name(child.tag) + if child_tag.endswith("DirectPosition.coordinate") and (child.text or "").strip(): + direct = child.text.strip() + break + if child_tag.endswith("PointRef.point"): + ref = child.attrib.get("idref") + if direct is not None: + coords.append(lonlat_from_text(direct)) + elif ref and ref in point_lookup: + coords.append(point_lookup[ref]) + return coords + + +def tile_lonlat_bounds(z: int, x: int, y: int) -> tuple[float, float, float, float]: + n = 2**z + lon_left = x / n * 360.0 - 180.0 + lon_right = (x + 1) / n * 360.0 - 180.0 + lat_top = math.degrees(math.atan(math.sinh(math.pi * (1 - 2 * y / n)))) + lat_bottom = math.degrees(math.atan(math.sinh(math.pi * (1 - 2 * (y + 1) / n)))) + return lon_left, lat_bottom, lon_right, lat_top + + +def tile_mercator_bounds(z: int, x: int, y: int) -> tuple[float, float, float, float]: + lon_min, lat_min, lon_max, lat_max = tile_lonlat_bounds(z, x, y) + return mercator_x(lon_min), mercator_y(lat_min), mercator_x(lon_max), mercator_y(lat_max) + + +def transform_geom_from_tile(geom, bounds_m: tuple[float, float, float, float], extent: int): + minx, miny, maxx, maxy = bounds_m + dx = maxx - minx + dy = maxy - miny + + def coord(x: float, y: float): + mx = minx + (x / extent) * dx + my = miny + (y / extent) * dy + return mx, my + + def walk(obj): + if isinstance(obj[0], (int, float)): + return coord(obj[0], obj[1]) + return [walk(item) for item in obj] + + return walk(geom) + + +def iter_polygons(geom): + gt = geom.geom_type + if gt == "Polygon": + yield geom + elif gt == "MultiPolygon": + for g in geom.geoms: + yield g + + +def px_from_mercator(x: float, minx: float, px_m: float) -> float: + return (x - minx) / px_m + + +def py_from_mercator(y: float, maxy: float, px_m: float) -> float: + return (maxy - y) / px_m + + +def cell_to_px_rect(minx: float, maxy: float, px_m: float, x: float, y: float, cell_m: float) -> tuple[float, float, float, float]: + x0 = px_from_mercator(x, minx, px_m) + y0 = py_from_mercator(y + cell_m, maxy, px_m) + x1 = px_from_mercator(x + cell_m, minx, px_m) + y1 = py_from_mercator(y, maxy, px_m) + return x0, y0, x1, y1 + + +def main() -> None: + parser = argparse.ArgumentParser(description="Render Fukuoka/Saga three-layer navigation preview") + parser.add_argument("--output-png", default="src/pbf/coastline-only/fukuoka_saga_three_layer/fukuoka_saga_three_layer.png") + parser.add_argument("--bbox", nargs=4, type=float, default=list(DEFAULT_BBOX)) + parser.add_argument("--pixel-size-m", type=float, default=20.0) + parser.add_argument("--coast-buffer-m", type=float, default=12.0) + parser.add_argument("--point-buffer-m", type=float, default=25.0) + args = parser.parse_args() + + project_root = Path(__file__).resolve().parent.parent + out_path = Path(args.output_png) + if not out_path.is_absolute(): + out_path = project_root / out_path + out_path.parent.mkdir(parents=True, exist_ok=True) + + bbox = tuple(args.bbox) + px_m = args.pixel_size_m + + # 1) 渔港 AOI + aoi_path = project_root / FISH_AOI_SRC + data = json.loads(aoi_path.read_text(encoding="utf-8")) + fish_polygons = [] + fish_bounds_list = [] + for feature in data.get("features", []): + props = feature.get("properties") or {} + if props.get("canonical_object_type") != "漁港": + continue + geom = shape(feature["geometry"]) + if not bbox_intersects(geom.bounds, bbox): + continue + mg = transform(lambda x, y, z=None: (mercator_x(x), mercator_y(y)), geom) + fish_polygons.append(mg) + fish_bounds_list.append(mg.bounds) + + if not fish_polygons: + raise SystemExit("no fish-port AOI polygons selected") + + fish_geom = unary_union(fish_polygons) + fish_prepared = prep(fish_geom) + + # 1b) 海岸线底座,用于限制渔港 20m 小框只出现在重叠区域 + coast_lines = [] + for src in COAST_SRC: + root = load_xml(project_root / src) + point_lookup = build_point_lookup(root) + for curve in root.findall(".//{http://www.opengis.net/gml/3.2}Curve"): + coords: list[tuple[float, float]] = [] + for pos_list in curve.findall(".//{http://www.opengis.net/gml/3.2}posList"): + if not pos_list.text: + continue + values = [float(part) for part in pos_list.text.split() if part] + if len(values) < 4 or len(values) % 2 != 0: + continue + for i in range(0, len(values), 2): + lat = values[i] + lon = values[i + 1] + coords.append((mercator_x(lon), mercator_y(lat))) + if len(coords) < 2: + coords = [(mercator_x(lon), mercator_y(lat)) for lon, lat in extract_curve_coords(curve, point_lookup)] + if len(coords) < 2: + continue + coast_lines.append(shape({"type": "LineString", "coordinates": coords})) + + if not coast_lines: + raise SystemExit("no coastline curves were parsed") + + coast_geom = unary_union(coast_lines) + coast_buffer = coast_geom.buffer(args.coast_buffer_m, cap_style=2, join_style=2) + coast_prepared = prep(coast_buffer) + + # 2) 黄色层:PBF 危险对象 + z = PBF_TILE_Z + n = 2**z + lon_min, lat_min, lon_max, lat_max = bbox + x0 = max(0, int((lon_min + 180.0) / 360.0 * n)) + x1 = min(n - 1, int((lon_max + 180.0) / 360.0 * n)) + def ytile(lat: float) -> int: + return int((1.0 - math.asinh(math.tan(math.radians(lat))) / math.pi) / 2.0 * n) + y0 = max(0, ytile(lat_max)) + y1 = min(n - 1, ytile(lat_min)) + + hazard_cells_50m: set[tuple[int, int]] = set() + fish_reef_points: list[tuple[float, float]] = [] + hazard_source_counts: dict[str, int] = {k: 0 for k in HAZARD_LAYERS} + hazard_features = 0 + tile_count = 0 + + for tx in range(x0, x1 + 1): + for ty in range(y0, y1 + 1): + p = PBF_TILE_ROOT / f"{z}/{tx}/{ty}.pbf" + if not p.exists(): + continue + try: + tile = mapbox_vector_tile.decode(p.read_bytes()) + except Exception: + continue + tile_count += 1 + bounds_m = tile_mercator_bounds(z, tx, ty) + for layer_name in HAZARD_LAYERS: + layer = tile.get(layer_name) + if not layer: + continue + extent = int(layer.get("extent") or 1048576) + for feature in layer.get("features", []): + geom = feature.get("geometry") or {} + if not geom: + continue + props = feature.get("properties") or {} + is_fish_reef = ( + props.get("canonical_object_type") == "fish_reef" + or props.get("chart_symbol_code") == "fish_reef" + or props.get("class_name") == "魚礁" + ) + gtype = geom.get("type") + coords = transform_geom_from_tile(geom.get("coordinates"), bounds_m, extent) + shp = shape({"type": gtype, "coordinates": coords}) + if shp.is_empty: + continue + if is_fish_reef: + fish_reef_points.append((shp.centroid.x, shp.centroid.y)) + hazard_features += 1 + hazard_source_counts[layer_name] += 1 + continue + if layer_name in POINT_LAYERS: + shp = shp.buffer(args.point_buffer_m) + hazard_features += 1 + hazard_source_counts[layer_name] += 1 + minx, miny, maxx, maxy = shp.bounds + start_x = math.floor(minx / HAZARD_CELL_M) * HAZARD_CELL_M + start_y = math.floor(miny / HAZARD_CELL_M) * HAZARD_CELL_M + end_x = math.ceil(maxx / HAZARD_CELL_M) * HAZARD_CELL_M + end_y = math.ceil(maxy / HAZARD_CELL_M) * HAZARD_CELL_M + prep_geom = prep(shp) + cy = start_y + while cy < end_y: + cx = start_x + while cx < end_x: + cell = box(cx, cy, cx + HAZARD_CELL_M, cy + HAZARD_CELL_M) + if prep_geom.intersects(cell): + hazard_cells_50m.add((int(round(cx / HAZARD_CELL_M)), int(round(cy / HAZARD_CELL_M)))) + cx += HAZARD_CELL_M + cy += HAZARD_CELL_M + + # 2b) 黄色层单独导出:50m 障碍格 + 鱼礁黄点 + hazard_minx = mercator_x(bbox[0]) + hazard_miny = mercator_y(bbox[1]) + hazard_maxx = mercator_x(bbox[2]) + hazard_maxy = mercator_y(bbox[3]) + hazard_width = max(1, math.ceil((hazard_maxx - hazard_minx) / px_m)) + hazard_height = max(1, math.ceil((hazard_maxy - hazard_miny) / px_m)) + hazard_image = Image.new("RGBA", (hazard_width, hazard_height), (0, 0, 0, 0)) + hazard_draw = ImageDraw.Draw(hazard_image, "RGBA") + + fish_reef_count = 0 + for ix, iy in hazard_cells_50m: + x = ix * HAZARD_CELL_M + y = iy * HAZARD_CELL_M + x0, y0, x1, y1 = cell_to_px_rect(hazard_minx, hazard_maxy, px_m, x, y, HAZARD_CELL_M) + hazard_draw.rectangle((x0, y0, x1, y1), fill=(242, 194, 48, 150), outline=(235, 180, 20, 160)) + + for x, y in fish_reef_points: + px = px_from_mercator(x, hazard_minx, px_m) + py = py_from_mercator(y, hazard_maxy, px_m) + r = 4.0 + hazard_draw.ellipse((px - r, py - r, px + r, py + r), fill=(242, 194, 48, 235), outline=(141, 103, 0, 230), width=1) + fish_reef_count += 1 + + hazard_overlay_path = out_path.parent / "fukuoka_saga_hazard_50m_overlay.png" + hazard_image.save(hazard_overlay_path) + hazard_manifest = { + "bbox_lonlat": list(bbox), + "pixel_size_m": px_m, + "hazard_cell_m": HAZARD_CELL_M, + "hazard_cells_50m": len(hazard_cells_50m), + "fish_reef_points": fish_reef_count, + "hazard_features": hazard_features, + "hazard_source_counts": hazard_source_counts, + "pbf_tiles_scanned": tile_count, + "image_width": hazard_width, + "image_height": hazard_height, + "png_file": hazard_overlay_path.name, + } + hazard_manifest_path = out_path.parent / "fukuoka_saga_hazard_50m_overlay_manifest.json" + hazard_manifest_path.write_text(json.dumps(hazard_manifest, ensure_ascii=False, indent=2), encoding="utf-8") + + # 4) 20m 渔港不可航行格:只对渔港 AOI 内着色 + minx_all, miny_all = fish_geom.bounds[0], fish_geom.bounds[1] + maxx_all, maxy_all = fish_geom.bounds[2], fish_geom.bounds[3] + width = max(1, math.ceil((maxx_all - minx_all) / px_m)) + height = max(1, math.ceil((maxy_all - miny_all) / px_m)) + image = Image.new("RGBA", (width, height), (0, 0, 0, 0)) + draw = ImageDraw.Draw(image, "RGBA") + + red_cells = 0 + coast_cells = 0 + yellow_cells = 0 + + for poly in iter_polygons(fish_geom): + pb = poly.bounds + start_x = math.floor(pb[0] / FISH_CELL_M) * FISH_CELL_M + start_y = math.floor(pb[1] / FISH_CELL_M) * FISH_CELL_M + end_x = math.ceil(pb[2] / FISH_CELL_M) * FISH_CELL_M + end_y = math.ceil(pb[3] / FISH_CELL_M) * FISH_CELL_M + prep_poly = prep(poly) + y = start_y + while y < end_y: + x = start_x + while x < end_x: + cell = box(x, y, x + FISH_CELL_M, y + FISH_CELL_M) + if prep_poly.intersects(cell) and coast_prepared.intersects(cell): + x0, y0, x1, y1 = cell_to_px_rect(minx_all, maxy_all, px_m, x, y, FISH_CELL_M) + draw.rectangle((x0, y0, x1, y1), fill=(222, 92, 92, 170)) + red_cells += 1 + x += FISH_CELL_M + y += FISH_CELL_M + + # 5) 黄色 50m 格 + for ix, iy in hazard_cells_50m: + x = ix * HAZARD_CELL_M + y = iy * HAZARD_CELL_M + x0, y0, x1, y1 = cell_to_px_rect(minx_all, maxy_all, px_m, x, y, HAZARD_CELL_M) + draw.rectangle((x0, y0, x1, y1), fill=(242, 194, 48, 155)) + yellow_cells += 1 + + image.save(out_path) + + manifest = { + "bbox_lonlat": list(bbox), + "pixel_size_m": px_m, + "coast_cell_m": COAST_CELL_M, + "fish_cell_m": FISH_CELL_M, + "hazard_cell_m": HAZARD_CELL_M, + "fish_polygon_count": len(fish_polygons), + "fish_green_cells": 0, + "fish_red_cells": red_cells, + "hazard_cells_50m": yellow_cells, + "hazard_features": hazard_features, + "hazard_source_counts": hazard_source_counts, + "pbf_tiles_scanned": tile_count, + "image_width": width, + "image_height": height, + "png_file": out_path.name, + } + manifest_path = out_path.parent / "fukuoka_saga_three_layer_manifest.json" + manifest_path.write_text(json.dumps(manifest, ensure_ascii=False, indent=2), encoding="utf-8") + print("已导出:") + print(" -", out_path) + print(" -", manifest_path) + print(" -", hazard_overlay_path) + print(" -", hazard_manifest_path) + + +if __name__ == "__main__": + main() diff --git a/docs/报告/20261013_NavSea_PBF全国Full生产链溯源调查_v1.md b/docs/报告/20261013_NavSea_PBF全国Full生产链溯源调查_v1.md new file mode 100644 index 0000000..5752b0c --- /dev/null +++ b/docs/报告/20261013_NavSea_PBF全国Full生产链溯源调查_v1.md @@ -0,0 +1,154 @@ +# NavSea PBF 全国 Full 标准生产链溯源调查 v1 + +- 调查日期:2026-10-13 +- 调查环境:X220 / Ubuntu Linux;工程目录 `/root/sourceserver/pbf` +- 调查性质:只读追溯历史生产代码、原始分片、合并目录及公网交付物;**未重建、未替换生产 PBF、未切换 Git 分支或 Worktree** +- 当前工程仓库:`main`,调查起点 HEAD `1fef4c6dd12a21d4228b39d67d569a660b149a03`,远端 `ssh://git@nas:2222/tei/pbf.git` +- 权威标准决定:2026-10-13 用户明确指定公网全国 Full PBF 为 NavSea PBF 标准,必须找到**实际生成该公网数据**的生产链,不得仅凭名称选择最新脚本或本地同名目录。 + +## 一、最终结论(优先阅读) + +**正确的历史生产流水线为 2026-04-18 全国 Full 四段分片生成流水线。** + +1. 代码属地:`/root/sourceserver/pbf`;历史生成代码固定在 Git commit `6d72340f364ee0c9020df8de7ede6a2e1a0621b0`,主要程序 `navsea_tile_builder.py`、`navsea_mapping_registry.py`、`tasks/pbf/mappings/`。 +2. 输入原始数据:`/home/wwwroot/newpec/exported_auto/tile.mapple-on.jp__newpec-mvt-20260106__z___x___y_.pbf/tiles`。 +3. 语义数据:MySQL `pbf_analysis`;映射规则包 `navsea-core`。 +4. Reference footprint:`/home/wwwroot/pbf-delivery-full-20260415`;**只指定 z/x/y 覆盖范围,不是新瓦片几何或业务属性的内容来源**。 +5. **实际生产原始分片目录(保留至今):`/home/wwwroot/pbf-delivery-full-20260418-rebuild.parts/`**,包含 `z0_8/`、`z9_10/`、`z11/`、`z12/`。 +6. 2026-04-18 合并交付目录原为 `/home/wwwroot/pbf-delivery-full-20260418-rebuild/`。用户确认最终版本从此工程生产后被复制至公网。 +7. **真正的公开对照:`https://pbf.jpcn.ccwu.cc/pbf/pbf-delivery-full-20260418-rebuild/{z}/{x}/{y}.pbf`。** +8. 当前同名本地合并目录中**部分文件已发生后续变化**;对照公网应优先取原始 `.parts` 分片,不能直接以当前同名合并目录为“2026-04-18 原始字节基线”。 + +结论证据包含:完整的 2026-06-11 历史重建说明、STEP_RECORD 历史记录、4 份分片 mapping audit、现存分片文件、8 个公网/原始分片 SHA-256 一致样本,以及 2026-08-08 hardlink inode 检查。**尚未逐一下载/比较全国 65,148 张公网瓦片,不能声称全量字节一致。** + +## 二、2026-04-18 生产流水线 + +```text +X220 /root/sourceserver/pbf + 历史代码:Git 6d72340 + ├─ navsea_tile_builder.py + ├─ navsea_mapping_registry.py + └─ tasks/pbf/mappings/ + │ +NewPEC 全国原始 PBF ─┬─ MySQL pbf_analysis / navsea-core + │ +20260415 reference ──┴──仅约束输出瓦片覆盖坐标 + │ + 四段独立生成 + │ +/home/wwwroot/pbf-delivery-full-20260418-rebuild.parts/ + ├─ z0_8/ (344) + ├─ z9_10/ (3,969) + ├─ z11/ (12,279) + └─ z12/ (48,556) + │ + 按相互不重叠的 zoom 合并 + │ +/home/wwwroot/pbf-delivery-full-20260418-rebuild/ + (历史合并目录,现已部分变化) + │ + 用户复制发布 + │ +https://pbf.jpcn.ccwu.cc/pbf/ +pbf-delivery-full-20260418-rebuild/{z}/{x}/{y}.pbf +``` + +历史重建入口权威文档:`NavSea_全国完整PBF重建流水线说明.md`(最后确认 2026-06-11)。 + +该文档固定的共同参数为:`--strip-legacy-japanese-delivery`、`--release-minimal`、`--fid-key`、`--bundle-id navsea-core`,且固定历史代码。FID key 的实际历史参数值应从上述受控源文档或受控执行配置取得,不在新文档重复扩散。 + +原工程里的 `navsea_rebuild_hotspot_tiles.py` 只用于 AOI 热点定位,**不是**正式全国生产入口;后续 `src/Domain/`、semantic unified、九州测试和 Provider Package 都不能未经批准替代这一生产基线。 + +### 分片数量与审计原文件 + +| 分片目录 | 实际 mapping audit 记录 written_tiles | 对应审计文件 | +| --- | ---: | --- | +| `z0_8` | 344 | `z0_8.mapping_audit.json`、`.md` | +| `z9_10` | 3,969 | `z9_10.mapping_audit.json`、`.md` | +| `z11` | 12,279 | `z11.mapping_audit.json`、`.md` | +| `z12` | 48,556 | `z12.mapping_audit.json`、`.md` | +| **合计** | **65,148** | 历史全国 Full 范围 | + +以上 4 套实际审计文件保存在 `/home/wwwroot/pbf-delivery-full-20260418-rebuild.parts/`,其中 `bundle_id=navsea-core` 且 `output_root` 指向对应实际分片目录。 + +历史合并后 zoom 分布:z0=1、z5=10、z6=27、z7=76、z8=230、z9=813、z10=3156、z11=12279、z12=48556;z1–z4 未生成相应瓦片。 + +## 三、公网文件反向校验(2026-10-13) + +比较方法:在 X220 上对公开 HTTP GET 响应和本地 `.parts` 文件分别做 SHA-256;使用相同 `z/x/y.pbf`。抽查覆盖全部有输出的 zoom 段中的多个等级。 + +| 瓦片 | 所属原始分片 | 公网与原始分片 | SHA-256 | +| --- | --- | --- | --- | +| `0/0/0.pbf` | z0_8 | MATCH | `32d19b773a93ef038c13766b8e36fd586d9919d5c524c68e39468b7d54445d41` | +| `5/27/14.pbf` | z0_8 | MATCH | `281788adf614be91fe8b8801438f2f9a4ee15d1efdefec49d2f2527ca63e8c54` | +| `8/234/91.pbf` | z0_8 | MATCH | `3e108574b386081de755ee81ca572e9d5988f655935c770a8b201c2cbb58a4e1` | +| `9/431/216.pbf` | z9_10 | MATCH | `4b2d5032be354cce7eab24693377f7ace1351666f324b3229ad9c32697edd3c7` | +| `10/910/441.pbf` | z9_10 | MATCH | `5243fe8af421224cde897044546c0edc70cc972717f621713f81a308f0539eec` | +| `11/1764/859.pbf` | z11 | MATCH | `a044b23d56bb6a9ecebff7c9ab63fb25a7928d450fb4c5991f887aa46ca06263` | +| `12/3632/1620.pbf` | z12 | MATCH | `34ca18e6a27ffc4db4dd759ca0baf64eb83da51bc28ccef4ebe74493c405db8b` | +| `12/3525/1643.pbf` | z12 | MATCH | `0386cc54d8db71b9af77300267bad75148fc7a125976067335bb9645f9b35be4` | + +额外确认:`12/3525/1643.pbf` 在 `pbf-delivery-full-20260418-staging-z12` 与 `pbf-delivery-full-20260408` 的本地样本也与公网一致;**仅凭单个文件一致不能认定这些更早目录就是最终生产路径**。有完整 4 分片审计与文档支撑的生产源仍是 `20260418-rebuild.parts`。 + +### 当前同名目录为什么不可作原始字节对照 + +样本 `12/3525/1643.pbf`: + +- 公网:98,160 bytes,SHA-256 `0386cc54…`。 +- 原始 `.parts/z12/`:98,160 bytes,SHA-256 `0386cc54…`,文件 mtime 为 2026-04-18。 +- 目前 `/home/wwwroot/pbf-delivery-full-20260418-rebuild/`:98,149 bytes,SHA-256 `794fc6e9…`,文件 mtime 为 **2026-08-08 22:48:33 (+08:00)**。 +- 当前合并目录该样本与 `/home/wwwroot/pbf-delivery-full-semantic-unified-20260808/` 样本 inode 均为 `14055745`,link count=2,确认二者是硬链接。 +- `navsea_reencode_unified_semantic_pbf.py` 定义以同名合并目录为 BASE_ROOT,以 `semantic-unified-20260808` 为 OUTPUT_ROOT,并通过 `cp -al` 建立硬链接,再对选中目标解除链接重编码。**这证明两套目录之间存在共享 inode 风险,但不能仅凭样本反推每一次实际修改由哪个进程写入。** +- 对 8 个样本进行 `.parts` 与当前合并目录比较:`8/234/91.pbf` 和 `12/3525/1643.pbf` 已不同;其他 6 个一致。因此“部分改变”有直接证据,而非推测。 + +历史重建文档所述的“业务结构等价”不要求 SHA-256 全相同,但这次反向找生产路径采取字节一致校验,辨识实际仍存的原始分片。二者不是矛盾的验收标准。 + +## 四、历史沿革(已查证节点) + +1. **2026-04-08 前后**:存在更早的 `pbf-delivery-full-20260408` 与工程版,是本轮溯源中的前驱/对照,不自动作为正式四段流水线。 +2. **2026-04-15**:全国 `pbf-delivery-full-20260415` 留作 reference footprint;后续不能误写成正式重建内容源。 +3. **2026-04-18**:历史固定代码 `6d72340` 修复高 extent reencoding 风险;基于 NewPEC + MySQL + navsea-core,按四段重建并合并全国 65,148 张,执行几何、native 和固定 AOI 审计。 +4. **2026-06-11**:写成 `NavSea_全国完整PBF重建流水线说明.md`,固定代码、数据源、分片参数、审计顺序和候选目录发布法;明确不覆盖原基线。 +5. **2026-08-06~08**:在既有 Full PBF 上进行语义图标、Style、Sprite 分析与 `semantic-unified-20260808` 派生;此阶段发生的硬链接共享和当前本地样本 mtime 提示原合并目录不再是可靠的原始字节快照。 +6. **2026-10-13**:用户指定已发布的公网全国 Full 为权威标准;反向调查以多个缩放等级的 SHA-256 校验定位到现存 `.parts` 原始分片,澄清“同名本地合并目录”与“公网实际交付内容”的差异。 + +说明:公网部署采用何种 `cp/rsync` 具体命令、实际复制时间及服务器磁盘目标位置,当前缺乏独立的命令日志;“从此工程生成后 copy 到公网”是用户确认的事实,不应伪造进一步的部署路径。 + +## 五、历史验收与未来修改门禁 + +相关现存审计入口: + +- `navsea_object_preservation_audit.py`:对象保全(FID/对象类型/几何来源需可追溯)。 +- `navsea_render_audit.py`:渲染命中、Style 消费及语义对照。 +- `navsea_geometry_native_audit.py`、`navsea_extent_shift_audit.py`、`navsea_tile_reencode_guard.py`:几何/extent/native 风险。 +- `navsea_full_aoi_visual_audit.py`:全国 AOI 截图和差异。 +- `report/full_rebuild_final_geometry_2026-04-18/` 与 `report/full_rebuild_final_aoi_visual_2026-04-18/`:历史生成期间的审核资料。 +- `src/pbf/style.navsea-delivery-full-semantic-extentfix.json`、`/newpec/sprite-semantic/sprite`:2026-08-06 文档确立的全国 Full **显示**组合;Style/Sprite 与 PBF 生产流水线是不同层次,不能把较新 UI 样式当成较新 PBF 生产源。 + +必须按 **对象保全 → Render/geometry/extent → 全国 AOI 人工视觉** 的顺序验收。需要新生产版本时: + +1. 先确认历史固定 Git 树与实际 DB/原始数据是否仍可用;不要用当前 HEAD `navsea_tile_builder.py` 覆盖历史含义,后续修改的功能必须单独验证。 +2. 先把基线与候选的 Style、规则包、原始 PBF、数据库状态、参考覆盖清单固定;数据库未做本轮只读一致性查询,不能声称当前数据库与 2026-04-18 完全相同。 +3. **只在新的候选目录生成**。Builder 会清理目标目录旧 PBF,绝不可指向正式交付目录或现存 `.parts`。 +4. 对象、properties、geometry、extent、source-layer、NavSea FID 和截图对照均通过后,提交新版本审计报告给用户确认;未经用户批准不替换正式 URL、Style 或硬链接目录。 +5. 不在没有用户批准的情况下执行仓库新建/切换分支或 Worktree,不执行重建/覆盖生产数据。 +6. 不把工程目录 `src/pbf` 下的大量生成 GeoJSON、`out/` SQLite/BIN、原始 ZIP 或全国 PBF 瓦片加入 Git;它们是数据、临时输出或生产结果,不能代替历史可复现源码与文档。 + +## 六、与 PbfProvider 项目的边界 + +2026-10-13 已有 `PBF_PROVIDER_MIGRATED.md` 明确:Provider 自己的 PBF/Style/Sprite 分析、视觉确认与 Package 生产迁出至独立仓库 `https://git.eyaku.jp/tei/PbfProvider`。这是**新架构的职责划分**,不改变本报告追溯的 `pbf` 仓库在 2026-04-18 生成 NewPEC 全国 Full PBF 的历史事实。不得从当前 Provider Package 反推它才是该公网 PBF 的生产路径。 + +## 七、证据、限制与交接要点 + +证据文件: + +- **8 份原始分片 mapping audit 已按原字节复制归档**:`docs/报告/20261013_全国Full生产分片历史审计证据/`(4 段 × JSON/Markdown,SHA-256 已与原文件逐份核对);源文件仍留在 `/home/wwwroot/pbf-delivery-full-20260418-rebuild.parts/`。 +- `NavSea_全国完整PBF重建流水线说明.md` +- `STEP_RECORD.md`:2026-04-18、2026-06-11、2026-08-06、2026-08-08 各阶段记录 +- `/home/wwwroot/pbf-delivery-full-20260418-rebuild.parts/*.mapping_audit.json` 及配套 Markdown +- `navsea_reencode_unified_semantic_pbf.py` +- Git 原提交 `6d72340` 与现有 `main` HEAD 历史 + +本次未进行:全量公网 65,148 文件比较、数据库重建/一致性验证、实际重新构建、MySQL 变更、生产部署、Git Worktree 切换。历史报告中的对象审计覆盖范围也不能无条件等同于全部要素。 + +**下次继续工作的最短读法**:先读本报告 → `NavSea_全国完整PBF重建流水线说明.md` → `STEP_RECORD.md` 历史相关段落 → 4 份 mapping audit → 在公开 URL 与原始 `.parts` 上做新样本核验 → 再决定是否修改代码。切勿把更名后的本地同名目录当成未经修改的字节金本位。 diff --git a/docs/报告/20261013_全国Full生产分片历史审计证据/z0_8.mapping_audit.json b/docs/报告/20261013_全国Full生产分片历史审计证据/z0_8.mapping_audit.json new file mode 100644 index 0000000..a256631 --- /dev/null +++ b/docs/报告/20261013_全国Full生产分片历史审计证据/z0_8.mapping_audit.json @@ -0,0 +1,5791 @@ +{ + "bundle_id": "navsea-core", + "output_root": "/home/wwwroot/pbf-delivery-full-20260418-rebuild.parts/z0_8", + "tile_jobs": 344, + "written_tiles": 344, + "skipped_tiles": 0, + "unresolved_event_count": 560915, + "unresolved_summary": [ + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線ククリ", + "canonical_object_type": "P基本線ククリ", + "geom_type": "LineString", + "count": 163774, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線ククリ", + "canonical_object_type": "P基本線ククリ", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 6602454, + "fid": "EC48C884", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線ククリ", + "canonical_object_type": "P基本線ククリ", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 6602455, + "fid": "5C8035AF", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線ククリ", + "canonical_object_type": "P基本線ククリ", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 6602456, + "fid": "EC171CFB", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線ククリ", + "canonical_object_type": "P基本線ククリ", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 6602457, + "fid": "1DAB7175", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線ククリ", + "canonical_object_type": "P基本線ククリ", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 6602458, + "fid": "355B1F3F", + "z": 0, + "x": 0, + "y": 0 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "L海底地形", + "canonical_object_type": "L海底地形", + "geom_type": "LineString", + "count": 118769, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L海底地形", + "canonical_object_type": "L海底地形", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 1276887, + "fid": "EFE5E233", + "z": 7, + "x": 107, + "y": 53 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L海底地形", + "canonical_object_type": "L海底地形", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 1276888, + "fid": "A60034C6", + "z": 7, + "x": 107, + "y": 53 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L海底地形", + "canonical_object_type": "L海底地形", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 1276889, + "fid": "626EF619", + "z": 7, + "x": 107, + "y": 53 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L海底地形", + "canonical_object_type": "L海底地形", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 1276890, + "fid": "0601CFC5", + "z": 7, + "x": 107, + "y": 53 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L海底地形", + "canonical_object_type": "L海底地形", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 2145791, + "fid": "03B8D0B3", + "z": 7, + "x": 107, + "y": 54 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "L等深線", + "canonical_object_type": "等深線", + "geom_type": "LineString", + "count": 99722, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L等深線", + "canonical_object_type": "等深線", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 2146234, + "fid": "2855083F", + "z": 7, + "x": 107, + "y": 54 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L等深線", + "canonical_object_type": "等深線", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 2146235, + "fid": "814E5D81", + "z": 7, + "x": 107, + "y": 54 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L等深線", + "canonical_object_type": "等深線", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 2146236, + "fid": "D47409FA", + "z": 7, + "x": 107, + "y": 54 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L等深線", + "canonical_object_type": "等深線", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 2146237, + "fid": "189B08E5", + "z": 7, + "x": 107, + "y": 54 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L等深線", + "canonical_object_type": "等深線", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 2146238, + "fid": "5DE10E7F", + "z": 7, + "x": 107, + "y": 54 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P穴", + "canonical_object_type": "P穴", + "geom_type": "Polygon", + "count": 38981, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P穴", + "canonical_object_type": "P穴", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6606086, + "fid": "F26B01B0", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P穴", + "canonical_object_type": "P穴", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6606087, + "fid": "C41C7B94", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P穴", + "canonical_object_type": "P穴", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6606088, + "fid": "76B01E94", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P穴", + "canonical_object_type": "P穴", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6606089, + "fid": "1806518A", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P穴", + "canonical_object_type": "P穴", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6606090, + "fid": "48F2E807", + "z": 0, + "x": 0, + "y": 0 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "5-10m", + "geom_type": "Polygon", + "count": 13206, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5-10m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6602434, + "fid": "7E984E1E", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5-10m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6602435, + "fid": "36874832", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5-10m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6602436, + "fid": "86B0692D", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5-10m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6602437, + "fid": "9A2FAB49", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5-10m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6602438, + "fid": "17117FA9", + "z": 0, + "x": 0, + "y": 0 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "5-10m", + "geom_type": "MultiPolygon", + "count": 12767, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5-10m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6602449, + "fid": "F34C948C", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5-10m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 5777878, + "fid": "B44A94B0", + "z": 5, + "x": 26, + "y": 13 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5-10m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 5777880, + "fid": "385AA778", + "z": 5, + "x": 26, + "y": 13 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5-10m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 5777881, + "fid": "6FB08B72", + "z": 5, + "x": 26, + "y": 13 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5-10m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 5777883, + "fid": "1A5200C8", + "z": 5, + "x": 26, + "y": 13 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "0-5m", + "geom_type": "MultiPolygon", + "count": 10112, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-5m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 5777841, + "fid": "7EBBAC6A", + "z": 5, + "x": 26, + "y": 13 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-5m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 5777842, + "fid": "00765484", + "z": 5, + "x": 26, + "y": 13 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-5m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 5777843, + "fid": "D480B85B", + "z": 5, + "x": 26, + "y": 13 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-5m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 5777844, + "fid": "5C4B5CF9", + "z": 5, + "x": 26, + "y": 13 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-5m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 5777845, + "fid": "2A91B74E", + "z": 5, + "x": 26, + "y": 13 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P陸域", + "canonical_object_type": "P陸域", + "geom_type": "Polygon", + "count": 9374, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P陸域", + "canonical_object_type": "P陸域", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6606387, + "fid": "5B97EC36", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P陸域", + "canonical_object_type": "P陸域", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6606390, + "fid": "1F1B0F2A", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P陸域", + "canonical_object_type": "P陸域", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6606392, + "fid": "6827EE69", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P陸域", + "canonical_object_type": "P陸域", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6606393, + "fid": "0BAB921F", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P陸域", + "canonical_object_type": "P陸域", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6606395, + "fid": "B10F85F9", + "z": 0, + "x": 0, + "y": 0 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "10-20m", + "geom_type": "Polygon", + "count": 7769, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "10-20m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6601951, + "fid": "D07EE97C", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "10-20m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6601952, + "fid": "348DCA57", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "10-20m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6601953, + "fid": "8B89F745", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "10-20m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6601958, + "fid": "D7A11006", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "10-20m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6601962, + "fid": "0437853E", + "z": 0, + "x": 0, + "y": 0 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "0-5m", + "geom_type": "Polygon", + "count": 7273, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-5m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6602415, + "fid": "7D3588C5", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-5m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6602416, + "fid": "0C9A20C0", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-5m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6602417, + "fid": "579B10CF", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-5m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6602418, + "fid": "E049A553", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-5m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6602419, + "fid": "006C327C", + "z": 0, + "x": 0, + "y": 0 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "2-5m", + "geom_type": "Polygon", + "count": 6949, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2-5m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6602426, + "fid": "3720E480", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2-5m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6602427, + "fid": "9EEFE193", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2-5m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6602428, + "fid": "19548092", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2-5m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6602429, + "fid": "497574A4", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2-5m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6602430, + "fid": "169F641B", + "z": 0, + "x": 0, + "y": 0 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "L海底地形", + "canonical_object_type": "L海底地形", + "geom_type": "MultiLineString", + "count": 6369, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L海底地形", + "canonical_object_type": "L海底地形", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 2145951, + "fid": "0D68F5F5", + "z": 7, + "x": 107, + "y": 54 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L海底地形", + "canonical_object_type": "L海底地形", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 2145968, + "fid": "3006A5C6", + "z": 7, + "x": 107, + "y": 54 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L海底地形", + "canonical_object_type": "L海底地形", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 2145975, + "fid": "6EBD5633", + "z": 7, + "x": 107, + "y": 54 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L海底地形", + "canonical_object_type": "L海底地形", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 2146070, + "fid": "3FA718A7", + "z": 7, + "x": 107, + "y": 54 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L海底地形", + "canonical_object_type": "L海底地形", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 2146077, + "fid": "43564763", + "z": 7, + "x": 107, + "y": 54 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "干潮帯", + "geom_type": "Polygon", + "count": 6308, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "干潮帯", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6602450, + "fid": "3FC0DBDF", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "干潮帯", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6602451, + "fid": "70952593", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "干潮帯", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 5777899, + "fid": "7F437C4B", + "z": 5, + "x": 26, + "y": 13 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "干潮帯", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 5777900, + "fid": "E1AD6ACB", + "z": 5, + "x": 26, + "y": 13 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "干潮帯", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 5777901, + "fid": "E0457B3D", + "z": 5, + "x": 26, + "y": 13 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "10-20m", + "geom_type": "MultiPolygon", + "count": 6053, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "10-20m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6601954, + "fid": "A31757E0", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "10-20m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6601955, + "fid": "B0770DCE", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "10-20m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6601956, + "fid": "0097E025", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "10-20m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6601957, + "fid": "AA00B6D9", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "10-20m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6601959, + "fid": "E26A14F5", + "z": 0, + "x": 0, + "y": 0 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "干潮帯", + "geom_type": "MultiPolygon", + "count": 4990, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "干潮帯", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 5777904, + "fid": "3644A6DF", + "z": 5, + "x": 26, + "y": 13 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "干潮帯", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 5777905, + "fid": "A0D4E93E", + "z": 5, + "x": 26, + "y": 13 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "干潮帯", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 5777907, + "fid": "A630E55F", + "z": 5, + "x": 26, + "y": 13 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "干潮帯", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 5777909, + "fid": "25CF8E17", + "z": 5, + "x": 26, + "y": 13 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "干潮帯", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 5777912, + "fid": "C4855872", + "z": 5, + "x": 26, + "y": 13 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "2-5m", + "geom_type": "MultiPolygon", + "count": 4589, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2-5m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 5777857, + "fid": "129C5A63", + "z": 5, + "x": 26, + "y": 13 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2-5m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 5777858, + "fid": "F0493CEA", + "z": 5, + "x": 26, + "y": 13 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2-5m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 5777859, + "fid": "A1F1EA6F", + "z": 5, + "x": 26, + "y": 13 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2-5m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 5777860, + "fid": "2A5DD9C8", + "z": 5, + "x": 26, + "y": 13 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2-5m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 5777861, + "fid": "D1096A72", + "z": 5, + "x": 26, + "y": 13 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "浅所危険界", + "geom_type": "Polygon", + "count": 4561, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "浅所危険界", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1996672, + "fid": "0DB7F52E", + "z": 5, + "x": 27, + "y": 12 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "浅所危険界", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1996673, + "fid": "9D18B6C3", + "z": 5, + "x": 27, + "y": 12 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "浅所危険界", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1996674, + "fid": "F96A0D58", + "z": 5, + "x": 27, + "y": 12 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "浅所危険界", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1996675, + "fid": "FE755C56", + "z": 5, + "x": 27, + "y": 12 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "浅所危険界", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1996676, + "fid": "5FB3B44A", + "z": 5, + "x": 27, + "y": 12 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "0-2m", + "geom_type": "Polygon", + "count": 3071, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-2m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6602413, + "fid": "95AE8A62", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-2m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6602414, + "fid": "1FF88844", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-2m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 5777822, + "fid": "A0FB6149", + "z": 5, + "x": 26, + "y": 13 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-2m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 5777823, + "fid": "1FDAA6C3", + "z": 5, + "x": 26, + "y": 13 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-2m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 5777824, + "fid": "3F8EDB7D", + "z": 5, + "x": 26, + "y": 13 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "20-100m", + "geom_type": "Polygon", + "count": 2743, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "20-100m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6601991, + "fid": "1A918C38", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "20-100m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6601992, + "fid": "F38BF372", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "20-100m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6601993, + "fid": "1806518A", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "20-100m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6601995, + "fid": "E862E555", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "20-100m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6601997, + "fid": "7E4481FF", + "z": 0, + "x": 0, + "y": 0 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P穴", + "canonical_object_type": "P穴", + "geom_type": "MultiPolygon", + "count": 2708, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P穴", + "canonical_object_type": "P穴", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6606109, + "fid": "D1493205", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P穴", + "canonical_object_type": "P穴", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6606113, + "fid": "FD95B91F", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P穴", + "canonical_object_type": "P穴", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6606114, + "fid": "FD95B91F", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P穴", + "canonical_object_type": "P穴", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6606115, + "fid": "8807D674", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P穴", + "canonical_object_type": "P穴", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6606117, + "fid": "56E28772", + "z": 0, + "x": 0, + "y": 0 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "0-2m", + "geom_type": "MultiPolygon", + "count": 2236, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-2m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 5777828, + "fid": "37AD052E", + "z": 5, + "x": 26, + "y": 13 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-2m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 5777829, + "fid": "581B753A", + "z": 5, + "x": 26, + "y": 13 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-2m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 5777831, + "fid": "27289469", + "z": 5, + "x": 26, + "y": 13 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-2m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 5777832, + "fid": "93C15BE2", + "z": 5, + "x": 26, + "y": 13 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-2m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 5777833, + "fid": "245BD740", + "z": 5, + "x": 26, + "y": 13 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "100-200m", + "geom_type": "Polygon", + "count": 2031, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "100-200m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6602036, + "fid": "8958AD5B", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "100-200m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6602037, + "fid": "059FAC86", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "100-200m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6602038, + "fid": "68ECAE42", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "100-200m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6602039, + "fid": "DA4E97B5", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "100-200m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6602040, + "fid": "B02B2865", + "z": 0, + "x": 0, + "y": 0 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P陸域", + "canonical_object_type": "P陸域", + "geom_type": "MultiPolygon", + "count": 1992, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P陸域", + "canonical_object_type": "P陸域", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6606388, + "fid": "7F464CF0", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P陸域", + "canonical_object_type": "P陸域", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6606389, + "fid": "41408D37", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P陸域", + "canonical_object_type": "P陸域", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6606391, + "fid": "103FABC1", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P陸域", + "canonical_object_type": "P陸域", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6606394, + "fid": "848E5376", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P陸域", + "canonical_object_type": "P陸域", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6606407, + "fid": "C54DF125", + "z": 0, + "x": 0, + "y": 0 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "200-500m", + "geom_type": "Polygon", + "count": 1883, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "200-500m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6602089, + "fid": "56EE429C", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "200-500m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6602090, + "fid": "70C29072", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "200-500m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6602091, + "fid": "AF13A7C0", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "200-500m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6602092, + "fid": "770DB2D3", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "200-500m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6602093, + "fid": "5953BEF0", + "z": 0, + "x": 0, + "y": 0 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "防波堤", + "geom_type": "Polygon", + "count": 1816, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "防波堤", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1996251, + "fid": "B8B20E68", + "z": 5, + "x": 27, + "y": 12 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "防波堤", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1996252, + "fid": "0063ED7E", + "z": 5, + "x": 27, + "y": 12 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "防波堤", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1996253, + "fid": "EEF58D08", + "z": 5, + "x": 27, + "y": 12 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "防波堤", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1996254, + "fid": "791DC1AB", + "z": 5, + "x": 27, + "y": 12 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "防波堤", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1996255, + "fid": "AE8D164E", + "z": 5, + "x": 27, + "y": 12 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "500-1000m", + "geom_type": "Polygon", + "count": 1754, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "500-1000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6602137, + "fid": "F26B01B0", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "500-1000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6602138, + "fid": "2E9857CA", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "500-1000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6602139, + "fid": "4ED0A7E9", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "500-1000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6602140, + "fid": "9501F8EE", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "500-1000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6602141, + "fid": "BDBE0C3B", + "z": 0, + "x": 0, + "y": 0 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "河川域", + "geom_type": "MultiPolygon", + "count": 1626, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "河川域", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 5777930, + "fid": "FDC93C3C", + "z": 5, + "x": 26, + "y": 13 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "河川域", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1996802, + "fid": "C368DE9F", + "z": 5, + "x": 27, + "y": 12 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "河川域", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1996803, + "fid": "E192CE08", + "z": 5, + "x": 27, + "y": 12 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "河川域", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1996804, + "fid": "73843E9D", + "z": 5, + "x": 27, + "y": 12 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "河川域", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1996806, + "fid": "DBCA9480", + "z": 5, + "x": 27, + "y": 12 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "1000-2000m", + "geom_type": "Polygon", + "count": 1608, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "1000-2000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6602182, + "fid": "F7FF20CB", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "1000-2000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6602183, + "fid": "84AC493A", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "1000-2000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6602184, + "fid": "57B0E605", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "1000-2000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6602185, + "fid": "8B7008BB", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "1000-2000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6602186, + "fid": "10E4A74F", + "z": 0, + "x": 0, + "y": 0 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "0-10m", + "geom_type": "MultiPolygon", + "count": 1381, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-10m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 5777847, + "fid": "A09598F3", + "z": 5, + "x": 26, + "y": 13 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-10m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 5777848, + "fid": "DB3EC69F", + "z": 5, + "x": 26, + "y": 13 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-10m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 5777849, + "fid": "74E48F1D", + "z": 5, + "x": 26, + "y": 13 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-10m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1994442, + "fid": "2EC83232", + "z": 5, + "x": 27, + "y": 12 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-10m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1994445, + "fid": "766B642C", + "z": 5, + "x": 27, + "y": 12 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "0-10m", + "geom_type": "Polygon", + "count": 1354, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-10m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 5777846, + "fid": "D954D328", + "z": 5, + "x": 26, + "y": 13 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-10m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1994419, + "fid": "69A181A5", + "z": 5, + "x": 27, + "y": 12 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-10m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1994420, + "fid": "FA607301", + "z": 5, + "x": 27, + "y": 12 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-10m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1994421, + "fid": "98AE7830", + "z": 5, + "x": 27, + "y": 12 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-10m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1994422, + "fid": "5BC78098", + "z": 5, + "x": 27, + "y": 12 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "2000-3000m", + "geom_type": "Polygon", + "count": 1284, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2000-3000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6602226, + "fid": "A9C357C2", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2000-3000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6602227, + "fid": "268C79E6", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2000-3000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6602228, + "fid": "1C6FE2C1", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2000-3000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6602229, + "fid": "B6AC35C2", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2000-3000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6602230, + "fid": "D68A509D", + "z": 0, + "x": 0, + "y": 0 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "河川域", + "geom_type": "Polygon", + "count": 1106, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "河川域", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6602452, + "fid": "B93D993E", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "河川域", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 5777929, + "fid": "027C1DB3", + "z": 5, + "x": 26, + "y": 13 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "河川域", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1996798, + "fid": "A3BB5B00", + "z": 5, + "x": 27, + "y": 12 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "河川域", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1996799, + "fid": "0EDCC701", + "z": 5, + "x": 27, + "y": 12 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "河川域", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1996800, + "fid": "875FB257", + "z": 5, + "x": 27, + "y": 12 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "3000-4000m", + "geom_type": "Polygon", + "count": 1085, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "3000-4000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6602268, + "fid": "69693C82", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "3000-4000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6602269, + "fid": "89E8A516", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "3000-4000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6602270, + "fid": "979D6D1F", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "3000-4000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6602271, + "fid": "128BF4F9", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "3000-4000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6602272, + "fid": "2F59E1CC", + "z": 0, + "x": 0, + "y": 0 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "4000-5000m", + "geom_type": "Polygon", + "count": 1059, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "4000-5000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6602310, + "fid": "F1972B85", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "4000-5000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6602311, + "fid": "523D5483", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "4000-5000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6602312, + "fid": "CF96EE48", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "4000-5000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6602313, + "fid": "675359B9", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "4000-5000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6602314, + "fid": "883C01FC", + "z": 0, + "x": 0, + "y": 0 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "浅所危険界", + "geom_type": "MultiPolygon", + "count": 900, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "浅所危険界", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1996680, + "fid": "FE3ABA80", + "z": 5, + "x": 27, + "y": 12 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "浅所危険界", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1996681, + "fid": "99C92F5F", + "z": 5, + "x": 27, + "y": 12 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "浅所危険界", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1996682, + "fid": "99F07159", + "z": 5, + "x": 27, + "y": 12 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "浅所危険界", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1996683, + "fid": "AD5E586A", + "z": 5, + "x": 27, + "y": 12 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "浅所危険界", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1996742, + "fid": "F67DBDC4", + "z": 5, + "x": 27, + "y": 12 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "未測海域", + "geom_type": "Polygon", + "count": 734, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "未測海域", + "canonical_family": "mixed", + "geom_type": "Polygon", + "feature_id": 1996744, + "fid": "3B86DDFE", + "z": 5, + "x": 27, + "y": 12 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "未測海域", + "canonical_family": "mixed", + "geom_type": "Polygon", + "feature_id": 1996745, + "fid": "67B74BE7", + "z": 5, + "x": 27, + "y": 12 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "未測海域", + "canonical_family": "mixed", + "geom_type": "Polygon", + "feature_id": 1996746, + "fid": "377E12AD", + "z": 5, + "x": 27, + "y": 12 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "未測海域", + "canonical_family": "mixed", + "geom_type": "Polygon", + "feature_id": 1996747, + "fid": "78F0EB76", + "z": 5, + "x": 27, + "y": 12 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "未測海域", + "canonical_family": "mixed", + "geom_type": "Polygon", + "feature_id": 1996748, + "fid": "3AFA1A5B", + "z": 5, + "x": 27, + "y": 12 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "5000-6000m", + "geom_type": "Polygon", + "count": 607, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5000-6000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6602358, + "fid": "5C20BB5A", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5000-6000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6602359, + "fid": "D0894DD3", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5000-6000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6602371, + "fid": "D8927080", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5000-6000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6602372, + "fid": "235CF96D", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5000-6000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6602375, + "fid": "344D3836", + "z": 0, + "x": 0, + "y": 0 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "防波堤", + "geom_type": "MultiPolygon", + "count": 578, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "防波堤", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 829399, + "fid": "65ACF69E", + "z": 6, + "x": 55, + "y": 25 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "防波堤", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 829416, + "fid": "475D4C9F", + "z": 6, + "x": 55, + "y": 25 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "防波堤", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 3507642, + "fid": "0A89FA4E", + "z": 6, + "x": 56, + "y": 23 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "防波堤", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 3755198, + "fid": "BD8B7FFC", + "z": 6, + "x": 56, + "y": 24 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "防波堤", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 3755199, + "fid": "C74E1531", + "z": 6, + "x": 56, + "y": 24 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "20-100m", + "geom_type": "MultiPolygon", + "count": 537, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "20-100m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6601994, + "fid": "5B843480", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "20-100m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6601996, + "fid": "675147AA", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "20-100m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6601999, + "fid": "7C089A7D", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "20-100m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6602000, + "fid": "DB722002", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "20-100m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6602004, + "fid": "BA17F83C", + "z": 0, + "x": 0, + "y": 0 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "6000-7000m", + "geom_type": "Polygon", + "count": 441, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "6000-7000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6602380, + "fid": "C8F01803", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "6000-7000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6602381, + "fid": "897D4967", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "6000-7000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6602386, + "fid": "EB16A865", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "6000-7000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6602388, + "fid": "54A45DC3", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "6000-7000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6602389, + "fid": "994BA75D", + "z": 0, + "x": 0, + "y": 0 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "2-10m", + "geom_type": "Polygon", + "count": 351, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2-10m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1994873, + "fid": "123FA9ED", + "z": 5, + "x": 27, + "y": 12 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2-10m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1994874, + "fid": "5BCA69B8", + "z": 5, + "x": 27, + "y": 12 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2-10m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1994875, + "fid": "55782D21", + "z": 5, + "x": 27, + "y": 12 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2-10m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1994876, + "fid": "5041BADD", + "z": 5, + "x": 27, + "y": 12 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2-10m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1994877, + "fid": "8AAFD0E9", + "z": 5, + "x": 27, + "y": 12 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "0-20m", + "geom_type": "Polygon", + "count": 343, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-20m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 5777850, + "fid": "6FEB3434", + "z": 5, + "x": 26, + "y": 13 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-20m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 5777852, + "fid": "9FC5954C", + "z": 5, + "x": 26, + "y": 13 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-20m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1994551, + "fid": "1A036F86", + "z": 5, + "x": 27, + "y": 12 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-20m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1994552, + "fid": "D5468E12", + "z": 5, + "x": 27, + "y": 12 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-20m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1994554, + "fid": "8C372A85", + "z": 5, + "x": 27, + "y": 12 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "L等深線", + "canonical_object_type": "等深線", + "geom_type": "MultiLineString", + "count": 339, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L等深線", + "canonical_object_type": "等深線", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 6406152, + "fid": "10EC38FF", + "z": 7, + "x": 107, + "y": 55 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L等深線", + "canonical_object_type": "等深線", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 6406271, + "fid": "7D857350", + "z": 7, + "x": 107, + "y": 55 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L等深線", + "canonical_object_type": "等深線", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 6406276, + "fid": "B6F5E2E2", + "z": 7, + "x": 107, + "y": 55 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L等深線", + "canonical_object_type": "等深線", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 6406138, + "fid": "EF017CEE", + "z": 7, + "x": 107, + "y": 55 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L等深線", + "canonical_object_type": "等深線", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 6406252, + "fid": "6559E6A6", + "z": 7, + "x": 107, + "y": 55 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "5-20m", + "geom_type": "Polygon", + "count": 275, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5-20m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1996228, + "fid": "4CC984F2", + "z": 5, + "x": 27, + "y": 12 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5-20m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1996229, + "fid": "3A8D236F", + "z": 5, + "x": 27, + "y": 12 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5-20m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1996230, + "fid": "FDD7ED42", + "z": 5, + "x": 27, + "y": 12 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5-20m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1996231, + "fid": "84946AFC", + "z": 5, + "x": 27, + "y": 12 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5-20m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1996232, + "fid": "23F61FF4", + "z": 5, + "x": 27, + "y": 12 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線ククリ", + "canonical_object_type": "P基本線ククリ", + "geom_type": "MultiLineString", + "count": 261, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線ククリ", + "canonical_object_type": "P基本線ククリ", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 2000152, + "fid": "3D028274", + "z": 5, + "x": 27, + "y": 12 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線ククリ", + "canonical_object_type": "P基本線ククリ", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 2000185, + "fid": "5E0A2D9A", + "z": 5, + "x": 27, + "y": 12 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線ククリ", + "canonical_object_type": "P基本線ククリ", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 2001262, + "fid": "62555E2E", + "z": 5, + "x": 27, + "y": 12 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線ククリ", + "canonical_object_type": "P基本線ククリ", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 4575032, + "fid": "F20D4BD8", + "z": 5, + "x": 28, + "y": 11 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線ククリ", + "canonical_object_type": "P基本線ククリ", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 4575054, + "fid": "64CA374B", + "z": 5, + "x": 28, + "y": 11 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "100-200m", + "geom_type": "MultiPolygon", + "count": 247, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "100-200m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6602045, + "fid": "0B4DB252", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "100-200m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6602047, + "fid": "B8C67C35", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "100-200m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6602048, + "fid": "2C124C95", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "100-200m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6602049, + "fid": "9C42CAA6", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "100-200m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6602055, + "fid": "DB2E3CB3", + "z": 0, + "x": 0, + "y": 0 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p航路標識群", + "canonical_object_type": "沿岸灯台 (15M over)", + "geom_type": "Point", + "count": 222, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "沿岸灯台 (15M over)", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 4865154, + "fid": "5FE3F829", + "z": 8, + "x": 214, + "y": 109 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "沿岸灯台 (15M over)", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 4865155, + "fid": "998A7327", + "z": 8, + "x": 214, + "y": 109 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "沿岸灯台 (15M over)", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3128984, + "fid": "706028EE", + "z": 8, + "x": 215, + "y": 110 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "沿岸灯台 (15M over)", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3992689, + "fid": "26410CCA", + "z": 8, + "x": 217, + "y": 109 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "沿岸灯台 (15M over)", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3992690, + "fid": "13FBBD9E", + "z": 8, + "x": 217, + "y": 109 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "2-10m", + "geom_type": "MultiPolygon", + "count": 221, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2-10m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1994893, + "fid": "B3A4FAA9", + "z": 5, + "x": 27, + "y": 12 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2-10m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1994894, + "fid": "A557ED87", + "z": 5, + "x": 27, + "y": 12 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2-10m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1994895, + "fid": "7E0D2ABF", + "z": 5, + "x": 27, + "y": 12 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2-10m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1994898, + "fid": "94BE3CE4", + "z": 5, + "x": 27, + "y": 12 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2-10m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 5213106, + "fid": "49971155", + "z": 5, + "x": 28, + "y": 12 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "未測海域", + "geom_type": "MultiPolygon", + "count": 218, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "未測海域", + "canonical_family": "mixed", + "geom_type": "MultiPolygon", + "feature_id": 1996759, + "fid": "CF6C8EDD", + "z": 5, + "x": 27, + "y": 12 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "未測海域", + "canonical_family": "mixed", + "geom_type": "MultiPolygon", + "feature_id": 1996760, + "fid": "8EADB584", + "z": 5, + "x": 27, + "y": 12 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "未測海域", + "canonical_family": "mixed", + "geom_type": "MultiPolygon", + "feature_id": 1996762, + "fid": "9DE02540", + "z": 5, + "x": 27, + "y": 12 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "未測海域", + "canonical_family": "mixed", + "geom_type": "MultiPolygon", + "feature_id": 1996763, + "fid": "20238158", + "z": 5, + "x": 27, + "y": 12 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "未測海域", + "canonical_family": "mixed", + "geom_type": "MultiPolygon", + "feature_id": 1996765, + "fid": "88B08808", + "z": 5, + "x": 27, + "y": 12 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "湖沼域", + "geom_type": "Polygon", + "count": 210, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "湖沼域", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1996919, + "fid": "EF9E7B14", + "z": 5, + "x": 27, + "y": 12 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "湖沼域", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1996920, + "fid": "AF9A7BF6", + "z": 5, + "x": 27, + "y": 12 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "湖沼域", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1996921, + "fid": "B350616B", + "z": 5, + "x": 27, + "y": 12 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "湖沼域", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 4670691, + "fid": "32DE2DAA", + "z": 5, + "x": 27, + "y": 13 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "湖沼域", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 4670692, + "fid": "5DA61F08", + "z": 5, + "x": 27, + "y": 13 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "1000-2000m", + "geom_type": "MultiPolygon", + "count": 170, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "1000-2000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6602194, + "fid": "C5691C29", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "1000-2000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6602195, + "fid": "86037A24", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "1000-2000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6602196, + "fid": "777970E1", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "1000-2000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6602197, + "fid": "475165F2", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "1000-2000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6602198, + "fid": "FD5AD278", + "z": 0, + "x": 0, + "y": 0 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "7000-8000m", + "geom_type": "Polygon", + "count": 170, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "7000-8000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6602400, + "fid": "0C9F1FF2", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "7000-8000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 4669070, + "fid": "5B94C545", + "z": 5, + "x": 27, + "y": 13 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "7000-8000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 4669071, + "fid": "49956793", + "z": 5, + "x": 27, + "y": 13 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "7000-8000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 4669072, + "fid": "38C09749", + "z": 5, + "x": 27, + "y": 13 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "7000-8000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 4572900, + "fid": "E9245A77", + "z": 5, + "x": 28, + "y": 11 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "500-1000m", + "geom_type": "MultiPolygon", + "count": 154, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "500-1000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6602150, + "fid": "FF70B2B0", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "500-1000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6602151, + "fid": "D1493205", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "500-1000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6602152, + "fid": "FA34FD93", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "500-1000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6602153, + "fid": "75798720", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "500-1000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6602154, + "fid": "77A6F0BE", + "z": 0, + "x": 0, + "y": 0 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "0-20m", + "geom_type": "MultiPolygon", + "count": 152, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-20m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6602425, + "fid": "F8D42967", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-20m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 5777851, + "fid": "B5322A33", + "z": 5, + "x": 26, + "y": 13 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-20m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1994553, + "fid": "194D1588", + "z": 5, + "x": 27, + "y": 12 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-20m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1994555, + "fid": "0EFE5844", + "z": 5, + "x": 27, + "y": 12 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-20m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1994556, + "fid": "C2A38ADB", + "z": 5, + "x": 27, + "y": 12 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "200-500m", + "geom_type": "MultiPolygon", + "count": 143, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "200-500m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6602094, + "fid": "7C8A4A31", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "200-500m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6602096, + "fid": "C9099116", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "200-500m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6602097, + "fid": "9AF2304F", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "200-500m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6602098, + "fid": "50CC2B7C", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "200-500m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6602100, + "fid": "BCC14839", + "z": 0, + "x": 0, + "y": 0 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "浮施設・桟橋", + "geom_type": "Polygon", + "count": 141, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "浮施設・桟橋", + "canonical_family": "mixed", + "geom_type": "Polygon", + "feature_id": 1996266, + "fid": "289A2379", + "z": 5, + "x": 27, + "y": 12 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "浮施設・桟橋", + "canonical_family": "mixed", + "geom_type": "Polygon", + "feature_id": 1996267, + "fid": "0F872716", + "z": 5, + "x": 27, + "y": 12 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "浮施設・桟橋", + "canonical_family": "mixed", + "geom_type": "Polygon", + "feature_id": 1996268, + "fid": "92399656", + "z": 5, + "x": 27, + "y": 12 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "浮施設・桟橋", + "canonical_family": "mixed", + "geom_type": "Polygon", + "feature_id": 4670254, + "fid": "2AFD5F91", + "z": 5, + "x": 27, + "y": 13 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "浮施設・桟橋", + "canonical_family": "mixed", + "geom_type": "Polygon", + "feature_id": 5213894, + "fid": "647EC9EB", + "z": 5, + "x": 28, + "y": 12 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "2000-3000m", + "geom_type": "MultiPolygon", + "count": 140, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2000-3000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6602238, + "fid": "C3A4B752", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2000-3000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6602239, + "fid": "377EC5F5", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2000-3000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6602240, + "fid": "802CF319", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2000-3000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6602241, + "fid": "74C1CD37", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2000-3000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6602242, + "fid": "238A75A3", + "z": 0, + "x": 0, + "y": 0 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "湖沼域", + "geom_type": "MultiPolygon", + "count": 127, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "湖沼域", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6602453, + "fid": "FEDECC67", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "湖沼域", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1996918, + "fid": "5E912B7D", + "z": 5, + "x": 27, + "y": 12 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "湖沼域", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1996922, + "fid": "24B7C2D2", + "z": 5, + "x": 27, + "y": 12 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "湖沼域", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1996923, + "fid": "F13710DF", + "z": 5, + "x": 27, + "y": 12 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "湖沼域", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 4573492, + "fid": "9480D024", + "z": 5, + "x": 28, + "y": 11 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "3000-4000m", + "geom_type": "MultiPolygon", + "count": 109, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "3000-4000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6602274, + "fid": "04F91266", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "3000-4000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6602275, + "fid": "5E696B4F", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "3000-4000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6602281, + "fid": "9BDF2584", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "3000-4000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6602282, + "fid": "F7AC40A1", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "3000-4000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6602283, + "fid": "BF5EAAE9", + "z": 0, + "x": 0, + "y": 0 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "5-20m", + "geom_type": "MultiPolygon", + "count": 108, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5-20m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1996236, + "fid": "B68C41B9", + "z": 5, + "x": 27, + "y": 12 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5-20m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1996239, + "fid": "AA888F0C", + "z": 5, + "x": 27, + "y": 12 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5-20m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1996240, + "fid": "2D8BF76C", + "z": 5, + "x": 27, + "y": 12 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5-20m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1996245, + "fid": "A04EC2D4", + "z": 5, + "x": 27, + "y": 12 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5-20m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1996246, + "fid": "81A6A5DB", + "z": 5, + "x": 27, + "y": 12 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p地名陸", + "canonical_object_type": "p地名陸", + "geom_type": "Point", + "count": 104, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p地名陸", + "canonical_object_type": "p地名陸", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 2961443, + "fid": "EA1A5459", + "z": 7, + "x": 109, + "y": 53 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p地名陸", + "canonical_object_type": "p地名陸", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 6569937, + "fid": "E1B2539A", + "z": 7, + "x": 109, + "y": 54 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p地名陸", + "canonical_object_type": "p地名陸", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 4707751, + "fid": "071C2979", + "z": 7, + "x": 110, + "y": 51 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p地名陸", + "canonical_object_type": "p地名陸", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 4707752, + "fid": "C0341A5D", + "z": 7, + "x": 110, + "y": 51 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p地名陸", + "canonical_object_type": "p地名陸", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 4707753, + "fid": "DC265159", + "z": 7, + "x": 110, + "y": 51 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "8000-9000m", + "geom_type": "Polygon", + "count": 101, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "8000-9000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 5212009, + "fid": "9BA461AB", + "z": 5, + "x": 28, + "y": 12 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "8000-9000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 5212010, + "fid": "2802C0FD", + "z": 5, + "x": 28, + "y": 12 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "8000-9000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 5212011, + "fid": "FB62FD54", + "z": 5, + "x": 28, + "y": 12 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "8000-9000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 5212012, + "fid": "9281063E", + "z": 5, + "x": 28, + "y": 12 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "8000-9000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 5212013, + "fid": "9F05DD35", + "z": 5, + "x": 28, + "y": 12 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "4000-5000m", + "geom_type": "MultiPolygon", + "count": 80, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "4000-5000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6602318, + "fid": "FB3EB755", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "4000-5000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6602319, + "fid": "B5B0DCFE", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "4000-5000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6602321, + "fid": "5F5B0E22", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "4000-5000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6602323, + "fid": "4264B390", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "4000-5000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6602324, + "fid": "A0C8913C", + "z": 0, + "x": 0, + "y": 0 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "陸上水域", + "geom_type": "Polygon", + "count": 72, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "陸上水域", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1996924, + "fid": "5386F483", + "z": 5, + "x": 27, + "y": 12 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "陸上水域", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 4573509, + "fid": "C388B169", + "z": 5, + "x": 28, + "y": 11 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "陸上水域", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 5214301, + "fid": "59E1AAF4", + "z": 5, + "x": 28, + "y": 12 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "陸上水域", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 5214302, + "fid": "A101D1A8", + "z": 5, + "x": 28, + "y": 12 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "陸上水域", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 5003032, + "fid": "24E6FAC4", + "z": 6, + "x": 54, + "y": 27 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "5000-6000m", + "geom_type": "MultiPolygon", + "count": 64, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5000-6000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6602360, + "fid": "849888C4", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5000-6000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6602361, + "fid": "9537CA05", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5000-6000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6602362, + "fid": "9943E796", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5000-6000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6602363, + "fid": "BF3D9FC8", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5000-6000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6602364, + "fid": "C88115FE", + "z": 0, + "x": 0, + "y": 0 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "9000m以深", + "geom_type": "Polygon", + "count": 61, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "9000m以深", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6602408, + "fid": "EEA46074", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "9000m以深", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6602409, + "fid": "04CFF596", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "9000m以深", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 5212022, + "fid": "E158354D", + "z": 5, + "x": 28, + "y": 12 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "9000m以深", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 5212023, + "fid": "C43012B7", + "z": 5, + "x": 28, + "y": 12 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "9000m以深", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 5212024, + "fid": "BC93D301", + "z": 5, + "x": 28, + "y": 12 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "6000-7000m", + "geom_type": "MultiPolygon", + "count": 56, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "6000-7000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6602382, + "fid": "DB51EE0A", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "6000-7000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6602383, + "fid": "5E59DA0E", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "6000-7000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6602384, + "fid": "E2BDFB10", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "6000-7000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6602385, + "fid": "562560B4", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "6000-7000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6602387, + "fid": "F24293C6", + "z": 0, + "x": 0, + "y": 0 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "2-20m", + "geom_type": "Polygon", + "count": 45, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2-20m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1994899, + "fid": "BE2B31E8", + "z": 5, + "x": 27, + "y": 12 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2-20m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1994900, + "fid": "93A8A39B", + "z": 5, + "x": 27, + "y": 12 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2-20m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1994901, + "fid": "5CF6AA3F", + "z": 5, + "x": 27, + "y": 12 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2-20m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1994902, + "fid": "3DF13D3C", + "z": 5, + "x": 27, + "y": 12 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2-20m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 4669846, + "fid": "2002C740", + "z": 5, + "x": 27, + "y": 13 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "7000-8000m", + "geom_type": "MultiPolygon", + "count": 33, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "7000-8000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6602398, + "fid": "E4B1B0C9", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "7000-8000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6602399, + "fid": "8807D674", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "7000-8000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6602401, + "fid": "8534C039", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "7000-8000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6602402, + "fid": "35B2730F", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "7000-8000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6602403, + "fid": "2DC828E9", + "z": 0, + "x": 0, + "y": 0 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "浮施設・桟橋", + "geom_type": "MultiPolygon", + "count": 17, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "浮施設・桟橋", + "canonical_family": "mixed", + "geom_type": "MultiPolygon", + "feature_id": 4694193, + "fid": "92399656", + "z": 7, + "x": 110, + "y": 51 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "浮施設・桟橋", + "canonical_family": "mixed", + "geom_type": "MultiPolygon", + "feature_id": 2935855, + "fid": "E45B4F84", + "z": 7, + "x": 112, + "y": 50 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "浮施設・桟橋", + "canonical_family": "mixed", + "geom_type": "MultiPolygon", + "feature_id": 2497122, + "fid": "EC02A725", + "z": 8, + "x": 220, + "y": 102 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "浮施設・桟橋", + "canonical_family": "mixed", + "geom_type": "MultiPolygon", + "feature_id": 2772496, + "fid": "9D758ACF", + "z": 8, + "x": 221, + "y": 102 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "浮施設・桟橋", + "canonical_family": "mixed", + "geom_type": "MultiPolygon", + "feature_id": 2772497, + "fid": "3683E9DD", + "z": 8, + "x": 221, + "y": 102 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "20-200m", + "geom_type": "Polygon", + "count": 16, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "20-200m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 5777729, + "fid": "A4DC808F", + "z": 5, + "x": 26, + "y": 13 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "20-200m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 5211402, + "fid": "29E995CC", + "z": 5, + "x": 28, + "y": 12 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "20-200m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 2970954, + "fid": "485FB77E", + "z": 5, + "x": 28, + "y": 13 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "20-200m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1577907, + "fid": "4E3F1FC1", + "z": 5, + "x": 29, + "y": 11 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "20-200m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 5288891, + "fid": "A4DC808F", + "z": 6, + "x": 53, + "y": 27 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "8000-9000m", + "geom_type": "MultiPolygon", + "count": 14, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "8000-9000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6602405, + "fid": "1A891ED1", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "8000-9000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6602406, + "fid": "FD95B91F", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "8000-9000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6602407, + "fid": "6D157A09", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "8000-9000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 4138601, + "fid": "FD95B91F", + "z": 7, + "x": 114, + "y": 53 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "8000-9000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6489143, + "fid": "1A891ED1", + "z": 7, + "x": 114, + "y": 55 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "撤去跡", + "geom_type": "Polygon", + "count": 13, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "撤去跡", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 830551, + "fid": "EC22EAD5", + "z": 6, + "x": 55, + "y": 25 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "撤去跡", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 5568623, + "fid": "A56F51E7", + "z": 6, + "x": 56, + "y": 25 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "撤去跡", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 4695498, + "fid": "EC22EAD5", + "z": 7, + "x": 110, + "y": 51 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "撤去跡", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 4695499, + "fid": "7010D72E", + "z": 7, + "x": 110, + "y": 51 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "撤去跡", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 2936266, + "fid": "A56F51E7", + "z": 7, + "x": 112, + "y": 50 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "10-100m", + "geom_type": "Polygon", + "count": 12, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "10-100m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 5211312, + "fid": "129C6506", + "z": 5, + "x": 28, + "y": 12 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "10-100m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 5211313, + "fid": "0BD28039", + "z": 5, + "x": 28, + "y": 12 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "10-100m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 5565929, + "fid": "129C6506", + "z": 6, + "x": 56, + "y": 25 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "10-100m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 338391, + "fid": "0BD28039", + "z": 6, + "x": 57, + "y": 24 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "10-100m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 520169, + "fid": "BF2D3895", + "z": 7, + "x": 109, + "y": 51 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "2-20m", + "geom_type": "MultiPolygon", + "count": 10, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2-20m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 5002010, + "fid": "2002C740", + "z": 6, + "x": 54, + "y": 27 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2-20m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 826987, + "fid": "D22760A2", + "z": 6, + "x": 55, + "y": 25 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2-20m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 826988, + "fid": "B77AED9B", + "z": 6, + "x": 55, + "y": 25 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2-20m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 5567465, + "fid": "39DEBDE3", + "z": 6, + "x": 56, + "y": 25 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2-20m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6566315, + "fid": "2002C740", + "z": 7, + "x": 109, + "y": 54 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "陸上水域", + "geom_type": "MultiPolygon", + "count": 6, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "陸上水域", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1996925, + "fid": "730CDFCD", + "z": 5, + "x": 27, + "y": 12 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "陸上水域", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 830774, + "fid": "730CDFCD", + "z": 6, + "x": 55, + "y": 25 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "陸上水域", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 4695702, + "fid": "730CDFCD", + "z": 7, + "x": 110, + "y": 51 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "陸上水域", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 863155, + "fid": "730CDFCD", + "z": 8, + "x": 220, + "y": 103 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "陸上水域", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 2367208, + "fid": "08EC458D", + "z": 8, + "x": 227, + "y": 100 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "9000m以深", + "geom_type": "MultiPolygon", + "count": 5, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "9000m以深", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6602410, + "fid": "15B362B9", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "9000m以深", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6602411, + "fid": "322F9391", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "9000m以深", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6602412, + "fid": "3A6B1A70", + "z": 0, + "x": 0, + "y": 0 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "9000m以深", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 427232, + "fid": "15B362B9", + "z": 8, + "x": 228, + "y": 101 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "9000m以深", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 2164793, + "fid": "15B362B9", + "z": 8, + "x": 229, + "y": 102 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "10-100m", + "geom_type": "MultiPolygon", + "count": 4, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "10-100m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 2970930, + "fid": "95102553", + "z": 5, + "x": 28, + "y": 13 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "10-100m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1681269, + "fid": "BF2D3895", + "z": 6, + "x": 54, + "y": 25 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "10-100m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 2361712, + "fid": "95102553", + "z": 6, + "x": 57, + "y": 26 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "10-100m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 4138533, + "fid": "95102553", + "z": 7, + "x": 114, + "y": 53 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "20-200m", + "geom_type": "MultiPolygon", + "count": 1, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "20-200m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6602035, + "fid": "4E3F1FC1", + "z": 0, + "x": 0, + "y": 0 + } + ] + } + ] +} \ No newline at end of file diff --git a/docs/报告/20261013_全国Full生产分片历史审计证据/z0_8.mapping_audit.md b/docs/报告/20261013_全国Full生产分片历史审计证据/z0_8.mapping_audit.md new file mode 100644 index 0000000..aaddbd2 --- /dev/null +++ b/docs/报告/20261013_全国Full生产分片历史审计证据/z0_8.mapping_audit.md @@ -0,0 +1,325 @@ +# NavSea Mapping Audit Report + +- bundle_id: `navsea-core` +- output_root: `/home/wwwroot/pbf-delivery-full-20260418-rebuild.parts/z0_8` +- tile_jobs: `344` +- written_tiles: `344` +- skipped_tiles: `0` +- unresolved_event_count: `560915` + +## Unresolved Summary + +- `render_rule_unresolved` | `P基本線ククリ` | `P基本線ククリ` | `LineString` | count=`163774` + sample: fid=`EC48C884` feature_id=`6602454` tile=`0/0/0` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`5C8035AF` feature_id=`6602455` tile=`0/0/0` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`EC171CFB` feature_id=`6602456` tile=`0/0/0` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `L海底地形` | `L海底地形` | `LineString` | count=`118769` + sample: fid=`EFE5E233` feature_id=`1276887` tile=`7/107/53` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`A60034C6` feature_id=`1276888` tile=`7/107/53` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`626EF619` feature_id=`1276889` tile=`7/107/53` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `L等深線` | `等深線` | `LineString` | count=`99722` + sample: fid=`2855083F` feature_id=`2146234` tile=`7/107/54` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`814E5D81` feature_id=`2146235` tile=`7/107/54` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`D47409FA` feature_id=`2146236` tile=`7/107/54` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P穴` | `P穴` | `Polygon` | count=`38981` + sample: fid=`F26B01B0` feature_id=`6606086` tile=`0/0/0` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`C41C7B94` feature_id=`6606087` tile=`0/0/0` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`76B01E94` feature_id=`6606088` tile=`0/0/0` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `5-10m` | `Polygon` | count=`13206` + sample: fid=`7E984E1E` feature_id=`6602434` tile=`0/0/0` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`36874832` feature_id=`6602435` tile=`0/0/0` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`86B0692D` feature_id=`6602436` tile=`0/0/0` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `5-10m` | `MultiPolygon` | count=`12767` + sample: fid=`F34C948C` feature_id=`6602449` tile=`0/0/0` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`B44A94B0` feature_id=`5777878` tile=`5/26/13` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`385AA778` feature_id=`5777880` tile=`5/26/13` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `0-5m` | `MultiPolygon` | count=`10112` + sample: fid=`7EBBAC6A` feature_id=`5777841` tile=`5/26/13` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`00765484` feature_id=`5777842` tile=`5/26/13` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`D480B85B` feature_id=`5777843` tile=`5/26/13` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P陸域` | `P陸域` | `Polygon` | count=`9374` + sample: fid=`5B97EC36` feature_id=`6606387` tile=`0/0/0` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`1F1B0F2A` feature_id=`6606390` tile=`0/0/0` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`6827EE69` feature_id=`6606392` tile=`0/0/0` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `10-20m` | `Polygon` | count=`7769` + sample: fid=`D07EE97C` feature_id=`6601951` tile=`0/0/0` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`348DCA57` feature_id=`6601952` tile=`0/0/0` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`8B89F745` feature_id=`6601953` tile=`0/0/0` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `0-5m` | `Polygon` | count=`7273` + sample: fid=`7D3588C5` feature_id=`6602415` tile=`0/0/0` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`0C9A20C0` feature_id=`6602416` tile=`0/0/0` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`579B10CF` feature_id=`6602417` tile=`0/0/0` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `2-5m` | `Polygon` | count=`6949` + sample: fid=`3720E480` feature_id=`6602426` tile=`0/0/0` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`9EEFE193` feature_id=`6602427` tile=`0/0/0` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`19548092` feature_id=`6602428` tile=`0/0/0` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `L海底地形` | `L海底地形` | `MultiLineString` | count=`6369` + sample: fid=`0D68F5F5` feature_id=`2145951` tile=`7/107/54` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`3006A5C6` feature_id=`2145968` tile=`7/107/54` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`6EBD5633` feature_id=`2145975` tile=`7/107/54` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `干潮帯` | `Polygon` | count=`6308` + sample: fid=`3FC0DBDF` feature_id=`6602450` tile=`0/0/0` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`70952593` feature_id=`6602451` tile=`0/0/0` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`7F437C4B` feature_id=`5777899` tile=`5/26/13` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `10-20m` | `MultiPolygon` | count=`6053` + sample: fid=`A31757E0` feature_id=`6601954` tile=`0/0/0` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`B0770DCE` feature_id=`6601955` tile=`0/0/0` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`0097E025` feature_id=`6601956` tile=`0/0/0` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `干潮帯` | `MultiPolygon` | count=`4990` + sample: fid=`3644A6DF` feature_id=`5777904` tile=`5/26/13` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`A0D4E93E` feature_id=`5777905` tile=`5/26/13` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`A630E55F` feature_id=`5777907` tile=`5/26/13` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `2-5m` | `MultiPolygon` | count=`4589` + sample: fid=`129C5A63` feature_id=`5777857` tile=`5/26/13` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`F0493CEA` feature_id=`5777858` tile=`5/26/13` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`A1F1EA6F` feature_id=`5777859` tile=`5/26/13` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `浅所危険界` | `Polygon` | count=`4561` + sample: fid=`0DB7F52E` feature_id=`1996672` tile=`5/27/12` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`9D18B6C3` feature_id=`1996673` tile=`5/27/12` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`F96A0D58` feature_id=`1996674` tile=`5/27/12` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `0-2m` | `Polygon` | count=`3071` + sample: fid=`95AE8A62` feature_id=`6602413` tile=`0/0/0` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`1FF88844` feature_id=`6602414` tile=`0/0/0` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`A0FB6149` feature_id=`5777822` tile=`5/26/13` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `20-100m` | `Polygon` | count=`2743` + sample: fid=`1A918C38` feature_id=`6601991` tile=`0/0/0` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`F38BF372` feature_id=`6601992` tile=`0/0/0` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`1806518A` feature_id=`6601993` tile=`0/0/0` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P穴` | `P穴` | `MultiPolygon` | count=`2708` + sample: fid=`D1493205` feature_id=`6606109` tile=`0/0/0` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`FD95B91F` feature_id=`6606113` tile=`0/0/0` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`FD95B91F` feature_id=`6606114` tile=`0/0/0` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `0-2m` | `MultiPolygon` | count=`2236` + sample: fid=`37AD052E` feature_id=`5777828` tile=`5/26/13` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`581B753A` feature_id=`5777829` tile=`5/26/13` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`27289469` feature_id=`5777831` tile=`5/26/13` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `100-200m` | `Polygon` | count=`2031` + sample: fid=`8958AD5B` feature_id=`6602036` tile=`0/0/0` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`059FAC86` feature_id=`6602037` tile=`0/0/0` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`68ECAE42` feature_id=`6602038` tile=`0/0/0` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P陸域` | `P陸域` | `MultiPolygon` | count=`1992` + sample: fid=`7F464CF0` feature_id=`6606388` tile=`0/0/0` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`41408D37` feature_id=`6606389` tile=`0/0/0` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`103FABC1` feature_id=`6606391` tile=`0/0/0` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `200-500m` | `Polygon` | count=`1883` + sample: fid=`56EE429C` feature_id=`6602089` tile=`0/0/0` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`70C29072` feature_id=`6602090` tile=`0/0/0` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`AF13A7C0` feature_id=`6602091` tile=`0/0/0` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `防波堤` | `Polygon` | count=`1816` + sample: fid=`B8B20E68` feature_id=`1996251` tile=`5/27/12` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`0063ED7E` feature_id=`1996252` tile=`5/27/12` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`EEF58D08` feature_id=`1996253` tile=`5/27/12` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `500-1000m` | `Polygon` | count=`1754` + sample: fid=`F26B01B0` feature_id=`6602137` tile=`0/0/0` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`2E9857CA` feature_id=`6602138` tile=`0/0/0` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`4ED0A7E9` feature_id=`6602139` tile=`0/0/0` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `河川域` | `MultiPolygon` | count=`1626` + sample: fid=`FDC93C3C` feature_id=`5777930` tile=`5/26/13` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`C368DE9F` feature_id=`1996802` tile=`5/27/12` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`E192CE08` feature_id=`1996803` tile=`5/27/12` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `1000-2000m` | `Polygon` | count=`1608` + sample: fid=`F7FF20CB` feature_id=`6602182` tile=`0/0/0` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`84AC493A` feature_id=`6602183` tile=`0/0/0` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`57B0E605` feature_id=`6602184` tile=`0/0/0` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `0-10m` | `MultiPolygon` | count=`1381` + sample: fid=`A09598F3` feature_id=`5777847` tile=`5/26/13` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`DB3EC69F` feature_id=`5777848` tile=`5/26/13` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`74E48F1D` feature_id=`5777849` tile=`5/26/13` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `0-10m` | `Polygon` | count=`1354` + sample: fid=`D954D328` feature_id=`5777846` tile=`5/26/13` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`69A181A5` feature_id=`1994419` tile=`5/27/12` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`FA607301` feature_id=`1994420` tile=`5/27/12` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `2000-3000m` | `Polygon` | count=`1284` + sample: fid=`A9C357C2` feature_id=`6602226` tile=`0/0/0` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`268C79E6` feature_id=`6602227` tile=`0/0/0` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`1C6FE2C1` feature_id=`6602228` tile=`0/0/0` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `河川域` | `Polygon` | count=`1106` + sample: fid=`B93D993E` feature_id=`6602452` tile=`0/0/0` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`027C1DB3` feature_id=`5777929` tile=`5/26/13` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`A3BB5B00` feature_id=`1996798` tile=`5/27/12` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `3000-4000m` | `Polygon` | count=`1085` + sample: fid=`69693C82` feature_id=`6602268` tile=`0/0/0` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`89E8A516` feature_id=`6602269` tile=`0/0/0` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`979D6D1F` feature_id=`6602270` tile=`0/0/0` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `4000-5000m` | `Polygon` | count=`1059` + sample: fid=`F1972B85` feature_id=`6602310` tile=`0/0/0` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`523D5483` feature_id=`6602311` tile=`0/0/0` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`CF96EE48` feature_id=`6602312` tile=`0/0/0` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `浅所危険界` | `MultiPolygon` | count=`900` + sample: fid=`FE3ABA80` feature_id=`1996680` tile=`5/27/12` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`99C92F5F` feature_id=`1996681` tile=`5/27/12` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`99F07159` feature_id=`1996682` tile=`5/27/12` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `未測海域` | `Polygon` | count=`734` + sample: fid=`3B86DDFE` feature_id=`1996744` tile=`5/27/12` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`67B74BE7` feature_id=`1996745` tile=`5/27/12` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`377E12AD` feature_id=`1996746` tile=`5/27/12` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `5000-6000m` | `Polygon` | count=`607` + sample: fid=`5C20BB5A` feature_id=`6602358` tile=`0/0/0` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`D0894DD3` feature_id=`6602359` tile=`0/0/0` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`D8927080` feature_id=`6602371` tile=`0/0/0` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `防波堤` | `MultiPolygon` | count=`578` + sample: fid=`65ACF69E` feature_id=`829399` tile=`6/55/25` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`475D4C9F` feature_id=`829416` tile=`6/55/25` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`0A89FA4E` feature_id=`3507642` tile=`6/56/23` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `20-100m` | `MultiPolygon` | count=`537` + sample: fid=`5B843480` feature_id=`6601994` tile=`0/0/0` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`675147AA` feature_id=`6601996` tile=`0/0/0` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`7C089A7D` feature_id=`6601999` tile=`0/0/0` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `6000-7000m` | `Polygon` | count=`441` + sample: fid=`C8F01803` feature_id=`6602380` tile=`0/0/0` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`897D4967` feature_id=`6602381` tile=`0/0/0` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`EB16A865` feature_id=`6602386` tile=`0/0/0` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `2-10m` | `Polygon` | count=`351` + sample: fid=`123FA9ED` feature_id=`1994873` tile=`5/27/12` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`5BCA69B8` feature_id=`1994874` tile=`5/27/12` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`55782D21` feature_id=`1994875` tile=`5/27/12` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `0-20m` | `Polygon` | count=`343` + sample: fid=`6FEB3434` feature_id=`5777850` tile=`5/26/13` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`9FC5954C` feature_id=`5777852` tile=`5/26/13` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`1A036F86` feature_id=`1994551` tile=`5/27/12` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `L等深線` | `等深線` | `MultiLineString` | count=`339` + sample: fid=`10EC38FF` feature_id=`6406152` tile=`7/107/55` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`7D857350` feature_id=`6406271` tile=`7/107/55` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`B6F5E2E2` feature_id=`6406276` tile=`7/107/55` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `5-20m` | `Polygon` | count=`275` + sample: fid=`4CC984F2` feature_id=`1996228` tile=`5/27/12` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`3A8D236F` feature_id=`1996229` tile=`5/27/12` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`FDD7ED42` feature_id=`1996230` tile=`5/27/12` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線ククリ` | `P基本線ククリ` | `MultiLineString` | count=`261` + sample: fid=`3D028274` feature_id=`2000152` tile=`5/27/12` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`5E0A2D9A` feature_id=`2000185` tile=`5/27/12` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`62555E2E` feature_id=`2001262` tile=`5/27/12` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `100-200m` | `MultiPolygon` | count=`247` + sample: fid=`0B4DB252` feature_id=`6602045` tile=`0/0/0` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`B8C67C35` feature_id=`6602047` tile=`0/0/0` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`2C124C95` feature_id=`6602048` tile=`0/0/0` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p航路標識群` | `沿岸灯台 (15M over)` | `Point` | count=`222` + sample: fid=`5FE3F829` feature_id=`4865154` tile=`8/214/109` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`998A7327` feature_id=`4865155` tile=`8/214/109` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`706028EE` feature_id=`3128984` tile=`8/215/110` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `2-10m` | `MultiPolygon` | count=`221` + sample: fid=`B3A4FAA9` feature_id=`1994893` tile=`5/27/12` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`A557ED87` feature_id=`1994894` tile=`5/27/12` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`7E0D2ABF` feature_id=`1994895` tile=`5/27/12` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `未測海域` | `MultiPolygon` | count=`218` + sample: fid=`CF6C8EDD` feature_id=`1996759` tile=`5/27/12` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`8EADB584` feature_id=`1996760` tile=`5/27/12` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`9DE02540` feature_id=`1996762` tile=`5/27/12` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `湖沼域` | `Polygon` | count=`210` + sample: fid=`EF9E7B14` feature_id=`1996919` tile=`5/27/12` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`AF9A7BF6` feature_id=`1996920` tile=`5/27/12` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`B350616B` feature_id=`1996921` tile=`5/27/12` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `1000-2000m` | `MultiPolygon` | count=`170` + sample: fid=`C5691C29` feature_id=`6602194` tile=`0/0/0` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`86037A24` feature_id=`6602195` tile=`0/0/0` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`777970E1` feature_id=`6602196` tile=`0/0/0` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `7000-8000m` | `Polygon` | count=`170` + sample: fid=`0C9F1FF2` feature_id=`6602400` tile=`0/0/0` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`5B94C545` feature_id=`4669070` tile=`5/27/13` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`49956793` feature_id=`4669071` tile=`5/27/13` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `500-1000m` | `MultiPolygon` | count=`154` + sample: fid=`FF70B2B0` feature_id=`6602150` tile=`0/0/0` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`D1493205` feature_id=`6602151` tile=`0/0/0` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`FA34FD93` feature_id=`6602152` tile=`0/0/0` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `0-20m` | `MultiPolygon` | count=`152` + sample: fid=`F8D42967` feature_id=`6602425` tile=`0/0/0` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`B5322A33` feature_id=`5777851` tile=`5/26/13` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`194D1588` feature_id=`1994553` tile=`5/27/12` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `200-500m` | `MultiPolygon` | count=`143` + sample: fid=`7C8A4A31` feature_id=`6602094` tile=`0/0/0` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`C9099116` feature_id=`6602096` tile=`0/0/0` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`9AF2304F` feature_id=`6602097` tile=`0/0/0` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `浮施設・桟橋` | `Polygon` | count=`141` + sample: fid=`289A2379` feature_id=`1996266` tile=`5/27/12` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`0F872716` feature_id=`1996267` tile=`5/27/12` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`92399656` feature_id=`1996268` tile=`5/27/12` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `2000-3000m` | `MultiPolygon` | count=`140` + sample: fid=`C3A4B752` feature_id=`6602238` tile=`0/0/0` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`377EC5F5` feature_id=`6602239` tile=`0/0/0` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`802CF319` feature_id=`6602240` tile=`0/0/0` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `湖沼域` | `MultiPolygon` | count=`127` + sample: fid=`FEDECC67` feature_id=`6602453` tile=`0/0/0` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`5E912B7D` feature_id=`1996918` tile=`5/27/12` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`24B7C2D2` feature_id=`1996922` tile=`5/27/12` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `3000-4000m` | `MultiPolygon` | count=`109` + sample: fid=`04F91266` feature_id=`6602274` tile=`0/0/0` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`5E696B4F` feature_id=`6602275` tile=`0/0/0` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`9BDF2584` feature_id=`6602281` tile=`0/0/0` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `5-20m` | `MultiPolygon` | count=`108` + sample: fid=`B68C41B9` feature_id=`1996236` tile=`5/27/12` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`AA888F0C` feature_id=`1996239` tile=`5/27/12` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`2D8BF76C` feature_id=`1996240` tile=`5/27/12` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p地名陸` | `p地名陸` | `Point` | count=`104` + sample: fid=`EA1A5459` feature_id=`2961443` tile=`7/109/53` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`E1B2539A` feature_id=`6569937` tile=`7/109/54` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`071C2979` feature_id=`4707751` tile=`7/110/51` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `8000-9000m` | `Polygon` | count=`101` + sample: fid=`9BA461AB` feature_id=`5212009` tile=`5/28/12` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`2802C0FD` feature_id=`5212010` tile=`5/28/12` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`FB62FD54` feature_id=`5212011` tile=`5/28/12` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `4000-5000m` | `MultiPolygon` | count=`80` + sample: fid=`FB3EB755` feature_id=`6602318` tile=`0/0/0` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`B5B0DCFE` feature_id=`6602319` tile=`0/0/0` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`5F5B0E22` feature_id=`6602321` tile=`0/0/0` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `陸上水域` | `Polygon` | count=`72` + sample: fid=`5386F483` feature_id=`1996924` tile=`5/27/12` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`C388B169` feature_id=`4573509` tile=`5/28/11` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`59E1AAF4` feature_id=`5214301` tile=`5/28/12` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `5000-6000m` | `MultiPolygon` | count=`64` + sample: fid=`849888C4` feature_id=`6602360` tile=`0/0/0` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`9537CA05` feature_id=`6602361` tile=`0/0/0` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`9943E796` feature_id=`6602362` tile=`0/0/0` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `9000m以深` | `Polygon` | count=`61` + sample: fid=`EEA46074` feature_id=`6602408` tile=`0/0/0` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`04CFF596` feature_id=`6602409` tile=`0/0/0` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`E158354D` feature_id=`5212022` tile=`5/28/12` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `6000-7000m` | `MultiPolygon` | count=`56` + sample: fid=`DB51EE0A` feature_id=`6602382` tile=`0/0/0` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`5E59DA0E` feature_id=`6602383` tile=`0/0/0` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`E2BDFB10` feature_id=`6602384` tile=`0/0/0` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `2-20m` | `Polygon` | count=`45` + sample: fid=`BE2B31E8` feature_id=`1994899` tile=`5/27/12` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`93A8A39B` feature_id=`1994900` tile=`5/27/12` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`5CF6AA3F` feature_id=`1994901` tile=`5/27/12` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `7000-8000m` | `MultiPolygon` | count=`33` + sample: fid=`E4B1B0C9` feature_id=`6602398` tile=`0/0/0` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`8807D674` feature_id=`6602399` tile=`0/0/0` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`8534C039` feature_id=`6602401` tile=`0/0/0` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `浮施設・桟橋` | `MultiPolygon` | count=`17` + sample: fid=`92399656` feature_id=`4694193` tile=`7/110/51` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`E45B4F84` feature_id=`2935855` tile=`7/112/50` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`EC02A725` feature_id=`2497122` tile=`8/220/102` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `20-200m` | `Polygon` | count=`16` + sample: fid=`A4DC808F` feature_id=`5777729` tile=`5/26/13` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`29E995CC` feature_id=`5211402` tile=`5/28/12` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`485FB77E` feature_id=`2970954` tile=`5/28/13` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `8000-9000m` | `MultiPolygon` | count=`14` + sample: fid=`1A891ED1` feature_id=`6602405` tile=`0/0/0` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`FD95B91F` feature_id=`6602406` tile=`0/0/0` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`6D157A09` feature_id=`6602407` tile=`0/0/0` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `撤去跡` | `Polygon` | count=`13` + sample: fid=`EC22EAD5` feature_id=`830551` tile=`6/55/25` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`A56F51E7` feature_id=`5568623` tile=`6/56/25` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`EC22EAD5` feature_id=`4695498` tile=`7/110/51` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `10-100m` | `Polygon` | count=`12` + sample: fid=`129C6506` feature_id=`5211312` tile=`5/28/12` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`0BD28039` feature_id=`5211313` tile=`5/28/12` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`129C6506` feature_id=`5565929` tile=`6/56/25` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `2-20m` | `MultiPolygon` | count=`10` + sample: fid=`2002C740` feature_id=`5002010` tile=`6/54/27` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`D22760A2` feature_id=`826987` tile=`6/55/25` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`B77AED9B` feature_id=`826988` tile=`6/55/25` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `陸上水域` | `MultiPolygon` | count=`6` + sample: fid=`730CDFCD` feature_id=`1996925` tile=`5/27/12` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`730CDFCD` feature_id=`830774` tile=`6/55/25` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`730CDFCD` feature_id=`4695702` tile=`7/110/51` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `9000m以深` | `MultiPolygon` | count=`5` + sample: fid=`15B362B9` feature_id=`6602410` tile=`0/0/0` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`322F9391` feature_id=`6602411` tile=`0/0/0` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`3A6B1A70` feature_id=`6602412` tile=`0/0/0` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `10-100m` | `MultiPolygon` | count=`4` + sample: fid=`95102553` feature_id=`2970930` tile=`5/28/13` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`BF2D3895` feature_id=`1681269` tile=`6/54/25` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`95102553` feature_id=`2361712` tile=`6/57/26` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `20-200m` | `MultiPolygon` | count=`1` + sample: fid=`4E3F1FC1` feature_id=`6602035` tile=`0/0/0` reason=`no specific render rule matched; heuristic fill-in was used` diff --git a/docs/报告/20261013_全国Full生产分片历史审计证据/z11.mapping_audit.json b/docs/报告/20261013_全国Full生产分片历史审计证据/z11.mapping_audit.json new file mode 100644 index 0000000..6442c9e --- /dev/null +++ b/docs/报告/20261013_全国Full生产分片历史审计证据/z11.mapping_audit.json @@ -0,0 +1,12605 @@ +{ + "bundle_id": "navsea-core", + "output_root": "/home/wwwroot/pbf-delivery-full-20260418-rebuild.parts/z11", + "tile_jobs": 12279, + "written_tiles": 12279, + "skipped_tiles": 0, + "unresolved_event_count": 2440224, + "unresolved_summary": [ + { + "issue_type": "render_rule_unresolved", + "source_layer": "L海底地形", + "canonical_object_type": "L海底地形", + "geom_type": "LineString", + "count": 688313, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L海底地形", + "canonical_object_type": "L海底地形", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 4241769, + "fid": "CD5F9644", + "z": 11, + "x": 1718, + "y": 872 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L海底地形", + "canonical_object_type": "L海底地形", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 4241770, + "fid": "80A01819", + "z": 11, + "x": 1718, + "y": 872 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L海底地形", + "canonical_object_type": "L海底地形", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 4220989, + "fid": "80A01819", + "z": 11, + "x": 1718, + "y": 868 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L海底地形", + "canonical_object_type": "L海底地形", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 3027404, + "fid": "FABCFAB0", + "z": 11, + "x": 1718, + "y": 874 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L海底地形", + "canonical_object_type": "L海底地形", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 3027406, + "fid": "9E67B1D0", + "z": 11, + "x": 1718, + "y": 874 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "L陸上構造物陸", + "canonical_object_type": "道路", + "geom_type": "LineString", + "count": 620959, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L陸上構造物陸", + "canonical_object_type": "道路", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 1658522, + "fid": "D3D2A599", + "z": 11, + "x": 1723, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L陸上構造物陸", + "canonical_object_type": "道路", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 1658523, + "fid": "89CE3AF5", + "z": 11, + "x": 1723, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L陸上構造物陸", + "canonical_object_type": "道路", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 1658524, + "fid": "29CFCEE4", + "z": 11, + "x": 1723, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L陸上構造物陸", + "canonical_object_type": "道路", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 1658526, + "fid": "45DD05E6", + "z": 11, + "x": 1723, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L陸上構造物陸", + "canonical_object_type": "道路", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 1658527, + "fid": "865D0855", + "z": 11, + "x": 1723, + "y": 880 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線ククリ", + "canonical_object_type": "P基本線ククリ", + "geom_type": "LineString", + "count": 393892, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線ククリ", + "canonical_object_type": "P基本線ククリ", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 6008951, + "fid": "73FD37DB", + "z": 11, + "x": 1718, + "y": 877 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線ククリ", + "canonical_object_type": "P基本線ククリ", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 6008952, + "fid": "EDB2B684", + "z": 11, + "x": 1718, + "y": 877 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線ククリ", + "canonical_object_type": "P基本線ククリ", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 514542, + "fid": "F486965C", + "z": 11, + "x": 1718, + "y": 876 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線ククリ", + "canonical_object_type": "P基本線ククリ", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 514543, + "fid": "1C821C0E", + "z": 11, + "x": 1718, + "y": 876 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線ククリ", + "canonical_object_type": "P基本線ククリ", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 514544, + "fid": "73FD37DB", + "z": 11, + "x": 1718, + "y": 876 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P穴", + "canonical_object_type": "P穴", + "geom_type": "Polygon", + "count": 120866, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P穴", + "canonical_object_type": "P穴", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 4241775, + "fid": "AD717985", + "z": 11, + "x": 1718, + "y": 872 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P穴", + "canonical_object_type": "P穴", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 3027417, + "fid": "F7BE478F", + "z": 11, + "x": 1718, + "y": 874 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P穴", + "canonical_object_type": "P穴", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 3027416, + "fid": "06A61EE6", + "z": 11, + "x": 1718, + "y": 874 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P穴", + "canonical_object_type": "P穴", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 3027418, + "fid": "77AA5E0A", + "z": 11, + "x": 1718, + "y": 874 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P穴", + "canonical_object_type": "P穴", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6195447, + "fid": "F7BE478F", + "z": 11, + "x": 1718, + "y": 873 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "L等深線", + "canonical_object_type": "等深線", + "geom_type": "LineString", + "count": 114644, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L等深線", + "canonical_object_type": "等深線", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 4241771, + "fid": "3A62AB5A", + "z": 11, + "x": 1718, + "y": 872 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L等深線", + "canonical_object_type": "等深線", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 6008944, + "fid": "3314CA36", + "z": 11, + "x": 1718, + "y": 877 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L等深線", + "canonical_object_type": "等深線", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 514535, + "fid": "3314CA36", + "z": 11, + "x": 1718, + "y": 876 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L等深線", + "canonical_object_type": "等深線", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 6195434, + "fid": "3A62AB5A", + "z": 11, + "x": 1718, + "y": 873 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L等深線", + "canonical_object_type": "等深線", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 6195435, + "fid": "EDDFFC1D", + "z": 11, + "x": 1718, + "y": 873 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P陸域", + "canonical_object_type": "P陸域", + "geom_type": "Polygon", + "count": 69777, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P陸域", + "canonical_object_type": "P陸域", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 3027419, + "fid": "0ADCE957", + "z": 11, + "x": 1718, + "y": 874 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P陸域", + "canonical_object_type": "P陸域", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6008953, + "fid": "2A73DE2E", + "z": 11, + "x": 1718, + "y": 877 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P陸域", + "canonical_object_type": "P陸域", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 514547, + "fid": "2A73DE2E", + "z": 11, + "x": 1718, + "y": 876 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P陸域", + "canonical_object_type": "P陸域", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6195452, + "fid": "0ADCE957", + "z": 11, + "x": 1718, + "y": 873 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P陸域", + "canonical_object_type": "P陸域", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6195453, + "fid": "AAAF3533", + "z": 11, + "x": 1718, + "y": 873 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "L海底地形", + "canonical_object_type": "L海底地形", + "geom_type": "MultiLineString", + "count": 65865, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L海底地形", + "canonical_object_type": "L海底地形", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 1055404, + "fid": "C504F1DC", + "z": 11, + "x": 1718, + "y": 875 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L海底地形", + "canonical_object_type": "L海底地形", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 3027403, + "fid": "E390BAF5", + "z": 11, + "x": 1718, + "y": 874 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L海底地形", + "canonical_object_type": "L海底地形", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 3027405, + "fid": "48C58DCD", + "z": 11, + "x": 1718, + "y": 874 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L海底地形", + "canonical_object_type": "L海底地形", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 110183, + "fid": "C4A39917", + "z": 11, + "x": 1718, + "y": 878 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L海底地形", + "canonical_object_type": "L海底地形", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 4042704, + "fid": "5A78A35A", + "z": 11, + "x": 1718, + "y": 879 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "干潮帯", + "geom_type": "Polygon", + "count": 44007, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "干潮帯", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6008950, + "fid": "5A848E07", + "z": 11, + "x": 1718, + "y": 877 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "干潮帯", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 514540, + "fid": "2B71620E", + "z": 11, + "x": 1718, + "y": 876 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "干潮帯", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 514541, + "fid": "5A848E07", + "z": 11, + "x": 1718, + "y": 876 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "干潮帯", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 4946317, + "fid": "BD50CC9E", + "z": 11, + "x": 1724, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "干潮帯", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1658892, + "fid": "52483690", + "z": 11, + "x": 1723, + "y": 880 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "防波堤", + "geom_type": "Polygon", + "count": 26657, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "防波堤", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1658873, + "fid": "835DB6BE", + "z": 11, + "x": 1723, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "防波堤", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1658874, + "fid": "D41CE538", + "z": 11, + "x": 1723, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "防波堤", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1658875, + "fid": "6A43127C", + "z": 11, + "x": 1723, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "防波堤", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1658876, + "fid": "12B79203", + "z": 11, + "x": 1723, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "防波堤", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1658877, + "fid": "F74F6F9A", + "z": 11, + "x": 1723, + "y": 880 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "2-5m", + "geom_type": "Polygon", + "count": 19769, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2-5m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1658837, + "fid": "686E0615", + "z": 11, + "x": 1723, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2-5m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1658838, + "fid": "82D9DBFC", + "z": 11, + "x": 1723, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2-5m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1658839, + "fid": "59BDEBD8", + "z": 11, + "x": 1723, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2-5m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1658840, + "fid": "38824A78", + "z": 11, + "x": 1723, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2-5m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1658841, + "fid": "79B28D57", + "z": 11, + "x": 1723, + "y": 880 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "0-2m", + "geom_type": "Polygon", + "count": 18565, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-2m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1658806, + "fid": "5967E197", + "z": 11, + "x": 1723, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-2m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1658807, + "fid": "DF19D5CF", + "z": 11, + "x": 1723, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-2m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1658808, + "fid": "828727CA", + "z": 11, + "x": 1723, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-2m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1658809, + "fid": "95E93B5E", + "z": 11, + "x": 1723, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-2m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1658810, + "fid": "7D4FD8DC", + "z": 11, + "x": 1723, + "y": 880 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P危険界ククリ", + "canonical_object_type": "P危険界ククリ", + "geom_type": "LineString", + "count": 17153, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P危険界ククリ", + "canonical_object_type": "P危険界ククリ", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 1658786, + "fid": "CC30B83A", + "z": 11, + "x": 1723, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P危険界ククリ", + "canonical_object_type": "P危険界ククリ", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 1658787, + "fid": "2C4274DB", + "z": 11, + "x": 1723, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P危険界ククリ", + "canonical_object_type": "P危険界ククリ", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 576877, + "fid": "54DEA8EA", + "z": 11, + "x": 1726, + "y": 882 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P危険界ククリ", + "canonical_object_type": "P危険界ククリ", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 6106260, + "fid": "991D10EB", + "z": 11, + "x": 1727, + "y": 881 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P危険界ククリ", + "canonical_object_type": "P危険界ククリ", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 6106261, + "fid": "0817B81C", + "z": 11, + "x": 1727, + "y": 881 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "5-10m", + "geom_type": "Polygon", + "count": 17138, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5-10m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 4946316, + "fid": "88CEFF3D", + "z": 11, + "x": 1724, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5-10m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1658861, + "fid": "30573D4C", + "z": 11, + "x": 1723, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5-10m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1658862, + "fid": "6C32970B", + "z": 11, + "x": 1723, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5-10m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1658863, + "fid": "2024B66B", + "z": 11, + "x": 1723, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5-10m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1658864, + "fid": "E5F22252", + "z": 11, + "x": 1723, + "y": 880 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P陸上構造物陸", + "canonical_object_type": "ビル", + "geom_type": "Polygon", + "count": 13240, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P陸上構造物陸", + "canonical_object_type": "ビル", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 2476459, + "fid": "36346858", + "z": 11, + "x": 1730, + "y": 881 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P陸上構造物陸", + "canonical_object_type": "ビル", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 2476460, + "fid": "47FCBA67", + "z": 11, + "x": 1730, + "y": 881 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P陸上構造物陸", + "canonical_object_type": "ビル", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 5920685, + "fid": "CE2C9644", + "z": 11, + "x": 1737, + "y": 878 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P陸上構造物陸", + "canonical_object_type": "ビル", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 5770225, + "fid": "C9698B1A", + "z": 11, + "x": 1736, + "y": 878 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P陸上構造物陸", + "canonical_object_type": "ビル", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 5770226, + "fid": "56C1EA0E", + "z": 11, + "x": 1736, + "y": 878 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "L基本線", + "canonical_object_type": "一本線で表わす桟橋", + "geom_type": "LineString", + "count": 12716, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L基本線", + "canonical_object_type": "一本線で表わす桟橋", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 1657385, + "fid": "B344852A", + "z": 11, + "x": 1723, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L基本線", + "canonical_object_type": "一本線で表わす桟橋", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 1657386, + "fid": "39A0EDD1", + "z": 11, + "x": 1723, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L基本線", + "canonical_object_type": "一本線で表わす桟橋", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 1657387, + "fid": "0AEF0433", + "z": 11, + "x": 1723, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L基本線", + "canonical_object_type": "一本線で表わす桟橋", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 1657388, + "fid": "A78DFEDF", + "z": 11, + "x": 1723, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L基本線", + "canonical_object_type": "一本線で表わす桟橋", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 1657389, + "fid": "0E016B58", + "z": 11, + "x": 1723, + "y": 880 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "険悪物", + "geom_type": "Point", + "count": 11226, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "険悪物", + "canonical_family": "mixed", + "geom_type": "Point", + "feature_id": 1659364, + "fid": "92FECF71", + "z": 11, + "x": 1723, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "険悪物", + "canonical_family": "mixed", + "geom_type": "Point", + "feature_id": 4243538, + "fid": "29A880E7", + "z": 11, + "x": 1729, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "険悪物", + "canonical_family": "mixed", + "geom_type": "Point", + "feature_id": 2908339, + "fid": "29A880E7", + "z": 11, + "x": 1730, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "険悪物", + "canonical_family": "mixed", + "geom_type": "Point", + "feature_id": 2476483, + "fid": "80644496", + "z": 11, + "x": 1730, + "y": 881 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "険悪物", + "canonical_family": "mixed", + "geom_type": "Point", + "feature_id": 2476484, + "fid": "57D4AF30", + "z": 11, + "x": 1730, + "y": 881 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "浅所危険界", + "geom_type": "Polygon", + "count": 9393, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "浅所危険界", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1658934, + "fid": "2E138F2C", + "z": 11, + "x": 1723, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "浅所危険界", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1658935, + "fid": "CB35E9BB", + "z": 11, + "x": 1723, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "浅所危険界", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 576895, + "fid": "ECDA2D8E", + "z": 11, + "x": 1726, + "y": 882 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "浅所危険界", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6106431, + "fid": "CA72E1D4", + "z": 11, + "x": 1727, + "y": 881 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "浅所危険界", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6106432, + "fid": "A3F2B4E2", + "z": 11, + "x": 1727, + "y": 881 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P漁具定置箇所", + "canonical_object_type": "区画漁業", + "geom_type": "Polygon", + "count": 8948, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P漁具定置箇所", + "canonical_object_type": "区画漁業", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1119839, + "fid": "53C0C79E", + "z": 11, + "x": 1727, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P漁具定置箇所", + "canonical_object_type": "区画漁業", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1119840, + "fid": "4D7527C1", + "z": 11, + "x": 1727, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P漁具定置箇所", + "canonical_object_type": "区画漁業", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1119841, + "fid": "EE1E4129", + "z": 11, + "x": 1727, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P漁具定置箇所", + "canonical_object_type": "区画漁業", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6106655, + "fid": "8FB0CEEF", + "z": 11, + "x": 1727, + "y": 881 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P漁具定置箇所", + "canonical_object_type": "区画漁業", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6106656, + "fid": "14D1387C", + "z": 11, + "x": 1727, + "y": 881 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P橋りょう等構造物", + "canonical_object_type": "橋 (水門)", + "geom_type": "Polygon", + "count": 8735, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P橋りょう等構造物", + "canonical_object_type": "橋 (水門)", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1659262, + "fid": "287D307D", + "z": 11, + "x": 1723, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P橋りょう等構造物", + "canonical_object_type": "橋 (水門)", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1659263, + "fid": "3EA799A7", + "z": 11, + "x": 1723, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P橋りょう等構造物", + "canonical_object_type": "橋 (水門)", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1659264, + "fid": "AB02422E", + "z": 11, + "x": 1723, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P橋りょう等構造物", + "canonical_object_type": "橋 (水門)", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1119835, + "fid": "BEE80C71", + "z": 11, + "x": 1727, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P橋りょう等構造物", + "canonical_object_type": "橋 (水門)", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1119836, + "fid": "E2EDA422", + "z": 11, + "x": 1727, + "y": 880 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "L基本線", + "canonical_object_type": "浮施設・桟橋", + "geom_type": "LineString", + "count": 8378, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L基本線", + "canonical_object_type": "浮施設・桟橋", + "canonical_family": "mixed", + "geom_type": "LineString", + "feature_id": 6104220, + "fid": "5EDBD274", + "z": 11, + "x": 1727, + "y": 881 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L基本線", + "canonical_object_type": "浮施設・桟橋", + "canonical_family": "mixed", + "geom_type": "LineString", + "feature_id": 6104221, + "fid": "AB03DA90", + "z": 11, + "x": 1727, + "y": 881 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L基本線", + "canonical_object_type": "浮施設・桟橋", + "canonical_family": "mixed", + "geom_type": "LineString", + "feature_id": 6104222, + "fid": "1F709B93", + "z": 11, + "x": 1727, + "y": 881 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L基本線", + "canonical_object_type": "浮施設・桟橋", + "canonical_family": "mixed", + "geom_type": "LineString", + "feature_id": 6104223, + "fid": "6CB5C008", + "z": 11, + "x": 1727, + "y": 881 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L基本線", + "canonical_object_type": "浮施設・桟橋", + "canonical_family": "mixed", + "geom_type": "LineString", + "feature_id": 5258991, + "fid": "5EDBD274", + "z": 11, + "x": 1728, + "y": 881 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "10-20m", + "geom_type": "Polygon", + "count": 8190, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "10-20m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6195437, + "fid": "064C7DCC", + "z": 11, + "x": 1718, + "y": 873 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "10-20m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 4946296, + "fid": "C57872E0", + "z": 11, + "x": 1724, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "10-20m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1658788, + "fid": "D3FB56F3", + "z": 11, + "x": 1723, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "10-20m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1658789, + "fid": "B0B225B7", + "z": 11, + "x": 1723, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "10-20m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1658790, + "fid": "2C8E3D96", + "z": 11, + "x": 1723, + "y": 880 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p航路標識群", + "canonical_object_type": "灯 (Lt)", + "geom_type": "Point", + "count": 7433, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "灯 (Lt)", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 1659368, + "fid": "F950488E", + "z": 11, + "x": 1723, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "灯 (Lt)", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 2476514, + "fid": "C369C907", + "z": 11, + "x": 1730, + "y": 881 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "灯 (Lt)", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 2476515, + "fid": "BC7BC706", + "z": 11, + "x": 1730, + "y": 881 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "灯 (Lt)", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 2476516, + "fid": "AFC0D051", + "z": 11, + "x": 1730, + "y": 881 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "灯 (Lt)", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 2476517, + "fid": "F8300C16", + "z": 11, + "x": 1730, + "y": 881 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "干潮帯", + "geom_type": "MultiPolygon", + "count": 6540, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "干潮帯", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1658897, + "fid": "BF3C5476", + "z": 11, + "x": 1723, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "干潮帯", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1658899, + "fid": "8CBDF727", + "z": 11, + "x": 1723, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "干潮帯", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1658901, + "fid": "65A8F5C9", + "z": 11, + "x": 1723, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "干潮帯", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1658902, + "fid": "6E5DBF93", + "z": 11, + "x": 1723, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "干潮帯", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1658904, + "fid": "2FAC6A2A", + "z": 11, + "x": 1723, + "y": 880 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p陸上構造物", + "canonical_object_type": "塔、やぐら、風車", + "geom_type": "Point", + "count": 5399, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p陸上構造物", + "canonical_object_type": "塔、やぐら、風車", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 1659371, + "fid": "AE513420", + "z": 11, + "x": 1723, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p陸上構造物", + "canonical_object_type": "塔、やぐら、風車", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 1659372, + "fid": "3CEC656A", + "z": 11, + "x": 1723, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p陸上構造物", + "canonical_object_type": "塔、やぐら、風車", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 1659373, + "fid": "3F506F41", + "z": 11, + "x": 1723, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p陸上構造物", + "canonical_object_type": "塔、やぐら、風車", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 1119910, + "fid": "EA8C4A6F", + "z": 11, + "x": 1727, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p陸上構造物", + "canonical_object_type": "塔、やぐら、風車", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 1119911, + "fid": "89080905", + "z": 11, + "x": 1727, + "y": 880 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "浮施設・桟橋", + "geom_type": "Polygon", + "count": 5336, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "浮施設・桟橋", + "canonical_family": "mixed", + "geom_type": "Polygon", + "feature_id": 1658891, + "fid": "E00710B9", + "z": 11, + "x": 1723, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "浮施設・桟橋", + "canonical_family": "mixed", + "geom_type": "Polygon", + "feature_id": 6106409, + "fid": "90D4DC8C", + "z": 11, + "x": 1727, + "y": 881 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "浮施設・桟橋", + "canonical_family": "mixed", + "geom_type": "Polygon", + "feature_id": 162885, + "fid": "5F799B91", + "z": 11, + "x": 1728, + "y": 882 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "浮施設・桟橋", + "canonical_family": "mixed", + "geom_type": "Polygon", + "feature_id": 5261083, + "fid": "F693EFE1", + "z": 11, + "x": 1728, + "y": 881 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "浮施設・桟橋", + "canonical_family": "mixed", + "geom_type": "Polygon", + "feature_id": 5261084, + "fid": "90D4DC8C", + "z": 11, + "x": 1728, + "y": 881 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p陸上構造物", + "canonical_object_type": "山頂", + "geom_type": "Point", + "count": 4859, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p陸上構造物", + "canonical_object_type": "山頂", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 1659376, + "fid": "424D30E3", + "z": 11, + "x": 1723, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p陸上構造物", + "canonical_object_type": "山頂", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 1659377, + "fid": "587D05E2", + "z": 11, + "x": 1723, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p陸上構造物", + "canonical_object_type": "山頂", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 1659378, + "fid": "03201A28", + "z": 11, + "x": 1723, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p陸上構造物", + "canonical_object_type": "山頂", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3074081, + "fid": "07F4404B", + "z": 11, + "x": 1726, + "y": 872 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p陸上構造物", + "canonical_object_type": "山頂", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3074082, + "fid": "DB591312", + "z": 11, + "x": 1726, + "y": 872 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "L基本線", + "canonical_object_type": "一本線で表わす海上バース", + "geom_type": "LineString", + "count": 4670, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L基本線", + "canonical_object_type": "一本線で表わす海上バース", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 5759230, + "fid": "0784B5C1", + "z": 11, + "x": 1736, + "y": 878 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L基本線", + "canonical_object_type": "一本線で表わす海上バース", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 5759231, + "fid": "4C72B741", + "z": 11, + "x": 1736, + "y": 878 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L基本線", + "canonical_object_type": "一本線で表わす海上バース", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 5759232, + "fid": "F651FD8C", + "z": 11, + "x": 1736, + "y": 878 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L基本線", + "canonical_object_type": "一本線で表わす海上バース", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 5759233, + "fid": "46ABED8C", + "z": 11, + "x": 1736, + "y": 878 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L基本線", + "canonical_object_type": "一本線で表わす海上バース", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 5759234, + "fid": "DC529B68", + "z": 11, + "x": 1736, + "y": 878 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "0-5m", + "geom_type": "Polygon", + "count": 4505, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-5m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 4946315, + "fid": "EA41DC1A", + "z": 11, + "x": 1724, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-5m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1658834, + "fid": "B60FCE34", + "z": 11, + "x": 1723, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-5m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1658835, + "fid": "39F5455E", + "z": 11, + "x": 1723, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-5m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1658836, + "fid": "EA41DC1A", + "z": 11, + "x": 1723, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-5m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 3073833, + "fid": "F2BC3DB5", + "z": 11, + "x": 1726, + "y": 872 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P陸上構造物陸", + "canonical_object_type": "タンク", + "geom_type": "Polygon", + "count": 4324, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P陸上構造物陸", + "canonical_object_type": "タンク", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1859032, + "fid": "9D4AF305", + "z": 11, + "x": 1733, + "y": 879 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P陸上構造物陸", + "canonical_object_type": "タンク", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 5920686, + "fid": "DAE5A542", + "z": 11, + "x": 1737, + "y": 878 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P陸上構造物陸", + "canonical_object_type": "タンク", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 3398593, + "fid": "FEB5AABE", + "z": 11, + "x": 1750, + "y": 870 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P陸上構造物陸", + "canonical_object_type": "タンク", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 2557861, + "fid": "123270F8", + "z": 11, + "x": 1748, + "y": 869 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P陸上構造物陸", + "canonical_object_type": "タンク", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1485637, + "fid": "1EF0B02A", + "z": 11, + "x": 1751, + "y": 867 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P投錨注意障害物ククリ", + "canonical_object_type": "P投錨注意障害物ククリ", + "geom_type": "LineString", + "count": 4238, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P投錨注意障害物ククリ", + "canonical_object_type": "P投錨注意障害物ククリ", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 2476086, + "fid": "528C3DCB", + "z": 11, + "x": 1730, + "y": 881 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P投錨注意障害物ククリ", + "canonical_object_type": "P投錨注意障害物ククリ", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 5769441, + "fid": "90A8997B", + "z": 11, + "x": 1736, + "y": 878 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P投錨注意障害物ククリ", + "canonical_object_type": "P投錨注意障害物ククリ", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 5769442, + "fid": "F6E928F4", + "z": 11, + "x": 1736, + "y": 878 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P投錨注意障害物ククリ", + "canonical_object_type": "P投錨注意障害物ククリ", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 5769443, + "fid": "F2198E48", + "z": 11, + "x": 1736, + "y": 878 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P投錨注意障害物ククリ", + "canonical_object_type": "P投錨注意障害物ククリ", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 3398538, + "fid": "C27B5E65", + "z": 11, + "x": 1750, + "y": 870 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p陸上構造物", + "canonical_object_type": "煙突", + "geom_type": "Point", + "count": 4069, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p陸上構造物", + "canonical_object_type": "煙突", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 1659370, + "fid": "EC760317", + "z": 11, + "x": 1723, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p陸上構造物", + "canonical_object_type": "煙突", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 163124, + "fid": "54E058BA", + "z": 11, + "x": 1728, + "y": 882 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p陸上構造物", + "canonical_object_type": "煙突", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 5261587, + "fid": "F10AA73A", + "z": 11, + "x": 1728, + "y": 881 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p陸上構造物", + "canonical_object_type": "煙突", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 2908342, + "fid": "B80ABF42", + "z": 11, + "x": 1730, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p陸上構造物", + "canonical_object_type": "煙突", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 2908343, + "fid": "D18F595D", + "z": 11, + "x": 1730, + "y": 880 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p地名", + "canonical_object_type": "p地名", + "geom_type": "Point", + "count": 3797, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p地名", + "canonical_object_type": "p地名", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3027420, + "fid": "2D74112C", + "z": 11, + "x": 1718, + "y": 874 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p地名", + "canonical_object_type": "p地名", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 514548, + "fid": "F9C7F936", + "z": 11, + "x": 1718, + "y": 876 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p地名", + "canonical_object_type": "p地名", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 6195454, + "fid": "2D74112C", + "z": 11, + "x": 1718, + "y": 873 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p地名", + "canonical_object_type": "p地名", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 6195455, + "fid": "995A3245", + "z": 11, + "x": 1718, + "y": 873 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p地名", + "canonical_object_type": "p地名", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 4053570, + "fid": "F5508AEE", + "z": 11, + "x": 1724, + "y": 881 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "2-5m", + "geom_type": "MultiPolygon", + "count": 3115, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2-5m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1658850, + "fid": "425EAC85", + "z": 11, + "x": 1723, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2-5m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1658851, + "fid": "50F8A8A7", + "z": 11, + "x": 1723, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2-5m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1658854, + "fid": "EDC4138F", + "z": 11, + "x": 1723, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2-5m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1658855, + "fid": "2BDE3A5B", + "z": 11, + "x": 1723, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2-5m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1658858, + "fid": "84781DAE", + "z": 11, + "x": 1723, + "y": 880 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "1000-2000m", + "geom_type": "Polygon", + "count": 3050, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "1000-2000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6008948, + "fid": "743EE596", + "z": 11, + "x": 1718, + "y": 877 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "1000-2000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 5636561, + "fid": "743EE596", + "z": 11, + "x": 1718, + "y": 881 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "1000-2000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 4784134, + "fid": "743EE596", + "z": 11, + "x": 1718, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "1000-2000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 2077862, + "fid": "743EE596", + "z": 11, + "x": 1719, + "y": 876 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "1000-2000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1613933, + "fid": "743EE596", + "z": 11, + "x": 1719, + "y": 877 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "20-100m", + "geom_type": "Polygon", + "count": 2915, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "20-100m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 12306, + "fid": "AD717985", + "z": 11, + "x": 1718, + "y": 859 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "20-100m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 2560992, + "fid": "AD717985", + "z": 11, + "x": 1718, + "y": 857 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "20-100m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 4241772, + "fid": "AD717985", + "z": 11, + "x": 1718, + "y": 872 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "20-100m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1781956, + "fid": "AD717985", + "z": 11, + "x": 1718, + "y": 870 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "20-100m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 3757772, + "fid": "AD717985", + "z": 11, + "x": 1718, + "y": 871 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "河川域", + "geom_type": "Polygon", + "count": 2875, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "河川域", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1658938, + "fid": "1297E1A2", + "z": 11, + "x": 1723, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "河川域", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1658939, + "fid": "418DB88C", + "z": 11, + "x": 1723, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "河川域", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1119612, + "fid": "807B94C0", + "z": 11, + "x": 1727, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "河川域", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1119614, + "fid": "691A0BBE", + "z": 11, + "x": 1727, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "河川域", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6106436, + "fid": "BD211F82", + "z": 11, + "x": 1727, + "y": 881 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "2000-3000m", + "geom_type": "Polygon", + "count": 2835, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2000-3000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 5636562, + "fid": "0C643A77", + "z": 11, + "x": 1718, + "y": 881 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2000-3000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 4784135, + "fid": "0C643A77", + "z": 11, + "x": 1718, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2000-3000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 2635522, + "fid": "79FC1C63", + "z": 11, + "x": 1718, + "y": 882 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2000-3000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 2635523, + "fid": "35F46985", + "z": 11, + "x": 1718, + "y": 882 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2000-3000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 2635524, + "fid": "0C643A77", + "z": 11, + "x": 1718, + "y": 882 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "0-2m", + "geom_type": "MultiPolygon", + "count": 2698, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-2m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1658816, + "fid": "3ABF15C4", + "z": 11, + "x": 1723, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-2m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1658821, + "fid": "80B4E8E0", + "z": 11, + "x": 1723, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-2m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1658822, + "fid": "199DF05E", + "z": 11, + "x": 1723, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-2m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1658823, + "fid": "439F99ED", + "z": 11, + "x": 1723, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-2m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1658829, + "fid": "1BA02148", + "z": 11, + "x": 1723, + "y": 880 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "L概略等深線", + "canonical_object_type": "概略等深線", + "geom_type": "LineString", + "count": 2661, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L概略等深線", + "canonical_object_type": "概略等深線", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 1118113, + "fid": "1C4DC829", + "z": 11, + "x": 1727, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L概略等深線", + "canonical_object_type": "概略等深線", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 1118114, + "fid": "68A16F49", + "z": 11, + "x": 1727, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L概略等深線", + "canonical_object_type": "概略等深線", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 1118115, + "fid": "6D11BA30", + "z": 11, + "x": 1727, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L概略等深線", + "canonical_object_type": "概略等深線", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 1118117, + "fid": "526AFAC6", + "z": 11, + "x": 1727, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L概略等深線", + "canonical_object_type": "概略等深線", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 1118118, + "fid": "29DA630A", + "z": 11, + "x": 1727, + "y": 880 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "100-200m", + "geom_type": "Polygon", + "count": 2496, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "100-200m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 4241773, + "fid": "77AA5E0A", + "z": 11, + "x": 1718, + "y": 872 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "100-200m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 892193, + "fid": "77AA5E0A", + "z": 11, + "x": 1718, + "y": 867 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "100-200m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1055405, + "fid": "C08C44E0", + "z": 11, + "x": 1718, + "y": 875 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "100-200m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 4220991, + "fid": "77AA5E0A", + "z": 11, + "x": 1718, + "y": 868 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "100-200m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 3027411, + "fid": "C08C44E0", + "z": 11, + "x": 1718, + "y": 874 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "500-1000m", + "geom_type": "Polygon", + "count": 2355, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "500-1000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6008947, + "fid": "06D87451", + "z": 11, + "x": 1718, + "y": 877 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "500-1000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 110195, + "fid": "06D87451", + "z": 11, + "x": 1718, + "y": 878 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "500-1000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 4042709, + "fid": "06D87451", + "z": 11, + "x": 1718, + "y": 879 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "500-1000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 4784133, + "fid": "06D87451", + "z": 11, + "x": 1718, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "500-1000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 293862, + "fid": "06D87451", + "z": 11, + "x": 1719, + "y": 875 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p航路標識群", + "canonical_object_type": "防波堤灯台", + "geom_type": "Point", + "count": 2330, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "防波堤灯台", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 1659367, + "fid": "CBE175BD", + "z": 11, + "x": 1723, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "防波堤灯台", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 163122, + "fid": "BB8A6871", + "z": 11, + "x": 1728, + "y": 882 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "防波堤灯台", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 5261581, + "fid": "F310F499", + "z": 11, + "x": 1728, + "y": 881 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "防波堤灯台", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 5529063, + "fid": "5B9E6E39", + "z": 11, + "x": 1728, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "防波堤灯台", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 2476509, + "fid": "97042303", + "z": 11, + "x": 1730, + "y": 881 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "3000-4000m", + "geom_type": "Polygon", + "count": 2321, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "3000-4000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 5636563, + "fid": "5ED00BCE", + "z": 11, + "x": 1718, + "y": 881 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "3000-4000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 2635525, + "fid": "5ED00BCE", + "z": 11, + "x": 1718, + "y": 882 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "3000-4000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 263677, + "fid": "5ED00BCE", + "z": 11, + "x": 1718, + "y": 886 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "3000-4000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1409100, + "fid": "5ED00BCE", + "z": 11, + "x": 1718, + "y": 885 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "3000-4000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 2768684, + "fid": "3CAC3CBB", + "z": 11, + "x": 1718, + "y": 888 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "5-10m", + "geom_type": "MultiPolygon", + "count": 2266, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5-10m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1658872, + "fid": "88CEFF3D", + "z": 11, + "x": 1723, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5-10m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1119577, + "fid": "40A4C619", + "z": 11, + "x": 1727, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5-10m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1119578, + "fid": "7F20C326", + "z": 11, + "x": 1727, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5-10m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1119583, + "fid": "9A5B2800", + "z": 11, + "x": 1727, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5-10m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1119592, + "fid": "3465866A", + "z": 11, + "x": 1727, + "y": 880 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P投錨注意障害物", + "canonical_object_type": "険悪物", + "geom_type": "Polygon", + "count": 2256, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P投錨注意障害物", + "canonical_object_type": "険悪物", + "canonical_family": "mixed", + "geom_type": "Polygon", + "feature_id": 2476085, + "fid": "2253E918", + "z": 11, + "x": 1730, + "y": 881 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P投錨注意障害物", + "canonical_object_type": "険悪物", + "canonical_family": "mixed", + "geom_type": "Polygon", + "feature_id": 5769438, + "fid": "4492C503", + "z": 11, + "x": 1736, + "y": 878 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P投錨注意障害物", + "canonical_object_type": "険悪物", + "canonical_family": "mixed", + "geom_type": "Polygon", + "feature_id": 5769439, + "fid": "5743A617", + "z": 11, + "x": 1736, + "y": 878 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P投錨注意障害物", + "canonical_object_type": "険悪物", + "canonical_family": "mixed", + "geom_type": "Polygon", + "feature_id": 5769440, + "fid": "ADA27DFD", + "z": 11, + "x": 1736, + "y": 878 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P投錨注意障害物", + "canonical_object_type": "険悪物", + "canonical_family": "mixed", + "geom_type": "Polygon", + "feature_id": 2526229, + "fid": "94B6A179", + "z": 11, + "x": 1751, + "y": 866 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "5000-6000m", + "geom_type": "Polygon", + "count": 2169, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5000-6000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 263679, + "fid": "CBB6C786", + "z": 11, + "x": 1718, + "y": 886 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5000-6000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 5894877, + "fid": "CBB6C786", + "z": 11, + "x": 1718, + "y": 889 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5000-6000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 5092111, + "fid": "CBB6C786", + "z": 11, + "x": 1718, + "y": 887 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5000-6000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 2768686, + "fid": "CBB6C786", + "z": 11, + "x": 1718, + "y": 888 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5000-6000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6299293, + "fid": "CBB6C786", + "z": 11, + "x": 1718, + "y": 890 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "海草", + "geom_type": "Point", + "count": 2089, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "海草", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 5261570, + "fid": "2E7F8CC5", + "z": 11, + "x": 1728, + "y": 881 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "海草", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 5261571, + "fid": "913E9502", + "z": 11, + "x": 1728, + "y": 881 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "海草", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 5261572, + "fid": "04F949D0", + "z": 11, + "x": 1728, + "y": 881 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "海草", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 5261573, + "fid": "4F88FC9E", + "z": 11, + "x": 1728, + "y": 881 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "海草", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 5261574, + "fid": "A1A9EC62", + "z": 11, + "x": 1728, + "y": 881 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "200-500m", + "geom_type": "Polygon", + "count": 2087, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "200-500m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 3027413, + "fid": "E2915581", + "z": 11, + "x": 1718, + "y": 874 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "200-500m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6008946, + "fid": "E2915581", + "z": 11, + "x": 1718, + "y": 877 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "200-500m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 514538, + "fid": "E2915581", + "z": 11, + "x": 1718, + "y": 876 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "200-500m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6195441, + "fid": "E2915581", + "z": 11, + "x": 1718, + "y": 873 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "200-500m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 110194, + "fid": "E2915581", + "z": 11, + "x": 1718, + "y": 878 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "p投錨注意障害物", + "geom_type": "Point", + "count": 1950, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "p投錨注意障害物", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 4743624, + "fid": "7A0D847A", + "z": 11, + "x": 1749, + "y": 869 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "p投錨注意障害物", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3398610, + "fid": "9FB7A5A8", + "z": 11, + "x": 1750, + "y": 870 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "p投錨注意障害物", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 2071879, + "fid": "33B95929", + "z": 11, + "x": 1751, + "y": 864 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "p投錨注意障害物", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 2526573, + "fid": "6E34EEAB", + "z": 11, + "x": 1751, + "y": 866 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "p投錨注意障害物", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 2526572, + "fid": "3F395350", + "z": 11, + "x": 1751, + "y": 866 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "4000-5000m", + "geom_type": "Polygon", + "count": 1949, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "4000-5000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 263678, + "fid": "C87811B8", + "z": 11, + "x": 1718, + "y": 886 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "4000-5000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1409101, + "fid": "C87811B8", + "z": 11, + "x": 1718, + "y": 885 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "4000-5000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 5894876, + "fid": "C87811B8", + "z": 11, + "x": 1718, + "y": 889 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "4000-5000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 5092110, + "fid": "C87811B8", + "z": 11, + "x": 1718, + "y": 887 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "4000-5000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 2768685, + "fid": "C87811B8", + "z": 11, + "x": 1718, + "y": 888 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "L等深線", + "canonical_object_type": "等深線", + "geom_type": "MultiLineString", + "count": 1693, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L等深線", + "canonical_object_type": "等深線", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 3027409, + "fid": "909521C0", + "z": 11, + "x": 1718, + "y": 874 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L等深線", + "canonical_object_type": "等深線", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 162549, + "fid": "A776BD73", + "z": 11, + "x": 1728, + "y": 882 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L等深線", + "canonical_object_type": "等深線", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 162654, + "fid": "69927C42", + "z": 11, + "x": 1728, + "y": 882 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L等深線", + "canonical_object_type": "等深線", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 162650, + "fid": "51833680", + "z": 11, + "x": 1728, + "y": 882 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L等深線", + "canonical_object_type": "等深線", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 162665, + "fid": "E2607ADC", + "z": 11, + "x": 1728, + "y": 882 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P漁具定置箇所", + "canonical_object_type": "定置漁業", + "geom_type": "Polygon", + "count": 1688, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P漁具定置箇所", + "canonical_object_type": "定置漁業", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 3112540, + "fid": "6B7C9CC7", + "z": 11, + "x": 1750, + "y": 868 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P漁具定置箇所", + "canonical_object_type": "定置漁業", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1485403, + "fid": "4A357AB2", + "z": 11, + "x": 1751, + "y": 867 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P漁具定置箇所", + "canonical_object_type": "定置漁業", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 3793250, + "fid": "4A357AB2", + "z": 11, + "x": 1751, + "y": 868 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P漁具定置箇所", + "canonical_object_type": "定置漁業", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 4464759, + "fid": "1642A99D", + "z": 11, + "x": 1751, + "y": 869 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P漁具定置箇所", + "canonical_object_type": "定置漁業", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 3701650, + "fid": "FECA0EFA", + "z": 11, + "x": 1753, + "y": 866 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線ククリ", + "canonical_object_type": "P基本線ククリ", + "geom_type": "MultiLineString", + "count": 1632, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線ククリ", + "canonical_object_type": "P基本線ククリ", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 3027415, + "fid": "DC7730C3", + "z": 11, + "x": 1718, + "y": 874 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線ククリ", + "canonical_object_type": "P基本線ククリ", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 1119739, + "fid": "1D09FFF9", + "z": 11, + "x": 1727, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線ククリ", + "canonical_object_type": "P基本線ククリ", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 1119740, + "fid": "B65FD7AB", + "z": 11, + "x": 1727, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線ククリ", + "canonical_object_type": "P基本線ククリ", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 1119757, + "fid": "EF41D3BD", + "z": 11, + "x": 1727, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線ククリ", + "canonical_object_type": "P基本線ククリ", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 6106506, + "fid": "027E2DFE", + "z": 11, + "x": 1727, + "y": 881 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p航路標識群", + "canonical_object_type": "灯浮標 (やぐら型)", + "geom_type": "Point", + "count": 1476, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "灯浮標 (やぐら型)", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 2476535, + "fid": "3A5184DE", + "z": 11, + "x": 1730, + "y": 881 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "灯浮標 (やぐら型)", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 2476536, + "fid": "0BFCE6A1", + "z": 11, + "x": 1730, + "y": 881 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "灯浮標 (やぐら型)", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 2476537, + "fid": "3C514497", + "z": 11, + "x": 1730, + "y": 881 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "灯浮標 (やぐら型)", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 2476538, + "fid": "35EE2A56", + "z": 11, + "x": 1730, + "y": 881 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "灯浮標 (やぐら型)", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 2476539, + "fid": "304D7A7E", + "z": 11, + "x": 1730, + "y": 881 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p陸上構造物", + "canonical_object_type": "漁業協同組合", + "geom_type": "Point", + "count": 1457, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p陸上構造物", + "canonical_object_type": "漁業協同組合", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 1659374, + "fid": "48E57A0F", + "z": 11, + "x": 1723, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p陸上構造物", + "canonical_object_type": "漁業協同組合", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 2476566, + "fid": "B732CB5D", + "z": 11, + "x": 1730, + "y": 881 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p陸上構造物", + "canonical_object_type": "漁業協同組合", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3087180, + "fid": "F361D134", + "z": 11, + "x": 1736, + "y": 877 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p陸上構造物", + "canonical_object_type": "漁業協同組合", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 5770380, + "fid": "65D57E55", + "z": 11, + "x": 1736, + "y": 878 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p陸上構造物", + "canonical_object_type": "漁業協同組合", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 5770381, + "fid": "7958FDB3", + "z": 11, + "x": 1736, + "y": 878 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "L等深線", + "canonical_object_type": "湖沼等深線", + "geom_type": "LineString", + "count": 1426, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L等深線", + "canonical_object_type": "湖沼等深線", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 3341668, + "fid": "6BD73FB9", + "z": 11, + "x": 1766, + "y": 836 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L等深線", + "canonical_object_type": "湖沼等深線", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 3341670, + "fid": "7B1E6A61", + "z": 11, + "x": 1766, + "y": 836 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L等深線", + "canonical_object_type": "湖沼等深線", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 3341673, + "fid": "7A1B24E5", + "z": 11, + "x": 1766, + "y": 836 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L等深線", + "canonical_object_type": "湖沼等深線", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 3341683, + "fid": "A11FACA1", + "z": 11, + "x": 1766, + "y": 836 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L等深線", + "canonical_object_type": "湖沼等深線", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 3341674, + "fid": "49649CCE", + "z": 11, + "x": 1766, + "y": 836 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "防波堤", + "geom_type": "MultiPolygon", + "count": 1379, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "防波堤", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1119599, + "fid": "534380FF", + "z": 11, + "x": 1727, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "防波堤", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 5528409, + "fid": "D20AC775", + "z": 11, + "x": 1728, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "防波堤", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 2475241, + "fid": "7744EF43", + "z": 11, + "x": 1730, + "y": 881 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "防波堤", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 3085959, + "fid": "E418B1E8", + "z": 11, + "x": 1736, + "y": 877 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "防波堤", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 3085963, + "fid": "747CE4DA", + "z": 11, + "x": 1736, + "y": 877 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P陸域", + "canonical_object_type": "P陸域", + "geom_type": "MultiPolygon", + "count": 1369, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P陸域", + "canonical_object_type": "P陸域", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1659341, + "fid": "4FFB3503", + "z": 11, + "x": 1723, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P陸域", + "canonical_object_type": "P陸域", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1659360, + "fid": "A84E9810", + "z": 11, + "x": 1723, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P陸域", + "canonical_object_type": "P陸域", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 3074040, + "fid": "30EE65EA", + "z": 11, + "x": 1726, + "y": 872 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P陸域", + "canonical_object_type": "P陸域", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 806379, + "fid": "D37BFD3B", + "z": 11, + "x": 1727, + "y": 871 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P陸域", + "canonical_object_type": "P陸域", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1119902, + "fid": "791A0A39", + "z": 11, + "x": 1727, + "y": 880 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "未測海域", + "geom_type": "Polygon", + "count": 1361, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "未測海域", + "canonical_family": "mixed", + "geom_type": "Polygon", + "feature_id": 1658936, + "fid": "83EAC938", + "z": 11, + "x": 1723, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "未測海域", + "canonical_family": "mixed", + "geom_type": "Polygon", + "feature_id": 1119611, + "fid": "F479826F", + "z": 11, + "x": 1727, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "未測海域", + "canonical_family": "mixed", + "geom_type": "Polygon", + "feature_id": 6106435, + "fid": "97FC94D6", + "z": 11, + "x": 1727, + "y": 881 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "未測海域", + "canonical_family": "mixed", + "geom_type": "Polygon", + "feature_id": 5261164, + "fid": "97FC94D6", + "z": 11, + "x": 1728, + "y": 881 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "未測海域", + "canonical_family": "mixed", + "geom_type": "Polygon", + "feature_id": 5528466, + "fid": "9AB1FD47", + "z": 11, + "x": 1728, + "y": 880 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p航路標識群", + "canonical_object_type": "浮標 (やぐら型)", + "geom_type": "Point", + "count": 1312, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "浮標 (やぐら型)", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 6106749, + "fid": "07962E26", + "z": 11, + "x": 1727, + "y": 881 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "浮標 (やぐら型)", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 6106750, + "fid": "33A8B8ED", + "z": 11, + "x": 1727, + "y": 881 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "浮標 (やぐら型)", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 6106751, + "fid": "39C907F5", + "z": 11, + "x": 1727, + "y": 881 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "浮標 (やぐら型)", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 6106752, + "fid": "FE0573C9", + "z": 11, + "x": 1727, + "y": 881 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "浮標 (やぐら型)", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 6106753, + "fid": "B41E2AE0", + "z": 11, + "x": 1727, + "y": 881 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P潜堤", + "canonical_object_type": "潜提", + "geom_type": "Polygon", + "count": 1273, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P潜堤", + "canonical_object_type": "潜提", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1659265, + "fid": "E669A0EB", + "z": 11, + "x": 1723, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P潜堤", + "canonical_object_type": "潜提", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1659266, + "fid": "A0EBECD5", + "z": 11, + "x": 1723, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P潜堤", + "canonical_object_type": "潜提", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1659267, + "fid": "96ED2E48", + "z": 11, + "x": 1723, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P潜堤", + "canonical_object_type": "潜提", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1659269, + "fid": "4D00AC77", + "z": 11, + "x": 1723, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P潜堤", + "canonical_object_type": "潜提", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1659270, + "fid": "A4CBCA55", + "z": 11, + "x": 1723, + "y": 880 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p航路標識群", + "canonical_object_type": "橋梁灯", + "geom_type": "Point", + "count": 1251, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "橋梁灯", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 2476540, + "fid": "37E04346", + "z": 11, + "x": 1730, + "y": 881 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "橋梁灯", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 2476541, + "fid": "390D55A4", + "z": 11, + "x": 1730, + "y": 881 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "橋梁灯", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 2476542, + "fid": "302DFA5F", + "z": 11, + "x": 1730, + "y": 881 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "橋梁灯", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 2476543, + "fid": "91FB0914", + "z": 11, + "x": 1730, + "y": 881 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "橋梁灯", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 2476544, + "fid": "7E7468BF", + "z": 11, + "x": 1730, + "y": 881 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "0-10m", + "geom_type": "Polygon", + "count": 1206, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-10m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 3073839, + "fid": "978BE898", + "z": 11, + "x": 1726, + "y": 872 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-10m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 576889, + "fid": "A341BC14", + "z": 11, + "x": 1726, + "y": 882 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-10m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 3396605, + "fid": "A341BC14", + "z": 11, + "x": 1727, + "y": 882 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-10m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 5052825, + "fid": "AA7BE16F", + "z": 11, + "x": 1736, + "y": 876 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-10m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 4966161, + "fid": "2BDB9213", + "z": 11, + "x": 1737, + "y": 876 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p航路標識群", + "canonical_object_type": "立標", + "geom_type": "Point", + "count": 1181, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "立標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 1119904, + "fid": "B01AFB55", + "z": 11, + "x": 1727, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "立標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 1119905, + "fid": "69B2380F", + "z": 11, + "x": 1727, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "立標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 1119906, + "fid": "F8F27B5B", + "z": 11, + "x": 1727, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "立標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 6106739, + "fid": "185C4E34", + "z": 11, + "x": 1727, + "y": 881 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "立標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 6106740, + "fid": "8945234B", + "z": 11, + "x": 1727, + "y": 881 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "サンドウェーブ", + "geom_type": "Point", + "count": 1177, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "サンドウェーブ", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 5302825, + "fid": "48D8CB78", + "z": 11, + "x": 1757, + "y": 822 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "サンドウェーブ", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 5302826, + "fid": "CF6032AF", + "z": 11, + "x": 1757, + "y": 822 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "サンドウェーブ", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 1060881, + "fid": "56AC2D05", + "z": 11, + "x": 1757, + "y": 823 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "サンドウェーブ", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 1060882, + "fid": "B180CC51", + "z": 11, + "x": 1757, + "y": 823 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "サンドウェーブ", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 1060883, + "fid": "F3B6686B", + "z": 11, + "x": 1757, + "y": 823 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P穴", + "canonical_object_type": "P穴", + "geom_type": "MultiPolygon", + "count": 1176, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P穴", + "canonical_object_type": "P穴", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 3893226, + "fid": "87D84AAD", + "z": 11, + "x": 1725, + "y": 881 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P穴", + "canonical_object_type": "P穴", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1497481, + "fid": "87D84AAD", + "z": 11, + "x": 1725, + "y": 882 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P穴", + "canonical_object_type": "P穴", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1497482, + "fid": "06D87451", + "z": 11, + "x": 1725, + "y": 882 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P穴", + "canonical_object_type": "P穴", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1659289, + "fid": "B3C6E2BF", + "z": 11, + "x": 1723, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P穴", + "canonical_object_type": "P穴", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 3073963, + "fid": "1A0D0490", + "z": 11, + "x": 1726, + "y": 872 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "急潮・波紋・激潮", + "geom_type": "Point", + "count": 1106, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "急潮・波紋・激潮", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 6008954, + "fid": "7199DD64", + "z": 11, + "x": 1718, + "y": 877 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "急潮・波紋・激潮", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 6008955, + "fid": "D145703B", + "z": 11, + "x": 1718, + "y": 877 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "急潮・波紋・激潮", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 514549, + "fid": "98D50BAD", + "z": 11, + "x": 1718, + "y": 876 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "急潮・波紋・激潮", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 514550, + "fid": "35393FA4", + "z": 11, + "x": 1718, + "y": 876 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "急潮・波紋・激潮", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3074073, + "fid": "E8D72DEB", + "z": 11, + "x": 1726, + "y": 872 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "撤去跡", + "geom_type": "Polygon", + "count": 1093, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "撤去跡", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1658937, + "fid": "5A99B3C0", + "z": 11, + "x": 1723, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "撤去跡", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 2475526, + "fid": "E90E5C8F", + "z": 11, + "x": 1730, + "y": 881 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "撤去跡", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 5768536, + "fid": "1C3B6443", + "z": 11, + "x": 1736, + "y": 878 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "撤去跡", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 5768537, + "fid": "D5E5E255", + "z": 11, + "x": 1736, + "y": 878 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "撤去跡", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 2071155, + "fid": "E5148925", + "z": 11, + "x": 1751, + "y": 864 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "6000-7000m", + "geom_type": "Polygon", + "count": 1003, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "6000-7000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1929019, + "fid": "2DFE98D1", + "z": 11, + "x": 1723, + "y": 887 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "6000-7000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 2835533, + "fid": "2DFE98D1", + "z": 11, + "x": 1723, + "y": 888 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "6000-7000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6279220, + "fid": "2DFE98D1", + "z": 11, + "x": 1723, + "y": 889 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "6000-7000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1131838, + "fid": "2DFE98D1", + "z": 11, + "x": 1724, + "y": 887 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "6000-7000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 288141, + "fid": "2DFE98D1", + "z": 11, + "x": 1724, + "y": 889 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p地名陸", + "canonical_object_type": "p地名陸", + "geom_type": "Point", + "count": 834, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p地名陸", + "canonical_object_type": "p地名陸", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 1659362, + "fid": "691C23C6", + "z": 11, + "x": 1723, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p地名陸", + "canonical_object_type": "p地名陸", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 5261569, + "fid": "6E962866", + "z": 11, + "x": 1728, + "y": 881 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p地名陸", + "canonical_object_type": "p地名陸", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 2908338, + "fid": "BF3B2CB9", + "z": 11, + "x": 1730, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p地名陸", + "canonical_object_type": "p地名陸", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 1859049, + "fid": "FAD051DE", + "z": 11, + "x": 1733, + "y": 879 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p地名陸", + "canonical_object_type": "p地名陸", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 5770284, + "fid": "F67C5142", + "z": 11, + "x": 1736, + "y": 878 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "10-20m", + "geom_type": "MultiPolygon", + "count": 790, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "10-20m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1119476, + "fid": "7A97ABC1", + "z": 11, + "x": 1727, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "10-20m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1119478, + "fid": "D8449685", + "z": 11, + "x": 1727, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "10-20m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1119479, + "fid": "673DFF9E", + "z": 11, + "x": 1727, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "10-20m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6106293, + "fid": "673DFF9E", + "z": 11, + "x": 1727, + "y": 881 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "10-20m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 162773, + "fid": "264151DA", + "z": 11, + "x": 1728, + "y": 882 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "0-5m", + "geom_type": "MultiPolygon", + "count": 775, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-5m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1658833, + "fid": "D48573EF", + "z": 11, + "x": 1723, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-5m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 3073837, + "fid": "1A0D0490", + "z": 11, + "x": 1726, + "y": 872 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-5m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1119523, + "fid": "A58F35B2", + "z": 11, + "x": 1727, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-5m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6106322, + "fid": "EA5AA210", + "z": 11, + "x": 1727, + "y": 881 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-5m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6106324, + "fid": "679C3EFA", + "z": 11, + "x": 1727, + "y": 881 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "L陸上構造物陸", + "canonical_object_type": "道路", + "geom_type": "MultiLineString", + "count": 669, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L陸上構造物陸", + "canonical_object_type": "道路", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 5527685, + "fid": "A6E5F13E", + "z": 11, + "x": 1728, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L陸上構造物陸", + "canonical_object_type": "道路", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 2906704, + "fid": "DD126EAC", + "z": 11, + "x": 1730, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L陸上構造物陸", + "canonical_object_type": "道路", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 3923247, + "fid": "3C0A61F7", + "z": 11, + "x": 1729, + "y": 881 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L陸上構造物陸", + "canonical_object_type": "道路", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 5766145, + "fid": "0719F4F4", + "z": 11, + "x": 1736, + "y": 878 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L陸上構造物陸", + "canonical_object_type": "道路", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 4153159, + "fid": "64D6790A", + "z": 11, + "x": 1747, + "y": 869 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p航路標識群", + "canonical_object_type": "灯標", + "geom_type": "Point", + "count": 627, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "灯標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 1119907, + "fid": "FFB86255", + "z": 11, + "x": 1727, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "灯標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 6106748, + "fid": "BD85D71D", + "z": 11, + "x": 1727, + "y": 881 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "灯標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 163123, + "fid": "91C94DA7", + "z": 11, + "x": 1728, + "y": 882 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "灯標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 5261586, + "fid": "F51C7A3F", + "z": 11, + "x": 1728, + "y": 881 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "灯標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 4243541, + "fid": "51BF2412", + "z": 11, + "x": 1729, + "y": 880 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p航路標識群", + "canonical_object_type": "円錐型浮標", + "geom_type": "Point", + "count": 609, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "円錐型浮標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3112861, + "fid": "A7BED5AC", + "z": 11, + "x": 1750, + "y": 868 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "円錐型浮標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3112862, + "fid": "9E5A86B7", + "z": 11, + "x": 1750, + "y": 868 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "円錐型浮標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 1485823, + "fid": "09F9A7BC", + "z": 11, + "x": 1751, + "y": 867 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "円錐型浮標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 2526659, + "fid": "1B4AC267", + "z": 11, + "x": 1751, + "y": 866 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "円錐型浮標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3794120, + "fid": "4C37F1D2", + "z": 11, + "x": 1751, + "y": 868 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "L基本線", + "canonical_object_type": "一本線で表わす潜提", + "geom_type": "LineString", + "count": 552, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L基本線", + "canonical_object_type": "一本線で表わす潜提", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 2359347, + "fid": "954E8B30", + "z": 11, + "x": 1747, + "y": 868 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L基本線", + "canonical_object_type": "一本線で表わす潜提", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 2359348, + "fid": "F1638A1F", + "z": 11, + "x": 1747, + "y": 868 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L基本線", + "canonical_object_type": "一本線で表わす潜提", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 1435768, + "fid": "AD1F7C36", + "z": 11, + "x": 1750, + "y": 869 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L基本線", + "canonical_object_type": "一本線で表わす潜提", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 1435769, + "fid": "C24D5DF6", + "z": 11, + "x": 1750, + "y": 869 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L基本線", + "canonical_object_type": "一本線で表わす潜提", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 1435770, + "fid": "D645B56E", + "z": 11, + "x": 1750, + "y": 869 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "L高さ制限", + "canonical_object_type": "架空線、送電線", + "geom_type": "LineString", + "count": 504, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L高さ制限", + "canonical_object_type": "架空線、送電線", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 4883338, + "fid": "AC66912E", + "z": 11, + "x": 1752, + "y": 866 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L高さ制限", + "canonical_object_type": "架空線、送電線", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 2544636, + "fid": "F4D17FC2", + "z": 11, + "x": 1756, + "y": 826 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L高さ制限", + "canonical_object_type": "架空線、送電線", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 2544637, + "fid": "D386D9CB", + "z": 11, + "x": 1756, + "y": 826 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L高さ制限", + "canonical_object_type": "架空線、送電線", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 5578828, + "fid": "1A2D8F71", + "z": 11, + "x": 1757, + "y": 825 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L高さ制限", + "canonical_object_type": "架空線、送電線", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 5578829, + "fid": "70F8A615", + "z": 11, + "x": 1757, + "y": 825 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "7000-8000m", + "geom_type": "Polygon", + "count": 496, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "7000-8000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 2636537, + "fid": "2819F28E", + "z": 11, + "x": 1742, + "y": 884 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "7000-8000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 3841849, + "fid": "2819F28E", + "z": 11, + "x": 1742, + "y": 885 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "7000-8000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 3618225, + "fid": "2819F28E", + "z": 11, + "x": 1743, + "y": 884 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "7000-8000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1177998, + "fid": "2819F28E", + "z": 11, + "x": 1743, + "y": 885 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "7000-8000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6210763, + "fid": "D61A115D", + "z": 11, + "x": 1744, + "y": 883 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "全沈没船 (危険なし)", + "geom_type": "Point", + "count": 406, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "全沈没船 (危険なし)", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 6008956, + "fid": "148CC311", + "z": 11, + "x": 1718, + "y": 877 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "全沈没船 (危険なし)", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 110196, + "fid": "E755C3EF", + "z": 11, + "x": 1718, + "y": 878 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "全沈没船 (危険なし)", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 6378480, + "fid": "718B5FDF", + "z": 11, + "x": 1722, + "y": 875 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "全沈没船 (危険なし)", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 1238770, + "fid": "ABA079EA", + "z": 11, + "x": 1724, + "y": 869 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "全沈没船 (危険なし)", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3087157, + "fid": "14BA8C42", + "z": 11, + "x": 1736, + "y": 877 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "L基本線", + "canonical_object_type": "一本線で表わす撤去跡", + "geom_type": "LineString", + "count": 389, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L基本線", + "canonical_object_type": "一本線で表わす撤去跡", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 6202091, + "fid": "BE70460E", + "z": 11, + "x": 1744, + "y": 868 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L基本線", + "canonical_object_type": "一本線で表わす撤去跡", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 1042912, + "fid": "B8D10F2E", + "z": 11, + "x": 1745, + "y": 868 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L基本線", + "canonical_object_type": "一本線で表わす撤去跡", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 1042913, + "fid": "443C1102", + "z": 11, + "x": 1745, + "y": 868 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L基本線", + "canonical_object_type": "一本線で表わす撤去跡", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 1042914, + "fid": "0F0F53CB", + "z": 11, + "x": 1745, + "y": 868 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L基本線", + "canonical_object_type": "一本線で表わす撤去跡", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 1042915, + "fid": "BE70460E", + "z": 11, + "x": 1745, + "y": 868 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "陸上水域", + "geom_type": "Polygon", + "count": 388, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "陸上水域", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 2907422, + "fid": "A38487E8", + "z": 11, + "x": 1730, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "陸上水域", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 2907423, + "fid": "DC3EB664", + "z": 11, + "x": 1730, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "陸上水域", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 5920354, + "fid": "D8E07027", + "z": 11, + "x": 1737, + "y": 878 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "陸上水域", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 5768539, + "fid": "D8E07027", + "z": 11, + "x": 1736, + "y": 878 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "陸上水域", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 2360459, + "fid": "2C6B925D", + "z": 11, + "x": 1747, + "y": 868 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "500-1000m", + "geom_type": "MultiPolygon", + "count": 376, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "500-1000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 2989247, + "fid": "06D87451", + "z": 11, + "x": 1719, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "500-1000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 3742458, + "fid": "06D87451", + "z": 11, + "x": 1720, + "y": 879 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "500-1000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 5454297, + "fid": "06D87451", + "z": 11, + "x": 1720, + "y": 878 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "500-1000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 2064157, + "fid": "06D87451", + "z": 11, + "x": 1721, + "y": 875 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "500-1000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 5317754, + "fid": "06D87451", + "z": 11, + "x": 1721, + "y": 878 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p航路標識群", + "canonical_object_type": "円柱型浮標", + "geom_type": "Point", + "count": 366, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "円柱型浮標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 1119908, + "fid": "A3188FB2", + "z": 11, + "x": 1727, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "円柱型浮標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 1119909, + "fid": "53626821", + "z": 11, + "x": 1727, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "円柱型浮標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 5529079, + "fid": "A3188FB2", + "z": 11, + "x": 1728, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "円柱型浮標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3112858, + "fid": "F5C833FF", + "z": 11, + "x": 1750, + "y": 868 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "円柱型浮標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 2526655, + "fid": "198A981D", + "z": 11, + "x": 1751, + "y": 866 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "20-100m", + "geom_type": "MultiPolygon", + "count": 364, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "20-100m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 2315833, + "fid": "AD717985", + "z": 11, + "x": 1721, + "y": 862 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "20-100m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 493089, + "fid": "AD717985", + "z": 11, + "x": 1723, + "y": 860 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "20-100m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 2793295, + "fid": "48A38EDC", + "z": 11, + "x": 1727, + "y": 872 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "20-100m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6106300, + "fid": "031CEB6E", + "z": 11, + "x": 1727, + "y": 881 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "20-100m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 162776, + "fid": "2E2E1037", + "z": 11, + "x": 1728, + "y": 882 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "1000-2000m", + "geom_type": "MultiPolygon", + "count": 354, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "1000-2000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 5454298, + "fid": "743EE596", + "z": 11, + "x": 1720, + "y": 878 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "1000-2000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 4928748, + "fid": "743EE596", + "z": 11, + "x": 1721, + "y": 882 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "1000-2000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 265811, + "fid": "743EE596", + "z": 11, + "x": 1722, + "y": 873 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "1000-2000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 5888959, + "fid": "743EE596", + "z": 11, + "x": 1722, + "y": 874 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "1000-2000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 2632804, + "fid": "743EE596", + "z": 11, + "x": 1724, + "y": 873 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "海底設置物、放水口、取水口", + "geom_type": "Point", + "count": 342, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "海底設置物、放水口、取水口", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 4243539, + "fid": "D91DE2AC", + "z": 11, + "x": 1729, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "海底設置物、放水口、取水口", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 2908340, + "fid": "D91DE2AC", + "z": 11, + "x": 1730, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "海底設置物、放水口、取水口", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 2476506, + "fid": "D91DE2AC", + "z": 11, + "x": 1730, + "y": 881 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "海底設置物、放水口、取水口", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 2476507, + "fid": "F0014415", + "z": 11, + "x": 1730, + "y": 881 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "海底設置物、放水口、取水口", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3926655, + "fid": "D91DE2AC", + "z": 11, + "x": 1729, + "y": 881 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "河川域", + "geom_type": "MultiPolygon", + "count": 339, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "河川域", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1119613, + "fid": "C2330F65", + "z": 11, + "x": 1727, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "河川域", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6106441, + "fid": "C2330F65", + "z": 11, + "x": 1727, + "y": 881 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "河川域", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 5261167, + "fid": "C2330F65", + "z": 11, + "x": 1728, + "y": 881 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "河川域", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 5261176, + "fid": "97819C91", + "z": 11, + "x": 1728, + "y": 881 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "河川域", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 5528480, + "fid": "C2330F65", + "z": 11, + "x": 1728, + "y": 880 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "浮施設・桟橋", + "geom_type": "MultiPolygon", + "count": 336, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "浮施設・桟橋", + "canonical_family": "mixed", + "geom_type": "MultiPolygon", + "feature_id": 162886, + "fid": "9BECD1D8", + "z": 11, + "x": 1728, + "y": 882 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "浮施設・桟橋", + "canonical_family": "mixed", + "geom_type": "MultiPolygon", + "feature_id": 2556516, + "fid": "D4D4EBB2", + "z": 11, + "x": 1748, + "y": 869 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "浮施設・桟橋", + "canonical_family": "mixed", + "geom_type": "MultiPolygon", + "feature_id": 2525473, + "fid": "96CDB2AF", + "z": 11, + "x": 1751, + "y": 866 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "浮施設・桟橋", + "canonical_family": "mixed", + "geom_type": "MultiPolygon", + "feature_id": 2525475, + "fid": "8D1842EF", + "z": 11, + "x": 1751, + "y": 866 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "浮施設・桟橋", + "canonical_family": "mixed", + "geom_type": "MultiPolygon", + "feature_id": 1447315, + "fid": "7A6E5A48", + "z": 11, + "x": 1750, + "y": 869 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "浅所危険界", + "geom_type": "MultiPolygon", + "count": 331, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "浅所危険界", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 2907404, + "fid": "A34495A1", + "z": 11, + "x": 1730, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "浅所危険界", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 3924758, + "fid": "9818D205", + "z": 11, + "x": 1729, + "y": 881 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "浅所危険界", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 3924770, + "fid": "E0D001E8", + "z": 11, + "x": 1729, + "y": 881 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "浅所危険界", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 2556599, + "fid": "ACB810A8", + "z": 11, + "x": 1748, + "y": 869 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "浅所危険界", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1484860, + "fid": "0B19CE4D", + "z": 11, + "x": 1751, + "y": 867 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P航路ククリ", + "canonical_object_type": "P航路ククリ", + "geom_type": "LineString", + "count": 328, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P航路ククリ", + "canonical_object_type": "P航路ククリ", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 1449391, + "fid": "BAB3AF62", + "z": 11, + "x": 1750, + "y": 869 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P航路ククリ", + "canonical_object_type": "P航路ククリ", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 1449392, + "fid": "EF4E687B", + "z": 11, + "x": 1750, + "y": 869 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P航路ククリ", + "canonical_object_type": "P航路ククリ", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 3206978, + "fid": "0658407A", + "z": 11, + "x": 1761, + "y": 824 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P航路ククリ", + "canonical_object_type": "P航路ククリ", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 3361387, + "fid": "F85A71F4", + "z": 11, + "x": 1762, + "y": 826 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P航路ククリ", + "canonical_object_type": "P航路ククリ", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 4018197, + "fid": "C2DEA6C2", + "z": 11, + "x": 1765, + "y": 825 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "L等深線", + "canonical_object_type": "湖沼等深線", + "geom_type": "MultiLineString", + "count": 301, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L等深線", + "canonical_object_type": "湖沼等深線", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 3341669, + "fid": "77275D9C", + "z": 11, + "x": 1766, + "y": 836 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L等深線", + "canonical_object_type": "湖沼等深線", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 3341704, + "fid": "34548F72", + "z": 11, + "x": 1766, + "y": 836 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L等深線", + "canonical_object_type": "湖沼等深線", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 3341724, + "fid": "F5FF7035", + "z": 11, + "x": 1766, + "y": 836 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L等深線", + "canonical_object_type": "湖沼等深線", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 3341726, + "fid": "F417A582", + "z": 11, + "x": 1766, + "y": 836 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L等深線", + "canonical_object_type": "湖沼等深線", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 3341730, + "fid": "1F2B0FCF", + "z": 11, + "x": 1766, + "y": 836 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "2-10m", + "geom_type": "Polygon", + "count": 299, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2-10m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 3924048, + "fid": "127FE71D", + "z": 11, + "x": 1729, + "y": 881 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2-10m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 2525332, + "fid": "56BBD698", + "z": 11, + "x": 1751, + "y": 866 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2-10m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1447062, + "fid": "78E9E2B0", + "z": 11, + "x": 1750, + "y": 869 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2-10m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1447063, + "fid": "D5CC4F62", + "z": 11, + "x": 1750, + "y": 869 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2-10m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 5579218, + "fid": "F959CAE8", + "z": 11, + "x": 1757, + "y": 825 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "2000-3000m", + "geom_type": "MultiPolygon", + "count": 291, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2000-3000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 5089765, + "fid": "02940A0C", + "z": 11, + "x": 1721, + "y": 885 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2000-3000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6519736, + "fid": "02940A0C", + "z": 11, + "x": 1722, + "y": 884 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2000-3000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6177791, + "fid": "0C643A77", + "z": 11, + "x": 1727, + "y": 884 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2000-3000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1262330, + "fid": "0C643A77", + "z": 11, + "x": 1728, + "y": 884 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2000-3000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1719291, + "fid": "0C643A77", + "z": 11, + "x": 1728, + "y": 886 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "測定済みの沈船", + "geom_type": "Point", + "count": 283, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "測定済みの沈船", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3087156, + "fid": "BD81369C", + "z": 11, + "x": 1736, + "y": 877 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "測定済みの沈船", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 2526597, + "fid": "BB964571", + "z": 11, + "x": 1751, + "y": 866 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "測定済みの沈船", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 1449599, + "fid": "E5AEF2FD", + "z": 11, + "x": 1750, + "y": 869 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "測定済みの沈船", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 1449600, + "fid": "490FD962", + "z": 11, + "x": 1750, + "y": 869 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "測定済みの沈船", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 1449601, + "fid": "27DE4528", + "z": 11, + "x": 1750, + "y": 869 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "200-500m", + "geom_type": "MultiPolygon", + "count": 270, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "200-500m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1055406, + "fid": "E2915581", + "z": 11, + "x": 1718, + "y": 875 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "200-500m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 110193, + "fid": "E654FCFF", + "z": 11, + "x": 1718, + "y": 878 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "200-500m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1332665, + "fid": "E654FCFF", + "z": 11, + "x": 1720, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "200-500m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 4637364, + "fid": "E2915581", + "z": 11, + "x": 1721, + "y": 873 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "200-500m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1497477, + "fid": "87D84AAD", + "z": 11, + "x": 1725, + "y": 882 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "100-200m", + "geom_type": "MultiPolygon", + "count": 252, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "100-200m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6493522, + "fid": "77AA5E0A", + "z": 11, + "x": 1722, + "y": 861 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "100-200m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 2090767, + "fid": "77AA5E0A", + "z": 11, + "x": 1723, + "y": 859 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "100-200m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 5333189, + "fid": "77AA5E0A", + "z": 11, + "x": 1723, + "y": 870 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "100-200m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 3893222, + "fid": "93E6B6AC", + "z": 11, + "x": 1725, + "y": 881 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "100-200m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1497475, + "fid": "93E6B6AC", + "z": 11, + "x": 1725, + "y": 882 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p航路標識群", + "canonical_object_type": "沿岸灯台 (15M over)", + "geom_type": "Point", + "count": 228, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "沿岸灯台 (15M over)", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 6008957, + "fid": "5FE3F829", + "z": 11, + "x": 1718, + "y": 877 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "沿岸灯台 (15M over)", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 514551, + "fid": "5FE3F829", + "z": 11, + "x": 1718, + "y": 876 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "沿岸灯台 (15M over)", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 6195456, + "fid": "998A7327", + "z": 11, + "x": 1718, + "y": 873 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "沿岸灯台 (15M over)", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 1659365, + "fid": "706028EE", + "z": 11, + "x": 1723, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "沿岸灯台 (15M over)", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3087158, + "fid": "26410CCA", + "z": 11, + "x": 1736, + "y": 877 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "0-20m", + "geom_type": "Polygon", + "count": 217, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-20m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 4241774, + "fid": "4F2BF8F9", + "z": 11, + "x": 1718, + "y": 872 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-20m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 3027414, + "fid": "F7BE478F", + "z": 11, + "x": 1718, + "y": 874 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-20m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6008949, + "fid": "71660929", + "z": 11, + "x": 1718, + "y": 877 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-20m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 514539, + "fid": "71660929", + "z": 11, + "x": 1718, + "y": 876 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-20m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6195442, + "fid": "F7BE478F", + "z": 11, + "x": 1718, + "y": 873 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p陸上構造物", + "canonical_object_type": "海事関係署", + "geom_type": "Point", + "count": 215, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p陸上構造物", + "canonical_object_type": "海事関係署", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 2908356, + "fid": "FCB92171", + "z": 11, + "x": 1730, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p陸上構造物", + "canonical_object_type": "海事関係署", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 2476565, + "fid": "E0FC7400", + "z": 11, + "x": 1730, + "y": 881 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p陸上構造物", + "canonical_object_type": "海事関係署", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 5770379, + "fid": "8933F5C4", + "z": 11, + "x": 1736, + "y": 878 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p陸上構造物", + "canonical_object_type": "海事関係署", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 2526675, + "fid": "77B0A304", + "z": 11, + "x": 1751, + "y": 866 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p陸上構造物", + "canonical_object_type": "海事関係署", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 1449797, + "fid": "16B8835F", + "z": 11, + "x": 1750, + "y": 869 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "8000-9000m", + "geom_type": "Polygon", + "count": 213, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "8000-9000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 5945450, + "fid": "3E968A5B", + "z": 11, + "x": 1829, + "y": 818 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "8000-9000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 3143555, + "fid": "862003B7", + "z": 11, + "x": 1830, + "y": 814 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "8000-9000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 5053541, + "fid": "3E968A5B", + "z": 11, + "x": 1830, + "y": 815 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "8000-9000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 872104, + "fid": "3E968A5B", + "z": 11, + "x": 1830, + "y": 816 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "8000-9000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6367356, + "fid": "3E968A5B", + "z": 11, + "x": 1830, + "y": 817 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "湖沼域", + "geom_type": "Polygon", + "count": 205, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "湖沼域", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 132770, + "fid": "8568908E", + "z": 11, + "x": 1762, + "y": 832 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "湖沼域", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 132771, + "fid": "B70FBEBA", + "z": 11, + "x": 1762, + "y": 832 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "湖沼域", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 132772, + "fid": "49332368", + "z": 11, + "x": 1762, + "y": 832 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "湖沼域", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 132773, + "fid": "FED8F99F", + "z": 11, + "x": 1762, + "y": 832 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "湖沼域", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 5348067, + "fid": "BDE69415", + "z": 11, + "x": 1765, + "y": 836 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "5000-6000m", + "geom_type": "MultiPolygon", + "count": 201, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5000-6000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 2293761, + "fid": "CBB6C786", + "z": 11, + "x": 1722, + "y": 890 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5000-6000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 3742407, + "fid": "CBB6C786", + "z": 11, + "x": 1723, + "y": 890 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5000-6000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 399513, + "fid": "CBB6C786", + "z": 11, + "x": 1725, + "y": 893 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5000-6000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 2192190, + "fid": "CBB6C786", + "z": 11, + "x": 1726, + "y": 894 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5000-6000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 2862121, + "fid": "CBB6C786", + "z": 11, + "x": 1727, + "y": 894 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "3000-4000m", + "geom_type": "MultiPolygon", + "count": 200, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "3000-4000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 2292974, + "fid": "5ED00BCE", + "z": 11, + "x": 1718, + "y": 883 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "3000-4000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 3537333, + "fid": "5ED00BCE", + "z": 11, + "x": 1718, + "y": 884 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "3000-4000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 4999890, + "fid": "5ED00BCE", + "z": 11, + "x": 1719, + "y": 884 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "3000-4000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1058256, + "fid": "5ED00BCE", + "z": 11, + "x": 1720, + "y": 884 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "3000-4000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 3919089, + "fid": "5ED00BCE", + "z": 11, + "x": 1722, + "y": 885 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p航路標識群", + "canonical_object_type": "シーバース灯", + "geom_type": "Point", + "count": 190, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "シーバース灯", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 1485804, + "fid": "0C4298FB", + "z": 11, + "x": 1751, + "y": 867 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "シーバース灯", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 1449613, + "fid": "11E2EA3A", + "z": 11, + "x": 1750, + "y": 869 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "シーバース灯", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 1449614, + "fid": "91AE8C5F", + "z": 11, + "x": 1750, + "y": 869 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "シーバース灯", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 1449615, + "fid": "8523ED8B", + "z": 11, + "x": 1750, + "y": 869 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "シーバース灯", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3794034, + "fid": "B19E5379", + "z": 11, + "x": 1751, + "y": 868 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "4000-5000m", + "geom_type": "MultiPolygon", + "count": 185, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "4000-5000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 2897182, + "fid": "C87811B8", + "z": 11, + "x": 1719, + "y": 887 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "4000-5000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1591406, + "fid": "C87811B8", + "z": 11, + "x": 1719, + "y": 892 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "4000-5000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6588550, + "fid": "C87811B8", + "z": 11, + "x": 1719, + "y": 891 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "4000-5000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1384225, + "fid": "C87811B8", + "z": 11, + "x": 1722, + "y": 892 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "4000-5000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 3649165, + "fid": "C87811B8", + "z": 11, + "x": 1723, + "y": 891 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "0-10m", + "geom_type": "MultiPolygon", + "count": 177, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-10m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 806100, + "fid": "32B98784", + "z": 11, + "x": 1727, + "y": 871 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-10m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 5767617, + "fid": "57E22EBA", + "z": 11, + "x": 1736, + "y": 878 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-10m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1045477, + "fid": "56F79D7E", + "z": 11, + "x": 1745, + "y": 868 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-10m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 4463743, + "fid": "86EB9BA0", + "z": 11, + "x": 1751, + "y": 869 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-10m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 5411480, + "fid": "D7D20E7D", + "z": 11, + "x": 1753, + "y": 865 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "L739", + "canonical_object_type": "平水境界", + "geom_type": "LineString", + "count": 175, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L739", + "canonical_object_type": "平水境界", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 1118112, + "fid": "7917ED9D", + "z": 11, + "x": 1727, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L739", + "canonical_object_type": "平水境界", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 6104219, + "fid": "7917ED9D", + "z": 11, + "x": 1727, + "y": 881 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L739", + "canonical_object_type": "平水境界", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 5258990, + "fid": "CD0ED35F", + "z": 11, + "x": 1728, + "y": 881 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L739", + "canonical_object_type": "平水境界", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 6173739, + "fid": "E72097B9", + "z": 11, + "x": 1729, + "y": 882 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L739", + "canonical_object_type": "平水境界", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 4241777, + "fid": "74713523", + "z": 11, + "x": 1729, + "y": 880 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p航路標識群", + "canonical_object_type": "指向灯/照射灯", + "geom_type": "Point", + "count": 172, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "指向灯/照射灯", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 1659369, + "fid": "106F0CF7", + "z": 11, + "x": 1723, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "指向灯/照射灯", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 6330500, + "fid": "E03CDD96", + "z": 11, + "x": 1754, + "y": 864 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "指向灯/照射灯", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 6330501, + "fid": "95C01AE6", + "z": 11, + "x": 1754, + "y": 864 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "指向灯/照射灯", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 5328637, + "fid": "6C543EA2", + "z": 11, + "x": 1755, + "y": 862 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "指向灯/照射灯", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 680910, + "fid": "BCBB25D1", + "z": 11, + "x": 1755, + "y": 826 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P漁具定置箇所", + "canonical_object_type": "区画漁業", + "geom_type": "MultiPolygon", + "count": 157, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P漁具定置箇所", + "canonical_object_type": "区画漁業", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 2546806, + "fid": "7C9FB9DF", + "z": 11, + "x": 1756, + "y": 826 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P漁具定置箇所", + "canonical_object_type": "区画漁業", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 121415, + "fid": "66869DE6", + "z": 11, + "x": 1757, + "y": 827 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P漁具定置箇所", + "canonical_object_type": "区画漁業", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6264357, + "fid": "687CCE1E", + "z": 11, + "x": 1758, + "y": 825 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P漁具定置箇所", + "canonical_object_type": "区画漁業", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6264367, + "fid": "07B55AB7", + "z": 11, + "x": 1758, + "y": 825 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P漁具定置箇所", + "canonical_object_type": "区画漁業", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 5775406, + "fid": "5270DD31", + "z": 11, + "x": 1759, + "y": 814 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "5-20m", + "geom_type": "Polygon", + "count": 155, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5-20m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 5528400, + "fid": "3248DB89", + "z": 11, + "x": 1728, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5-20m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 3666389, + "fid": "1DBB95D5", + "z": 11, + "x": 1752, + "y": 829 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5-20m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 4400006, + "fid": "1DBB95D5", + "z": 11, + "x": 1752, + "y": 830 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5-20m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1540343, + "fid": "7B485F7D", + "z": 11, + "x": 1754, + "y": 813 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5-20m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1540344, + "fid": "6355F312", + "z": 11, + "x": 1754, + "y": 813 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p陸上構造物", + "canonical_object_type": "税関", + "geom_type": "Point", + "count": 144, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p陸上構造物", + "canonical_object_type": "税関", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 1659375, + "fid": "30D76B48", + "z": 11, + "x": 1723, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p陸上構造物", + "canonical_object_type": "税関", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 2476567, + "fid": "D8AE27A4", + "z": 11, + "x": 1730, + "y": 881 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p陸上構造物", + "canonical_object_type": "税関", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 5770382, + "fid": "CCBC0B80", + "z": 11, + "x": 1736, + "y": 878 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p陸上構造物", + "canonical_object_type": "税関", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 1449807, + "fid": "F1061FCE", + "z": 11, + "x": 1750, + "y": 869 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p陸上構造物", + "canonical_object_type": "税関", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 1449808, + "fid": "2B0E1BE6", + "z": 11, + "x": 1750, + "y": 869 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p航路標識群", + "canonical_object_type": "導灯", + "geom_type": "Point", + "count": 143, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "導灯", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 6330487, + "fid": "EA9F9E7F", + "z": 11, + "x": 1754, + "y": 864 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "導灯", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 6330488, + "fid": "68C8CA9B", + "z": 11, + "x": 1754, + "y": 864 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "導灯", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 5465212, + "fid": "561A4C88", + "z": 11, + "x": 1755, + "y": 861 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "導灯", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 5465213, + "fid": "0F23E908", + "z": 11, + "x": 1755, + "y": 861 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "導灯", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 5465214, + "fid": "1B826E61", + "z": 11, + "x": 1755, + "y": 861 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P航路", + "canonical_object_type": "航路 (法律による航路)", + "geom_type": "Polygon", + "count": 142, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P航路", + "canonical_object_type": "航路 (法律による航路)", + "canonical_family": "mixed", + "geom_type": "Polygon", + "feature_id": 1449390, + "fid": "E7B749D4", + "z": 11, + "x": 1750, + "y": 869 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P航路", + "canonical_object_type": "航路 (法律による航路)", + "canonical_family": "mixed", + "geom_type": "Polygon", + "feature_id": 3206977, + "fid": "E7CD6778", + "z": 11, + "x": 1761, + "y": 824 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P航路", + "canonical_object_type": "航路 (法律による航路)", + "canonical_family": "mixed", + "geom_type": "Polygon", + "feature_id": 3361386, + "fid": "C9BC5819", + "z": 11, + "x": 1762, + "y": 826 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P航路", + "canonical_object_type": "航路 (法律による航路)", + "canonical_family": "mixed", + "geom_type": "Polygon", + "feature_id": 4018196, + "fid": "F8AB4652", + "z": 11, + "x": 1765, + "y": 825 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P航路", + "canonical_object_type": "航路 (法律による航路)", + "canonical_family": "mixed", + "geom_type": "Polygon", + "feature_id": 3953904, + "fid": "F8AB4652", + "z": 11, + "x": 1765, + "y": 824 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "6000-7000m", + "geom_type": "MultiPolygon", + "count": 128, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "6000-7000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 5086256, + "fid": "2DFE98D1", + "z": 11, + "x": 1736, + "y": 886 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "6000-7000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 3213265, + "fid": "2DFE98D1", + "z": 11, + "x": 1736, + "y": 889 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "6000-7000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1488269, + "fid": "2DFE98D1", + "z": 11, + "x": 1736, + "y": 890 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "6000-7000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 392681, + "fid": "2DFE98D1", + "z": 11, + "x": 1737, + "y": 886 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "6000-7000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 4286396, + "fid": "2DFE98D1", + "z": 11, + "x": 1740, + "y": 888 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "沈木", + "geom_type": "Point", + "count": 127, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "沈木", + "canonical_family": "mixed", + "geom_type": "Point", + "feature_id": 774144, + "fid": "65E9778D", + "z": 11, + "x": 1768, + "y": 818 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "沈木", + "canonical_family": "mixed", + "geom_type": "Point", + "feature_id": 4512906, + "fid": "9E5BF71D", + "z": 11, + "x": 1774, + "y": 825 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "沈木", + "canonical_family": "mixed", + "geom_type": "Point", + "feature_id": 4512907, + "fid": "619D6745", + "z": 11, + "x": 1774, + "y": 825 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "沈木", + "canonical_family": "mixed", + "geom_type": "Point", + "feature_id": 4512908, + "fid": "C1D03279", + "z": 11, + "x": 1774, + "y": 825 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "沈木", + "canonical_family": "mixed", + "geom_type": "Point", + "feature_id": 4512909, + "fid": "8EEE09C4", + "z": 11, + "x": 1774, + "y": 825 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p航路境界等", + "canonical_object_type": "進路矢印 (法律による)", + "geom_type": "Point", + "count": 125, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路境界等", + "canonical_object_type": "進路矢印 (法律による)", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3024319, + "fid": "67272361", + "z": 11, + "x": 1775, + "y": 818 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路境界等", + "canonical_object_type": "進路矢印 (法律による)", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3024320, + "fid": "5EA21A0E", + "z": 11, + "x": 1775, + "y": 818 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路境界等", + "canonical_object_type": "進路矢印 (法律による)", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3024321, + "fid": "6BD45C8F", + "z": 11, + "x": 1775, + "y": 818 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路境界等", + "canonical_object_type": "進路矢印 (法律による)", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3024322, + "fid": "BBA1F51B", + "z": 11, + "x": 1775, + "y": 818 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路境界等", + "canonical_object_type": "進路矢印 (法律による)", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 6646483, + "fid": "0C7B6DC9", + "z": 11, + "x": 1776, + "y": 818 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p陸上構造物", + "canonical_object_type": "その他 (記念碑等)", + "geom_type": "Point", + "count": 115, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p陸上構造物", + "canonical_object_type": "その他 (記念碑等)", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 163130, + "fid": "783E6CDE", + "z": 11, + "x": 1728, + "y": 882 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p陸上構造物", + "canonical_object_type": "その他 (記念碑等)", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 1859067, + "fid": "104D3B28", + "z": 11, + "x": 1733, + "y": 879 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p陸上構造物", + "canonical_object_type": "その他 (記念碑等)", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 6074576, + "fid": "479D058A", + "z": 11, + "x": 1750, + "y": 867 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p陸上構造物", + "canonical_object_type": "その他 (記念碑等)", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3398631, + "fid": "7FD63BDE", + "z": 11, + "x": 1750, + "y": 870 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p陸上構造物", + "canonical_object_type": "その他 (記念碑等)", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3398632, + "fid": "A6BCDF62", + "z": 11, + "x": 1750, + "y": 870 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "9000m以深", + "geom_type": "Polygon", + "count": 108, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "9000m以深", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 872105, + "fid": "6B80B4A6", + "z": 11, + "x": 1830, + "y": 816 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "9000m以深", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6367357, + "fid": "6B80B4A6", + "z": 11, + "x": 1830, + "y": 817 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "9000m以深", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 2610135, + "fid": "6B80B4A6", + "z": 11, + "x": 1830, + "y": 818 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "9000m以深", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 4862217, + "fid": "6B80B4A6", + "z": 11, + "x": 1831, + "y": 814 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "9000m以深", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 3049841, + "fid": "4A164DC3", + "z": 11, + "x": 1831, + "y": 815 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p陸上構造物", + "canonical_object_type": "管制信号所", + "geom_type": "Point", + "count": 90, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p陸上構造物", + "canonical_object_type": "管制信号所", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 1449813, + "fid": "1A4D33C3", + "z": 11, + "x": 1750, + "y": 869 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p陸上構造物", + "canonical_object_type": "管制信号所", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 1449814, + "fid": "9892CD09", + "z": 11, + "x": 1750, + "y": 869 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p陸上構造物", + "canonical_object_type": "管制信号所", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 2509313, + "fid": "662BCEAB", + "z": 11, + "x": 1757, + "y": 824 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p陸上構造物", + "canonical_object_type": "管制信号所", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 5582514, + "fid": "662BCEAB", + "z": 11, + "x": 1757, + "y": 825 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p陸上構造物", + "canonical_object_type": "管制信号所", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 589478, + "fid": "662BCEAB", + "z": 11, + "x": 1758, + "y": 824 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P投錨注意障害物ククリ", + "canonical_object_type": "P投錨注意障害物ククリ", + "geom_type": "MultiLineString", + "count": 81, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P投錨注意障害物ククリ", + "canonical_object_type": "P投錨注意障害物ククリ", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 2857676, + "fid": "C27B5E65", + "z": 11, + "x": 1749, + "y": 870 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P投錨注意障害物ククリ", + "canonical_object_type": "P投錨注意障害物ククリ", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 4743434, + "fid": "05B8FEB4", + "z": 11, + "x": 1749, + "y": 869 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P投錨注意障害物ククリ", + "canonical_object_type": "P投錨注意障害物ククリ", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 4743435, + "fid": "C27B5E65", + "z": 11, + "x": 1749, + "y": 869 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P投錨注意障害物ククリ", + "canonical_object_type": "P投錨注意障害物ククリ", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 1449044, + "fid": "C27B5E65", + "z": 11, + "x": 1750, + "y": 869 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P投錨注意障害物ククリ", + "canonical_object_type": "P投錨注意障害物ククリ", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 121408, + "fid": "644822F5", + "z": 11, + "x": 1757, + "y": 827 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p航路標識群", + "canonical_object_type": "円筒型浮標", + "geom_type": "Point", + "count": 65, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "円筒型浮標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3112859, + "fid": "0065402D", + "z": 11, + "x": 1750, + "y": 868 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "円筒型浮標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3112860, + "fid": "E6DDFFFB", + "z": 11, + "x": 1750, + "y": 868 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "円筒型浮標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 2526657, + "fid": "D36F5B72", + "z": 11, + "x": 1751, + "y": 866 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "円筒型浮標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 2526658, + "fid": "2091616D", + "z": 11, + "x": 1751, + "y": 866 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "円筒型浮標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3794119, + "fid": "E61015C4", + "z": 11, + "x": 1751, + "y": 868 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p航路標識群", + "canonical_object_type": "無線局・レーダー局", + "geom_type": "Point", + "count": 65, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "無線局・レーダー局", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3112850, + "fid": "9343BB84", + "z": 11, + "x": 1750, + "y": 868 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "無線局・レーダー局", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 2763588, + "fid": "31DCBD4C", + "z": 11, + "x": 1754, + "y": 814 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "無線局・レーダー局", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 902131, + "fid": "DFB441A8", + "z": 11, + "x": 1756, + "y": 814 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "無線局・レーダー局", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 991640, + "fid": "15098966", + "z": 11, + "x": 1757, + "y": 811 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "無線局・レーダー局", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3858298, + "fid": "630AC127", + "z": 11, + "x": 1767, + "y": 817 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P危険界ククリ", + "canonical_object_type": "P危険界ククリ", + "geom_type": "MultiLineString", + "count": 60, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P危険界ククリ", + "canonical_object_type": "P危険界ククリ", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 5260900, + "fid": "BC187000", + "z": 11, + "x": 1728, + "y": 881 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P危険界ククリ", + "canonical_object_type": "P危険界ククリ", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 691933, + "fid": "4FCE70B6", + "z": 11, + "x": 1757, + "y": 859 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P危険界ククリ", + "canonical_object_type": "P危険界ククリ", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 6262076, + "fid": "ADF80DC6", + "z": 11, + "x": 1758, + "y": 825 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P危険界ククリ", + "canonical_object_type": "P危険界ククリ", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 355604, + "fid": "453B0990", + "z": 11, + "x": 1759, + "y": 816 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P危険界ククリ", + "canonical_object_type": "P危険界ククリ", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 1125630, + "fid": "73951714", + "z": 11, + "x": 1759, + "y": 849 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p航路標識群", + "canonical_object_type": "大型灯浮標", + "geom_type": "Point", + "count": 55, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "大型灯浮標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 4118805, + "fid": "92EDE4F4", + "z": 11, + "x": 1758, + "y": 854 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "大型灯浮標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3090698, + "fid": "0D81F358", + "z": 11, + "x": 1760, + "y": 834 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "大型灯浮標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 364682, + "fid": "3DDDFB9B", + "z": 11, + "x": 1770, + "y": 819 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "大型灯浮標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 302827, + "fid": "21FF2109", + "z": 11, + "x": 1772, + "y": 837 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "大型灯浮標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 302828, + "fid": "95BAF9E9", + "z": 11, + "x": 1772, + "y": 837 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p航路標識群", + "canonical_object_type": "航空・飛行場灯台", + "geom_type": "Point", + "count": 51, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "航空・飛行場灯台", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3112849, + "fid": "18A2848D", + "z": 11, + "x": 1750, + "y": 868 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "航空・飛行場灯台", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 1449703, + "fid": "415E4220", + "z": 11, + "x": 1750, + "y": 869 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "航空・飛行場灯台", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 5142364, + "fid": "2E9FA298", + "z": 11, + "x": 1761, + "y": 855 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "航空・飛行場灯台", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 5748096, + "fid": "398F8CA2", + "z": 11, + "x": 1763, + "y": 825 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "航空・飛行場灯台", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 4026269, + "fid": "C2AC052D", + "z": 11, + "x": 1767, + "y": 818 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "未測海域", + "geom_type": "MultiPolygon", + "count": 48, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "未測海域", + "canonical_family": "mixed", + "geom_type": "MultiPolygon", + "feature_id": 5528469, + "fid": "C121D6EC", + "z": 11, + "x": 1728, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "未測海域", + "canonical_family": "mixed", + "geom_type": "MultiPolygon", + "feature_id": 2953249, + "fid": "F802DEDD", + "z": 11, + "x": 1746, + "y": 868 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "未測海域", + "canonical_family": "mixed", + "geom_type": "MultiPolygon", + "feature_id": 1045978, + "fid": "F802DEDD", + "z": 11, + "x": 1745, + "y": 868 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "未測海域", + "canonical_family": "mixed", + "geom_type": "MultiPolygon", + "feature_id": 5579766, + "fid": "8D7D9346", + "z": 11, + "x": 1757, + "y": 825 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "未測海域", + "canonical_family": "mixed", + "geom_type": "MultiPolygon", + "feature_id": 2620625, + "fid": "828594D2", + "z": 11, + "x": 1760, + "y": 855 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "渦流", + "geom_type": "Point", + "count": 47, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "渦流", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 5418104, + "fid": "B186097A", + "z": 11, + "x": 1762, + "y": 824 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "渦流", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 5418105, + "fid": "8E53CE65", + "z": 11, + "x": 1762, + "y": 824 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "渦流", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 5418106, + "fid": "8E3EE032", + "z": 11, + "x": 1762, + "y": 824 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "渦流", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 4074621, + "fid": "7982F056", + "z": 11, + "x": 1764, + "y": 827 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "渦流", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 4074622, + "fid": "178C9C23", + "z": 11, + "x": 1764, + "y": 827 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "7000-8000m", + "geom_type": "MultiPolygon", + "count": 46, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "7000-8000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 3735626, + "fid": "D61A115D", + "z": 11, + "x": 1745, + "y": 883 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "7000-8000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 3961823, + "fid": "D61A115D", + "z": 11, + "x": 1745, + "y": 882 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "7000-8000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6038614, + "fid": "D61A115D", + "z": 11, + "x": 1749, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "7000-8000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6172525, + "fid": "D61A115D", + "z": 11, + "x": 1750, + "y": 878 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "7000-8000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 4568394, + "fid": "D61A115D", + "z": 11, + "x": 1750, + "y": 879 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "8000-9000m", + "geom_type": "MultiPolygon", + "count": 44, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "8000-9000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 5987901, + "fid": "3E968A5B", + "z": 11, + "x": 1829, + "y": 819 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "8000-9000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 3143556, + "fid": "3E968A5B", + "z": 11, + "x": 1830, + "y": 814 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "8000-9000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 5621599, + "fid": "3E968A5B", + "z": 11, + "x": 1830, + "y": 820 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "8000-9000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1226198, + "fid": "3E968A5B", + "z": 11, + "x": 1831, + "y": 818 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "8000-9000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 4871545, + "fid": "3E968A5B", + "z": 11, + "x": 1831, + "y": 819 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "L725", + "canonical_object_type": "境界線", + "geom_type": "LineString", + "count": 43, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L725", + "canonical_object_type": "境界線", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 3911943, + "fid": "0486684F", + "z": 11, + "x": 1777, + "y": 816 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L725", + "canonical_object_type": "境界線", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 3911944, + "fid": "2DAF1666", + "z": 11, + "x": 1777, + "y": 816 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L725", + "canonical_object_type": "境界線", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 5907152, + "fid": "0486684F", + "z": 11, + "x": 1778, + "y": 816 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L725", + "canonical_object_type": "境界線", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 5907153, + "fid": "2DAF1666", + "z": 11, + "x": 1778, + "y": 816 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L725", + "canonical_object_type": "境界線", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 3845094, + "fid": "23682B11", + "z": 11, + "x": 1779, + "y": 817 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "湖沼域", + "geom_type": "MultiPolygon", + "count": 39, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "湖沼域", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 2685509, + "fid": "816B1C49", + "z": 11, + "x": 1778, + "y": 809 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "湖沼域", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 5982422, + "fid": "E0A99EA5", + "z": 11, + "x": 1779, + "y": 808 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "湖沼域", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 2644281, + "fid": "18BEB67A", + "z": 11, + "x": 1785, + "y": 813 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "湖沼域", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 2644282, + "fid": "9E667D90", + "z": 11, + "x": 1785, + "y": 813 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "湖沼域", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6439165, + "fid": "9E667D90", + "z": 11, + "x": 1785, + "y": 814 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p航路境界等", + "canonical_object_type": "進路矢印 (指導による)", + "geom_type": "Point", + "count": 36, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路境界等", + "canonical_object_type": "進路矢印 (指導による)", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 6187501, + "fid": "EBA0DC04", + "z": 11, + "x": 1786, + "y": 814 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路境界等", + "canonical_object_type": "進路矢印 (指導による)", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 6187502, + "fid": "C7846E44", + "z": 11, + "x": 1786, + "y": 814 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路境界等", + "canonical_object_type": "進路矢印 (指導による)", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 6187503, + "fid": "0F4D306D", + "z": 11, + "x": 1786, + "y": 814 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路境界等", + "canonical_object_type": "進路矢印 (指導による)", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 6187504, + "fid": "56007CEF", + "z": 11, + "x": 1786, + "y": 814 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路境界等", + "canonical_object_type": "進路矢印 (指導による)", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 6187505, + "fid": "EE470354", + "z": 11, + "x": 1786, + "y": 814 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "撤去跡", + "geom_type": "MultiPolygon", + "count": 35, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "撤去跡", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 5016830, + "fid": "5BE152B2", + "z": 11, + "x": 1765, + "y": 820 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "撤去跡", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 4024627, + "fid": "EB0BA809", + "z": 11, + "x": 1767, + "y": 818 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "撤去跡", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 771139, + "fid": "F936834E", + "z": 11, + "x": 1768, + "y": 818 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "撤去跡", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 15955, + "fid": "F6C7E95C", + "z": 11, + "x": 1772, + "y": 823 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "撤去跡", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1350741, + "fid": "E18134D8", + "z": 11, + "x": 1775, + "y": 819 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P航路ククリ", + "canonical_object_type": "P航路ククリ", + "geom_type": "MultiLineString", + "count": 34, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P航路ククリ", + "canonical_object_type": "P航路ククリ", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 3953907, + "fid": "C2DEA6C2", + "z": 11, + "x": 1765, + "y": 824 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P航路ククリ", + "canonical_object_type": "P航路ククリ", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 773583, + "fid": "41C732F7", + "z": 11, + "x": 1768, + "y": 818 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P航路ククリ", + "canonical_object_type": "P航路ククリ", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 773600, + "fid": "41C732F7", + "z": 11, + "x": 1768, + "y": 818 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P航路ククリ", + "canonical_object_type": "P航路ククリ", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 773604, + "fid": "41C732F7", + "z": 11, + "x": 1768, + "y": 818 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P航路ククリ", + "canonical_object_type": "P航路ククリ", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 773577, + "fid": "ED8419F3", + "z": 11, + "x": 1768, + "y": 818 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p航路境界等", + "canonical_object_type": "水源方向", + "geom_type": "Point", + "count": 32, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路境界等", + "canonical_object_type": "水源方向", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3938497, + "fid": "D974DA70", + "z": 11, + "x": 1760, + "y": 822 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路境界等", + "canonical_object_type": "水源方向", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 1978049, + "fid": "D974DA70", + "z": 11, + "x": 1760, + "y": 823 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路境界等", + "canonical_object_type": "水源方向", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 1978050, + "fid": "D3EFAAE7", + "z": 11, + "x": 1760, + "y": 823 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路境界等", + "canonical_object_type": "水源方向", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 1978051, + "fid": "A34182C7", + "z": 11, + "x": 1760, + "y": 823 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路境界等", + "canonical_object_type": "水源方向", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 1772477, + "fid": "C35936C4", + "z": 11, + "x": 1761, + "y": 822 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "L航路", + "canonical_object_type": "航路 (法律による航路)", + "geom_type": "LineString", + "count": 31, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L航路", + "canonical_object_type": "航路 (法律による航路)", + "canonical_family": "mixed", + "geom_type": "LineString", + "feature_id": 3020424, + "fid": "FA5DE10A", + "z": 11, + "x": 1775, + "y": 818 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L航路", + "canonical_object_type": "航路 (法律による航路)", + "canonical_family": "mixed", + "geom_type": "LineString", + "feature_id": 3020425, + "fid": "D7E45D68", + "z": 11, + "x": 1775, + "y": 818 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L航路", + "canonical_object_type": "航路 (法律による航路)", + "canonical_family": "mixed", + "geom_type": "LineString", + "feature_id": 3020426, + "fid": "CA1B99FA", + "z": 11, + "x": 1775, + "y": 818 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L航路", + "canonical_object_type": "航路 (法律による航路)", + "canonical_family": "mixed", + "geom_type": "LineString", + "feature_id": 6643750, + "fid": "3A4214D7", + "z": 11, + "x": 1776, + "y": 818 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L航路", + "canonical_object_type": "航路 (法律による航路)", + "canonical_family": "mixed", + "geom_type": "LineString", + "feature_id": 6643751, + "fid": "D7E45D68", + "z": 11, + "x": 1776, + "y": 818 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "0-20m", + "geom_type": "MultiPolygon", + "count": 28, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-20m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 5052826, + "fid": "F572D716", + "z": 11, + "x": 1736, + "y": 876 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-20m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 3085672, + "fid": "F572D716", + "z": 11, + "x": 1736, + "y": 877 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-20m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 2593973, + "fid": "9F54D72A", + "z": 11, + "x": 1752, + "y": 811 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-20m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 18153, + "fid": "9F54D72A", + "z": 11, + "x": 1752, + "y": 812 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-20m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 3416127, + "fid": "9F54D72A", + "z": 11, + "x": 1753, + "y": 811 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P潜堤", + "canonical_object_type": "潜提", + "geom_type": "MultiPolygon", + "count": 28, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P潜堤", + "canonical_object_type": "潜提", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1659268, + "fid": "212C469D", + "z": 11, + "x": 1723, + "y": 880 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P潜堤", + "canonical_object_type": "潜提", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 3398546, + "fid": "6FAD2903", + "z": 11, + "x": 1750, + "y": 870 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P潜堤", + "canonical_object_type": "潜提", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1449111, + "fid": "6FAD2903", + "z": 11, + "x": 1750, + "y": 869 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P潜堤", + "canonical_object_type": "潜提", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1449115, + "fid": "D3B7398B", + "z": 11, + "x": 1750, + "y": 869 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P潜堤", + "canonical_object_type": "潜提", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1449116, + "fid": "3FF5D3E9", + "z": 11, + "x": 1750, + "y": 869 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p航路標識群", + "canonical_object_type": "V-AIS", + "geom_type": "Point", + "count": 25, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "V-AIS", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3542207, + "fid": "9CEF6ED7", + "z": 11, + "x": 1771, + "y": 819 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "V-AIS", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3275771, + "fid": "42FB9A34", + "z": 11, + "x": 1772, + "y": 819 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "V-AIS", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3234133, + "fid": "BC38CDDE", + "z": 11, + "x": 1773, + "y": 819 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "V-AIS", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 136687, + "fid": "CF995525", + "z": 11, + "x": 1774, + "y": 819 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "V-AIS", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 4596820, + "fid": "B866B0AB", + "z": 11, + "x": 1775, + "y": 820 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "2-20m", + "geom_type": "Polygon", + "count": 24, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2-20m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 48779, + "fid": "052109DF", + "z": 11, + "x": 1755, + "y": 813 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2-20m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1943025, + "fid": "61423455", + "z": 11, + "x": 1762, + "y": 821 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2-20m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 2655493, + "fid": "BFD59CC0", + "z": 11, + "x": 1766, + "y": 834 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2-20m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 136193, + "fid": "064EA3A2", + "z": 11, + "x": 1774, + "y": 819 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2-20m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 965340, + "fid": "064EA3A2", + "z": 11, + "x": 1774, + "y": 818 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "L危険界", + "canonical_object_type": "未測海域", + "geom_type": "LineString", + "count": 23, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L危険界", + "canonical_object_type": "未測海域", + "canonical_family": "mixed", + "geom_type": "LineString", + "feature_id": 2543144, + "fid": "8E0C8986", + "z": 11, + "x": 1756, + "y": 826 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L危険界", + "canonical_object_type": "未測海域", + "canonical_family": "mixed", + "geom_type": "LineString", + "feature_id": 5576454, + "fid": "8CAD59E8", + "z": 11, + "x": 1757, + "y": 825 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L危険界", + "canonical_object_type": "未測海域", + "canonical_family": "mixed", + "geom_type": "LineString", + "feature_id": 5576455, + "fid": "87513660", + "z": 11, + "x": 1757, + "y": 825 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L危険界", + "canonical_object_type": "未測海域", + "canonical_family": "mixed", + "geom_type": "LineString", + "feature_id": 5576456, + "fid": "074FABE3", + "z": 11, + "x": 1757, + "y": 825 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L危険界", + "canonical_object_type": "未測海域", + "canonical_family": "mixed", + "geom_type": "LineString", + "feature_id": 1698354, + "fid": "1CF9E239", + "z": 11, + "x": 1757, + "y": 826 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P陸上構造物陸", + "canonical_object_type": "ビル", + "geom_type": "MultiPolygon", + "count": 23, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P陸上構造物陸", + "canonical_object_type": "ビル", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 2951122, + "fid": "860BF7D1", + "z": 11, + "x": 1756, + "y": 827 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P陸上構造物陸", + "canonical_object_type": "ビル", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 2547128, + "fid": "860BF7D1", + "z": 11, + "x": 1756, + "y": 826 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P陸上構造物陸", + "canonical_object_type": "ビル", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 5380154, + "fid": "47C9507D", + "z": 11, + "x": 1768, + "y": 819 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P陸上構造物陸", + "canonical_object_type": "ビル", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1371762, + "fid": "31C4C5E2", + "z": 11, + "x": 1771, + "y": 833 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P陸上構造物陸", + "canonical_object_type": "ビル", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6524166, + "fid": "716CF27C", + "z": 11, + "x": 1772, + "y": 818 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "L740", + "canonical_object_type": "海上交通安全法適用海域境界", + "geom_type": "LineString", + "count": 22, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L740", + "canonical_object_type": "海上交通安全法適用海域境界", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 1593871, + "fid": "EABBA61C", + "z": 11, + "x": 1774, + "y": 822 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L740", + "canonical_object_type": "海上交通安全法適用海域境界", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 1593872, + "fid": "1358B907", + "z": 11, + "x": 1774, + "y": 822 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L740", + "canonical_object_type": "海上交通安全法適用海域境界", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 4819263, + "fid": "1358B907", + "z": 11, + "x": 1774, + "y": 823 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L740", + "canonical_object_type": "海上交通安全法適用海域境界", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 1310883, + "fid": "EABBA61C", + "z": 11, + "x": 1775, + "y": 822 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L740", + "canonical_object_type": "海上交通安全法適用海域境界", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 312548, + "fid": "B13D0BAB", + "z": 11, + "x": 1790, + "y": 819 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "L航路", + "canonical_object_type": "航路 (その他の推薦航路)", + "geom_type": "LineString", + "count": 21, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L航路", + "canonical_object_type": "航路 (その他の推薦航路)", + "canonical_family": "mixed", + "geom_type": "LineString", + "feature_id": 4038949, + "fid": "EDF44F8D", + "z": 11, + "x": 1796, + "y": 822 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L航路", + "canonical_object_type": "航路 (その他の推薦航路)", + "canonical_family": "mixed", + "geom_type": "LineString", + "feature_id": 6412715, + "fid": "EDF44F8D", + "z": 11, + "x": 1796, + "y": 821 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L航路", + "canonical_object_type": "航路 (その他の推薦航路)", + "canonical_family": "mixed", + "geom_type": "LineString", + "feature_id": 1629301, + "fid": "7A4B46EB", + "z": 11, + "x": 1801, + "y": 812 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L航路", + "canonical_object_type": "航路 (その他の推薦航路)", + "canonical_family": "mixed", + "geom_type": "LineString", + "feature_id": 1629302, + "fid": "5E3D99E1", + "z": 11, + "x": 1801, + "y": 812 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L航路", + "canonical_object_type": "航路 (その他の推薦航路)", + "canonical_family": "mixed", + "geom_type": "LineString", + "feature_id": 1629303, + "fid": "F9D40B29", + "z": 11, + "x": 1801, + "y": 812 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "2-10m", + "geom_type": "MultiPolygon", + "count": 21, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2-10m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 2883373, + "fid": "A2B7A627", + "z": 11, + "x": 1754, + "y": 865 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2-10m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 4161730, + "fid": "A2B7A627", + "z": 11, + "x": 1754, + "y": 866 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2-10m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6262309, + "fid": "37FC5194", + "z": 11, + "x": 1758, + "y": 825 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2-10m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6262310, + "fid": "63EA57CD", + "z": 11, + "x": 1758, + "y": 825 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2-10m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 3864167, + "fid": "26632E1D", + "z": 11, + "x": 1766, + "y": 828 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "20-200m", + "geom_type": "Polygon", + "count": 21, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "20-200m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6008945, + "fid": "1382B474", + "z": 11, + "x": 1718, + "y": 877 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "20-200m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 514536, + "fid": "1382B474", + "z": 11, + "x": 1718, + "y": 876 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "20-200m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1426407, + "fid": "11F4FB4E", + "z": 11, + "x": 1761, + "y": 820 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "20-200m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1770162, + "fid": "51E4D4D5", + "z": 11, + "x": 1761, + "y": 822 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "20-200m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 3519841, + "fid": "11F4FB4E", + "z": 11, + "x": 1761, + "y": 819 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p航路標識群", + "canonical_object_type": "球型浮標", + "geom_type": "Point", + "count": 19, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "球型浮標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 1266758, + "fid": "2FE99533", + "z": 11, + "x": 1773, + "y": 818 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "球型浮標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 1266759, + "fid": "6C113F18", + "z": 11, + "x": 1773, + "y": 818 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "球型浮標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 2742933, + "fid": "D44C692E", + "z": 11, + "x": 1801, + "y": 797 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "球型浮標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 5462831, + "fid": "D44C692E", + "z": 11, + "x": 1801, + "y": 798 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "球型浮標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 744601, + "fid": "E79B0CDE", + "z": 11, + "x": 1801, + "y": 811 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P投錨注意障害物", + "canonical_object_type": "障害物", + "geom_type": "Polygon", + "count": 18, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P投錨注意障害物", + "canonical_object_type": "障害物", + "canonical_family": "mixed", + "geom_type": "Polygon", + "feature_id": 3744923, + "fid": "B6671E1F", + "z": 11, + "x": 1828, + "y": 786 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P投錨注意障害物", + "canonical_object_type": "障害物", + "canonical_family": "mixed", + "geom_type": "Polygon", + "feature_id": 3744924, + "fid": "B11CCD20", + "z": 11, + "x": 1828, + "y": 786 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P投錨注意障害物", + "canonical_object_type": "障害物", + "canonical_family": "mixed", + "geom_type": "Polygon", + "feature_id": 3744925, + "fid": "470B5701", + "z": 11, + "x": 1828, + "y": 786 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P投錨注意障害物", + "canonical_object_type": "障害物", + "canonical_family": "mixed", + "geom_type": "Polygon", + "feature_id": 3744926, + "fid": "E21C4C60", + "z": 11, + "x": 1828, + "y": 786 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P投錨注意障害物", + "canonical_object_type": "障害物", + "canonical_family": "mixed", + "geom_type": "Polygon", + "feature_id": 3744927, + "fid": "9FC354B0", + "z": 11, + "x": 1828, + "y": 786 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p航路標識群", + "canonical_object_type": "ドラム (樽)型灯浮標", + "geom_type": "Point", + "count": 16, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "ドラム (樽)型灯浮標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 4090387, + "fid": "778EB794", + "z": 11, + "x": 1766, + "y": 835 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "ドラム (樽)型灯浮標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 4090388, + "fid": "39BB632C", + "z": 11, + "x": 1766, + "y": 835 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "ドラム (樽)型灯浮標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 4090389, + "fid": "7D816CED", + "z": 11, + "x": 1766, + "y": 835 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "ドラム (樽)型灯浮標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 4090390, + "fid": "F5A8D3E2", + "z": 11, + "x": 1766, + "y": 835 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "ドラム (樽)型灯浮標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 4090391, + "fid": "BFE98AF6", + "z": 11, + "x": 1766, + "y": 835 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P投錨注意障害物", + "canonical_object_type": "沈木", + "geom_type": "Polygon", + "count": 15, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P投錨注意障害物", + "canonical_object_type": "沈木", + "canonical_family": "mixed", + "geom_type": "Polygon", + "feature_id": 663673, + "fid": "C4D1233E", + "z": 11, + "x": 1794, + "y": 807 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P投錨注意障害物", + "canonical_object_type": "沈木", + "canonical_family": "mixed", + "geom_type": "Polygon", + "feature_id": 663674, + "fid": "EBB969C6", + "z": 11, + "x": 1794, + "y": 807 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P投錨注意障害物", + "canonical_object_type": "沈木", + "canonical_family": "mixed", + "geom_type": "Polygon", + "feature_id": 663675, + "fid": "EFE3F543", + "z": 11, + "x": 1794, + "y": 807 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P投錨注意障害物", + "canonical_object_type": "沈木", + "canonical_family": "mixed", + "geom_type": "Polygon", + "feature_id": 5460954, + "fid": "CDADDC62", + "z": 11, + "x": 1797, + "y": 806 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P投錨注意障害物", + "canonical_object_type": "沈木", + "canonical_family": "mixed", + "geom_type": "Polygon", + "feature_id": 5460955, + "fid": "5B5FFB25", + "z": 11, + "x": 1797, + "y": 806 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "掃海済みの危険物", + "geom_type": "Point", + "count": 15, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "掃海済みの危険物", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 813217, + "fid": "A60E88F1", + "z": 11, + "x": 1760, + "y": 825 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "掃海済みの危険物", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 4809987, + "fid": "2EC7057D", + "z": 11, + "x": 1761, + "y": 825 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "掃海済みの危険物", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 4809988, + "fid": "A60E88F1", + "z": 11, + "x": 1761, + "y": 825 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "掃海済みの危険物", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 4809989, + "fid": "E8D43991", + "z": 11, + "x": 1761, + "y": 825 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "掃海済みの危険物", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3207175, + "fid": "7A8560D5", + "z": 11, + "x": 1761, + "y": 824 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p陸上構造物", + "canonical_object_type": "陸上顕著物 (観覧車等)", + "geom_type": "Point", + "count": 15, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p陸上構造物", + "canonical_object_type": "陸上顕著物 (観覧車等)", + "canonical_family": "mixed", + "geom_type": "Point", + "feature_id": 1449810, + "fid": "A31C29BB", + "z": 11, + "x": 1750, + "y": 869 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p陸上構造物", + "canonical_object_type": "陸上顕著物 (観覧車等)", + "canonical_family": "mixed", + "geom_type": "Point", + "feature_id": 1772582, + "fid": "D311D92A", + "z": 11, + "x": 1761, + "y": 822 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p陸上構造物", + "canonical_object_type": "陸上顕著物 (観覧車等)", + "canonical_family": "mixed", + "geom_type": "Point", + "feature_id": 5018939, + "fid": "89B78B34", + "z": 11, + "x": 1765, + "y": 820 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p陸上構造物", + "canonical_object_type": "陸上顕著物 (観覧車等)", + "canonical_family": "mixed", + "geom_type": "Point", + "feature_id": 5018940, + "fid": "DAB38272", + "z": 11, + "x": 1765, + "y": 820 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p陸上構造物", + "canonical_object_type": "陸上顕著物 (観覧車等)", + "canonical_family": "mixed", + "geom_type": "Point", + "feature_id": 774615, + "fid": "2A4BAE8B", + "z": 11, + "x": 1768, + "y": 818 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p航路標識群", + "canonical_object_type": "円柱型灯浮標", + "geom_type": "Point", + "count": 12, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "円柱型灯浮標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3041542, + "fid": "D4592BD0", + "z": 11, + "x": 1773, + "y": 833 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "円柱型灯浮標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 2480929, + "fid": "0A011E44", + "z": 11, + "x": 1774, + "y": 830 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "円柱型灯浮標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 2177863, + "fid": "D4592BD0", + "z": 11, + "x": 1774, + "y": 833 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "円柱型灯浮標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 2533703, + "fid": "10DF44DF", + "z": 11, + "x": 1828, + "y": 768 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "円柱型灯浮標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 2533704, + "fid": "08A6A8B4", + "z": 11, + "x": 1828, + "y": 768 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "掃海済みの沈船", + "geom_type": "Point", + "count": 10, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "掃海済みの沈船", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 136676, + "fid": "DC4CFD1E", + "z": 11, + "x": 1774, + "y": 819 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "掃海済みの沈船", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 1352294, + "fid": "9DFBC5A5", + "z": 11, + "x": 1775, + "y": 819 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "掃海済みの沈船", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 1352295, + "fid": "6856F775", + "z": 11, + "x": 1775, + "y": 819 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "掃海済みの沈船", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 1600185, + "fid": "932524B8", + "z": 11, + "x": 1776, + "y": 817 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "掃海済みの沈船", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 5991194, + "fid": "1F875EDF", + "z": 11, + "x": 1776, + "y": 819 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p航路境界等", + "canonical_object_type": "p航路境界等", + "geom_type": "Point", + "count": 9, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路境界等", + "canonical_object_type": "p航路境界等", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 1479260, + "fid": "7099C349", + "z": 11, + "x": 1818, + "y": 808 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路境界等", + "canonical_object_type": "p航路境界等", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3570113, + "fid": "D491063C", + "z": 11, + "x": 1818, + "y": 809 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路境界等", + "canonical_object_type": "p航路境界等", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 2272223, + "fid": "FBD92873", + "z": 11, + "x": 1819, + "y": 808 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路境界等", + "canonical_object_type": "p航路境界等", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 6112414, + "fid": "25622CC1", + "z": 11, + "x": 1819, + "y": 809 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路境界等", + "canonical_object_type": "p航路境界等", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 6112413, + "fid": "65ED2C15", + "z": 11, + "x": 1819, + "y": 809 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p航路標識群", + "canonical_object_type": "円錐型灯浮標", + "geom_type": "Point", + "count": 9, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "円錐型灯浮標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3522819, + "fid": "52AA624F", + "z": 11, + "x": 1761, + "y": 819 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "円錐型灯浮標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 5697892, + "fid": "A989A53D", + "z": 11, + "x": 1763, + "y": 828 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "円錐型灯浮標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 5018882, + "fid": "E452ECE1", + "z": 11, + "x": 1765, + "y": 820 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "円錐型灯浮標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 5018883, + "fid": "7C6EEF53", + "z": 11, + "x": 1765, + "y": 820 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "円錐型灯浮標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 5018884, + "fid": "7D1560CB", + "z": 11, + "x": 1765, + "y": 820 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "L700", + "canonical_object_type": "指導線", + "geom_type": "LineString", + "count": 8, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L700", + "canonical_object_type": "指導線", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 3911939, + "fid": "95EA91C6", + "z": 11, + "x": 1777, + "y": 816 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L700", + "canonical_object_type": "指導線", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 3911940, + "fid": "AD6DB187", + "z": 11, + "x": 1777, + "y": 816 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L700", + "canonical_object_type": "指導線", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 3911941, + "fid": "9BBB14F4", + "z": 11, + "x": 1777, + "y": 816 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L700", + "canonical_object_type": "指導線", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 3911942, + "fid": "1A29BA55", + "z": 11, + "x": 1777, + "y": 816 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L700", + "canonical_object_type": "指導線", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 5907148, + "fid": "95EA91C6", + "z": 11, + "x": 1778, + "y": 816 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "L概略等深線", + "canonical_object_type": "概略等深線", + "geom_type": "MultiLineString", + "count": 8, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L概略等深線", + "canonical_object_type": "概略等深線", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 3786364, + "fid": "884C15A7", + "z": 11, + "x": 1751, + "y": 868 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L概略等深線", + "canonical_object_type": "概略等深線", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 3786381, + "fid": "9AF1BC41", + "z": 11, + "x": 1751, + "y": 868 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L概略等深線", + "canonical_object_type": "概略等深線", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 5925354, + "fid": "3B2306E5", + "z": 11, + "x": 1772, + "y": 833 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L概略等深線", + "canonical_object_type": "概略等深線", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 3873061, + "fid": "5A7508C7", + "z": 11, + "x": 1776, + "y": 823 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L概略等深線", + "canonical_object_type": "概略等深線", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 3912255, + "fid": "CEA49143", + "z": 11, + "x": 1777, + "y": 816 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P橋りょう等構造物", + "canonical_object_type": "橋 (水門)", + "geom_type": "MultiPolygon", + "count": 8, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P橋りょう等構造物", + "canonical_object_type": "橋 (水門)", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1449064, + "fid": "6D532E5E", + "z": 11, + "x": 1750, + "y": 869 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P橋りょう等構造物", + "canonical_object_type": "橋 (水門)", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1945381, + "fid": "93B1D92F", + "z": 11, + "x": 1762, + "y": 821 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P橋りょう等構造物", + "canonical_object_type": "橋 (水門)", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 5018127, + "fid": "AA96CFC3", + "z": 11, + "x": 1765, + "y": 820 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P橋りょう等構造物", + "canonical_object_type": "橋 (水門)", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 5124992, + "fid": "AA96CFC3", + "z": 11, + "x": 1766, + "y": 820 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P橋りょう等構造物", + "canonical_object_type": "橋 (水門)", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 675426, + "fid": "9D6B3126", + "z": 11, + "x": 1773, + "y": 828 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P航路", + "canonical_object_type": "航路 (その他の推薦航路)", + "geom_type": "Polygon", + "count": 8, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P航路", + "canonical_object_type": "航路 (その他の推薦航路)", + "canonical_family": "mixed", + "geom_type": "Polygon", + "feature_id": 2271879, + "fid": "6BF72E68", + "z": 11, + "x": 1819, + "y": 808 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P航路", + "canonical_object_type": "航路 (その他の推薦航路)", + "canonical_family": "mixed", + "geom_type": "Polygon", + "feature_id": 3946766, + "fid": "A4437DB7", + "z": 11, + "x": 1819, + "y": 807 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P航路", + "canonical_object_type": "航路 (その他の推薦航路)", + "canonical_family": "mixed", + "geom_type": "Polygon", + "feature_id": 4736549, + "fid": "A4437DB7", + "z": 11, + "x": 1819, + "y": 806 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P航路", + "canonical_object_type": "航路 (その他の推薦航路)", + "canonical_family": "mixed", + "geom_type": "Polygon", + "feature_id": 302177, + "fid": "AB8AD527", + "z": 11, + "x": 1820, + "y": 808 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P航路", + "canonical_object_type": "航路 (その他の推薦航路)", + "canonical_family": "mixed", + "geom_type": "Polygon", + "feature_id": 6398884, + "fid": "020C971B", + "z": 11, + "x": 1820, + "y": 806 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "陸上水域", + "geom_type": "MultiPolygon", + "count": 7, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "陸上水域", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 223110, + "fid": "27557D24", + "z": 11, + "x": 1764, + "y": 825 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "陸上水域", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1489850, + "fid": "27557D24", + "z": 11, + "x": 1764, + "y": 826 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "陸上水域", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 2874458, + "fid": "EF6DBAAC", + "z": 11, + "x": 1777, + "y": 817 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "陸上水域", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 936777, + "fid": "ECFA58E4", + "z": 11, + "x": 1799, + "y": 801 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "陸上水域", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 3648729, + "fid": "5D0777AC", + "z": 11, + "x": 1801, + "y": 799 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p航路標識群", + "canonical_object_type": "ドラム (樽)型浮標", + "geom_type": "Point", + "count": 5, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "ドラム (樽)型浮標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 6621322, + "fid": "64AF5DD5", + "z": 11, + "x": 1765, + "y": 830 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "ドラム (樽)型浮標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 4666307, + "fid": "5C5EEE22", + "z": 11, + "x": 1776, + "y": 816 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "ドラム (樽)型浮標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 5662044, + "fid": "E8100D31", + "z": 11, + "x": 1785, + "y": 816 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "ドラム (樽)型浮標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3632438, + "fid": "AE19A72D", + "z": 11, + "x": 1802, + "y": 812 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "ドラム (樽)型浮標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3632439, + "fid": "C2B6B73B", + "z": 11, + "x": 1802, + "y": 812 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "L702", + "canonical_object_type": "分離通航方式", + "geom_type": "LineString", + "count": 3, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L702", + "canonical_object_type": "分離通航方式", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 5390782, + "fid": "C2D9262F", + "z": 11, + "x": 1839, + "y": 729 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L702", + "canonical_object_type": "分離通航方式", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 4755520, + "fid": "C2D9262F", + "z": 11, + "x": 1840, + "y": 729 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L702", + "canonical_object_type": "分離通航方式", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 2674848, + "fid": "C2D9262F", + "z": 11, + "x": 1841, + "y": 729 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "L739", + "canonical_object_type": "平水境界", + "geom_type": "MultiLineString", + "count": 3, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L739", + "canonical_object_type": "平水境界", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 5311303, + "fid": "4AABADB1", + "z": 11, + "x": 1760, + "y": 824 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L739", + "canonical_object_type": "平水境界", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 3199915, + "fid": "4AABADB1", + "z": 11, + "x": 1761, + "y": 824 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L739", + "canonical_object_type": "平水境界", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 2460687, + "fid": "4CA6268B", + "z": 11, + "x": 1777, + "y": 823 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "9000m以深", + "geom_type": "MultiPolygon", + "count": 3, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "9000m以深", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 5279386, + "fid": "4785675C", + "z": 11, + "x": 1835, + "y": 845 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "9000m以深", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 5309521, + "fid": "60D19859", + "z": 11, + "x": 1836, + "y": 850 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "9000m以深", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 4404633, + "fid": "60D19859", + "z": 11, + "x": 1837, + "y": 850 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "危険全沈没船", + "geom_type": "Point", + "count": 3, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "危険全沈没船", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 6174113, + "fid": "8FD02D44", + "z": 11, + "x": 1729, + "y": 882 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "危険全沈没船", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3926654, + "fid": "8FD02D44", + "z": 11, + "x": 1729, + "y": 881 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "危険全沈没船", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 686768, + "fid": "340D60F3", + "z": 11, + "x": 1825, + "y": 806 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p航路標識群", + "canonical_object_type": "タワー型灯標識", + "geom_type": "Point", + "count": 3, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "タワー型灯標識", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3858299, + "fid": "31C7574C", + "z": 11, + "x": 1767, + "y": 817 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "タワー型灯標識", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 4193933, + "fid": "DE194D83", + "z": 11, + "x": 1816, + "y": 788 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "タワー型灯標識", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 4051880, + "fid": "DE194D83", + "z": 11, + "x": 1816, + "y": 789 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "2-20m", + "geom_type": "MultiPolygon", + "count": 2, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2-20m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 751597, + "fid": "0F7F5293", + "z": 11, + "x": 1778, + "y": 818 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2-20m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6023303, + "fid": "E0974B17", + "z": 11, + "x": 1814, + "y": 810 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "20-200m", + "geom_type": "MultiPolygon", + "count": 2, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "20-200m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 243228, + "fid": "41E75C18", + "z": 11, + "x": 1803, + "y": 812 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "20-200m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 5719155, + "fid": "BE609287", + "z": 11, + "x": 1874, + "y": 731 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "5-20m", + "geom_type": "MultiPolygon", + "count": 2, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5-20m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 2874167, + "fid": "4028EAF1", + "z": 11, + "x": 1777, + "y": 817 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5-20m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1423938, + "fid": "E7E0E63A", + "z": 11, + "x": 1813, + "y": 811 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P漁具定置箇所", + "canonical_object_type": "定置漁業", + "geom_type": "MultiPolygon", + "count": 2, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P漁具定置箇所", + "canonical_object_type": "定置漁業", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 5636391, + "fid": "DCB6AF45", + "z": 11, + "x": 1762, + "y": 820 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P漁具定置箇所", + "canonical_object_type": "定置漁業", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1902855, + "fid": "0DDBD9FE", + "z": 11, + "x": 1832, + "y": 779 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "障害物", + "geom_type": "Point", + "count": 2, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "障害物", + "canonical_family": "mixed", + "geom_type": "Point", + "feature_id": 4737341, + "fid": "8DAA127E", + "z": 11, + "x": 1819, + "y": 806 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "障害物", + "canonical_family": "mixed", + "geom_type": "Point", + "feature_id": 3745634, + "fid": "2FE1DC31", + "z": 11, + "x": 1828, + "y": 786 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p航路標識群", + "canonical_object_type": "大型灯標", + "geom_type": "Point", + "count": 2, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "大型灯標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 1212794, + "fid": "D82C0B91", + "z": 11, + "x": 1802, + "y": 811 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "大型灯標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 4829805, + "fid": "1B0F95E5", + "z": 11, + "x": 1820, + "y": 807 + } + ] + }, + { + "issue_type": "field_value_rule_unresolved", + "source_layer": "p航路標識群", + "canonical_object_type": "灯 (Lt)", + "geom_type": "Point", + "count": 1, + "sample_features": [ + { + "issue_type": "field_value_rule_unresolved", + "reason": "light color was inferred from remark because no explicit field-value rule matched", + "source_layer": "p航路標識群", + "canonical_object_type": "灯 (Lt)", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 6250146, + "fid": "EEFCB357", + "z": 11, + "x": 1793, + "y": 813, + "field_name": "灯色", + "legacy_value": "0", + "target_field": "light_color_code" + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "10-100m", + "geom_type": "Polygon", + "count": 1, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "10-100m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 4649328, + "fid": "BAF8D781", + "z": 11, + "x": 1832, + "y": 780 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P投錨注意障害物", + "canonical_object_type": "険悪物", + "geom_type": "MultiPolygon", + "count": 1, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P投錨注意障害物", + "canonical_object_type": "険悪物", + "canonical_family": "mixed", + "geom_type": "MultiPolygon", + "feature_id": 5676955, + "fid": "0A11F6C5", + "z": 11, + "x": 1826, + "y": 796 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P陸上構造物陸", + "canonical_object_type": "陸上顕著物 (観覧車等)", + "geom_type": "Polygon", + "count": 1, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P陸上構造物陸", + "canonical_object_type": "陸上顕著物 (観覧車等)", + "canonical_family": "mixed", + "geom_type": "Polygon", + "feature_id": 1479063, + "fid": "8B5BAA43", + "z": 11, + "x": 1818, + "y": 808 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "魚礁 (危険なもの)", + "geom_type": "Point", + "count": 1, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "魚礁 (危険なもの)", + "canonical_family": "mixed", + "geom_type": "Point", + "feature_id": 5018689, + "fid": "CD620388", + "z": 11, + "x": 1765, + "y": 820 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p航路標識群", + "canonical_object_type": "大型浮標", + "geom_type": "Point", + "count": 1, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "大型浮標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3794116, + "fid": "FB1EF39A", + "z": 11, + "x": 1751, + "y": 868 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p航路標識群", + "canonical_object_type": "球型灯浮標", + "geom_type": "Point", + "count": 1, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "球型灯浮標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3207285, + "fid": "3C6E2A98", + "z": 11, + "x": 1761, + "y": 824 + } + ] + } + ] +} \ No newline at end of file diff --git a/docs/报告/20261013_全国Full生产分片历史审计证据/z11.mapping_audit.md b/docs/报告/20261013_全国Full生产分片历史审计证据/z11.mapping_audit.md new file mode 100644 index 0000000..c1270e1 --- /dev/null +++ b/docs/报告/20261013_全国Full生产分片历史审计证据/z11.mapping_audit.md @@ -0,0 +1,711 @@ +# NavSea Mapping Audit Report + +- bundle_id: `navsea-core` +- output_root: `/home/wwwroot/pbf-delivery-full-20260418-rebuild.parts/z11` +- tile_jobs: `12279` +- written_tiles: `12279` +- skipped_tiles: `0` +- unresolved_event_count: `2440224` + +## Unresolved Summary + +- `render_rule_unresolved` | `L海底地形` | `L海底地形` | `LineString` | count=`688313` + sample: fid=`CD5F9644` feature_id=`4241769` tile=`11/1718/872` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`80A01819` feature_id=`4241770` tile=`11/1718/872` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`80A01819` feature_id=`4220989` tile=`11/1718/868` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `L陸上構造物陸` | `道路` | `LineString` | count=`620959` + sample: fid=`D3D2A599` feature_id=`1658522` tile=`11/1723/880` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`89CE3AF5` feature_id=`1658523` tile=`11/1723/880` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`29CFCEE4` feature_id=`1658524` tile=`11/1723/880` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線ククリ` | `P基本線ククリ` | `LineString` | count=`393892` + sample: fid=`73FD37DB` feature_id=`6008951` tile=`11/1718/877` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`EDB2B684` feature_id=`6008952` tile=`11/1718/877` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`F486965C` feature_id=`514542` tile=`11/1718/876` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P穴` | `P穴` | `Polygon` | count=`120866` + sample: fid=`AD717985` feature_id=`4241775` tile=`11/1718/872` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`F7BE478F` feature_id=`3027417` tile=`11/1718/874` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`06A61EE6` feature_id=`3027416` tile=`11/1718/874` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `L等深線` | `等深線` | `LineString` | count=`114644` + sample: fid=`3A62AB5A` feature_id=`4241771` tile=`11/1718/872` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`3314CA36` feature_id=`6008944` tile=`11/1718/877` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`3314CA36` feature_id=`514535` tile=`11/1718/876` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P陸域` | `P陸域` | `Polygon` | count=`69777` + sample: fid=`0ADCE957` feature_id=`3027419` tile=`11/1718/874` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`2A73DE2E` feature_id=`6008953` tile=`11/1718/877` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`2A73DE2E` feature_id=`514547` tile=`11/1718/876` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `L海底地形` | `L海底地形` | `MultiLineString` | count=`65865` + sample: fid=`C504F1DC` feature_id=`1055404` tile=`11/1718/875` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`E390BAF5` feature_id=`3027403` tile=`11/1718/874` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`48C58DCD` feature_id=`3027405` tile=`11/1718/874` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `干潮帯` | `Polygon` | count=`44007` + sample: fid=`5A848E07` feature_id=`6008950` tile=`11/1718/877` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`2B71620E` feature_id=`514540` tile=`11/1718/876` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`5A848E07` feature_id=`514541` tile=`11/1718/876` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `防波堤` | `Polygon` | count=`26657` + sample: fid=`835DB6BE` feature_id=`1658873` tile=`11/1723/880` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`D41CE538` feature_id=`1658874` tile=`11/1723/880` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`6A43127C` feature_id=`1658875` tile=`11/1723/880` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `2-5m` | `Polygon` | count=`19769` + sample: fid=`686E0615` feature_id=`1658837` tile=`11/1723/880` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`82D9DBFC` feature_id=`1658838` tile=`11/1723/880` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`59BDEBD8` feature_id=`1658839` tile=`11/1723/880` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `0-2m` | `Polygon` | count=`18565` + sample: fid=`5967E197` feature_id=`1658806` tile=`11/1723/880` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`DF19D5CF` feature_id=`1658807` tile=`11/1723/880` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`828727CA` feature_id=`1658808` tile=`11/1723/880` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P危険界ククリ` | `P危険界ククリ` | `LineString` | count=`17153` + sample: fid=`CC30B83A` feature_id=`1658786` tile=`11/1723/880` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`2C4274DB` feature_id=`1658787` tile=`11/1723/880` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`54DEA8EA` feature_id=`576877` tile=`11/1726/882` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `5-10m` | `Polygon` | count=`17138` + sample: fid=`88CEFF3D` feature_id=`4946316` tile=`11/1724/880` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`30573D4C` feature_id=`1658861` tile=`11/1723/880` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`6C32970B` feature_id=`1658862` tile=`11/1723/880` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P陸上構造物陸` | `ビル` | `Polygon` | count=`13240` + sample: fid=`36346858` feature_id=`2476459` tile=`11/1730/881` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`47FCBA67` feature_id=`2476460` tile=`11/1730/881` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`CE2C9644` feature_id=`5920685` tile=`11/1737/878` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `L基本線` | `一本線で表わす桟橋` | `LineString` | count=`12716` + sample: fid=`B344852A` feature_id=`1657385` tile=`11/1723/880` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`39A0EDD1` feature_id=`1657386` tile=`11/1723/880` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`0AEF0433` feature_id=`1657387` tile=`11/1723/880` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p投錨注意障害物` | `険悪物` | `Point` | count=`11226` + sample: fid=`92FECF71` feature_id=`1659364` tile=`11/1723/880` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`29A880E7` feature_id=`4243538` tile=`11/1729/880` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`29A880E7` feature_id=`2908339` tile=`11/1730/880` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `浅所危険界` | `Polygon` | count=`9393` + sample: fid=`2E138F2C` feature_id=`1658934` tile=`11/1723/880` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`CB35E9BB` feature_id=`1658935` tile=`11/1723/880` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`ECDA2D8E` feature_id=`576895` tile=`11/1726/882` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P漁具定置箇所` | `区画漁業` | `Polygon` | count=`8948` + sample: fid=`53C0C79E` feature_id=`1119839` tile=`11/1727/880` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`4D7527C1` feature_id=`1119840` tile=`11/1727/880` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`EE1E4129` feature_id=`1119841` tile=`11/1727/880` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P橋りょう等構造物` | `橋 (水門)` | `Polygon` | count=`8735` + sample: fid=`287D307D` feature_id=`1659262` tile=`11/1723/880` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`3EA799A7` feature_id=`1659263` tile=`11/1723/880` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`AB02422E` feature_id=`1659264` tile=`11/1723/880` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `L基本線` | `浮施設・桟橋` | `LineString` | count=`8378` + sample: fid=`5EDBD274` feature_id=`6104220` tile=`11/1727/881` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`AB03DA90` feature_id=`6104221` tile=`11/1727/881` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`1F709B93` feature_id=`6104222` tile=`11/1727/881` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `10-20m` | `Polygon` | count=`8190` + sample: fid=`064C7DCC` feature_id=`6195437` tile=`11/1718/873` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`C57872E0` feature_id=`4946296` tile=`11/1724/880` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`D3FB56F3` feature_id=`1658788` tile=`11/1723/880` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p航路標識群` | `灯 (Lt)` | `Point` | count=`7433` + sample: fid=`F950488E` feature_id=`1659368` tile=`11/1723/880` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`C369C907` feature_id=`2476514` tile=`11/1730/881` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`BC7BC706` feature_id=`2476515` tile=`11/1730/881` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `干潮帯` | `MultiPolygon` | count=`6540` + sample: fid=`BF3C5476` feature_id=`1658897` tile=`11/1723/880` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`8CBDF727` feature_id=`1658899` tile=`11/1723/880` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`65A8F5C9` feature_id=`1658901` tile=`11/1723/880` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p陸上構造物` | `塔、やぐら、風車` | `Point` | count=`5399` + sample: fid=`AE513420` feature_id=`1659371` tile=`11/1723/880` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`3CEC656A` feature_id=`1659372` tile=`11/1723/880` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`3F506F41` feature_id=`1659373` tile=`11/1723/880` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `浮施設・桟橋` | `Polygon` | count=`5336` + sample: fid=`E00710B9` feature_id=`1658891` tile=`11/1723/880` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`90D4DC8C` feature_id=`6106409` tile=`11/1727/881` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`5F799B91` feature_id=`162885` tile=`11/1728/882` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p陸上構造物` | `山頂` | `Point` | count=`4859` + sample: fid=`424D30E3` feature_id=`1659376` tile=`11/1723/880` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`587D05E2` feature_id=`1659377` tile=`11/1723/880` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`03201A28` feature_id=`1659378` tile=`11/1723/880` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `L基本線` | `一本線で表わす海上バース` | `LineString` | count=`4670` + sample: fid=`0784B5C1` feature_id=`5759230` tile=`11/1736/878` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`4C72B741` feature_id=`5759231` tile=`11/1736/878` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`F651FD8C` feature_id=`5759232` tile=`11/1736/878` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `0-5m` | `Polygon` | count=`4505` + sample: fid=`EA41DC1A` feature_id=`4946315` tile=`11/1724/880` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`B60FCE34` feature_id=`1658834` tile=`11/1723/880` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`39F5455E` feature_id=`1658835` tile=`11/1723/880` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P陸上構造物陸` | `タンク` | `Polygon` | count=`4324` + sample: fid=`9D4AF305` feature_id=`1859032` tile=`11/1733/879` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`DAE5A542` feature_id=`5920686` tile=`11/1737/878` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`FEB5AABE` feature_id=`3398593` tile=`11/1750/870` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P投錨注意障害物ククリ` | `P投錨注意障害物ククリ` | `LineString` | count=`4238` + sample: fid=`528C3DCB` feature_id=`2476086` tile=`11/1730/881` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`90A8997B` feature_id=`5769441` tile=`11/1736/878` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`F6E928F4` feature_id=`5769442` tile=`11/1736/878` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p陸上構造物` | `煙突` | `Point` | count=`4069` + sample: fid=`EC760317` feature_id=`1659370` tile=`11/1723/880` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`54E058BA` feature_id=`163124` tile=`11/1728/882` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`F10AA73A` feature_id=`5261587` tile=`11/1728/881` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p地名` | `p地名` | `Point` | count=`3797` + sample: fid=`2D74112C` feature_id=`3027420` tile=`11/1718/874` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`F9C7F936` feature_id=`514548` tile=`11/1718/876` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`2D74112C` feature_id=`6195454` tile=`11/1718/873` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `2-5m` | `MultiPolygon` | count=`3115` + sample: fid=`425EAC85` feature_id=`1658850` tile=`11/1723/880` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`50F8A8A7` feature_id=`1658851` tile=`11/1723/880` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`EDC4138F` feature_id=`1658854` tile=`11/1723/880` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `1000-2000m` | `Polygon` | count=`3050` + sample: fid=`743EE596` feature_id=`6008948` tile=`11/1718/877` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`743EE596` feature_id=`5636561` tile=`11/1718/881` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`743EE596` feature_id=`4784134` tile=`11/1718/880` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `20-100m` | `Polygon` | count=`2915` + sample: fid=`AD717985` feature_id=`12306` tile=`11/1718/859` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`AD717985` feature_id=`2560992` tile=`11/1718/857` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`AD717985` feature_id=`4241772` tile=`11/1718/872` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `河川域` | `Polygon` | count=`2875` + sample: fid=`1297E1A2` feature_id=`1658938` tile=`11/1723/880` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`418DB88C` feature_id=`1658939` tile=`11/1723/880` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`807B94C0` feature_id=`1119612` tile=`11/1727/880` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `2000-3000m` | `Polygon` | count=`2835` + sample: fid=`0C643A77` feature_id=`5636562` tile=`11/1718/881` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`0C643A77` feature_id=`4784135` tile=`11/1718/880` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`79FC1C63` feature_id=`2635522` tile=`11/1718/882` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `0-2m` | `MultiPolygon` | count=`2698` + sample: fid=`3ABF15C4` feature_id=`1658816` tile=`11/1723/880` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`80B4E8E0` feature_id=`1658821` tile=`11/1723/880` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`199DF05E` feature_id=`1658822` tile=`11/1723/880` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `L概略等深線` | `概略等深線` | `LineString` | count=`2661` + sample: fid=`1C4DC829` feature_id=`1118113` tile=`11/1727/880` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`68A16F49` feature_id=`1118114` tile=`11/1727/880` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`6D11BA30` feature_id=`1118115` tile=`11/1727/880` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `100-200m` | `Polygon` | count=`2496` + sample: fid=`77AA5E0A` feature_id=`4241773` tile=`11/1718/872` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`77AA5E0A` feature_id=`892193` tile=`11/1718/867` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`C08C44E0` feature_id=`1055405` tile=`11/1718/875` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `500-1000m` | `Polygon` | count=`2355` + sample: fid=`06D87451` feature_id=`6008947` tile=`11/1718/877` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`06D87451` feature_id=`110195` tile=`11/1718/878` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`06D87451` feature_id=`4042709` tile=`11/1718/879` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p航路標識群` | `防波堤灯台` | `Point` | count=`2330` + sample: fid=`CBE175BD` feature_id=`1659367` tile=`11/1723/880` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`BB8A6871` feature_id=`163122` tile=`11/1728/882` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`F310F499` feature_id=`5261581` tile=`11/1728/881` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `3000-4000m` | `Polygon` | count=`2321` + sample: fid=`5ED00BCE` feature_id=`5636563` tile=`11/1718/881` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`5ED00BCE` feature_id=`2635525` tile=`11/1718/882` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`5ED00BCE` feature_id=`263677` tile=`11/1718/886` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `5-10m` | `MultiPolygon` | count=`2266` + sample: fid=`88CEFF3D` feature_id=`1658872` tile=`11/1723/880` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`40A4C619` feature_id=`1119577` tile=`11/1727/880` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`7F20C326` feature_id=`1119578` tile=`11/1727/880` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P投錨注意障害物` | `険悪物` | `Polygon` | count=`2256` + sample: fid=`2253E918` feature_id=`2476085` tile=`11/1730/881` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`4492C503` feature_id=`5769438` tile=`11/1736/878` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`5743A617` feature_id=`5769439` tile=`11/1736/878` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `5000-6000m` | `Polygon` | count=`2169` + sample: fid=`CBB6C786` feature_id=`263679` tile=`11/1718/886` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`CBB6C786` feature_id=`5894877` tile=`11/1718/889` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`CBB6C786` feature_id=`5092111` tile=`11/1718/887` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p投錨注意障害物` | `海草` | `Point` | count=`2089` + sample: fid=`2E7F8CC5` feature_id=`5261570` tile=`11/1728/881` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`913E9502` feature_id=`5261571` tile=`11/1728/881` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`04F949D0` feature_id=`5261572` tile=`11/1728/881` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `200-500m` | `Polygon` | count=`2087` + sample: fid=`E2915581` feature_id=`3027413` tile=`11/1718/874` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`E2915581` feature_id=`6008946` tile=`11/1718/877` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`E2915581` feature_id=`514538` tile=`11/1718/876` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p投錨注意障害物` | `p投錨注意障害物` | `Point` | count=`1950` + sample: fid=`7A0D847A` feature_id=`4743624` tile=`11/1749/869` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`9FB7A5A8` feature_id=`3398610` tile=`11/1750/870` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`33B95929` feature_id=`2071879` tile=`11/1751/864` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `4000-5000m` | `Polygon` | count=`1949` + sample: fid=`C87811B8` feature_id=`263678` tile=`11/1718/886` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`C87811B8` feature_id=`1409101` tile=`11/1718/885` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`C87811B8` feature_id=`5894876` tile=`11/1718/889` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `L等深線` | `等深線` | `MultiLineString` | count=`1693` + sample: fid=`909521C0` feature_id=`3027409` tile=`11/1718/874` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`A776BD73` feature_id=`162549` tile=`11/1728/882` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`69927C42` feature_id=`162654` tile=`11/1728/882` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P漁具定置箇所` | `定置漁業` | `Polygon` | count=`1688` + sample: fid=`6B7C9CC7` feature_id=`3112540` tile=`11/1750/868` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`4A357AB2` feature_id=`1485403` tile=`11/1751/867` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`4A357AB2` feature_id=`3793250` tile=`11/1751/868` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線ククリ` | `P基本線ククリ` | `MultiLineString` | count=`1632` + sample: fid=`DC7730C3` feature_id=`3027415` tile=`11/1718/874` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`1D09FFF9` feature_id=`1119739` tile=`11/1727/880` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`B65FD7AB` feature_id=`1119740` tile=`11/1727/880` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p航路標識群` | `灯浮標 (やぐら型)` | `Point` | count=`1476` + sample: fid=`3A5184DE` feature_id=`2476535` tile=`11/1730/881` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`0BFCE6A1` feature_id=`2476536` tile=`11/1730/881` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`3C514497` feature_id=`2476537` tile=`11/1730/881` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p陸上構造物` | `漁業協同組合` | `Point` | count=`1457` + sample: fid=`48E57A0F` feature_id=`1659374` tile=`11/1723/880` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`B732CB5D` feature_id=`2476566` tile=`11/1730/881` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`F361D134` feature_id=`3087180` tile=`11/1736/877` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `L等深線` | `湖沼等深線` | `LineString` | count=`1426` + sample: fid=`6BD73FB9` feature_id=`3341668` tile=`11/1766/836` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`7B1E6A61` feature_id=`3341670` tile=`11/1766/836` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`7A1B24E5` feature_id=`3341673` tile=`11/1766/836` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `防波堤` | `MultiPolygon` | count=`1379` + sample: fid=`534380FF` feature_id=`1119599` tile=`11/1727/880` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`D20AC775` feature_id=`5528409` tile=`11/1728/880` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`7744EF43` feature_id=`2475241` tile=`11/1730/881` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P陸域` | `P陸域` | `MultiPolygon` | count=`1369` + sample: fid=`4FFB3503` feature_id=`1659341` tile=`11/1723/880` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`A84E9810` feature_id=`1659360` tile=`11/1723/880` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`30EE65EA` feature_id=`3074040` tile=`11/1726/872` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `未測海域` | `Polygon` | count=`1361` + sample: fid=`83EAC938` feature_id=`1658936` tile=`11/1723/880` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`F479826F` feature_id=`1119611` tile=`11/1727/880` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`97FC94D6` feature_id=`6106435` tile=`11/1727/881` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p航路標識群` | `浮標 (やぐら型)` | `Point` | count=`1312` + sample: fid=`07962E26` feature_id=`6106749` tile=`11/1727/881` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`33A8B8ED` feature_id=`6106750` tile=`11/1727/881` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`39C907F5` feature_id=`6106751` tile=`11/1727/881` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P潜堤` | `潜提` | `Polygon` | count=`1273` + sample: fid=`E669A0EB` feature_id=`1659265` tile=`11/1723/880` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`A0EBECD5` feature_id=`1659266` tile=`11/1723/880` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`96ED2E48` feature_id=`1659267` tile=`11/1723/880` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p航路標識群` | `橋梁灯` | `Point` | count=`1251` + sample: fid=`37E04346` feature_id=`2476540` tile=`11/1730/881` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`390D55A4` feature_id=`2476541` tile=`11/1730/881` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`302DFA5F` feature_id=`2476542` tile=`11/1730/881` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `0-10m` | `Polygon` | count=`1206` + sample: fid=`978BE898` feature_id=`3073839` tile=`11/1726/872` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`A341BC14` feature_id=`576889` tile=`11/1726/882` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`A341BC14` feature_id=`3396605` tile=`11/1727/882` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p航路標識群` | `立標` | `Point` | count=`1181` + sample: fid=`B01AFB55` feature_id=`1119904` tile=`11/1727/880` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`69B2380F` feature_id=`1119905` tile=`11/1727/880` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`F8F27B5B` feature_id=`1119906` tile=`11/1727/880` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p投錨注意障害物` | `サンドウェーブ` | `Point` | count=`1177` + sample: fid=`48D8CB78` feature_id=`5302825` tile=`11/1757/822` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`CF6032AF` feature_id=`5302826` tile=`11/1757/822` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`56AC2D05` feature_id=`1060881` tile=`11/1757/823` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P穴` | `P穴` | `MultiPolygon` | count=`1176` + sample: fid=`87D84AAD` feature_id=`3893226` tile=`11/1725/881` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`87D84AAD` feature_id=`1497481` tile=`11/1725/882` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`06D87451` feature_id=`1497482` tile=`11/1725/882` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p投錨注意障害物` | `急潮・波紋・激潮` | `Point` | count=`1106` + sample: fid=`7199DD64` feature_id=`6008954` tile=`11/1718/877` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`D145703B` feature_id=`6008955` tile=`11/1718/877` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`98D50BAD` feature_id=`514549` tile=`11/1718/876` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `撤去跡` | `Polygon` | count=`1093` + sample: fid=`5A99B3C0` feature_id=`1658937` tile=`11/1723/880` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`E90E5C8F` feature_id=`2475526` tile=`11/1730/881` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`1C3B6443` feature_id=`5768536` tile=`11/1736/878` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `6000-7000m` | `Polygon` | count=`1003` + sample: fid=`2DFE98D1` feature_id=`1929019` tile=`11/1723/887` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`2DFE98D1` feature_id=`2835533` tile=`11/1723/888` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`2DFE98D1` feature_id=`6279220` tile=`11/1723/889` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p地名陸` | `p地名陸` | `Point` | count=`834` + sample: fid=`691C23C6` feature_id=`1659362` tile=`11/1723/880` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`6E962866` feature_id=`5261569` tile=`11/1728/881` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`BF3B2CB9` feature_id=`2908338` tile=`11/1730/880` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `10-20m` | `MultiPolygon` | count=`790` + sample: fid=`7A97ABC1` feature_id=`1119476` tile=`11/1727/880` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`D8449685` feature_id=`1119478` tile=`11/1727/880` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`673DFF9E` feature_id=`1119479` tile=`11/1727/880` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `0-5m` | `MultiPolygon` | count=`775` + sample: fid=`D48573EF` feature_id=`1658833` tile=`11/1723/880` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`1A0D0490` feature_id=`3073837` tile=`11/1726/872` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`A58F35B2` feature_id=`1119523` tile=`11/1727/880` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `L陸上構造物陸` | `道路` | `MultiLineString` | count=`669` + sample: fid=`A6E5F13E` feature_id=`5527685` tile=`11/1728/880` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`DD126EAC` feature_id=`2906704` tile=`11/1730/880` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`3C0A61F7` feature_id=`3923247` tile=`11/1729/881` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p航路標識群` | `灯標` | `Point` | count=`627` + sample: fid=`FFB86255` feature_id=`1119907` tile=`11/1727/880` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`BD85D71D` feature_id=`6106748` tile=`11/1727/881` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`91C94DA7` feature_id=`163123` tile=`11/1728/882` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p航路標識群` | `円錐型浮標` | `Point` | count=`609` + sample: fid=`A7BED5AC` feature_id=`3112861` tile=`11/1750/868` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`9E5A86B7` feature_id=`3112862` tile=`11/1750/868` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`09F9A7BC` feature_id=`1485823` tile=`11/1751/867` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `L基本線` | `一本線で表わす潜提` | `LineString` | count=`552` + sample: fid=`954E8B30` feature_id=`2359347` tile=`11/1747/868` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`F1638A1F` feature_id=`2359348` tile=`11/1747/868` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`AD1F7C36` feature_id=`1435768` tile=`11/1750/869` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `L高さ制限` | `架空線、送電線` | `LineString` | count=`504` + sample: fid=`AC66912E` feature_id=`4883338` tile=`11/1752/866` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`F4D17FC2` feature_id=`2544636` tile=`11/1756/826` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`D386D9CB` feature_id=`2544637` tile=`11/1756/826` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `7000-8000m` | `Polygon` | count=`496` + sample: fid=`2819F28E` feature_id=`2636537` tile=`11/1742/884` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`2819F28E` feature_id=`3841849` tile=`11/1742/885` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`2819F28E` feature_id=`3618225` tile=`11/1743/884` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p投錨注意障害物` | `全沈没船 (危険なし)` | `Point` | count=`406` + sample: fid=`148CC311` feature_id=`6008956` tile=`11/1718/877` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`E755C3EF` feature_id=`110196` tile=`11/1718/878` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`718B5FDF` feature_id=`6378480` tile=`11/1722/875` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `L基本線` | `一本線で表わす撤去跡` | `LineString` | count=`389` + sample: fid=`BE70460E` feature_id=`6202091` tile=`11/1744/868` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`B8D10F2E` feature_id=`1042912` tile=`11/1745/868` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`443C1102` feature_id=`1042913` tile=`11/1745/868` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `陸上水域` | `Polygon` | count=`388` + sample: fid=`A38487E8` feature_id=`2907422` tile=`11/1730/880` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`DC3EB664` feature_id=`2907423` tile=`11/1730/880` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`D8E07027` feature_id=`5920354` tile=`11/1737/878` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `500-1000m` | `MultiPolygon` | count=`376` + sample: fid=`06D87451` feature_id=`2989247` tile=`11/1719/880` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`06D87451` feature_id=`3742458` tile=`11/1720/879` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`06D87451` feature_id=`5454297` tile=`11/1720/878` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p航路標識群` | `円柱型浮標` | `Point` | count=`366` + sample: fid=`A3188FB2` feature_id=`1119908` tile=`11/1727/880` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`53626821` feature_id=`1119909` tile=`11/1727/880` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`A3188FB2` feature_id=`5529079` tile=`11/1728/880` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `20-100m` | `MultiPolygon` | count=`364` + sample: fid=`AD717985` feature_id=`2315833` tile=`11/1721/862` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`AD717985` feature_id=`493089` tile=`11/1723/860` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`48A38EDC` feature_id=`2793295` tile=`11/1727/872` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `1000-2000m` | `MultiPolygon` | count=`354` + sample: fid=`743EE596` feature_id=`5454298` tile=`11/1720/878` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`743EE596` feature_id=`4928748` tile=`11/1721/882` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`743EE596` feature_id=`265811` tile=`11/1722/873` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p投錨注意障害物` | `海底設置物、放水口、取水口` | `Point` | count=`342` + sample: fid=`D91DE2AC` feature_id=`4243539` tile=`11/1729/880` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`D91DE2AC` feature_id=`2908340` tile=`11/1730/880` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`D91DE2AC` feature_id=`2476506` tile=`11/1730/881` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `河川域` | `MultiPolygon` | count=`339` + sample: fid=`C2330F65` feature_id=`1119613` tile=`11/1727/880` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`C2330F65` feature_id=`6106441` tile=`11/1727/881` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`C2330F65` feature_id=`5261167` tile=`11/1728/881` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `浮施設・桟橋` | `MultiPolygon` | count=`336` + sample: fid=`9BECD1D8` feature_id=`162886` tile=`11/1728/882` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`D4D4EBB2` feature_id=`2556516` tile=`11/1748/869` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`96CDB2AF` feature_id=`2525473` tile=`11/1751/866` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `浅所危険界` | `MultiPolygon` | count=`331` + sample: fid=`A34495A1` feature_id=`2907404` tile=`11/1730/880` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`9818D205` feature_id=`3924758` tile=`11/1729/881` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`E0D001E8` feature_id=`3924770` tile=`11/1729/881` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P航路ククリ` | `P航路ククリ` | `LineString` | count=`328` + sample: fid=`BAB3AF62` feature_id=`1449391` tile=`11/1750/869` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`EF4E687B` feature_id=`1449392` tile=`11/1750/869` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`0658407A` feature_id=`3206978` tile=`11/1761/824` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `L等深線` | `湖沼等深線` | `MultiLineString` | count=`301` + sample: fid=`77275D9C` feature_id=`3341669` tile=`11/1766/836` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`34548F72` feature_id=`3341704` tile=`11/1766/836` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`F5FF7035` feature_id=`3341724` tile=`11/1766/836` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `2-10m` | `Polygon` | count=`299` + sample: fid=`127FE71D` feature_id=`3924048` tile=`11/1729/881` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`56BBD698` feature_id=`2525332` tile=`11/1751/866` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`78E9E2B0` feature_id=`1447062` tile=`11/1750/869` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `2000-3000m` | `MultiPolygon` | count=`291` + sample: fid=`02940A0C` feature_id=`5089765` tile=`11/1721/885` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`02940A0C` feature_id=`6519736` tile=`11/1722/884` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`0C643A77` feature_id=`6177791` tile=`11/1727/884` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p投錨注意障害物` | `測定済みの沈船` | `Point` | count=`283` + sample: fid=`BD81369C` feature_id=`3087156` tile=`11/1736/877` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`BB964571` feature_id=`2526597` tile=`11/1751/866` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`E5AEF2FD` feature_id=`1449599` tile=`11/1750/869` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `200-500m` | `MultiPolygon` | count=`270` + sample: fid=`E2915581` feature_id=`1055406` tile=`11/1718/875` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`E654FCFF` feature_id=`110193` tile=`11/1718/878` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`E654FCFF` feature_id=`1332665` tile=`11/1720/880` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `100-200m` | `MultiPolygon` | count=`252` + sample: fid=`77AA5E0A` feature_id=`6493522` tile=`11/1722/861` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`77AA5E0A` feature_id=`2090767` tile=`11/1723/859` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`77AA5E0A` feature_id=`5333189` tile=`11/1723/870` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p航路標識群` | `沿岸灯台 (15M over)` | `Point` | count=`228` + sample: fid=`5FE3F829` feature_id=`6008957` tile=`11/1718/877` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`5FE3F829` feature_id=`514551` tile=`11/1718/876` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`998A7327` feature_id=`6195456` tile=`11/1718/873` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `0-20m` | `Polygon` | count=`217` + sample: fid=`4F2BF8F9` feature_id=`4241774` tile=`11/1718/872` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`F7BE478F` feature_id=`3027414` tile=`11/1718/874` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`71660929` feature_id=`6008949` tile=`11/1718/877` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p陸上構造物` | `海事関係署` | `Point` | count=`215` + sample: fid=`FCB92171` feature_id=`2908356` tile=`11/1730/880` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`E0FC7400` feature_id=`2476565` tile=`11/1730/881` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`8933F5C4` feature_id=`5770379` tile=`11/1736/878` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `8000-9000m` | `Polygon` | count=`213` + sample: fid=`3E968A5B` feature_id=`5945450` tile=`11/1829/818` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`862003B7` feature_id=`3143555` tile=`11/1830/814` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`3E968A5B` feature_id=`5053541` tile=`11/1830/815` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `湖沼域` | `Polygon` | count=`205` + sample: fid=`8568908E` feature_id=`132770` tile=`11/1762/832` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`B70FBEBA` feature_id=`132771` tile=`11/1762/832` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`49332368` feature_id=`132772` tile=`11/1762/832` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `5000-6000m` | `MultiPolygon` | count=`201` + sample: fid=`CBB6C786` feature_id=`2293761` tile=`11/1722/890` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`CBB6C786` feature_id=`3742407` tile=`11/1723/890` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`CBB6C786` feature_id=`399513` tile=`11/1725/893` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `3000-4000m` | `MultiPolygon` | count=`200` + sample: fid=`5ED00BCE` feature_id=`2292974` tile=`11/1718/883` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`5ED00BCE` feature_id=`3537333` tile=`11/1718/884` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`5ED00BCE` feature_id=`4999890` tile=`11/1719/884` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p航路標識群` | `シーバース灯` | `Point` | count=`190` + sample: fid=`0C4298FB` feature_id=`1485804` tile=`11/1751/867` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`11E2EA3A` feature_id=`1449613` tile=`11/1750/869` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`91AE8C5F` feature_id=`1449614` tile=`11/1750/869` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `4000-5000m` | `MultiPolygon` | count=`185` + sample: fid=`C87811B8` feature_id=`2897182` tile=`11/1719/887` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`C87811B8` feature_id=`1591406` tile=`11/1719/892` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`C87811B8` feature_id=`6588550` tile=`11/1719/891` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `0-10m` | `MultiPolygon` | count=`177` + sample: fid=`32B98784` feature_id=`806100` tile=`11/1727/871` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`57E22EBA` feature_id=`5767617` tile=`11/1736/878` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`56F79D7E` feature_id=`1045477` tile=`11/1745/868` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `L739` | `平水境界` | `LineString` | count=`175` + sample: fid=`7917ED9D` feature_id=`1118112` tile=`11/1727/880` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`7917ED9D` feature_id=`6104219` tile=`11/1727/881` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`CD0ED35F` feature_id=`5258990` tile=`11/1728/881` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p航路標識群` | `指向灯/照射灯` | `Point` | count=`172` + sample: fid=`106F0CF7` feature_id=`1659369` tile=`11/1723/880` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`E03CDD96` feature_id=`6330500` tile=`11/1754/864` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`95C01AE6` feature_id=`6330501` tile=`11/1754/864` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P漁具定置箇所` | `区画漁業` | `MultiPolygon` | count=`157` + sample: fid=`7C9FB9DF` feature_id=`2546806` tile=`11/1756/826` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`66869DE6` feature_id=`121415` tile=`11/1757/827` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`687CCE1E` feature_id=`6264357` tile=`11/1758/825` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `5-20m` | `Polygon` | count=`155` + sample: fid=`3248DB89` feature_id=`5528400` tile=`11/1728/880` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`1DBB95D5` feature_id=`3666389` tile=`11/1752/829` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`1DBB95D5` feature_id=`4400006` tile=`11/1752/830` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p陸上構造物` | `税関` | `Point` | count=`144` + sample: fid=`30D76B48` feature_id=`1659375` tile=`11/1723/880` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`D8AE27A4` feature_id=`2476567` tile=`11/1730/881` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`CCBC0B80` feature_id=`5770382` tile=`11/1736/878` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p航路標識群` | `導灯` | `Point` | count=`143` + sample: fid=`EA9F9E7F` feature_id=`6330487` tile=`11/1754/864` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`68C8CA9B` feature_id=`6330488` tile=`11/1754/864` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`561A4C88` feature_id=`5465212` tile=`11/1755/861` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P航路` | `航路 (法律による航路)` | `Polygon` | count=`142` + sample: fid=`E7B749D4` feature_id=`1449390` tile=`11/1750/869` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`E7CD6778` feature_id=`3206977` tile=`11/1761/824` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`C9BC5819` feature_id=`3361386` tile=`11/1762/826` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `6000-7000m` | `MultiPolygon` | count=`128` + sample: fid=`2DFE98D1` feature_id=`5086256` tile=`11/1736/886` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`2DFE98D1` feature_id=`3213265` tile=`11/1736/889` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`2DFE98D1` feature_id=`1488269` tile=`11/1736/890` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p投錨注意障害物` | `沈木` | `Point` | count=`127` + sample: fid=`65E9778D` feature_id=`774144` tile=`11/1768/818` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`9E5BF71D` feature_id=`4512906` tile=`11/1774/825` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`619D6745` feature_id=`4512907` tile=`11/1774/825` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p航路境界等` | `進路矢印 (法律による)` | `Point` | count=`125` + sample: fid=`67272361` feature_id=`3024319` tile=`11/1775/818` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`5EA21A0E` feature_id=`3024320` tile=`11/1775/818` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`6BD45C8F` feature_id=`3024321` tile=`11/1775/818` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p陸上構造物` | `その他 (記念碑等)` | `Point` | count=`115` + sample: fid=`783E6CDE` feature_id=`163130` tile=`11/1728/882` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`104D3B28` feature_id=`1859067` tile=`11/1733/879` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`479D058A` feature_id=`6074576` tile=`11/1750/867` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `9000m以深` | `Polygon` | count=`108` + sample: fid=`6B80B4A6` feature_id=`872105` tile=`11/1830/816` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`6B80B4A6` feature_id=`6367357` tile=`11/1830/817` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`6B80B4A6` feature_id=`2610135` tile=`11/1830/818` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p陸上構造物` | `管制信号所` | `Point` | count=`90` + sample: fid=`1A4D33C3` feature_id=`1449813` tile=`11/1750/869` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`9892CD09` feature_id=`1449814` tile=`11/1750/869` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`662BCEAB` feature_id=`2509313` tile=`11/1757/824` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P投錨注意障害物ククリ` | `P投錨注意障害物ククリ` | `MultiLineString` | count=`81` + sample: fid=`C27B5E65` feature_id=`2857676` tile=`11/1749/870` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`05B8FEB4` feature_id=`4743434` tile=`11/1749/869` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`C27B5E65` feature_id=`4743435` tile=`11/1749/869` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p航路標識群` | `円筒型浮標` | `Point` | count=`65` + sample: fid=`0065402D` feature_id=`3112859` tile=`11/1750/868` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`E6DDFFFB` feature_id=`3112860` tile=`11/1750/868` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`D36F5B72` feature_id=`2526657` tile=`11/1751/866` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p航路標識群` | `無線局・レーダー局` | `Point` | count=`65` + sample: fid=`9343BB84` feature_id=`3112850` tile=`11/1750/868` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`31DCBD4C` feature_id=`2763588` tile=`11/1754/814` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`DFB441A8` feature_id=`902131` tile=`11/1756/814` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P危険界ククリ` | `P危険界ククリ` | `MultiLineString` | count=`60` + sample: fid=`BC187000` feature_id=`5260900` tile=`11/1728/881` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`4FCE70B6` feature_id=`691933` tile=`11/1757/859` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`ADF80DC6` feature_id=`6262076` tile=`11/1758/825` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p航路標識群` | `大型灯浮標` | `Point` | count=`55` + sample: fid=`92EDE4F4` feature_id=`4118805` tile=`11/1758/854` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`0D81F358` feature_id=`3090698` tile=`11/1760/834` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`3DDDFB9B` feature_id=`364682` tile=`11/1770/819` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p航路標識群` | `航空・飛行場灯台` | `Point` | count=`51` + sample: fid=`18A2848D` feature_id=`3112849` tile=`11/1750/868` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`415E4220` feature_id=`1449703` tile=`11/1750/869` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`2E9FA298` feature_id=`5142364` tile=`11/1761/855` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `未測海域` | `MultiPolygon` | count=`48` + sample: fid=`C121D6EC` feature_id=`5528469` tile=`11/1728/880` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`F802DEDD` feature_id=`2953249` tile=`11/1746/868` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`F802DEDD` feature_id=`1045978` tile=`11/1745/868` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p投錨注意障害物` | `渦流` | `Point` | count=`47` + sample: fid=`B186097A` feature_id=`5418104` tile=`11/1762/824` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`8E53CE65` feature_id=`5418105` tile=`11/1762/824` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`8E3EE032` feature_id=`5418106` tile=`11/1762/824` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `7000-8000m` | `MultiPolygon` | count=`46` + sample: fid=`D61A115D` feature_id=`3735626` tile=`11/1745/883` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`D61A115D` feature_id=`3961823` tile=`11/1745/882` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`D61A115D` feature_id=`6038614` tile=`11/1749/880` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `8000-9000m` | `MultiPolygon` | count=`44` + sample: fid=`3E968A5B` feature_id=`5987901` tile=`11/1829/819` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`3E968A5B` feature_id=`3143556` tile=`11/1830/814` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`3E968A5B` feature_id=`5621599` tile=`11/1830/820` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `L725` | `境界線` | `LineString` | count=`43` + sample: fid=`0486684F` feature_id=`3911943` tile=`11/1777/816` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`2DAF1666` feature_id=`3911944` tile=`11/1777/816` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`0486684F` feature_id=`5907152` tile=`11/1778/816` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `湖沼域` | `MultiPolygon` | count=`39` + sample: fid=`816B1C49` feature_id=`2685509` tile=`11/1778/809` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`E0A99EA5` feature_id=`5982422` tile=`11/1779/808` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`18BEB67A` feature_id=`2644281` tile=`11/1785/813` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p航路境界等` | `進路矢印 (指導による)` | `Point` | count=`36` + sample: fid=`EBA0DC04` feature_id=`6187501` tile=`11/1786/814` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`C7846E44` feature_id=`6187502` tile=`11/1786/814` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`0F4D306D` feature_id=`6187503` tile=`11/1786/814` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `撤去跡` | `MultiPolygon` | count=`35` + sample: fid=`5BE152B2` feature_id=`5016830` tile=`11/1765/820` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`EB0BA809` feature_id=`4024627` tile=`11/1767/818` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`F936834E` feature_id=`771139` tile=`11/1768/818` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P航路ククリ` | `P航路ククリ` | `MultiLineString` | count=`34` + sample: fid=`C2DEA6C2` feature_id=`3953907` tile=`11/1765/824` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`41C732F7` feature_id=`773583` tile=`11/1768/818` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`41C732F7` feature_id=`773600` tile=`11/1768/818` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p航路境界等` | `水源方向` | `Point` | count=`32` + sample: fid=`D974DA70` feature_id=`3938497` tile=`11/1760/822` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`D974DA70` feature_id=`1978049` tile=`11/1760/823` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`D3EFAAE7` feature_id=`1978050` tile=`11/1760/823` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `L航路` | `航路 (法律による航路)` | `LineString` | count=`31` + sample: fid=`FA5DE10A` feature_id=`3020424` tile=`11/1775/818` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`D7E45D68` feature_id=`3020425` tile=`11/1775/818` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`CA1B99FA` feature_id=`3020426` tile=`11/1775/818` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `0-20m` | `MultiPolygon` | count=`28` + sample: fid=`F572D716` feature_id=`5052826` tile=`11/1736/876` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`F572D716` feature_id=`3085672` tile=`11/1736/877` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`9F54D72A` feature_id=`2593973` tile=`11/1752/811` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P潜堤` | `潜提` | `MultiPolygon` | count=`28` + sample: fid=`212C469D` feature_id=`1659268` tile=`11/1723/880` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`6FAD2903` feature_id=`3398546` tile=`11/1750/870` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`6FAD2903` feature_id=`1449111` tile=`11/1750/869` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p航路標識群` | `V-AIS` | `Point` | count=`25` + sample: fid=`9CEF6ED7` feature_id=`3542207` tile=`11/1771/819` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`42FB9A34` feature_id=`3275771` tile=`11/1772/819` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`BC38CDDE` feature_id=`3234133` tile=`11/1773/819` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `2-20m` | `Polygon` | count=`24` + sample: fid=`052109DF` feature_id=`48779` tile=`11/1755/813` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`61423455` feature_id=`1943025` tile=`11/1762/821` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`BFD59CC0` feature_id=`2655493` tile=`11/1766/834` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `L危険界` | `未測海域` | `LineString` | count=`23` + sample: fid=`8E0C8986` feature_id=`2543144` tile=`11/1756/826` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`8CAD59E8` feature_id=`5576454` tile=`11/1757/825` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`87513660` feature_id=`5576455` tile=`11/1757/825` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P陸上構造物陸` | `ビル` | `MultiPolygon` | count=`23` + sample: fid=`860BF7D1` feature_id=`2951122` tile=`11/1756/827` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`860BF7D1` feature_id=`2547128` tile=`11/1756/826` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`47C9507D` feature_id=`5380154` tile=`11/1768/819` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `L740` | `海上交通安全法適用海域境界` | `LineString` | count=`22` + sample: fid=`EABBA61C` feature_id=`1593871` tile=`11/1774/822` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`1358B907` feature_id=`1593872` tile=`11/1774/822` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`1358B907` feature_id=`4819263` tile=`11/1774/823` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `L航路` | `航路 (その他の推薦航路)` | `LineString` | count=`21` + sample: fid=`EDF44F8D` feature_id=`4038949` tile=`11/1796/822` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`EDF44F8D` feature_id=`6412715` tile=`11/1796/821` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`7A4B46EB` feature_id=`1629301` tile=`11/1801/812` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `2-10m` | `MultiPolygon` | count=`21` + sample: fid=`A2B7A627` feature_id=`2883373` tile=`11/1754/865` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`A2B7A627` feature_id=`4161730` tile=`11/1754/866` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`37FC5194` feature_id=`6262309` tile=`11/1758/825` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `20-200m` | `Polygon` | count=`21` + sample: fid=`1382B474` feature_id=`6008945` tile=`11/1718/877` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`1382B474` feature_id=`514536` tile=`11/1718/876` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`11F4FB4E` feature_id=`1426407` tile=`11/1761/820` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p航路標識群` | `球型浮標` | `Point` | count=`19` + sample: fid=`2FE99533` feature_id=`1266758` tile=`11/1773/818` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`6C113F18` feature_id=`1266759` tile=`11/1773/818` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`D44C692E` feature_id=`2742933` tile=`11/1801/797` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P投錨注意障害物` | `障害物` | `Polygon` | count=`18` + sample: fid=`B6671E1F` feature_id=`3744923` tile=`11/1828/786` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`B11CCD20` feature_id=`3744924` tile=`11/1828/786` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`470B5701` feature_id=`3744925` tile=`11/1828/786` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p航路標識群` | `ドラム (樽)型灯浮標` | `Point` | count=`16` + sample: fid=`778EB794` feature_id=`4090387` tile=`11/1766/835` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`39BB632C` feature_id=`4090388` tile=`11/1766/835` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`7D816CED` feature_id=`4090389` tile=`11/1766/835` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P投錨注意障害物` | `沈木` | `Polygon` | count=`15` + sample: fid=`C4D1233E` feature_id=`663673` tile=`11/1794/807` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`EBB969C6` feature_id=`663674` tile=`11/1794/807` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`EFE3F543` feature_id=`663675` tile=`11/1794/807` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p投錨注意障害物` | `掃海済みの危険物` | `Point` | count=`15` + sample: fid=`A60E88F1` feature_id=`813217` tile=`11/1760/825` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`2EC7057D` feature_id=`4809987` tile=`11/1761/825` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`A60E88F1` feature_id=`4809988` tile=`11/1761/825` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p陸上構造物` | `陸上顕著物 (観覧車等)` | `Point` | count=`15` + sample: fid=`A31C29BB` feature_id=`1449810` tile=`11/1750/869` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`D311D92A` feature_id=`1772582` tile=`11/1761/822` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`89B78B34` feature_id=`5018939` tile=`11/1765/820` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p航路標識群` | `円柱型灯浮標` | `Point` | count=`12` + sample: fid=`D4592BD0` feature_id=`3041542` tile=`11/1773/833` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`0A011E44` feature_id=`2480929` tile=`11/1774/830` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`D4592BD0` feature_id=`2177863` tile=`11/1774/833` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p投錨注意障害物` | `掃海済みの沈船` | `Point` | count=`10` + sample: fid=`DC4CFD1E` feature_id=`136676` tile=`11/1774/819` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`9DFBC5A5` feature_id=`1352294` tile=`11/1775/819` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`6856F775` feature_id=`1352295` tile=`11/1775/819` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p航路境界等` | `p航路境界等` | `Point` | count=`9` + sample: fid=`7099C349` feature_id=`1479260` tile=`11/1818/808` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`D491063C` feature_id=`3570113` tile=`11/1818/809` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`FBD92873` feature_id=`2272223` tile=`11/1819/808` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p航路標識群` | `円錐型灯浮標` | `Point` | count=`9` + sample: fid=`52AA624F` feature_id=`3522819` tile=`11/1761/819` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`A989A53D` feature_id=`5697892` tile=`11/1763/828` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`E452ECE1` feature_id=`5018882` tile=`11/1765/820` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `L700` | `指導線` | `LineString` | count=`8` + sample: fid=`95EA91C6` feature_id=`3911939` tile=`11/1777/816` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`AD6DB187` feature_id=`3911940` tile=`11/1777/816` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`9BBB14F4` feature_id=`3911941` tile=`11/1777/816` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `L概略等深線` | `概略等深線` | `MultiLineString` | count=`8` + sample: fid=`884C15A7` feature_id=`3786364` tile=`11/1751/868` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`9AF1BC41` feature_id=`3786381` tile=`11/1751/868` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`3B2306E5` feature_id=`5925354` tile=`11/1772/833` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P橋りょう等構造物` | `橋 (水門)` | `MultiPolygon` | count=`8` + sample: fid=`6D532E5E` feature_id=`1449064` tile=`11/1750/869` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`93B1D92F` feature_id=`1945381` tile=`11/1762/821` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`AA96CFC3` feature_id=`5018127` tile=`11/1765/820` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P航路` | `航路 (その他の推薦航路)` | `Polygon` | count=`8` + sample: fid=`6BF72E68` feature_id=`2271879` tile=`11/1819/808` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`A4437DB7` feature_id=`3946766` tile=`11/1819/807` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`A4437DB7` feature_id=`4736549` tile=`11/1819/806` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `陸上水域` | `MultiPolygon` | count=`7` + sample: fid=`27557D24` feature_id=`223110` tile=`11/1764/825` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`27557D24` feature_id=`1489850` tile=`11/1764/826` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`EF6DBAAC` feature_id=`2874458` tile=`11/1777/817` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p航路標識群` | `ドラム (樽)型浮標` | `Point` | count=`5` + sample: fid=`64AF5DD5` feature_id=`6621322` tile=`11/1765/830` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`5C5EEE22` feature_id=`4666307` tile=`11/1776/816` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`E8100D31` feature_id=`5662044` tile=`11/1785/816` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `L702` | `分離通航方式` | `LineString` | count=`3` + sample: fid=`C2D9262F` feature_id=`5390782` tile=`11/1839/729` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`C2D9262F` feature_id=`4755520` tile=`11/1840/729` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`C2D9262F` feature_id=`2674848` tile=`11/1841/729` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `L739` | `平水境界` | `MultiLineString` | count=`3` + sample: fid=`4AABADB1` feature_id=`5311303` tile=`11/1760/824` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`4AABADB1` feature_id=`3199915` tile=`11/1761/824` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`4CA6268B` feature_id=`2460687` tile=`11/1777/823` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `9000m以深` | `MultiPolygon` | count=`3` + sample: fid=`4785675C` feature_id=`5279386` tile=`11/1835/845` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`60D19859` feature_id=`5309521` tile=`11/1836/850` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`60D19859` feature_id=`4404633` tile=`11/1837/850` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p投錨注意障害物` | `危険全沈没船` | `Point` | count=`3` + sample: fid=`8FD02D44` feature_id=`6174113` tile=`11/1729/882` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`8FD02D44` feature_id=`3926654` tile=`11/1729/881` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`340D60F3` feature_id=`686768` tile=`11/1825/806` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p航路標識群` | `タワー型灯標識` | `Point` | count=`3` + sample: fid=`31C7574C` feature_id=`3858299` tile=`11/1767/817` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`DE194D83` feature_id=`4193933` tile=`11/1816/788` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`DE194D83` feature_id=`4051880` tile=`11/1816/789` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `2-20m` | `MultiPolygon` | count=`2` + sample: fid=`0F7F5293` feature_id=`751597` tile=`11/1778/818` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`E0974B17` feature_id=`6023303` tile=`11/1814/810` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `20-200m` | `MultiPolygon` | count=`2` + sample: fid=`41E75C18` feature_id=`243228` tile=`11/1803/812` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`BE609287` feature_id=`5719155` tile=`11/1874/731` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `5-20m` | `MultiPolygon` | count=`2` + sample: fid=`4028EAF1` feature_id=`2874167` tile=`11/1777/817` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`E7E0E63A` feature_id=`1423938` tile=`11/1813/811` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P漁具定置箇所` | `定置漁業` | `MultiPolygon` | count=`2` + sample: fid=`DCB6AF45` feature_id=`5636391` tile=`11/1762/820` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`0DDBD9FE` feature_id=`1902855` tile=`11/1832/779` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p投錨注意障害物` | `障害物` | `Point` | count=`2` + sample: fid=`8DAA127E` feature_id=`4737341` tile=`11/1819/806` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`2FE1DC31` feature_id=`3745634` tile=`11/1828/786` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p航路標識群` | `大型灯標` | `Point` | count=`2` + sample: fid=`D82C0B91` feature_id=`1212794` tile=`11/1802/811` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`1B0F95E5` feature_id=`4829805` tile=`11/1820/807` reason=`no specific render rule matched; heuristic fill-in was used` +- `field_value_rule_unresolved` | `p航路標識群` | `灯 (Lt)` | `Point` | count=`1` + sample: fid=`EEFCB357` feature_id=`6250146` tile=`11/1793/813` reason=`light color was inferred from remark because no explicit field-value rule matched` +- `render_rule_unresolved` | `P基本線` | `10-100m` | `Polygon` | count=`1` + sample: fid=`BAF8D781` feature_id=`4649328` tile=`11/1832/780` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P投錨注意障害物` | `険悪物` | `MultiPolygon` | count=`1` + sample: fid=`0A11F6C5` feature_id=`5676955` tile=`11/1826/796` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P陸上構造物陸` | `陸上顕著物 (観覧車等)` | `Polygon` | count=`1` + sample: fid=`8B5BAA43` feature_id=`1479063` tile=`11/1818/808` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p投錨注意障害物` | `魚礁 (危険なもの)` | `Point` | count=`1` + sample: fid=`CD620388` feature_id=`5018689` tile=`11/1765/820` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p航路標識群` | `大型浮標` | `Point` | count=`1` + sample: fid=`FB1EF39A` feature_id=`3794116` tile=`11/1751/868` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p航路標識群` | `球型灯浮標` | `Point` | count=`1` + sample: fid=`3C6E2A98` feature_id=`3207285` tile=`11/1761/824` reason=`no specific render rule matched; heuristic fill-in was used` diff --git a/docs/报告/20261013_全国Full生产分片历史审计证据/z12.mapping_audit.json b/docs/报告/20261013_全国Full生产分片历史审计证据/z12.mapping_audit.json new file mode 100644 index 0000000..ef19dc7 --- /dev/null +++ b/docs/报告/20261013_全国Full生产分片历史审计证据/z12.mapping_audit.json @@ -0,0 +1,17800 @@ +{ + "bundle_id": "navsea-core", + "output_root": "/home/wwwroot/pbf-delivery-full-20260418-rebuild.parts/z12", + "tile_jobs": 48556, + "written_tiles": 48556, + "skipped_tiles": 0, + "unresolved_event_count": 2986445, + "unresolved_summary": [ + { + "issue_type": "render_rule_unresolved", + "source_layer": "L海底地形", + "canonical_object_type": "L海底地形", + "geom_type": "LineString", + "count": 914174, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L海底地形", + "canonical_object_type": "L海底地形", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 6685108, + "fid": "80A01819", + "z": 12, + "x": 3444, + "y": 1722 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L海底地形", + "canonical_object_type": "L海底地形", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 6323734, + "fid": "C4A39917", + "z": 12, + "x": 3437, + "y": 1757 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L海底地形", + "canonical_object_type": "L海底地形", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 6323735, + "fid": "5A78A35A", + "z": 12, + "x": 3437, + "y": 1757 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L海底地形", + "canonical_object_type": "L海底地形", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 3767037, + "fid": "547CDC2B", + "z": 12, + "x": 3445, + "y": 1784 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L海底地形", + "canonical_object_type": "L海底地形", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 3767038, + "fid": "9693E3DE", + "z": 12, + "x": 3445, + "y": 1784 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "L陸上構造物陸", + "canonical_object_type": "道路", + "geom_type": "LineString", + "count": 635269, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L陸上構造物陸", + "canonical_object_type": "道路", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 4059245, + "fid": "7D75B55E", + "z": 12, + "x": 3456, + "y": 1762 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L陸上構造物陸", + "canonical_object_type": "道路", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 4059246, + "fid": "C2C5AE5C", + "z": 12, + "x": 3456, + "y": 1762 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L陸上構造物陸", + "canonical_object_type": "道路", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 4059247, + "fid": "2F129947", + "z": 12, + "x": 3456, + "y": 1762 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L陸上構造物陸", + "canonical_object_type": "道路", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 4059248, + "fid": "73E1E693", + "z": 12, + "x": 3456, + "y": 1762 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L陸上構造物陸", + "canonical_object_type": "道路", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 4059249, + "fid": "25055FB0", + "z": 12, + "x": 3456, + "y": 1762 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線ククリ", + "canonical_object_type": "P基本線ククリ", + "geom_type": "LineString", + "count": 399814, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線ククリ", + "canonical_object_type": "P基本線ククリ", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 1625103, + "fid": "F486965C", + "z": 12, + "x": 3436, + "y": 1753 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線ククリ", + "canonical_object_type": "P基本線ククリ", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 1625104, + "fid": "1C821C0E", + "z": 12, + "x": 3436, + "y": 1753 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線ククリ", + "canonical_object_type": "P基本線ククリ", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 1625105, + "fid": "73FD37DB", + "z": 12, + "x": 3436, + "y": 1753 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線ククリ", + "canonical_object_type": "P基本線ククリ", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 1625106, + "fid": "EDB2B684", + "z": 12, + "x": 3436, + "y": 1753 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線ククリ", + "canonical_object_type": "P基本線ククリ", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 1625107, + "fid": "27FA245B", + "z": 12, + "x": 3436, + "y": 1753 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P穴", + "canonical_object_type": "P穴", + "geom_type": "Polygon", + "count": 161745, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P穴", + "canonical_object_type": "P穴", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1330804, + "fid": "4F2BF8F9", + "z": 12, + "x": 3436, + "y": 1746 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P穴", + "canonical_object_type": "P穴", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1330805, + "fid": "AD717985", + "z": 12, + "x": 3436, + "y": 1746 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P穴", + "canonical_object_type": "P穴", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1330806, + "fid": "AD717985", + "z": 12, + "x": 3436, + "y": 1746 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P穴", + "canonical_object_type": "P穴", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 2249117, + "fid": "F7BE478F", + "z": 12, + "x": 3437, + "y": 1748 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P穴", + "canonical_object_type": "P穴", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 2249116, + "fid": "06A61EE6", + "z": 12, + "x": 3437, + "y": 1748 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "L等深線", + "canonical_object_type": "等深線", + "geom_type": "LineString", + "count": 118848, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L等深線", + "canonical_object_type": "等深線", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 1330798, + "fid": "EDDFFC1D", + "z": 12, + "x": 3436, + "y": 1746 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L等深線", + "canonical_object_type": "等深線", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 1625097, + "fid": "3314CA36", + "z": 12, + "x": 3436, + "y": 1753 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L等深線", + "canonical_object_type": "等深線", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 4555996, + "fid": "3314CA36", + "z": 12, + "x": 3436, + "y": 1754 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L等深線", + "canonical_object_type": "等深線", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 1005129, + "fid": "3A62AB5A", + "z": 12, + "x": 3437, + "y": 1746 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L等深線", + "canonical_object_type": "等深線", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 2982814, + "fid": "909521C0", + "z": 12, + "x": 3437, + "y": 1747 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "L海底地形", + "canonical_object_type": "L海底地形", + "geom_type": "MultiLineString", + "count": 114720, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L海底地形", + "canonical_object_type": "L海底地形", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 1869543, + "fid": "48361740", + "z": 12, + "x": 3445, + "y": 1781 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L海底地形", + "canonical_object_type": "L海底地形", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 6519895, + "fid": "80A01819", + "z": 12, + "x": 3444, + "y": 1723 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L海底地形", + "canonical_object_type": "L海底地形", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 4513733, + "fid": "D2D101CB", + "z": 12, + "x": 3445, + "y": 1777 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L海底地形", + "canonical_object_type": "L海底地形", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 1409864, + "fid": "177B59E1", + "z": 12, + "x": 3436, + "y": 1785 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L海底地形", + "canonical_object_type": "L海底地形", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 1330794, + "fid": "CD5F9644", + "z": 12, + "x": 3436, + "y": 1746 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P陸域", + "canonical_object_type": "P陸域", + "geom_type": "Polygon", + "count": 100791, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P陸域", + "canonical_object_type": "P陸域", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1330807, + "fid": "AAAF3533", + "z": 12, + "x": 3436, + "y": 1746 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P陸域", + "canonical_object_type": "P陸域", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 2249119, + "fid": "0ADCE957", + "z": 12, + "x": 3437, + "y": 1748 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P陸域", + "canonical_object_type": "P陸域", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1625108, + "fid": "2A73DE2E", + "z": 12, + "x": 3436, + "y": 1753 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P陸域", + "canonical_object_type": "P陸域", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 4556003, + "fid": "2A73DE2E", + "z": 12, + "x": 3436, + "y": 1754 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P陸域", + "canonical_object_type": "P陸域", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1005136, + "fid": "AAAF3533", + "z": 12, + "x": 3437, + "y": 1746 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "干潮帯", + "geom_type": "Polygon", + "count": 55564, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "干潮帯", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1625101, + "fid": "2B71620E", + "z": 12, + "x": 3436, + "y": 1753 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "干潮帯", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1625102, + "fid": "5A848E07", + "z": 12, + "x": 3436, + "y": 1753 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "干潮帯", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 4556000, + "fid": "5A848E07", + "z": 12, + "x": 3436, + "y": 1754 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "干潮帯", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 4059260, + "fid": "5B9A89E0", + "z": 12, + "x": 3456, + "y": 1762 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "干潮帯", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 4059261, + "fid": "DE9055A8", + "z": 12, + "x": 3456, + "y": 1762 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p地名陸", + "canonical_object_type": "p地名陸", + "geom_type": "Point", + "count": 33563, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p地名陸", + "canonical_object_type": "p地名陸", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 4059313, + "fid": "31818EDF", + "z": 12, + "x": 3456, + "y": 1762 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p地名陸", + "canonical_object_type": "p地名陸", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 6543272, + "fid": "6F4518F0", + "z": 12, + "x": 3447, + "y": 1761 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p地名陸", + "canonical_object_type": "p地名陸", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3994532, + "fid": "DAEFACF3", + "z": 12, + "x": 3457, + "y": 1762 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p地名陸", + "canonical_object_type": "p地名陸", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3994533, + "fid": "50813483", + "z": 12, + "x": 3457, + "y": 1762 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p地名陸", + "canonical_object_type": "p地名陸", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3994531, + "fid": "6E962866", + "z": 12, + "x": 3457, + "y": 1762 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p地名", + "canonical_object_type": "p地名", + "geom_type": "Point", + "count": 32034, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p地名", + "canonical_object_type": "p地名", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 2249120, + "fid": "2D74112C", + "z": 12, + "x": 3437, + "y": 1748 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p地名", + "canonical_object_type": "p地名", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 1625109, + "fid": "F9C7F936", + "z": 12, + "x": 3436, + "y": 1753 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p地名", + "canonical_object_type": "p地名", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 1005137, + "fid": "995A3245", + "z": 12, + "x": 3437, + "y": 1746 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p地名", + "canonical_object_type": "p地名", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 2982825, + "fid": "2D74112C", + "z": 12, + "x": 3437, + "y": 1747 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p地名", + "canonical_object_type": "p地名", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 261975, + "fid": "7BFC7537", + "z": 12, + "x": 3449, + "y": 1765 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "防波堤", + "geom_type": "Polygon", + "count": 29162, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "防波堤", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 4059258, + "fid": "DD04BE42", + "z": 12, + "x": 3456, + "y": 1762 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "防波堤", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6543217, + "fid": "42EAFF1B", + "z": 12, + "x": 3447, + "y": 1761 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "防波堤", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6543218, + "fid": "4F9DB56D", + "z": 12, + "x": 3447, + "y": 1761 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "防波堤", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6270484, + "fid": "8DC1E6EF", + "z": 12, + "x": 3446, + "y": 1761 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "防波堤", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 2354608, + "fid": "D387C0D0", + "z": 12, + "x": 3446, + "y": 1760 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "2-5m", + "geom_type": "Polygon", + "count": 23592, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2-5m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1014997, + "fid": "20B80820", + "z": 12, + "x": 3454, + "y": 1762 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2-5m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1906380, + "fid": "9EC2ED28", + "z": 12, + "x": 3457, + "y": 1764 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2-5m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1318140, + "fid": "62DED0C8", + "z": 12, + "x": 3456, + "y": 1766 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2-5m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1318141, + "fid": "44021EBA", + "z": 12, + "x": 3456, + "y": 1766 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2-5m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1318142, + "fid": "4E1A57DD", + "z": 12, + "x": 3456, + "y": 1766 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "0-2m", + "geom_type": "Polygon", + "count": 21914, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-2m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 4059255, + "fid": "7B2E3DDA", + "z": 12, + "x": 3456, + "y": 1762 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-2m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 4059256, + "fid": "875640FA", + "z": 12, + "x": 3456, + "y": 1762 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-2m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1014995, + "fid": "62617609", + "z": 12, + "x": 3454, + "y": 1762 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-2m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1906379, + "fid": "B8B8DB22", + "z": 12, + "x": 3457, + "y": 1764 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-2m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1318139, + "fid": "2D051A6D", + "z": 12, + "x": 3456, + "y": 1766 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "5-10m", + "geom_type": "Polygon", + "count": 20338, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5-10m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1014998, + "fid": "F16D3931", + "z": 12, + "x": 3454, + "y": 1762 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5-10m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 4593936, + "fid": "88CEFF3D", + "z": 12, + "x": 3448, + "y": 1760 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5-10m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6543210, + "fid": "6C32970B", + "z": 12, + "x": 3447, + "y": 1761 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5-10m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6543211, + "fid": "E5F22252", + "z": 12, + "x": 3447, + "y": 1761 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5-10m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6543212, + "fid": "CCB55921", + "z": 12, + "x": 3447, + "y": 1761 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P危険界ククリ", + "canonical_object_type": "P危険界ククリ", + "geom_type": "LineString", + "count": 17465, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P危険界ククリ", + "canonical_object_type": "P危険界ククリ", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 4059254, + "fid": "BC187000", + "z": 12, + "x": 3456, + "y": 1762 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P危険界ククリ", + "canonical_object_type": "P危険界ククリ", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 6625916, + "fid": "0B6A43BB", + "z": 12, + "x": 3459, + "y": 1760 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P危険界ククリ", + "canonical_object_type": "P危険界ククリ", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 2629019, + "fid": "C45A010E", + "z": 12, + "x": 3461, + "y": 1759 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P危険界ククリ", + "canonical_object_type": "P危険界ククリ", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 4015131, + "fid": "31C55B08", + "z": 12, + "x": 3474, + "y": 1754 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P危険界ククリ", + "canonical_object_type": "P危険界ククリ", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 2354563, + "fid": "CC30B83A", + "z": 12, + "x": 3446, + "y": 1760 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P陸上構造物陸", + "canonical_object_type": "ビル", + "geom_type": "Polygon", + "count": 13573, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P陸上構造物陸", + "canonical_object_type": "ビル", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 5042500, + "fid": "47FCBA67", + "z": 12, + "x": 3461, + "y": 1762 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P陸上構造物陸", + "canonical_object_type": "ビル", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 3720476, + "fid": "CE2C9644", + "z": 12, + "x": 3475, + "y": 1757 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P陸上構造物陸", + "canonical_object_type": "ビル", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1626923, + "fid": "CAFD8FF1", + "z": 12, + "x": 3501, + "y": 1735 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P陸上構造物陸", + "canonical_object_type": "ビル", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 5517933, + "fid": "8C5A289C", + "z": 12, + "x": 3503, + "y": 1734 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P陸上構造物陸", + "canonical_object_type": "ビル", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 2879851, + "fid": "D27F5432", + "z": 12, + "x": 3506, + "y": 1732 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "L基本線", + "canonical_object_type": "一本線で表わす桟橋", + "geom_type": "LineString", + "count": 12781, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L基本線", + "canonical_object_type": "一本線で表わす桟橋", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 4059244, + "fid": "722AF89C", + "z": 12, + "x": 3456, + "y": 1762 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L基本線", + "canonical_object_type": "一本線で表わす桟橋", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 2354027, + "fid": "B344852A", + "z": 12, + "x": 3446, + "y": 1760 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L基本線", + "canonical_object_type": "一本線で表わす桟橋", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 2354028, + "fid": "39A0EDD1", + "z": 12, + "x": 3446, + "y": 1760 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L基本線", + "canonical_object_type": "一本線で表わす桟橋", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 2354029, + "fid": "0AEF0433", + "z": 12, + "x": 3446, + "y": 1760 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L基本線", + "canonical_object_type": "一本線で表わす桟橋", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 2354030, + "fid": "A78DFEDF", + "z": 12, + "x": 3446, + "y": 1760 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "L海底線", + "canonical_object_type": "海底線 (電信電話)", + "geom_type": "LineString", + "count": 12712, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L海底線", + "canonical_object_type": "海底線 (電信電話)", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 6323736, + "fid": "DE0CD85E", + "z": 12, + "x": 3437, + "y": 1757 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L海底線", + "canonical_object_type": "海底線 (電信電話)", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 6323737, + "fid": "4F822F77", + "z": 12, + "x": 3437, + "y": 1757 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L海底線", + "canonical_object_type": "海底線 (電信電話)", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 3767042, + "fid": "AFA95DF8", + "z": 12, + "x": 3445, + "y": 1784 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L海底線", + "canonical_object_type": "海底線 (電信電話)", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 3767043, + "fid": "82F993F5", + "z": 12, + "x": 3445, + "y": 1784 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L海底線", + "canonical_object_type": "海底線 (電信電話)", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 3767044, + "fid": "E93205B9", + "z": 12, + "x": 3445, + "y": 1784 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "険悪物", + "geom_type": "Point", + "count": 11088, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "険悪物", + "canonical_family": "mixed", + "geom_type": "Point", + "feature_id": 2354897, + "fid": "92FECF71", + "z": 12, + "x": 3446, + "y": 1760 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "険悪物", + "canonical_family": "mixed", + "geom_type": "Point", + "feature_id": 5392011, + "fid": "29A880E7", + "z": 12, + "x": 3459, + "y": 1761 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "険悪物", + "canonical_family": "mixed", + "geom_type": "Point", + "feature_id": 6272309, + "fid": "78361FE6", + "z": 12, + "x": 3467, + "y": 1758 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "険悪物", + "canonical_family": "mixed", + "geom_type": "Point", + "feature_id": 6272310, + "fid": "585A53FA", + "z": 12, + "x": 3467, + "y": 1758 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "険悪物", + "canonical_family": "mixed", + "geom_type": "Point", + "feature_id": 2846725, + "fid": "B473359C", + "z": 12, + "x": 3490, + "y": 1736 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p航行危険障害物", + "canonical_object_type": "暗岩", + "geom_type": "Point", + "count": 10366, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航行危険障害物", + "canonical_object_type": "暗岩", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 1015022, + "fid": "9F2AE8E8", + "z": 12, + "x": 3454, + "y": 1762 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航行危険障害物", + "canonical_object_type": "暗岩", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 1015023, + "fid": "4F980869", + "z": 12, + "x": 3454, + "y": 1762 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航行危険障害物", + "canonical_object_type": "暗岩", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 4015179, + "fid": "601A9E4C", + "z": 12, + "x": 3474, + "y": 1754 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航行危険障害物", + "canonical_object_type": "暗岩", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 4015180, + "fid": "7263FFEF", + "z": 12, + "x": 3474, + "y": 1754 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航行危険障害物", + "canonical_object_type": "暗岩", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 4015181, + "fid": "CA57E2B1", + "z": 12, + "x": 3474, + "y": 1754 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "浅所危険界", + "geom_type": "Polygon", + "count": 9980, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "浅所危険界", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 4059264, + "fid": "7CF304CD", + "z": 12, + "x": 3456, + "y": 1762 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "浅所危険界", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6625938, + "fid": "728BEBC2", + "z": 12, + "x": 3459, + "y": 1760 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "浅所危険界", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 2629042, + "fid": "3F2B71EB", + "z": 12, + "x": 3461, + "y": 1759 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "浅所危険界", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 4015149, + "fid": "992D2CA9", + "z": 12, + "x": 3474, + "y": 1754 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "浅所危険界", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 2354633, + "fid": "2E138F2C", + "z": 12, + "x": 3446, + "y": 1760 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P漁具定置箇所", + "canonical_object_type": "区画漁業", + "geom_type": "Polygon", + "count": 9811, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P漁具定置箇所", + "canonical_object_type": "区画漁業", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6625969, + "fid": "2727C0E0", + "z": 12, + "x": 3459, + "y": 1760 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P漁具定置箇所", + "canonical_object_type": "区画漁業", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6625970, + "fid": "26E5B52D", + "z": 12, + "x": 3459, + "y": 1760 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P漁具定置箇所", + "canonical_object_type": "区画漁業", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6625971, + "fid": "9F1FEDEC", + "z": 12, + "x": 3459, + "y": 1760 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P漁具定置箇所", + "canonical_object_type": "区画漁業", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6625972, + "fid": "9C759646", + "z": 12, + "x": 3459, + "y": 1760 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P漁具定置箇所", + "canonical_object_type": "区画漁業", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6336380, + "fid": "A537FA81", + "z": 12, + "x": 3472, + "y": 1754 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "10-20m", + "geom_type": "Polygon", + "count": 9791, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "10-20m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1330799, + "fid": "064C7DCC", + "z": 12, + "x": 3436, + "y": 1746 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "10-20m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 3742367, + "fid": "2EB7B0DC", + "z": 12, + "x": 3454, + "y": 1764 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "10-20m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6543202, + "fid": "2C8E3D96", + "z": 12, + "x": 3447, + "y": 1761 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "10-20m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 5548754, + "fid": "264151DA", + "z": 12, + "x": 3455, + "y": 1766 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "10-20m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6270473, + "fid": "2C8E3D96", + "z": 12, + "x": 3446, + "y": 1761 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "1000-2000m", + "geom_type": "Polygon", + "count": 9092, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "1000-2000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 4852381, + "fid": "743EE596", + "z": 12, + "x": 3443, + "y": 1750 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "1000-2000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 3058904, + "fid": "743EE596", + "z": 12, + "x": 3443, + "y": 1747 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "1000-2000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6021241, + "fid": "743EE596", + "z": 12, + "x": 3443, + "y": 1751 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "1000-2000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1274160, + "fid": "743EE596", + "z": 12, + "x": 3445, + "y": 1766 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "1000-2000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6017393, + "fid": "743EE596", + "z": 12, + "x": 3445, + "y": 1764 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P橋りょう等構造物", + "canonical_object_type": "橋 (水門)", + "geom_type": "Polygon", + "count": 8972, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P橋りょう等構造物", + "canonical_object_type": "橋 (水門)", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 3994501, + "fid": "D3853F3B", + "z": 12, + "x": 3457, + "y": 1762 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P橋りょう等構造物", + "canonical_object_type": "橋 (水門)", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 3994502, + "fid": "A41FAF33", + "z": 12, + "x": 3457, + "y": 1762 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P橋りょう等構造物", + "canonical_object_type": "橋 (水門)", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 5929374, + "fid": "94988701", + "z": 12, + "x": 3461, + "y": 1761 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P橋りょう等構造物", + "canonical_object_type": "橋 (水門)", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 5929375, + "fid": "87282730", + "z": 12, + "x": 3461, + "y": 1761 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P橋りょう等構造物", + "canonical_object_type": "橋 (水門)", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 2354767, + "fid": "287D307D", + "z": 12, + "x": 3446, + "y": 1760 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "2000-3000m", + "geom_type": "Polygon", + "count": 8747, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2000-3000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 2539102, + "fid": "02940A0C", + "z": 12, + "x": 3445, + "y": 1772 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2000-3000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 212694, + "fid": "02940A0C", + "z": 12, + "x": 3445, + "y": 1771 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2000-3000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1459455, + "fid": "02940A0C", + "z": 12, + "x": 3445, + "y": 1769 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2000-3000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 5062908, + "fid": "0C643A77", + "z": 12, + "x": 3445, + "y": 1767 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2000-3000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1274161, + "fid": "0C643A77", + "z": 12, + "x": 3445, + "y": 1766 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "L基本線", + "canonical_object_type": "浮施設・桟橋", + "geom_type": "LineString", + "count": 8495, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L基本線", + "canonical_object_type": "浮施設・桟橋", + "canonical_family": "mixed", + "geom_type": "LineString", + "feature_id": 4059242, + "fid": "5EDBD274", + "z": 12, + "x": 3456, + "y": 1762 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L基本線", + "canonical_object_type": "浮施設・桟橋", + "canonical_family": "mixed", + "geom_type": "LineString", + "feature_id": 4059243, + "fid": "AB03DA90", + "z": 12, + "x": 3456, + "y": 1762 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L基本線", + "canonical_object_type": "浮施設・桟橋", + "canonical_family": "mixed", + "geom_type": "LineString", + "feature_id": 2846034, + "fid": "FEAEBF8A", + "z": 12, + "x": 3490, + "y": 1736 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L基本線", + "canonical_object_type": "浮施設・桟橋", + "canonical_family": "mixed", + "geom_type": "LineString", + "feature_id": 2846035, + "fid": "8298FEC1", + "z": 12, + "x": 3490, + "y": 1736 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L基本線", + "canonical_object_type": "浮施設・桟橋", + "canonical_family": "mixed", + "geom_type": "LineString", + "feature_id": 927486, + "fid": "1F709B93", + "z": 12, + "x": 3455, + "y": 1762 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p航路標識群", + "canonical_object_type": "灯 (Lt)", + "geom_type": "Point", + "count": 7503, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "灯 (Lt)", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 2354901, + "fid": "F950488E", + "z": 12, + "x": 3446, + "y": 1760 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "灯 (Lt)", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 803878, + "fid": "98CDE62D", + "z": 12, + "x": 3471, + "y": 1755 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "灯 (Lt)", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 803879, + "fid": "6A3188E4", + "z": 12, + "x": 3471, + "y": 1755 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "灯 (Lt)", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 803880, + "fid": "055B0549", + "z": 12, + "x": 3471, + "y": 1755 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "灯 (Lt)", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3351233, + "fid": "055B0549", + "z": 12, + "x": 3471, + "y": 1756 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "5000-6000m", + "geom_type": "Polygon", + "count": 7326, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5000-6000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 3767046, + "fid": "CBB6C786", + "z": 12, + "x": 3445, + "y": 1784 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5000-6000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 2028776, + "fid": "CBB6C786", + "z": 12, + "x": 3445, + "y": 1783 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5000-6000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 48069, + "fid": "CBB6C786", + "z": 12, + "x": 3438, + "y": 1781 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5000-6000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 4468806, + "fid": "CBB6C786", + "z": 12, + "x": 3445, + "y": 1782 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5000-6000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1869548, + "fid": "CBB6C786", + "z": 12, + "x": 3445, + "y": 1781 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "浮施設・桟橋", + "geom_type": "Polygon", + "count": 6933, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "浮施設・桟橋", + "canonical_family": "mixed", + "geom_type": "Polygon", + "feature_id": 4059259, + "fid": "79C37737", + "z": 12, + "x": 3456, + "y": 1762 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "浮施設・桟橋", + "canonical_family": "mixed", + "geom_type": "Polygon", + "feature_id": 2354617, + "fid": "E00710B9", + "z": 12, + "x": 3446, + "y": 1760 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "浮施設・桟橋", + "canonical_family": "mixed", + "geom_type": "Polygon", + "feature_id": 3610793, + "fid": "37161ECF", + "z": 12, + "x": 3456, + "y": 1760 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "浮施設・桟橋", + "canonical_family": "mixed", + "geom_type": "Polygon", + "feature_id": 6648284, + "fid": "A2588D22", + "z": 12, + "x": 3462, + "y": 1760 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "浮施設・桟橋", + "canonical_family": "mixed", + "geom_type": "Polygon", + "feature_id": 3903348, + "fid": "5F799B91", + "z": 12, + "x": 3456, + "y": 1765 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "3000-4000m", + "geom_type": "Polygon", + "count": 6837, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "3000-4000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1626438, + "fid": "5ED00BCE", + "z": 12, + "x": 3438, + "y": 1771 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "3000-4000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 2402216, + "fid": "5ED00BCE", + "z": 12, + "x": 3436, + "y": 1770 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "3000-4000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1742731, + "fid": "5ED00BCE", + "z": 12, + "x": 3445, + "y": 1773 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "3000-4000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 2539103, + "fid": "5ED00BCE", + "z": 12, + "x": 3445, + "y": 1772 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "3000-4000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 212695, + "fid": "5ED00BCE", + "z": 12, + "x": 3445, + "y": 1771 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "500-1000m", + "geom_type": "Polygon", + "count": 6537, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "500-1000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 3586368, + "fid": "06D87451", + "z": 12, + "x": 3443, + "y": 1748 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "500-1000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 816344, + "fid": "06D87451", + "z": 12, + "x": 3443, + "y": 1746 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "500-1000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 4852380, + "fid": "06D87451", + "z": 12, + "x": 3443, + "y": 1750 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "500-1000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 3058903, + "fid": "06D87451", + "z": 12, + "x": 3443, + "y": 1747 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "500-1000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 445899, + "fid": "06D87451", + "z": 12, + "x": 3443, + "y": 1749 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "100-200m", + "geom_type": "Polygon", + "count": 6504, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "100-200m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6685110, + "fid": "77AA5E0A", + "z": 12, + "x": 3444, + "y": 1722 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "100-200m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1637059, + "fid": "77AA5E0A", + "z": 12, + "x": 3444, + "y": 1725 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "100-200m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 3047063, + "fid": "77AA5E0A", + "z": 12, + "x": 3444, + "y": 1729 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "100-200m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6323738, + "fid": "85CAF682", + "z": 12, + "x": 3437, + "y": 1757 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "100-200m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1155867, + "fid": "77AA5E0A", + "z": 12, + "x": 3444, + "y": 1724 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "20-100m", + "geom_type": "Polygon", + "count": 6379, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "20-100m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 5758826, + "fid": "AD717985", + "z": 12, + "x": 3445, + "y": 1717 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "20-100m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 3048860, + "fid": "AD717985", + "z": 12, + "x": 3441, + "y": 1720 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "20-100m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6685109, + "fid": "AD717985", + "z": 12, + "x": 3444, + "y": 1722 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "20-100m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1855123, + "fid": "AD717985", + "z": 12, + "x": 3436, + "y": 1732 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "20-100m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1991530, + "fid": "AD717985", + "z": 12, + "x": 3445, + "y": 1716 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "4000-5000m", + "geom_type": "Polygon", + "count": 5835, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "4000-5000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 3767045, + "fid": "C87811B8", + "z": 12, + "x": 3445, + "y": 1784 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "4000-5000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 2028775, + "fid": "C87811B8", + "z": 12, + "x": 3445, + "y": 1783 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "4000-5000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 48068, + "fid": "C87811B8", + "z": 12, + "x": 3438, + "y": 1781 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "4000-5000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 4468805, + "fid": "C87811B8", + "z": 12, + "x": 3445, + "y": 1782 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "4000-5000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 4767337, + "fid": "C87811B8", + "z": 12, + "x": 3444, + "y": 1795 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "0-5m", + "geom_type": "Polygon", + "count": 5493, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-5m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1014996, + "fid": "EA5AA210", + "z": 12, + "x": 3454, + "y": 1762 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-5m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 4593935, + "fid": "EA41DC1A", + "z": 12, + "x": 3448, + "y": 1760 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-5m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6543208, + "fid": "39F5455E", + "z": 12, + "x": 3447, + "y": 1761 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-5m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6543209, + "fid": "EA41DC1A", + "z": 12, + "x": 3447, + "y": 1761 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-5m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6270480, + "fid": "39F5455E", + "z": 12, + "x": 3446, + "y": 1761 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p陸上構造物", + "canonical_object_type": "塔、やぐら、風車", + "geom_type": "Point", + "count": 5419, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p陸上構造物", + "canonical_object_type": "塔、やぐら、風車", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 4570633, + "fid": "7D1DD46C", + "z": 12, + "x": 3462, + "y": 1758 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p陸上構造物", + "canonical_object_type": "塔、やぐら、風車", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 5929450, + "fid": "4201B8C8", + "z": 12, + "x": 3461, + "y": 1761 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p陸上構造物", + "canonical_object_type": "塔、やぐら、風車", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 5929451, + "fid": "F7D992B2", + "z": 12, + "x": 3461, + "y": 1761 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p陸上構造物", + "canonical_object_type": "塔、やぐら、風車", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 2354903, + "fid": "3CEC656A", + "z": 12, + "x": 3446, + "y": 1760 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p陸上構造物", + "canonical_object_type": "塔、やぐら、風車", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 2761867, + "fid": "AE513420", + "z": 12, + "x": 3447, + "y": 1760 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "200-500m", + "geom_type": "Polygon", + "count": 5256, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "200-500m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6323739, + "fid": "E654FCFF", + "z": 12, + "x": 3437, + "y": 1757 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "200-500m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1406852, + "fid": "E2915581", + "z": 12, + "x": 3437, + "y": 1749 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "200-500m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 2249113, + "fid": "E2915581", + "z": 12, + "x": 3437, + "y": 1748 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "200-500m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 3012389, + "fid": "E2915581", + "z": 12, + "x": 3443, + "y": 1745 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "200-500m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 816343, + "fid": "E2915581", + "z": 12, + "x": 3443, + "y": 1746 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p陸上構造物", + "canonical_object_type": "山頂", + "geom_type": "Point", + "count": 4827, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p陸上構造物", + "canonical_object_type": "山頂", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 4059314, + "fid": "7A343E6B", + "z": 12, + "x": 3456, + "y": 1762 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p陸上構造物", + "canonical_object_type": "山頂", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 4059315, + "fid": "6772E944", + "z": 12, + "x": 3456, + "y": 1762 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p陸上構造物", + "canonical_object_type": "山頂", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 4059316, + "fid": "B8CB620F", + "z": 12, + "x": 3456, + "y": 1762 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p陸上構造物", + "canonical_object_type": "山頂", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 4059317, + "fid": "EA54BFF3", + "z": 12, + "x": 3456, + "y": 1762 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p陸上構造物", + "canonical_object_type": "山頂", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 4059318, + "fid": "31BFE09B", + "z": 12, + "x": 3456, + "y": 1762 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "L基本線", + "canonical_object_type": "一本線で表わす海上バース", + "geom_type": "LineString", + "count": 4696, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L基本線", + "canonical_object_type": "一本線で表わす海上バース", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 4714113, + "fid": "12A21CC5", + "z": 12, + "x": 3503, + "y": 1732 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L基本線", + "canonical_object_type": "一本線で表わす海上バース", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 4714114, + "fid": "04B197C6", + "z": 12, + "x": 3503, + "y": 1732 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L基本線", + "canonical_object_type": "一本線で表わす海上バース", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 2870437, + "fid": "6AFAA9DF", + "z": 12, + "x": 3503, + "y": 1735 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L基本線", + "canonical_object_type": "一本線で表わす海上バース", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 2870438, + "fid": "36C06644", + "z": 12, + "x": 3503, + "y": 1735 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L基本線", + "canonical_object_type": "一本線で表わす海上バース", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 420809, + "fid": "BD0998F7", + "z": 12, + "x": 3504, + "y": 1736 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P陸上構造物陸", + "canonical_object_type": "タンク", + "geom_type": "Polygon", + "count": 4441, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P陸上構造物陸", + "canonical_object_type": "タンク", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 579723, + "fid": "9D4AF305", + "z": 12, + "x": 3466, + "y": 1758 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P陸上構造物陸", + "canonical_object_type": "タンク", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6094118, + "fid": "DAE5A542", + "z": 12, + "x": 3474, + "y": 1756 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P陸上構造物陸", + "canonical_object_type": "タンク", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 5517934, + "fid": "68773C74", + "z": 12, + "x": 3503, + "y": 1734 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P陸上構造物陸", + "canonical_object_type": "タンク", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 4412243, + "fid": "DFC1BD6D", + "z": 12, + "x": 3505, + "y": 1733 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P陸上構造物陸", + "canonical_object_type": "タンク", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 3704030, + "fid": "123270F8", + "z": 12, + "x": 3497, + "y": 1738 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P投錨注意障害物ククリ", + "canonical_object_type": "P投錨注意障害物ククリ", + "geom_type": "LineString", + "count": 4227, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P投錨注意障害物ククリ", + "canonical_object_type": "P投錨注意障害物ククリ", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 3733776, + "fid": "C99504B5", + "z": 12, + "x": 3503, + "y": 1738 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P投錨注意障害物ククリ", + "canonical_object_type": "P投錨注意障害物ククリ", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 1117332, + "fid": "879A1585", + "z": 12, + "x": 3503, + "y": 1728 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P投錨注意障害物ククリ", + "canonical_object_type": "P投錨注意障害物ククリ", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 2777142, + "fid": "C27B5E65", + "z": 12, + "x": 3500, + "y": 1740 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P投錨注意障害物ククリ", + "canonical_object_type": "P投錨注意障害物ククリ", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 2034763, + "fid": "99AFD219", + "z": 12, + "x": 3517, + "y": 1655 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P投錨注意障害物ククリ", + "canonical_object_type": "P投錨注意障害物ククリ", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 5531149, + "fid": "3EA61624", + "z": 12, + "x": 3502, + "y": 1733 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p陸上構造物", + "canonical_object_type": "煙突", + "geom_type": "Point", + "count": 4054, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p陸上構造物", + "canonical_object_type": "煙突", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 2761866, + "fid": "EC760317", + "z": 12, + "x": 3447, + "y": 1760 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p陸上構造物", + "canonical_object_type": "煙突", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 5042516, + "fid": "21B165E3", + "z": 12, + "x": 3461, + "y": 1762 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p陸上構造物", + "canonical_object_type": "煙突", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 5042517, + "fid": "241A832B", + "z": 12, + "x": 3461, + "y": 1762 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p陸上構造物", + "canonical_object_type": "煙突", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 5042518, + "fid": "7C701862", + "z": 12, + "x": 3461, + "y": 1762 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p陸上構造物", + "canonical_object_type": "煙突", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 5042519, + "fid": "B80ABF42", + "z": 12, + "x": 3461, + "y": 1762 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "L等深線", + "canonical_object_type": "等深線", + "geom_type": "MultiLineString", + "count": 3531, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L等深線", + "canonical_object_type": "等深線", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 1330797, + "fid": "3A62AB5A", + "z": 12, + "x": 3436, + "y": 1746 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L等深線", + "canonical_object_type": "等深線", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 2249110, + "fid": "909521C0", + "z": 12, + "x": 3437, + "y": 1748 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L等深線", + "canonical_object_type": "等深線", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 4593925, + "fid": "30F5C9F9", + "z": 12, + "x": 3448, + "y": 1760 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L等深線", + "canonical_object_type": "等深線", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 3994376, + "fid": "14A4143F", + "z": 12, + "x": 3457, + "y": 1762 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L等深線", + "canonical_object_type": "等深線", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 3994386, + "fid": "622E023D", + "z": 12, + "x": 3457, + "y": 1762 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線ククリ", + "canonical_object_type": "P基本線ククリ", + "geom_type": "MultiLineString", + "count": 3527, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線ククリ", + "canonical_object_type": "P基本線ククリ", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 1330803, + "fid": "17ECC1F3", + "z": 12, + "x": 3436, + "y": 1746 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線ククリ", + "canonical_object_type": "P基本線ククリ", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 2249115, + "fid": "DC7730C3", + "z": 12, + "x": 3437, + "y": 1748 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線ククリ", + "canonical_object_type": "P基本線ククリ", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 2982820, + "fid": "DC7730C3", + "z": 12, + "x": 3437, + "y": 1747 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線ククリ", + "canonical_object_type": "P基本線ククリ", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 4059273, + "fid": "8150C222", + "z": 12, + "x": 3456, + "y": 1762 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線ククリ", + "canonical_object_type": "P基本線ククリ", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 4059275, + "fid": "20D28945", + "z": 12, + "x": 3456, + "y": 1762 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "河川域", + "geom_type": "Polygon", + "count": 3389, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "河川域", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 4059266, + "fid": "A76C35D8", + "z": 12, + "x": 3456, + "y": 1762 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "河川域", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 4059268, + "fid": "9E5FD143", + "z": 12, + "x": 3456, + "y": 1762 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "河川域", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 4059269, + "fid": "C8E56387", + "z": 12, + "x": 3456, + "y": 1762 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "河川域", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 4059270, + "fid": "97819C91", + "z": 12, + "x": 3456, + "y": 1762 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "河川域", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 3994460, + "fid": "2D5ACF65", + "z": 12, + "x": 3457, + "y": 1762 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p航行危険障害物", + "canonical_object_type": "洗岩", + "geom_type": "Point", + "count": 3323, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航行危険障害物", + "canonical_object_type": "洗岩", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3994536, + "fid": "2C62D88D", + "z": 12, + "x": 3457, + "y": 1762 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航行危険障害物", + "canonical_object_type": "洗岩", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 1067515, + "fid": "574043FA", + "z": 12, + "x": 3455, + "y": 1763 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航行危険障害物", + "canonical_object_type": "洗岩", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 4055050, + "fid": "BBD57184", + "z": 12, + "x": 3472, + "y": 1753 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航行危険障害物", + "canonical_object_type": "洗岩", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 4055051, + "fid": "AE671644", + "z": 12, + "x": 3472, + "y": 1753 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航行危険障害物", + "canonical_object_type": "洗岩", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 4055052, + "fid": "C147C37C", + "z": 12, + "x": 3472, + "y": 1753 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p施設・境界線等", + "canonical_object_type": "漁港", + "geom_type": "Point", + "count": 3169, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p施設・境界線等", + "canonical_object_type": "漁港", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 2354898, + "fid": "F3683074", + "z": 12, + "x": 3446, + "y": 1760 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p施設・境界線等", + "canonical_object_type": "漁港", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 803869, + "fid": "10DD546A", + "z": 12, + "x": 3471, + "y": 1755 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p施設・境界線等", + "canonical_object_type": "漁港", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3903639, + "fid": "7EF93C38", + "z": 12, + "x": 3456, + "y": 1765 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p施設・境界線等", + "canonical_object_type": "漁港", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 579773, + "fid": "4FF1D3BE", + "z": 12, + "x": 3466, + "y": 1758 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p施設・境界線等", + "canonical_object_type": "漁港", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 579774, + "fid": "3603D81F", + "z": 12, + "x": 3466, + "y": 1758 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "6000-7000m", + "geom_type": "Polygon", + "count": 3001, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "6000-7000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 4343122, + "fid": "2DFE98D1", + "z": 12, + "x": 3446, + "y": 1775 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "6000-7000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 871075, + "fid": "2DFE98D1", + "z": 12, + "x": 3446, + "y": 1776 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "6000-7000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 4383465, + "fid": "2DFE98D1", + "z": 12, + "x": 3447, + "y": 1775 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "6000-7000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 709344, + "fid": "2DFE98D1", + "z": 12, + "x": 3447, + "y": 1776 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "6000-7000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 2804018, + "fid": "2DFE98D1", + "z": 12, + "x": 3447, + "y": 1777 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "L概略等深線", + "canonical_object_type": "概略等深線", + "geom_type": "LineString", + "count": 2830, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L概略等深線", + "canonical_object_type": "概略等深線", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 6336228, + "fid": "4ED8BA45", + "z": 12, + "x": 3472, + "y": 1754 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L概略等深線", + "canonical_object_type": "概略等深線", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 1748701, + "fid": "4D2C2294", + "z": 12, + "x": 3499, + "y": 1739 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L概略等深線", + "canonical_object_type": "概略等深線", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 1748702, + "fid": "A8318F47", + "z": 12, + "x": 3499, + "y": 1739 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L概略等深線", + "canonical_object_type": "概略等深線", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 1748703, + "fid": "0BBB4102", + "z": 12, + "x": 3499, + "y": 1739 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L概略等深線", + "canonical_object_type": "概略等深線", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 1748704, + "fid": "48AAD0C4", + "z": 12, + "x": 3499, + "y": 1739 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p航路標識群", + "canonical_object_type": "防波堤灯台", + "geom_type": "Point", + "count": 2349, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "防波堤灯台", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 2354900, + "fid": "CBE175BD", + "z": 12, + "x": 3446, + "y": 1760 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "防波堤灯台", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3903643, + "fid": "BB8A6871", + "z": 12, + "x": 3456, + "y": 1765 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "防波堤灯台", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3236167, + "fid": "19CBAE9A", + "z": 12, + "x": 3491, + "y": 1736 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "防波堤灯台", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 2846727, + "fid": "19CBAE9A", + "z": 12, + "x": 3490, + "y": 1736 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "防波堤灯台", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 5817514, + "fid": "F310F499", + "z": 12, + "x": 3457, + "y": 1763 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P投錨注意障害物", + "canonical_object_type": "険悪物", + "geom_type": "Polygon", + "count": 2263, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P投錨注意障害物", + "canonical_object_type": "険悪物", + "canonical_family": "mixed", + "geom_type": "Polygon", + "feature_id": 2034762, + "fid": "078F9E5C", + "z": 12, + "x": 3517, + "y": 1655 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P投錨注意障害物", + "canonical_object_type": "険悪物", + "canonical_family": "mixed", + "geom_type": "Polygon", + "feature_id": 1252846, + "fid": "078F9E5C", + "z": 12, + "x": 3518, + "y": 1655 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P投錨注意障害物", + "canonical_object_type": "険悪物", + "canonical_family": "mixed", + "geom_type": "Polygon", + "feature_id": 5367950, + "fid": "4BD57036", + "z": 12, + "x": 3502, + "y": 1738 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P投錨注意障害物", + "canonical_object_type": "険悪物", + "canonical_family": "mixed", + "geom_type": "Polygon", + "feature_id": 5367951, + "fid": "2C1DA13F", + "z": 12, + "x": 3502, + "y": 1738 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P投錨注意障害物", + "canonical_object_type": "険悪物", + "canonical_family": "mixed", + "geom_type": "Polygon", + "feature_id": 5367952, + "fid": "7E049638", + "z": 12, + "x": 3502, + "y": 1738 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p航行危険障害物", + "canonical_object_type": "ポンツーン、パイル、杭", + "geom_type": "Point", + "count": 2119, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航行危険障害物", + "canonical_object_type": "ポンツーン、パイル、杭", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 5817498, + "fid": "F7621D99", + "z": 12, + "x": 3457, + "y": 1763 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航行危険障害物", + "canonical_object_type": "ポンツーン、パイル、杭", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 2777262, + "fid": "F89AE4A5", + "z": 12, + "x": 3500, + "y": 1740 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航行危険障害物", + "canonical_object_type": "ポンツーン、パイル、杭", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 4715345, + "fid": "C836FEF0", + "z": 12, + "x": 3503, + "y": 1732 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航行危険障害物", + "canonical_object_type": "ポンツーン、パイル、杭", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 4715346, + "fid": "AF88243C", + "z": 12, + "x": 3503, + "y": 1732 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航行危険障害物", + "canonical_object_type": "ポンツーン、パイル、杭", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 1309182, + "fid": "92535A3F", + "z": 12, + "x": 3502, + "y": 1736 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "海草", + "geom_type": "Point", + "count": 2086, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "海草", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 5817486, + "fid": "2E7F8CC5", + "z": 12, + "x": 3457, + "y": 1763 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "海草", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 5817487, + "fid": "913E9502", + "z": 12, + "x": 3457, + "y": 1763 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "海草", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 5817488, + "fid": "04F949D0", + "z": 12, + "x": 3457, + "y": 1763 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "海草", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 5817489, + "fid": "4F88FC9E", + "z": 12, + "x": 3457, + "y": 1763 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "海草", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 5817490, + "fid": "A1A9EC62", + "z": 12, + "x": 3457, + "y": 1763 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "p投錨注意障害物", + "geom_type": "Point", + "count": 1976, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "p投錨注意障害物", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3733865, + "fid": "80D2DC24", + "z": 12, + "x": 3503, + "y": 1738 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "p投錨注意障害物", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 1117546, + "fid": "33B95929", + "z": 12, + "x": 3503, + "y": 1728 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "p投錨注意障害物", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 2777259, + "fid": "9FB7A5A8", + "z": 12, + "x": 3500, + "y": 1740 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "p投錨注意障害物", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 5531467, + "fid": "6E34EEAB", + "z": 12, + "x": 3502, + "y": 1733 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "p投錨注意障害物", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 5531466, + "fid": "3F395350", + "z": 12, + "x": 3502, + "y": 1733 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P漁具定置箇所", + "canonical_object_type": "定置漁業", + "geom_type": "Polygon", + "count": 1878, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P漁具定置箇所", + "canonical_object_type": "定置漁業", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 3429700, + "fid": "FECA0EFA", + "z": 12, + "x": 3507, + "y": 1732 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P漁具定置箇所", + "canonical_object_type": "定置漁業", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 721638, + "fid": "6B7C9CC7", + "z": 12, + "x": 3501, + "y": 1736 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P漁具定置箇所", + "canonical_object_type": "定置漁業", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 5127032, + "fid": "F8D81DE2", + "z": 12, + "x": 3513, + "y": 1651 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P漁具定置箇所", + "canonical_object_type": "定置漁業", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 2626563, + "fid": "FECA0EFA", + "z": 12, + "x": 3508, + "y": 1732 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P漁具定置箇所", + "canonical_object_type": "定置漁業", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 2871562, + "fid": "4A357AB2", + "z": 12, + "x": 3503, + "y": 1735 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "L等深線", + "canonical_object_type": "湖沼等深線", + "geom_type": "LineString", + "count": 1698, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L等深線", + "canonical_object_type": "湖沼等深線", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 2756267, + "fid": "6BD73FB9", + "z": 12, + "x": 3533, + "y": 1673 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L等深線", + "canonical_object_type": "湖沼等深線", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 2756269, + "fid": "7B1E6A61", + "z": 12, + "x": 3533, + "y": 1673 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L等深線", + "canonical_object_type": "湖沼等深線", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 2756272, + "fid": "7A1B24E5", + "z": 12, + "x": 3533, + "y": 1673 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L等深線", + "canonical_object_type": "湖沼等深線", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 2756282, + "fid": "A11FACA1", + "z": 12, + "x": 3533, + "y": 1673 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L等深線", + "canonical_object_type": "湖沼等深線", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 2756273, + "fid": "49649CCE", + "z": 12, + "x": 3533, + "y": 1673 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "L741", + "canonical_object_type": "港則法による境界", + "geom_type": "LineString", + "count": 1665, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L741", + "canonical_object_type": "港則法による境界", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 5277886, + "fid": "6CC91E28", + "z": 12, + "x": 3499, + "y": 1738 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L741", + "canonical_object_type": "港則法による境界", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 1838251, + "fid": "FD4440C8", + "z": 12, + "x": 3504, + "y": 1738 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L741", + "canonical_object_type": "港則法による境界", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 3089603, + "fid": "0D784360", + "z": 12, + "x": 3503, + "y": 1739 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L741", + "canonical_object_type": "港則法による境界", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 3089604, + "fid": "E59AC6F9", + "z": 12, + "x": 3503, + "y": 1739 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L741", + "canonical_object_type": "港則法による境界", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 3089605, + "fid": "FB164273", + "z": 12, + "x": 3503, + "y": 1739 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "0-10m", + "geom_type": "Polygon", + "count": 1461, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-10m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 3742372, + "fid": "A341BC14", + "z": 12, + "x": 3454, + "y": 1764 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-10m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 4848640, + "fid": "2BDB9213", + "z": 12, + "x": 3474, + "y": 1753 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-10m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 4015139, + "fid": "2BDB9213", + "z": 12, + "x": 3474, + "y": 1754 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-10m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 4864916, + "fid": "AA7BE16F", + "z": 12, + "x": 3473, + "y": 1753 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-10m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6395818, + "fid": "A341BC14", + "z": 12, + "x": 3453, + "y": 1764 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p航路標識群", + "canonical_object_type": "灯浮標 (やぐら型)", + "geom_type": "Point", + "count": 1460, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "灯浮標 (やぐら型)", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 2113057, + "fid": "770E95D8", + "z": 12, + "x": 3472, + "y": 1755 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "灯浮標 (やぐら型)", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 4012659, + "fid": "137F0591", + "z": 12, + "x": 3500, + "y": 1737 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "灯浮標 (やぐら型)", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3733877, + "fid": "0192322A", + "z": 12, + "x": 3503, + "y": 1738 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "灯浮標 (やぐら型)", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3733878, + "fid": "37644C2A", + "z": 12, + "x": 3503, + "y": 1738 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "灯浮標 (やぐら型)", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3733879, + "fid": "0AA68BFA", + "z": 12, + "x": 3503, + "y": 1738 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p陸上構造物", + "canonical_object_type": "漁業協同組合", + "geom_type": "Point", + "count": 1457, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p陸上構造物", + "canonical_object_type": "漁業協同組合", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 2354904, + "fid": "48E57A0F", + "z": 12, + "x": 3446, + "y": 1760 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p陸上構造物", + "canonical_object_type": "漁業協同組合", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 2091851, + "fid": "71E68D1B", + "z": 12, + "x": 3494, + "y": 1736 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p陸上構造物", + "canonical_object_type": "漁業協同組合", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 351509, + "fid": "64141F98", + "z": 12, + "x": 3504, + "y": 1728 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p陸上構造物", + "canonical_object_type": "漁業協同組合", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3704160, + "fid": "EA2AE191", + "z": 12, + "x": 3497, + "y": 1738 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p陸上構造物", + "canonical_object_type": "漁業協同組合", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 1117574, + "fid": "64141F98", + "z": 12, + "x": 3503, + "y": 1728 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "未測海域", + "geom_type": "Polygon", + "count": 1438, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "未測海域", + "canonical_family": "mixed", + "geom_type": "Polygon", + "feature_id": 4059265, + "fid": "97FC94D6", + "z": 12, + "x": 3456, + "y": 1762 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "未測海域", + "canonical_family": "mixed", + "geom_type": "Polygon", + "feature_id": 6336353, + "fid": "58B89C9B", + "z": 12, + "x": 3472, + "y": 1754 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "未測海域", + "canonical_family": "mixed", + "geom_type": "Polygon", + "feature_id": 2354634, + "fid": "83EAC938", + "z": 12, + "x": 3446, + "y": 1760 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "未測海域", + "canonical_family": "mixed", + "geom_type": "Polygon", + "feature_id": 803800, + "fid": "7335170C", + "z": 12, + "x": 3471, + "y": 1755 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "未測海域", + "canonical_family": "mixed", + "geom_type": "Polygon", + "feature_id": 3610819, + "fid": "52765ED7", + "z": 12, + "x": 3456, + "y": 1760 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "7000-8000m", + "geom_type": "Polygon", + "count": 1381, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "7000-8000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 3606890, + "fid": "2819F28E", + "z": 12, + "x": 3485, + "y": 1770 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "7000-8000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 3413215, + "fid": "2819F28E", + "z": 12, + "x": 3485, + "y": 1769 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "7000-8000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 400944, + "fid": "2819F28E", + "z": 12, + "x": 3486, + "y": 1769 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "7000-8000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1014707, + "fid": "D61A115D", + "z": 12, + "x": 3489, + "y": 1766 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "7000-8000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 2339830, + "fid": "D61A115D", + "z": 12, + "x": 3490, + "y": 1766 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "L陸上構造物陸", + "canonical_object_type": "道路", + "geom_type": "MultiLineString", + "count": 1365, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L陸上構造物陸", + "canonical_object_type": "道路", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 6270466, + "fid": "1807893C", + "z": 12, + "x": 3446, + "y": 1761 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L陸上構造物陸", + "canonical_object_type": "道路", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 2354555, + "fid": "37F239FE", + "z": 12, + "x": 3446, + "y": 1760 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L陸上構造物陸", + "canonical_object_type": "道路", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 2761395, + "fid": "77612B77", + "z": 12, + "x": 3447, + "y": 1760 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L陸上構造物陸", + "canonical_object_type": "道路", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 3350956, + "fid": "562A09B3", + "z": 12, + "x": 3471, + "y": 1756 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L陸上構造物陸", + "canonical_object_type": "道路", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 4108164, + "fid": "812694B4", + "z": 12, + "x": 3460, + "y": 1760 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P潜堤", + "canonical_object_type": "潜提", + "geom_type": "Polygon", + "count": 1340, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P潜堤", + "canonical_object_type": "潜提", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 2761729, + "fid": "E669A0EB", + "z": 12, + "x": 3447, + "y": 1760 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P潜堤", + "canonical_object_type": "潜提", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 2761730, + "fid": "A0EBECD5", + "z": 12, + "x": 3447, + "y": 1760 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P潜堤", + "canonical_object_type": "潜提", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 2761731, + "fid": "96ED2E48", + "z": 12, + "x": 3447, + "y": 1760 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P潜堤", + "canonical_object_type": "潜提", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 2761732, + "fid": "212C469D", + "z": 12, + "x": 3447, + "y": 1760 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P潜堤", + "canonical_object_type": "潜提", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 2761733, + "fid": "4D00AC77", + "z": 12, + "x": 3447, + "y": 1760 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p航路標識群", + "canonical_object_type": "浮標 (やぐら型)", + "geom_type": "Point", + "count": 1313, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "浮標 (やぐら型)", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 2816411, + "fid": "422DDF7C", + "z": 12, + "x": 3458, + "y": 1758 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "浮標 (やぐら型)", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 5026057, + "fid": "27B246A1", + "z": 12, + "x": 3493, + "y": 1741 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "浮標 (やぐら型)", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 929054, + "fid": "07962E26", + "z": 12, + "x": 3455, + "y": 1762 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "浮標 (やぐら型)", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 929055, + "fid": "33A8B8ED", + "z": 12, + "x": 3455, + "y": 1762 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "浮標 (やぐら型)", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 929056, + "fid": "39C907F5", + "z": 12, + "x": 3455, + "y": 1762 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "撤去跡", + "geom_type": "Polygon", + "count": 1271, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "撤去跡", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 2761559, + "fid": "5A99B3C0", + "z": 12, + "x": 3447, + "y": 1760 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "撤去跡", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 351323, + "fid": "2C7C977F", + "z": 12, + "x": 3504, + "y": 1728 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "撤去跡", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 351324, + "fid": "0B7DB166", + "z": 12, + "x": 3504, + "y": 1728 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "撤去跡", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1117184, + "fid": "5FF3F92A", + "z": 12, + "x": 3503, + "y": 1728 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "撤去跡", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1272717, + "fid": "80750D57", + "z": 12, + "x": 3501, + "y": 1739 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p航路標識群", + "canonical_object_type": "橋梁灯", + "geom_type": "Point", + "count": 1250, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "橋梁灯", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 5531512, + "fid": "9BC70A66", + "z": 12, + "x": 3502, + "y": 1733 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "橋梁灯", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 5531513, + "fid": "04D0404F", + "z": 12, + "x": 3502, + "y": 1733 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "橋梁灯", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 2449313, + "fid": "5201577E", + "z": 12, + "x": 3473, + "y": 1755 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "橋梁灯", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 5885325, + "fid": "37E04346", + "z": 12, + "x": 3460, + "y": 1762 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "橋梁灯", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 5885326, + "fid": "390D55A4", + "z": 12, + "x": 3460, + "y": 1762 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P陸域", + "canonical_object_type": "P陸域", + "geom_type": "MultiPolygon", + "count": 1188, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P陸域", + "canonical_object_type": "P陸域", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 4059307, + "fid": "CCE84815", + "z": 12, + "x": 3456, + "y": 1762 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P陸域", + "canonical_object_type": "P陸域", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1318163, + "fid": "936E1646", + "z": 12, + "x": 3456, + "y": 1766 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P陸域", + "canonical_object_type": "P陸域", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 5807574, + "fid": "7843E684", + "z": 12, + "x": 3453, + "y": 1745 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P陸域", + "canonical_object_type": "P陸域", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 3994527, + "fid": "CCE84815", + "z": 12, + "x": 3457, + "y": 1762 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P陸域", + "canonical_object_type": "P陸域", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 4570629, + "fid": "AD33FE98", + "z": 12, + "x": 3462, + "y": 1758 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p航路標識群", + "canonical_object_type": "立標", + "geom_type": "Point", + "count": 1181, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "立標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 250025, + "fid": "DB3D660E", + "z": 12, + "x": 3466, + "y": 1757 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "立標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 250026, + "fid": "7E97BA97", + "z": 12, + "x": 3466, + "y": 1757 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "立標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 250027, + "fid": "D5A190E2", + "z": 12, + "x": 3466, + "y": 1757 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "立標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3610951, + "fid": "42E4449C", + "z": 12, + "x": 3456, + "y": 1760 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "立標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3610952, + "fid": "7F5C638E", + "z": 12, + "x": 3456, + "y": 1760 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "サンドウェーブ", + "geom_type": "Point", + "count": 1178, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "サンドウェーブ", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 2701096, + "fid": "48D8CB78", + "z": 12, + "x": 3515, + "y": 1645 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "サンドウェーブ", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 2701097, + "fid": "CF6032AF", + "z": 12, + "x": 3515, + "y": 1645 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "サンドウェーブ", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3541622, + "fid": "56AC2D05", + "z": 12, + "x": 3515, + "y": 1646 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "サンドウェーブ", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3541623, + "fid": "B180CC51", + "z": 12, + "x": 3515, + "y": 1646 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "サンドウェーブ", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3541624, + "fid": "F3B6686B", + "z": 12, + "x": 3515, + "y": 1646 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p航行危険障害物", + "canonical_object_type": "干出岩", + "geom_type": "Point", + "count": 1178, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航行危険障害物", + "canonical_object_type": "干出岩", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 5807576, + "fid": "26C78D5B", + "z": 12, + "x": 3453, + "y": 1745 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航行危険障害物", + "canonical_object_type": "干出岩", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3994534, + "fid": "546FC197", + "z": 12, + "x": 3457, + "y": 1762 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航行危険障害物", + "canonical_object_type": "干出岩", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3994535, + "fid": "A3395477", + "z": 12, + "x": 3457, + "y": 1762 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航行危険障害物", + "canonical_object_type": "干出岩", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 2629076, + "fid": "EF1FD50E", + "z": 12, + "x": 3461, + "y": 1759 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航行危険障害物", + "canonical_object_type": "干出岩", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 6395878, + "fid": "4BF97F6B", + "z": 12, + "x": 3453, + "y": 1764 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "急潮・波紋・激潮", + "geom_type": "Point", + "count": 1100, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "急潮・波紋・激潮", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 1625110, + "fid": "98D50BAD", + "z": 12, + "x": 3436, + "y": 1753 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "急潮・波紋・激潮", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 1625111, + "fid": "35393FA4", + "z": 12, + "x": 3436, + "y": 1753 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "急潮・波紋・激潮", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 4556004, + "fid": "7199DD64", + "z": 12, + "x": 3436, + "y": 1754 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "急潮・波紋・激潮", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 4556005, + "fid": "D145703B", + "z": 12, + "x": 3436, + "y": 1754 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "急潮・波紋・激潮", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 1418623, + "fid": "E8D72DEB", + "z": 12, + "x": 3452, + "y": 1744 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "10-20m", + "geom_type": "MultiPolygon", + "count": 995, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "10-20m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 4593926, + "fid": "C57872E0", + "z": 12, + "x": 3448, + "y": 1760 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "10-20m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 2629021, + "fid": "1793C814", + "z": 12, + "x": 3461, + "y": 1759 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "10-20m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 529217, + "fid": "19A6D64D", + "z": 12, + "x": 3458, + "y": 1761 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "10-20m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 249938, + "fid": "B65BBCEB", + "z": 12, + "x": 3466, + "y": 1757 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "10-20m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 3665194, + "fid": "90963245", + "z": 12, + "x": 3453, + "y": 1744 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "5-10m", + "geom_type": "MultiPolygon", + "count": 877, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5-10m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 3994452, + "fid": "175252A4", + "z": 12, + "x": 3457, + "y": 1762 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5-10m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 2629030, + "fid": "C06F864C", + "z": 12, + "x": 3461, + "y": 1759 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5-10m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 529234, + "fid": "F8EAA6CD", + "z": 12, + "x": 3458, + "y": 1761 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5-10m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 3380586, + "fid": "C06F864C", + "z": 12, + "x": 3460, + "y": 1763 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5-10m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 3903337, + "fid": "C529C147", + "z": 12, + "x": 3456, + "y": 1765 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p高さ制限", + "canonical_object_type": "p高さ制限", + "geom_type": "Point", + "count": 858, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p高さ制限", + "canonical_object_type": "p高さ制限", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 1021184, + "fid": "01A58C66", + "z": 12, + "x": 3473, + "y": 1757 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p高さ制限", + "canonical_object_type": "p高さ制限", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 1117578, + "fid": "95A26FC7", + "z": 12, + "x": 3503, + "y": 1728 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p高さ制限", + "canonical_object_type": "p高さ制限", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 2617943, + "fid": "DFDB6C2D", + "z": 12, + "x": 3503, + "y": 1733 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p高さ制限", + "canonical_object_type": "p高さ制限", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 422155, + "fid": "9004D6CC", + "z": 12, + "x": 3504, + "y": 1736 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p高さ制限", + "canonical_object_type": "p高さ制限", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 5531516, + "fid": "6A866032", + "z": 12, + "x": 3502, + "y": 1733 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p航行危険障害物", + "canonical_object_type": "孤立危険物", + "geom_type": "Point", + "count": 824, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航行危険障害物", + "canonical_object_type": "孤立危険物", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 1015021, + "fid": "32239646", + "z": 12, + "x": 3454, + "y": 1762 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航行危険障害物", + "canonical_object_type": "孤立危険物", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 1067514, + "fid": "A318FB5F", + "z": 12, + "x": 3455, + "y": 1763 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航行危険障害物", + "canonical_object_type": "孤立危険物", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 4015178, + "fid": "571E1C8D", + "z": 12, + "x": 3474, + "y": 1754 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航行危険障害物", + "canonical_object_type": "孤立危険物", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 2761862, + "fid": "41BA0119", + "z": 12, + "x": 3447, + "y": 1760 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航行危険障害物", + "canonical_object_type": "孤立危険物", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 4478978, + "fid": "571E1C8D", + "z": 12, + "x": 3474, + "y": 1755 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P穴", + "canonical_object_type": "P穴", + "geom_type": "MultiPolygon", + "count": 775, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P穴", + "canonical_object_type": "P穴", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 3994553, + "fid": "06D87451", + "z": 12, + "x": 3446, + "y": 1763 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P穴", + "canonical_object_type": "P穴", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 2760413, + "fid": "743EE596", + "z": 12, + "x": 3449, + "y": 1758 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P穴", + "canonical_object_type": "P穴", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 5869681, + "fid": "5ED00BCE", + "z": 12, + "x": 3450, + "y": 1768 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P穴", + "canonical_object_type": "P穴", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6167993, + "fid": "06D87451", + "z": 12, + "x": 3450, + "y": 1761 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P穴", + "canonical_object_type": "P穴", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1389300, + "fid": "743EE596", + "z": 12, + "x": 3452, + "y": 1755 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p航行危険障害物", + "canonical_object_type": "ドルフィン", + "geom_type": "Point", + "count": 756, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航行危険障害物", + "canonical_object_type": "ドルフィン", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3090621, + "fid": "1CD945AE", + "z": 12, + "x": 3503, + "y": 1739 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航行危険障害物", + "canonical_object_type": "ドルフィン", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3704153, + "fid": "916F998B", + "z": 12, + "x": 3497, + "y": 1738 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航行危険障害物", + "canonical_object_type": "ドルフィン", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 2871809, + "fid": "F5C36EE7", + "z": 12, + "x": 3503, + "y": 1735 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航行危険障害物", + "canonical_object_type": "ドルフィン", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 2871810, + "fid": "4C1BF55F", + "z": 12, + "x": 3503, + "y": 1735 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航行危険障害物", + "canonical_object_type": "ドルフィン", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 2871811, + "fid": "E56E3947", + "z": 12, + "x": 3503, + "y": 1735 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "L海底線", + "canonical_object_type": "海底線 (電力)", + "geom_type": "LineString", + "count": 735, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L海底線", + "canonical_object_type": "海底線 (電力)", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 249907, + "fid": "6DB72EA4", + "z": 12, + "x": 3466, + "y": 1757 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L海底線", + "canonical_object_type": "海底線 (電力)", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 3610709, + "fid": "12213B32", + "z": 12, + "x": 3456, + "y": 1760 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L海底線", + "canonical_object_type": "海底線 (電力)", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 3610710, + "fid": "306875B3", + "z": 12, + "x": 3456, + "y": 1760 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L海底線", + "canonical_object_type": "海底線 (電力)", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 3610708, + "fid": "F3BBA905", + "z": 12, + "x": 3456, + "y": 1760 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L海底線", + "canonical_object_type": "海底線 (電力)", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 579045, + "fid": "6DB72EA4", + "z": 12, + "x": 3466, + "y": 1758 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P754ククリ", + "canonical_object_type": "P754ククリ", + "geom_type": "LineString", + "count": 730, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P754ククリ", + "canonical_object_type": "P754ククリ", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 4412058, + "fid": "149B5C0F", + "z": 12, + "x": 3505, + "y": 1733 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P754ククリ", + "canonical_object_type": "P754ククリ", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 3987357, + "fid": "3B86B41A", + "z": 12, + "x": 3496, + "y": 1738 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P754ククリ", + "canonical_object_type": "P754ククリ", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 3987358, + "fid": "6D20602A", + "z": 12, + "x": 3496, + "y": 1738 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P754ククリ", + "canonical_object_type": "P754ククリ", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 3804610, + "fid": "185ED300", + "z": 12, + "x": 3503, + "y": 1736 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P754ククリ", + "canonical_object_type": "P754ククリ", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 5593196, + "fid": "434C607F", + "z": 12, + "x": 3504, + "y": 1732 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P施設・境界線等", + "canonical_object_type": "養殖場", + "geom_type": "Polygon", + "count": 716, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P施設・境界線等", + "canonical_object_type": "養殖場", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 4412183, + "fid": "EC80B343", + "z": 12, + "x": 3505, + "y": 1733 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P施設・境界線等", + "canonical_object_type": "養殖場", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 3987888, + "fid": "D34E4F34", + "z": 12, + "x": 3496, + "y": 1738 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P施設・境界線等", + "canonical_object_type": "養殖場", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 3987889, + "fid": "AA92D46C", + "z": 12, + "x": 3496, + "y": 1738 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P施設・境界線等", + "canonical_object_type": "養殖場", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1309005, + "fid": "57F1A014", + "z": 12, + "x": 3502, + "y": 1736 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P施設・境界線等", + "canonical_object_type": "養殖場", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 3804982, + "fid": "57F1A014", + "z": 12, + "x": 3503, + "y": 1736 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "20-100m", + "geom_type": "MultiPolygon", + "count": 664, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "20-100m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1673157, + "fid": "AD717985", + "z": 12, + "x": 3445, + "y": 1721 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "20-100m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1261587, + "fid": "AD717985", + "z": 12, + "x": 3446, + "y": 1721 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "20-100m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 2116840, + "fid": "AD717985", + "z": 12, + "x": 3459, + "y": 1720 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "20-100m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 4980689, + "fid": "48A38EDC", + "z": 12, + "x": 3454, + "y": 1745 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "20-100m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1407737, + "fid": "48A38EDC", + "z": 12, + "x": 3454, + "y": 1744 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "8000-9000m", + "geom_type": "Polygon", + "count": 659, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "8000-9000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 654872, + "fid": "3E968A5B", + "z": 12, + "x": 3659, + "y": 1638 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "8000-9000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 223611, + "fid": "3E968A5B", + "z": 12, + "x": 3659, + "y": 1637 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "8000-9000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 5930394, + "fid": "3E968A5B", + "z": 12, + "x": 3660, + "y": 1633 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "8000-9000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 3684476, + "fid": "3E968A5B", + "z": 12, + "x": 3660, + "y": 1631 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "8000-9000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 5532225, + "fid": "3E968A5B", + "z": 12, + "x": 3660, + "y": 1636 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "L海底線", + "canonical_object_type": "海底輸送管 (水)", + "geom_type": "LineString", + "count": 649, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L海底線", + "canonical_object_type": "海底輸送管 (水)", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 3994375, + "fid": "9380A1D3", + "z": 12, + "x": 3457, + "y": 1762 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L海底線", + "canonical_object_type": "海底輸送管 (水)", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 3610711, + "fid": "4136BF95", + "z": 12, + "x": 3456, + "y": 1760 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L海底線", + "canonical_object_type": "海底輸送管 (水)", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 2838686, + "fid": "9380A1D3", + "z": 12, + "x": 3458, + "y": 1762 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L海底線", + "canonical_object_type": "海底輸送管 (水)", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 5816481, + "fid": "51845571", + "z": 12, + "x": 3457, + "y": 1763 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L海底線", + "canonical_object_type": "海底輸送管 (水)", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 2088977, + "fid": "51845571", + "z": 12, + "x": 3458, + "y": 1763 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p航路標識群", + "canonical_object_type": "灯標", + "geom_type": "Point", + "count": 630, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "灯標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 4055053, + "fid": "CB8DC6E1", + "z": 12, + "x": 3472, + "y": 1753 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "灯標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 6336409, + "fid": "8F669990", + "z": 12, + "x": 3472, + "y": 1754 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "灯標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 4864997, + "fid": "2BE4FF79", + "z": 12, + "x": 3473, + "y": 1753 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "灯標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3610955, + "fid": "F7EF7034", + "z": 12, + "x": 3456, + "y": 1760 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "灯標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3610956, + "fid": "B2318F03", + "z": 12, + "x": 3456, + "y": 1760 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "500-1000m", + "geom_type": "MultiPolygon", + "count": 627, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "500-1000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6017392, + "fid": "06D87451", + "z": 12, + "x": 3445, + "y": 1764 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "500-1000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 4263647, + "fid": "06D87451", + "z": 12, + "x": 3445, + "y": 1748 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "500-1000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6607190, + "fid": "06D87451", + "z": 12, + "x": 3445, + "y": 1747 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "500-1000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 4933847, + "fid": "06D87451", + "z": 12, + "x": 3445, + "y": 1746 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "500-1000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 4127769, + "fid": "06D87451", + "z": 12, + "x": 3444, + "y": 1759 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p施設・境界線等", + "canonical_object_type": "一般港湾 (港則法区域、重要港湾)", + "geom_type": "Point", + "count": 610, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p施設・境界線等", + "canonical_object_type": "一般港湾 (港則法区域、重要港湾)", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 1838775, + "fid": "852E4E78", + "z": 12, + "x": 3504, + "y": 1738 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p施設・境界線等", + "canonical_object_type": "一般港湾 (港則法区域、重要港湾)", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 1355419, + "fid": "852E4E78", + "z": 12, + "x": 3504, + "y": 1737 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p施設・境界線等", + "canonical_object_type": "一般港湾 (港則法区域、重要港湾)", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 2617925, + "fid": "39DE8A76", + "z": 12, + "x": 3503, + "y": 1733 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p施設・境界線等", + "canonical_object_type": "一般港湾 (港則法区域、重要港湾)", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 5531477, + "fid": "FF20633E", + "z": 12, + "x": 3502, + "y": 1733 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p施設・境界線等", + "canonical_object_type": "一般港湾 (港則法区域、重要港湾)", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 5531478, + "fid": "F7EE494E", + "z": 12, + "x": 3502, + "y": 1733 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p航路標識群", + "canonical_object_type": "円錐型浮標", + "geom_type": "Point", + "count": 589, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "円錐型浮標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 1309232, + "fid": "09F9A7BC", + "z": 12, + "x": 3502, + "y": 1736 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "円錐型浮標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 5531514, + "fid": "1B4AC267", + "z": 12, + "x": 3502, + "y": 1733 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "円錐型浮標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 2034368, + "fid": "BBDFED31", + "z": 12, + "x": 3513, + "y": 1654 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "円錐型浮標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 2034369, + "fid": "F1CAF635", + "z": 12, + "x": 3513, + "y": 1654 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "円錐型浮標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3179259, + "fid": "7AA93F5E", + "z": 12, + "x": 3504, + "y": 1733 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "2-5m", + "geom_type": "MultiPolygon", + "count": 563, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2-5m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 3994448, + "fid": "B7B6199B", + "z": 12, + "x": 3457, + "y": 1762 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2-5m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 529230, + "fid": "AD1C18A5", + "z": 12, + "x": 3458, + "y": 1761 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2-5m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 3380580, + "fid": "D9BA0654", + "z": 12, + "x": 3460, + "y": 1763 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2-5m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 3610781, + "fid": "FB8F9918", + "z": 12, + "x": 3456, + "y": 1760 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2-5m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 3903326, + "fid": "3D5ABE2E", + "z": 12, + "x": 3456, + "y": 1765 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "L基本線", + "canonical_object_type": "一本線で表わす潜提", + "geom_type": "LineString", + "count": 544, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L基本線", + "canonical_object_type": "一本線で表わす潜提", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 2091091, + "fid": "954E8B30", + "z": 12, + "x": 3494, + "y": 1736 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L基本線", + "canonical_object_type": "一本線で表わす潜提", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 2091092, + "fid": "F1638A1F", + "z": 12, + "x": 3494, + "y": 1736 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L基本線", + "canonical_object_type": "一本線で表わす潜提", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 6530629, + "fid": "419524C9", + "z": 12, + "x": 3518, + "y": 1633 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L基本線", + "canonical_object_type": "一本線で表わす潜提", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 6530630, + "fid": "23EDC032", + "z": 12, + "x": 3518, + "y": 1633 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L基本線", + "canonical_object_type": "一本線で表わす潜提", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 6530631, + "fid": "50988977", + "z": 12, + "x": 3518, + "y": 1633 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p施設・境界線等", + "canonical_object_type": "マリーナ", + "geom_type": "Point", + "count": 539, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p施設・境界線等", + "canonical_object_type": "マリーナ", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 4209374, + "fid": "98BD0407", + "z": 12, + "x": 3502, + "y": 1735 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p施設・境界線等", + "canonical_object_type": "マリーナ", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3179241, + "fid": "DD81E01C", + "z": 12, + "x": 3504, + "y": 1733 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p施設・境界線等", + "canonical_object_type": "マリーナ", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 2285982, + "fid": "85017068", + "z": 12, + "x": 3502, + "y": 1737 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p施設・境界線等", + "canonical_object_type": "マリーナ", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 1608499, + "fid": "79A60A0F", + "z": 12, + "x": 3501, + "y": 1738 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p施設・境界線等", + "canonical_object_type": "マリーナ", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 4377139, + "fid": "5137D944", + "z": 12, + "x": 3473, + "y": 1756 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "1000-2000m", + "geom_type": "MultiPolygon", + "count": 532, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "1000-2000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6336727, + "fid": "743EE596", + "z": 12, + "x": 3445, + "y": 1765 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "1000-2000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 203602, + "fid": "743EE596", + "z": 12, + "x": 3444, + "y": 1764 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "1000-2000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6607191, + "fid": "743EE596", + "z": 12, + "x": 3445, + "y": 1747 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "1000-2000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 3340095, + "fid": "743EE596", + "z": 12, + "x": 3443, + "y": 1764 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "1000-2000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 4414545, + "fid": "743EE596", + "z": 12, + "x": 3443, + "y": 1757 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "L高さ制限", + "canonical_object_type": "架空線、送電線", + "geom_type": "LineString", + "count": 524, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L高さ制限", + "canonical_object_type": "架空線、送電線", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 5593195, + "fid": "AC66912E", + "z": 12, + "x": 3504, + "y": 1732 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L高さ制限", + "canonical_object_type": "架空線、送電線", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 3178455, + "fid": "AC66912E", + "z": 12, + "x": 3504, + "y": 1733 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L高さ制限", + "canonical_object_type": "架空線、送電線", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 6167459, + "fid": "40A37244", + "z": 12, + "x": 3519, + "y": 1647 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L高さ制限", + "canonical_object_type": "架空線、送電線", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 1936596, + "fid": "F4D17FC2", + "z": 12, + "x": 3513, + "y": 1653 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L高さ制限", + "canonical_object_type": "架空線、送電線", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 1936597, + "fid": "D386D9CB", + "z": 12, + "x": 3513, + "y": 1653 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P施設・境界線等ククリ", + "canonical_object_type": "P施設・境界線等ククリ", + "geom_type": "LineString", + "count": 521, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P施設・境界線等ククリ", + "canonical_object_type": "P施設・境界線等ククリ", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 2112913, + "fid": "D10FFF57", + "z": 12, + "x": 3472, + "y": 1755 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P施設・境界線等ククリ", + "canonical_object_type": "P施設・境界線等ククリ", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 2112914, + "fid": "B535D9EF", + "z": 12, + "x": 3472, + "y": 1755 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P施設・境界線等ククリ", + "canonical_object_type": "P施設・境界線等ククリ", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 2829388, + "fid": "0E50C51A", + "z": 12, + "x": 3506, + "y": 1739 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P施設・境界線等ククリ", + "canonical_object_type": "P施設・境界線等ククリ", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 4766752, + "fid": "0E50C51A", + "z": 12, + "x": 3506, + "y": 1740 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P施設・境界線等ククリ", + "canonical_object_type": "P施設・境界線等ククリ", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 1900444, + "fid": "0E50C51A", + "z": 12, + "x": 3506, + "y": 1741 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "干潮帯", + "geom_type": "MultiPolygon", + "count": 510, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "干潮帯", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 4059262, + "fid": "D9A3253F", + "z": 12, + "x": 3456, + "y": 1762 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "干潮帯", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 4059263, + "fid": "4A8A43A0", + "z": 12, + "x": 3456, + "y": 1762 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "干潮帯", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 3994457, + "fid": "AF4E3E6C", + "z": 12, + "x": 3457, + "y": 1762 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "干潮帯", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 2629040, + "fid": "187E9AD6", + "z": 12, + "x": 3461, + "y": 1759 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "干潮帯", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 529235, + "fid": "AF4E3E6C", + "z": 12, + "x": 3458, + "y": 1761 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "0-2m", + "geom_type": "MultiPolygon", + "count": 484, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-2m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6152790, + "fid": "A99815C0", + "z": 12, + "x": 3457, + "y": 1760 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-2m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 529227, + "fid": "B0370531", + "z": 12, + "x": 3458, + "y": 1761 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-2m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 803774, + "fid": "C6AB161B", + "z": 12, + "x": 3471, + "y": 1755 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-2m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 3380575, + "fid": "964B2E81", + "z": 12, + "x": 3460, + "y": 1763 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-2m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 3380576, + "fid": "22749A2B", + "z": 12, + "x": 3460, + "y": 1763 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "200-500m", + "geom_type": "MultiPolygon", + "count": 458, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "200-500m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6172494, + "fid": "E654FCFF", + "z": 12, + "x": 3440, + "y": 1760 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "200-500m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 5477911, + "fid": "E654FCFF", + "z": 12, + "x": 3443, + "y": 1758 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "200-500m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 3340626, + "fid": "E2915581", + "z": 12, + "x": 3438, + "y": 1751 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "200-500m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 4865322, + "fid": "E2915581", + "z": 12, + "x": 3442, + "y": 1746 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "200-500m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 619958, + "fid": "E654FCFF", + "z": 12, + "x": 3441, + "y": 1760 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p施設・境界線等", + "canonical_object_type": "小港湾 (避難港、地方港湾)", + "geom_type": "Point", + "count": 454, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p施設・境界線等", + "canonical_object_type": "小港湾 (避難港、地方港湾)", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 1067513, + "fid": "F910010D", + "z": 12, + "x": 3455, + "y": 1763 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p施設・境界線等", + "canonical_object_type": "小港湾 (避難港、地方港湾)", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 250023, + "fid": "EE9111C7", + "z": 12, + "x": 3466, + "y": 1757 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p施設・境界線等", + "canonical_object_type": "小港湾 (避難港、地方港湾)", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 2761861, + "fid": "A461C066", + "z": 12, + "x": 3447, + "y": 1760 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p施設・境界線等", + "canonical_object_type": "小港湾 (避難港、地方港湾)", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3610948, + "fid": "957E1D86", + "z": 12, + "x": 3456, + "y": 1760 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p施設・境界線等", + "canonical_object_type": "小港湾 (避難港、地方港湾)", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3610949, + "fid": "98C9B622", + "z": 12, + "x": 3456, + "y": 1760 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "L等深線", + "canonical_object_type": "湖沼等深線", + "geom_type": "MultiLineString", + "count": 448, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L等深線", + "canonical_object_type": "湖沼等深線", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 2756268, + "fid": "77275D9C", + "z": 12, + "x": 3533, + "y": 1673 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L等深線", + "canonical_object_type": "湖沼等深線", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 2756303, + "fid": "34548F72", + "z": 12, + "x": 3533, + "y": 1673 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L等深線", + "canonical_object_type": "湖沼等深線", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 2756323, + "fid": "F5FF7035", + "z": 12, + "x": 3533, + "y": 1673 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L等深線", + "canonical_object_type": "湖沼等深線", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 2756325, + "fid": "F417A582", + "z": 12, + "x": 3533, + "y": 1673 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L等深線", + "canonical_object_type": "湖沼等深線", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 2756329, + "fid": "1F2B0FCF", + "z": 12, + "x": 3533, + "y": 1673 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "2000-3000m", + "geom_type": "MultiPolygon", + "count": 445, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2000-3000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1523226, + "fid": "02940A0C", + "z": 12, + "x": 3445, + "y": 1770 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2000-3000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 4087597, + "fid": "02940A0C", + "z": 12, + "x": 3443, + "y": 1771 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2000-3000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 4505199, + "fid": "02940A0C", + "z": 12, + "x": 3444, + "y": 1769 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2000-3000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 288134, + "fid": "0C643A77", + "z": 12, + "x": 3436, + "y": 1763 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2000-3000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6316283, + "fid": "02940A0C", + "z": 12, + "x": 3443, + "y": 1770 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P航路ククリ", + "canonical_object_type": "P航路ククリ", + "geom_type": "LineString", + "count": 427, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P航路ククリ", + "canonical_object_type": "P航路ククリ", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 6129303, + "fid": "BAB3AF62", + "z": 12, + "x": 3500, + "y": 1738 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P航路ククリ", + "canonical_object_type": "P航路ククリ", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 6129304, + "fid": "EF4E687B", + "z": 12, + "x": 3500, + "y": 1738 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P航路ククリ", + "canonical_object_type": "P航路ククリ", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 4816119, + "fid": "F85A71F4", + "z": 12, + "x": 3524, + "y": 1653 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P航路ククリ", + "canonical_object_type": "P航路ククリ", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 2304564, + "fid": "C2DEA6C2", + "z": 12, + "x": 3531, + "y": 1650 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P航路ククリ", + "canonical_object_type": "P航路ククリ", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 2261615, + "fid": "0658407A", + "z": 12, + "x": 3523, + "y": 1648 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "100-200m", + "geom_type": "MultiPolygon", + "count": 409, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "100-200m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6519897, + "fid": "77AA5E0A", + "z": 12, + "x": 3444, + "y": 1723 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "100-200m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 444816, + "fid": "77AA5E0A", + "z": 12, + "x": 3447, + "y": 1742 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "100-200m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 3333345, + "fid": "77AA5E0A", + "z": 12, + "x": 3447, + "y": 1719 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "100-200m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6137111, + "fid": "77AA5E0A", + "z": 12, + "x": 3451, + "y": 1745 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "100-200m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 386325, + "fid": "77AA5E0A", + "z": 12, + "x": 3460, + "y": 1724 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "陸上水域", + "geom_type": "Polygon", + "count": 406, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "陸上水域", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 4108306, + "fid": "A38487E8", + "z": 12, + "x": 3460, + "y": 1760 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "陸上水域", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 4108307, + "fid": "DC3EB664", + "z": 12, + "x": 3460, + "y": 1760 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "陸上水域", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6094006, + "fid": "D8E07027", + "z": 12, + "x": 3474, + "y": 1756 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "陸上水域", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 2846609, + "fid": "2438DABF", + "z": 12, + "x": 3490, + "y": 1736 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "陸上水域", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 2091616, + "fid": "2C6B925D", + "z": 12, + "x": 3494, + "y": 1736 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "全沈没船 (危険なし)", + "geom_type": "Point", + "count": 404, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "全沈没船 (危険なし)", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 4556006, + "fid": "148CC311", + "z": 12, + "x": 3436, + "y": 1754 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "全沈没船 (危険なし)", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 1690119, + "fid": "718B5FDF", + "z": 12, + "x": 3444, + "y": 1751 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "全沈没船 (危険なし)", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 4004870, + "fid": "E755C3EF", + "z": 12, + "x": 3436, + "y": 1757 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "全沈没船 (危険なし)", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 2072240, + "fid": "ABA079EA", + "z": 12, + "x": 3448, + "y": 1738 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "全沈没船 (危険なし)", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 1897774, + "fid": "914D1C8C", + "z": 12, + "x": 3480, + "y": 1711 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "L基本線", + "canonical_object_type": "一本線で表わす撤去跡", + "geom_type": "LineString", + "count": 391, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L基本線", + "canonical_object_type": "一本線で表わす撤去跡", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 5120641, + "fid": "B8D10F2E", + "z": 12, + "x": 3490, + "y": 1737 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L基本線", + "canonical_object_type": "一本線で表わす撤去跡", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 5120642, + "fid": "443C1102", + "z": 12, + "x": 3490, + "y": 1737 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L基本線", + "canonical_object_type": "一本線で表わす撤去跡", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 5120643, + "fid": "0F0F53CB", + "z": 12, + "x": 3490, + "y": 1737 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L基本線", + "canonical_object_type": "一本線で表わす撤去跡", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 5120644, + "fid": "BE70460E", + "z": 12, + "x": 3490, + "y": 1737 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L基本線", + "canonical_object_type": "一本線で表わす撤去跡", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 5120645, + "fid": "E2D84D4F", + "z": 12, + "x": 3490, + "y": 1737 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p航路標識群", + "canonical_object_type": "円柱型浮標", + "geom_type": "Point", + "count": 372, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "円柱型浮標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3092991, + "fid": "A3188FB2", + "z": 12, + "x": 3455, + "y": 1761 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "円柱型浮標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3092992, + "fid": "53626821", + "z": 12, + "x": 3455, + "y": 1761 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "円柱型浮標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 4414271, + "fid": "FBCA6CF8", + "z": 12, + "x": 3504, + "y": 1734 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "円柱型浮標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 4414272, + "fid": "C1DC5583", + "z": 12, + "x": 3504, + "y": 1734 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "円柱型浮標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 4414273, + "fid": "E746136A", + "z": 12, + "x": 3504, + "y": 1734 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "0-5m", + "geom_type": "MultiPolygon", + "count": 357, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-5m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 4059257, + "fid": "58FF5807", + "z": 12, + "x": 3456, + "y": 1762 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-5m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 2629027, + "fid": "E61C694D", + "z": 12, + "x": 3461, + "y": 1759 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-5m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 2606835, + "fid": "1012691D", + "z": 12, + "x": 3467, + "y": 1757 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-5m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 3665206, + "fid": "1A0D0490", + "z": 12, + "x": 3453, + "y": 1744 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-5m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6648280, + "fid": "E61C694D", + "z": 12, + "x": 3462, + "y": 1760 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "2-10m", + "geom_type": "Polygon", + "count": 340, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2-10m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 2626431, + "fid": "A2B7A627", + "z": 12, + "x": 3508, + "y": 1732 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2-10m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 854103, + "fid": "A2B7A627", + "z": 12, + "x": 3508, + "y": 1731 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2-10m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1272656, + "fid": "78E9E2B0", + "z": 12, + "x": 3501, + "y": 1739 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2-10m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1272657, + "fid": "D5CC4F62", + "z": 12, + "x": 3501, + "y": 1739 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2-10m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 2617469, + "fid": "56BBD698", + "z": 12, + "x": 3503, + "y": 1733 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "海底設置物、放水口、取水口", + "geom_type": "Point", + "count": 339, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "海底設置物、放水口、取水口", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 2113049, + "fid": "35F1D27F", + "z": 12, + "x": 3472, + "y": 1755 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "海底設置物、放水口、取水口", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 2681351, + "fid": "10E14094", + "z": 12, + "x": 3501, + "y": 1740 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "海底設置物、放水口、取水口", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 2681352, + "fid": "1DE4818E", + "z": 12, + "x": 3501, + "y": 1740 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "海底設置物、放水口、取水口", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 1838774, + "fid": "CBC7E254", + "z": 12, + "x": 3504, + "y": 1738 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "海底設置物、放水口、取水口", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3733867, + "fid": "CBC7E254", + "z": 12, + "x": 3503, + "y": 1738 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "5000-6000m", + "geom_type": "MultiPolygon", + "count": 318, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5000-6000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 2983593, + "fid": "CBB6C786", + "z": 12, + "x": 3444, + "y": 1781 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5000-6000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 2064492, + "fid": "CBB6C786", + "z": 12, + "x": 3451, + "y": 1786 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5000-6000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 2889703, + "fid": "CBB6C786", + "z": 12, + "x": 3451, + "y": 1787 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5000-6000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 2797624, + "fid": "CBB6C786", + "z": 12, + "x": 3452, + "y": 1785 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5000-6000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 4718504, + "fid": "CBB6C786", + "z": 12, + "x": 3453, + "y": 1789 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "4000-5000m", + "geom_type": "MultiPolygon", + "count": 300, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "4000-5000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 3825249, + "fid": "C87811B8", + "z": 12, + "x": 3437, + "y": 1784 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "4000-5000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 3422249, + "fid": "C87811B8", + "z": 12, + "x": 3437, + "y": 1772 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "4000-5000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 3956128, + "fid": "C87811B8", + "z": 12, + "x": 3438, + "y": 1784 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "4000-5000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 3591821, + "fid": "C87811B8", + "z": 12, + "x": 3438, + "y": 1774 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "4000-5000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 5796309, + "fid": "C87811B8", + "z": 12, + "x": 3437, + "y": 1774 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "3000-4000m", + "geom_type": "MultiPolygon", + "count": 297, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "3000-4000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 5852888, + "fid": "5ED00BCE", + "z": 12, + "x": 3444, + "y": 1771 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "3000-4000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 2351407, + "fid": "5ED00BCE", + "z": 12, + "x": 3443, + "y": 1773 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "3000-4000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 3351286, + "fid": "5ED00BCE", + "z": 12, + "x": 3444, + "y": 1770 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "3000-4000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6506502, + "fid": "5ED00BCE", + "z": 12, + "x": 3440, + "y": 1769 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "3000-4000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6619115, + "fid": "5ED00BCE", + "z": 12, + "x": 3437, + "y": 1766 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "9000m以深", + "geom_type": "Polygon", + "count": 283, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "9000m以深", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6192766, + "fid": "6B80B4A6", + "z": 12, + "x": 3661, + "y": 1634 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "9000m以深", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 3014210, + "fid": "6B80B4A6", + "z": 12, + "x": 3661, + "y": 1633 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "9000m以深", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 5658657, + "fid": "6B80B4A6", + "z": 12, + "x": 3661, + "y": 1635 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "9000m以深", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 567038, + "fid": "6B80B4A6", + "z": 12, + "x": 3661, + "y": 1637 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "9000m以深", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 157788, + "fid": "6B80B4A6", + "z": 12, + "x": 3661, + "y": 1636 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "測定済みの沈船", + "geom_type": "Point", + "count": 278, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "測定済みの沈船", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 4721416, + "fid": "A17FDCFA", + "z": 12, + "x": 3515, + "y": 1641 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "測定済みの沈船", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 2617924, + "fid": "BB964571", + "z": 12, + "x": 3503, + "y": 1733 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "測定済みの沈船", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 5531476, + "fid": "BB964571", + "z": 12, + "x": 3502, + "y": 1733 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "測定済みの沈船", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 2449233, + "fid": "BD81369C", + "z": 12, + "x": 3473, + "y": 1755 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "測定済みの沈船", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 2050830, + "fid": "FC467379", + "z": 12, + "x": 3522, + "y": 1636 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "0-20m", + "geom_type": "Polygon", + "count": 276, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-20m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1330802, + "fid": "4F2BF8F9", + "z": 12, + "x": 3436, + "y": 1746 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-20m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 2249114, + "fid": "F7BE478F", + "z": 12, + "x": 3437, + "y": 1748 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-20m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1625100, + "fid": "71660929", + "z": 12, + "x": 3436, + "y": 1753 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-20m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 4555999, + "fid": "71660929", + "z": 12, + "x": 3436, + "y": 1754 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-20m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1005132, + "fid": "4F2BF8F9", + "z": 12, + "x": 3437, + "y": 1746 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "湖沼域", + "geom_type": "Polygon", + "count": 269, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "湖沼域", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 3451752, + "fid": "FED8F99F", + "z": 12, + "x": 3525, + "y": 1664 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "湖沼域", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6419194, + "fid": "BDE69415", + "z": 12, + "x": 3532, + "y": 1673 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "湖沼域", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 2756371, + "fid": "AF542123", + "z": 12, + "x": 3533, + "y": 1673 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "湖沼域", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 2756372, + "fid": "01FAFECC", + "z": 12, + "x": 3533, + "y": 1673 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "湖沼域", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 303863, + "fid": "F49CB45F", + "z": 12, + "x": 3533, + "y": 1654 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p航行危険障害物", + "canonical_object_type": "障害物", + "geom_type": "Point", + "count": 254, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航行危険障害物", + "canonical_object_type": "障害物", + "canonical_family": "mixed", + "geom_type": "Point", + "feature_id": 2249121, + "fid": "023A1410", + "z": 12, + "x": 3437, + "y": 1748 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航行危険障害物", + "canonical_object_type": "障害物", + "canonical_family": "mixed", + "geom_type": "Point", + "feature_id": 3413155, + "fid": "CDC98F9A", + "z": 12, + "x": 3486, + "y": 1699 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航行危険障害物", + "canonical_object_type": "障害物", + "canonical_family": "mixed", + "geom_type": "Point", + "feature_id": 4715343, + "fid": "4C1013E2", + "z": 12, + "x": 3503, + "y": 1732 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航行危険障害物", + "canonical_object_type": "障害物", + "canonical_family": "mixed", + "geom_type": "Point", + "feature_id": 4715344, + "fid": "FFD88FBC", + "z": 12, + "x": 3503, + "y": 1732 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航行危険障害物", + "canonical_object_type": "障害物", + "canonical_family": "mixed", + "geom_type": "Point", + "feature_id": 2673321, + "fid": "B38B937C", + "z": 12, + "x": 3510, + "y": 1724 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "L739", + "canonical_object_type": "平水境界", + "geom_type": "LineString", + "count": 249, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L739", + "canonical_object_type": "平水境界", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 1014754, + "fid": "7917ED9D", + "z": 12, + "x": 3454, + "y": 1762 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L739", + "canonical_object_type": "平水境界", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 528710, + "fid": "74713523", + "z": 12, + "x": 3458, + "y": 1761 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L739", + "canonical_object_type": "平水境界", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 6336226, + "fid": "18B478D9", + "z": 12, + "x": 3472, + "y": 1754 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L739", + "canonical_object_type": "平水境界", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 6336227, + "fid": "7C295D19", + "z": 12, + "x": 3472, + "y": 1754 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L739", + "canonical_object_type": "平水境界", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 803604, + "fid": "E0E5FA23", + "z": 12, + "x": 3471, + "y": 1755 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P錨泊地等ククリ", + "canonical_object_type": "P錨泊地等ククリ", + "geom_type": "LineString", + "count": 240, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P錨泊地等ククリ", + "canonical_object_type": "P錨泊地等ククリ", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 6323741, + "fid": "1CF0C975", + "z": 12, + "x": 3437, + "y": 1757 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P錨泊地等ククリ", + "canonical_object_type": "P錨泊地等ククリ", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 3263518, + "fid": "1CF0C975", + "z": 12, + "x": 3437, + "y": 1758 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P錨泊地等ククリ", + "canonical_object_type": "P錨泊地等ククリ", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 5817655, + "fid": "1CF0C975", + "z": 12, + "x": 3436, + "y": 1755 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P錨泊地等ククリ", + "canonical_object_type": "P錨泊地等ククリ", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 496597, + "fid": "1CF0C975", + "z": 12, + "x": 3436, + "y": 1759 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P錨泊地等ククリ", + "canonical_object_type": "P錨泊地等ククリ", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 5949155, + "fid": "1CF0C975", + "z": 12, + "x": 3438, + "y": 1760 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p航路標識群", + "canonical_object_type": "沿岸灯台 (15M over)", + "geom_type": "Point", + "count": 224, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "沿岸灯台 (15M over)", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 1330808, + "fid": "998A7327", + "z": 12, + "x": 3436, + "y": 1746 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "沿岸灯台 (15M over)", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 1625112, + "fid": "5FE3F829", + "z": 12, + "x": 3436, + "y": 1753 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "沿岸灯台 (15M over)", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 1005138, + "fid": "998A7327", + "z": 12, + "x": 3437, + "y": 1746 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "沿岸灯台 (15M over)", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 6336408, + "fid": "26410CCA", + "z": 12, + "x": 3472, + "y": 1754 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "沿岸灯台 (15M over)", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 2354899, + "fid": "706028EE", + "z": 12, + "x": 3446, + "y": 1760 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p錨泊地等", + "canonical_object_type": "p錨泊地等", + "geom_type": "Point", + "count": 221, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p錨泊地等", + "canonical_object_type": "p錨泊地等", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 4004871, + "fid": "32BDDEC1", + "z": 12, + "x": 3436, + "y": 1757 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p錨泊地等", + "canonical_object_type": "p錨泊地等", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3090635, + "fid": "3E972B72", + "z": 12, + "x": 3503, + "y": 1739 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p錨泊地等", + "canonical_object_type": "p錨泊地等", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3733881, + "fid": "3E972B72", + "z": 12, + "x": 3503, + "y": 1738 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p錨泊地等", + "canonical_object_type": "p錨泊地等", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 4414277, + "fid": "87601500", + "z": 12, + "x": 3504, + "y": 1734 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p錨泊地等", + "canonical_object_type": "p錨泊地等", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 2985480, + "fid": "87601500", + "z": 12, + "x": 3505, + "y": 1734 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p陸上構造物", + "canonical_object_type": "海事関係署", + "geom_type": "Point", + "count": 221, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p陸上構造物", + "canonical_object_type": "海事関係署", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 5929452, + "fid": "FCB92171", + "z": 12, + "x": 3461, + "y": 1761 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p陸上構造物", + "canonical_object_type": "海事関係署", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 2617941, + "fid": "77B0A304", + "z": 12, + "x": 3503, + "y": 1733 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p陸上構造物", + "canonical_object_type": "海事関係署", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 2286028, + "fid": "5AA07C76", + "z": 12, + "x": 3502, + "y": 1737 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p陸上構造物", + "canonical_object_type": "海事関係署", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 5885343, + "fid": "E0FC7400", + "z": 12, + "x": 3460, + "y": 1762 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p陸上構造物", + "canonical_object_type": "海事関係署", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 5136911, + "fid": "AD1FAEC4", + "z": 12, + "x": 3514, + "y": 1654 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p施設・境界線等", + "canonical_object_type": "海の駅", + "geom_type": "Point", + "count": 203, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p施設・境界線等", + "canonical_object_type": "海の駅", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 5998509, + "fid": "E65354BD", + "z": 12, + "x": 3508, + "y": 1728 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p施設・境界線等", + "canonical_object_type": "海の駅", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 1989400, + "fid": "1F705230", + "z": 12, + "x": 3517, + "y": 1646 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p施設・境界線等", + "canonical_object_type": "海の駅", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3377678, + "fid": "06B25527", + "z": 12, + "x": 3516, + "y": 1650 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p施設・境界線等", + "canonical_object_type": "海の駅", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3603445, + "fid": "0204D872", + "z": 12, + "x": 3501, + "y": 1737 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p施設・境界線等", + "canonical_object_type": "海の駅", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 4042334, + "fid": "4DA0E5D1", + "z": 12, + "x": 3516, + "y": 1651 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P投錨注意障害物ククリ", + "canonical_object_type": "P投錨注意障害物ククリ", + "geom_type": "MultiLineString", + "count": 197, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P投錨注意障害物ククリ", + "canonical_object_type": "P投錨注意障害物ククリ", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 1748999, + "fid": "05B8FEB4", + "z": 12, + "x": 3499, + "y": 1739 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P投錨注意障害物ククリ", + "canonical_object_type": "P投錨注意障害物ククリ", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 2034032, + "fid": "A00D2675", + "z": 12, + "x": 3513, + "y": 1654 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P投錨注意障害物ククリ", + "canonical_object_type": "P投錨注意障害物ククリ", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 2034033, + "fid": "67031F7D", + "z": 12, + "x": 3513, + "y": 1654 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P投錨注意障害物ククリ", + "canonical_object_type": "P投錨注意障害物ククリ", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 5174686, + "fid": "A00D2675", + "z": 12, + "x": 3513, + "y": 1655 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P投錨注意障害物ククリ", + "canonical_object_type": "P投錨注意障害物ククリ", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 297783, + "fid": "C27B5E65", + "z": 12, + "x": 3500, + "y": 1739 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P航行危険障害物ククリ", + "canonical_object_type": "P航行危険障害物ククリ", + "geom_type": "LineString", + "count": 191, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P航行危険障害物ククリ", + "canonical_object_type": "P航行危険障害物ククリ", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 4055041, + "fid": "E0653593", + "z": 12, + "x": 3472, + "y": 1753 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P航行危険障害物ククリ", + "canonical_object_type": "P航行危険障害物ククリ", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 6336391, + "fid": "E0653593", + "z": 12, + "x": 3472, + "y": 1754 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P航行危険障害物ククリ", + "canonical_object_type": "P航行危険障害物ククリ", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 4015174, + "fid": "65B0C7BC", + "z": 12, + "x": 3474, + "y": 1754 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P航行危険障害物ククリ", + "canonical_object_type": "P航行危険障害物ククリ", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 5103305, + "fid": "E0653593", + "z": 12, + "x": 3473, + "y": 1754 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P航行危険障害物ククリ", + "canonical_object_type": "P航行危険障害物ククリ", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 871877, + "fid": "741C8380", + "z": 12, + "x": 3495, + "y": 1734 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P航路", + "canonical_object_type": "航路 (法律による航路)", + "geom_type": "Polygon", + "count": 190, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P航路", + "canonical_object_type": "航路 (法律による航路)", + "canonical_family": "mixed", + "geom_type": "Polygon", + "feature_id": 6129302, + "fid": "E7B749D4", + "z": 12, + "x": 3500, + "y": 1738 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P航路", + "canonical_object_type": "航路 (法律による航路)", + "canonical_family": "mixed", + "geom_type": "Polygon", + "feature_id": 4816118, + "fid": "C9BC5819", + "z": 12, + "x": 3524, + "y": 1653 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P航路", + "canonical_object_type": "航路 (法律による航路)", + "canonical_family": "mixed", + "geom_type": "Polygon", + "feature_id": 2304563, + "fid": "F8AB4652", + "z": 12, + "x": 3531, + "y": 1650 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P航路", + "canonical_object_type": "航路 (法律による航路)", + "canonical_family": "mixed", + "geom_type": "Polygon", + "feature_id": 4299593, + "fid": "C9BC5819", + "z": 12, + "x": 3525, + "y": 1653 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P航路", + "canonical_object_type": "航路 (法律による航路)", + "canonical_family": "mixed", + "geom_type": "Polygon", + "feature_id": 2261614, + "fid": "E7CD6778", + "z": 12, + "x": 3523, + "y": 1648 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p航路標識群", + "canonical_object_type": "シーバース灯", + "geom_type": "Point", + "count": 184, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "シーバース灯", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 2871825, + "fid": "0C4298FB", + "z": 12, + "x": 3503, + "y": 1735 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "シーバース灯", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 422148, + "fid": "E6F09E72", + "z": 12, + "x": 3504, + "y": 1736 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "シーバース灯", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 422149, + "fid": "9A712001", + "z": 12, + "x": 3504, + "y": 1736 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "シーバース灯", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 422150, + "fid": "96295FF9", + "z": 12, + "x": 3504, + "y": 1736 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "シーバース灯", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 1309198, + "fid": "A31711FE", + "z": 12, + "x": 3502, + "y": 1736 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P施設・境界線等", + "canonical_object_type": "漁網", + "geom_type": "Polygon", + "count": 178, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P施設・境界線等", + "canonical_object_type": "漁網", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 5367970, + "fid": "2DC4E082", + "z": 12, + "x": 3502, + "y": 1738 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P施設・境界線等", + "canonical_object_type": "漁網", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 5513638, + "fid": "2DC4E082", + "z": 12, + "x": 3502, + "y": 1739 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P施設・境界線等", + "canonical_object_type": "漁網", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 5593646, + "fid": "04A32351", + "z": 12, + "x": 3504, + "y": 1732 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P施設・境界線等", + "canonical_object_type": "漁網", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 2285633, + "fid": "7B18F862", + "z": 12, + "x": 3502, + "y": 1737 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P施設・境界線等", + "canonical_object_type": "漁網", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 2285634, + "fid": "030F8048", + "z": 12, + "x": 3502, + "y": 1737 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p航路標識群", + "canonical_object_type": "指向灯/照射灯", + "geom_type": "Point", + "count": 175, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "指向灯/照射灯", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 2354902, + "fid": "106F0CF7", + "z": 12, + "x": 3446, + "y": 1760 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "指向灯/照射灯", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 2673325, + "fid": "6C543EA2", + "z": 12, + "x": 3510, + "y": 1724 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "指向灯/照射灯", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 5998518, + "fid": "E03CDD96", + "z": 12, + "x": 3508, + "y": 1728 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "指向灯/照射灯", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 6401063, + "fid": "95C01AE6", + "z": 12, + "x": 3509, + "y": 1728 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "指向灯/照射灯", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3688636, + "fid": "BCBB25D1", + "z": 12, + "x": 3511, + "y": 1653 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "6000-7000m", + "geom_type": "MultiPolygon", + "count": 173, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "6000-7000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 4381348, + "fid": "2DFE98D1", + "z": 12, + "x": 3454, + "y": 1776 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "6000-7000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 2363742, + "fid": "2DFE98D1", + "z": 12, + "x": 3468, + "y": 1774 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "6000-7000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6619730, + "fid": "2DFE98D1", + "z": 12, + "x": 3472, + "y": 1780 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "6000-7000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 889932, + "fid": "2DFE98D1", + "z": 12, + "x": 3473, + "y": 1773 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "6000-7000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1935831, + "fid": "2DFE98D1", + "z": 12, + "x": 3474, + "y": 1773 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "5-20m", + "geom_type": "Polygon", + "count": 162, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5-20m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 3031875, + "fid": "1DBB95D5", + "z": 12, + "x": 3505, + "y": 1660 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5-20m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 2388400, + "fid": "6355F312", + "z": 12, + "x": 3508, + "y": 1628 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5-20m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 2388401, + "fid": "817287F9", + "z": 12, + "x": 3508, + "y": 1628 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5-20m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 2645064, + "fid": "7B485F7D", + "z": 12, + "x": 3508, + "y": 1627 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5-20m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 2645065, + "fid": "6355F312", + "z": 12, + "x": 3508, + "y": 1627 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "L748", + "canonical_object_type": "誘導線", + "geom_type": "LineString", + "count": 145, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L748", + "canonical_object_type": "誘導線", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 5997640, + "fid": "007D50D6", + "z": 12, + "x": 3508, + "y": 1728 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L748", + "canonical_object_type": "誘導線", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 2295442, + "fid": "01A98004", + "z": 12, + "x": 3515, + "y": 1649 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L748", + "canonical_object_type": "誘導線", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 531493, + "fid": "5E1D138A", + "z": 12, + "x": 3516, + "y": 1719 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L748", + "canonical_object_type": "誘導線", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 4154948, + "fid": "3443780E", + "z": 12, + "x": 3511, + "y": 1723 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L748", + "canonical_object_type": "誘導線", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 4154949, + "fid": "135428F3", + "z": 12, + "x": 3511, + "y": 1723 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p航路標識群", + "canonical_object_type": "導灯", + "geom_type": "Point", + "count": 145, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "導灯", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 6401055, + "fid": "EA9F9E7F", + "z": 12, + "x": 3509, + "y": 1728 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "導灯", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 6401056, + "fid": "68C8CA9B", + "z": 12, + "x": 3509, + "y": 1728 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "導灯", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 2746785, + "fid": "BB7EB142", + "z": 12, + "x": 3515, + "y": 1719 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "導灯", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 2746786, + "fid": "268E08DD", + "z": 12, + "x": 3515, + "y": 1719 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "導灯", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 4156494, + "fid": "561A4C88", + "z": 12, + "x": 3511, + "y": 1723 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p錨泊地等", + "canonical_object_type": "錨泊 (指定)地", + "geom_type": "Point", + "count": 145, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p錨泊地等", + "canonical_object_type": "錨泊 (指定)地", + "canonical_family": "mixed", + "geom_type": "Point", + "feature_id": 1156868, + "fid": "EAABC1D1", + "z": 12, + "x": 3540, + "y": 1637 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p錨泊地等", + "canonical_object_type": "錨泊 (指定)地", + "canonical_family": "mixed", + "geom_type": "Point", + "feature_id": 1156869, + "fid": "A04172BB", + "z": 12, + "x": 3540, + "y": 1637 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p錨泊地等", + "canonical_object_type": "錨泊 (指定)地", + "canonical_family": "mixed", + "geom_type": "Point", + "feature_id": 1156870, + "fid": "D772E58F", + "z": 12, + "x": 3540, + "y": 1637 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p錨泊地等", + "canonical_object_type": "錨泊 (指定)地", + "canonical_family": "mixed", + "geom_type": "Point", + "feature_id": 1156871, + "fid": "86161C0E", + "z": 12, + "x": 3540, + "y": 1637 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p錨泊地等", + "canonical_object_type": "錨泊 (指定)地", + "canonical_family": "mixed", + "geom_type": "Point", + "feature_id": 1156872, + "fid": "B5FB78D4", + "z": 12, + "x": 3540, + "y": 1637 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p陸上構造物", + "canonical_object_type": "税関", + "geom_type": "Point", + "count": 145, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p陸上構造物", + "canonical_object_type": "税関", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 2761870, + "fid": "30D76B48", + "z": 12, + "x": 3447, + "y": 1760 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p陸上構造物", + "canonical_object_type": "税関", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 422154, + "fid": "6E5386AA", + "z": 12, + "x": 3504, + "y": 1736 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p陸上構造物", + "canonical_object_type": "税関", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3805493, + "fid": "6E5386AA", + "z": 12, + "x": 3503, + "y": 1736 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p陸上構造物", + "canonical_object_type": "税関", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 5885345, + "fid": "D8AE27A4", + "z": 12, + "x": 3460, + "y": 1762 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p陸上構造物", + "canonical_object_type": "税関", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 5136912, + "fid": "1B64D6EF", + "z": 12, + "x": 3514, + "y": 1654 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "L749", + "canonical_object_type": "誘導線補助線", + "geom_type": "LineString", + "count": 140, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L749", + "canonical_object_type": "誘導線補助線", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 5997641, + "fid": "F7772568", + "z": 12, + "x": 3508, + "y": 1728 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L749", + "canonical_object_type": "誘導線補助線", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 6400067, + "fid": "F7772568", + "z": 12, + "x": 3509, + "y": 1728 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L749", + "canonical_object_type": "誘導線補助線", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 2746010, + "fid": "1BCAB394", + "z": 12, + "x": 3515, + "y": 1719 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L749", + "canonical_object_type": "誘導線補助線", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 531494, + "fid": "1BCAB394", + "z": 12, + "x": 3516, + "y": 1719 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L749", + "canonical_object_type": "誘導線補助線", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 4154950, + "fid": "61FC0FDC", + "z": 12, + "x": 3511, + "y": 1723 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P危険界ククリ", + "canonical_object_type": "P危険界ククリ", + "geom_type": "MultiLineString", + "count": 140, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P危険界ククリ", + "canonical_object_type": "P危険界ククリ", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 5102971, + "fid": "9F300E0D", + "z": 12, + "x": 3473, + "y": 1754 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P危険界ククリ", + "canonical_object_type": "P危険界ククリ", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 5102975, + "fid": "A62E76FE", + "z": 12, + "x": 3473, + "y": 1754 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P危険界ククリ", + "canonical_object_type": "P危険界ククリ", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 5102977, + "fid": "3683B9B7", + "z": 12, + "x": 3473, + "y": 1754 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P危険界ククリ", + "canonical_object_type": "P危険界ククリ", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 3951759, + "fid": "A945AA3B", + "z": 12, + "x": 3456, + "y": 1761 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P危険界ククリ", + "canonical_object_type": "P危険界ククリ", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 1864402, + "fid": "6CDEE127", + "z": 12, + "x": 3491, + "y": 1737 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "河川域", + "geom_type": "MultiPolygon", + "count": 139, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "河川域", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 4059267, + "fid": "24DD71ED", + "z": 12, + "x": 3456, + "y": 1762 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "河川域", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 3994465, + "fid": "97819C91", + "z": 12, + "x": 3457, + "y": 1762 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "河川域", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 4868239, + "fid": "B8493F51", + "z": 12, + "x": 3497, + "y": 1739 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "河川域", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 5817170, + "fid": "97819C91", + "z": 12, + "x": 3457, + "y": 1763 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "河川域", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 5997047, + "fid": "08BDC936", + "z": 12, + "x": 3506, + "y": 1733 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P錨泊地等", + "canonical_object_type": "検疫錨地", + "geom_type": "Polygon", + "count": 135, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P錨泊地等", + "canonical_object_type": "検疫錨地", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 3090562, + "fid": "7710897E", + "z": 12, + "x": 3503, + "y": 1739 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P錨泊地等", + "canonical_object_type": "検疫錨地", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 3733812, + "fid": "7710897E", + "z": 12, + "x": 3503, + "y": 1738 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P錨泊地等", + "canonical_object_type": "検疫錨地", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 421949, + "fid": "AF1924B4", + "z": 12, + "x": 3504, + "y": 1736 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P錨泊地等", + "canonical_object_type": "検疫錨地", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 3805158, + "fid": "AF1924B4", + "z": 12, + "x": 3503, + "y": 1736 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P錨泊地等", + "canonical_object_type": "検疫錨地", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 2449067, + "fid": "9A24F6D3", + "z": 12, + "x": 3473, + "y": 1755 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P航行危険障害物", + "canonical_object_type": "障害物", + "geom_type": "Polygon", + "count": 134, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P航行危険障害物", + "canonical_object_type": "障害物", + "canonical_family": "mixed", + "geom_type": "Polygon", + "feature_id": 4848651, + "fid": "C7EF26D5", + "z": 12, + "x": 3474, + "y": 1753 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P航行危険障害物", + "canonical_object_type": "障害物", + "canonical_family": "mixed", + "geom_type": "Polygon", + "feature_id": 4055040, + "fid": "1392249B", + "z": 12, + "x": 3472, + "y": 1753 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P航行危険障害物", + "canonical_object_type": "障害物", + "canonical_family": "mixed", + "geom_type": "Polygon", + "feature_id": 6336390, + "fid": "1392249B", + "z": 12, + "x": 3472, + "y": 1754 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P航行危険障害物", + "canonical_object_type": "障害物", + "canonical_family": "mixed", + "geom_type": "Polygon", + "feature_id": 4015173, + "fid": "C7EF26D5", + "z": 12, + "x": 3474, + "y": 1754 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P航行危険障害物", + "canonical_object_type": "障害物", + "canonical_family": "mixed", + "geom_type": "Polygon", + "feature_id": 4864987, + "fid": "1392249B", + "z": 12, + "x": 3473, + "y": 1753 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P施設・境界線等", + "canonical_object_type": "ケーソン仮置き場", + "geom_type": "Polygon", + "count": 128, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P施設・境界線等", + "canonical_object_type": "ケーソン仮置き場", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 5707083, + "fid": "FDC9B254", + "z": 12, + "x": 3519, + "y": 1713 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P施設・境界線等", + "canonical_object_type": "ケーソン仮置き場", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 4376592, + "fid": "731DB889", + "z": 12, + "x": 3473, + "y": 1756 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P施設・境界線等", + "canonical_object_type": "ケーソン仮置き場", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 4376593, + "fid": "F5D9E42E", + "z": 12, + "x": 3473, + "y": 1756 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P施設・境界線等", + "canonical_object_type": "ケーソン仮置き場", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 4376594, + "fid": "ABB7706B", + "z": 12, + "x": 3473, + "y": 1756 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P施設・境界線等", + "canonical_object_type": "ケーソン仮置き場", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 3330354, + "fid": "5323B444", + "z": 12, + "x": 3523, + "y": 1695 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P施設・境界線等", + "canonical_object_type": "土砂捨て場", + "geom_type": "Polygon", + "count": 123, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P施設・境界線等", + "canonical_object_type": "土砂捨て場", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 2112911, + "fid": "51B6CF2A", + "z": 12, + "x": 3472, + "y": 1755 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P施設・境界線等", + "canonical_object_type": "土砂捨て場", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 2112912, + "fid": "91CEF2B6", + "z": 12, + "x": 3472, + "y": 1755 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P施設・境界線等", + "canonical_object_type": "土砂捨て場", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 2448708, + "fid": "51B6CF2A", + "z": 12, + "x": 3473, + "y": 1755 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P施設・境界線等", + "canonical_object_type": "土砂捨て場", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 2247320, + "fid": "FD06BDDA", + "z": 12, + "x": 3526, + "y": 1643 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P施設・境界線等", + "canonical_object_type": "土砂捨て場", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 599577, + "fid": "3DFB3C38", + "z": 12, + "x": 3529, + "y": 1650 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "沈木", + "geom_type": "Point", + "count": 121, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "沈木", + "canonical_family": "mixed", + "geom_type": "Point", + "feature_id": 4878960, + "fid": "65E9778D", + "z": 12, + "x": 3536, + "y": 1637 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "沈木", + "canonical_family": "mixed", + "geom_type": "Point", + "feature_id": 4399489, + "fid": "9E5BF71D", + "z": 12, + "x": 3548, + "y": 1650 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "沈木", + "canonical_family": "mixed", + "geom_type": "Point", + "feature_id": 4399490, + "fid": "8EEE09C4", + "z": 12, + "x": 3548, + "y": 1650 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "沈木", + "canonical_family": "mixed", + "geom_type": "Point", + "feature_id": 4399491, + "fid": "65A166B7", + "z": 12, + "x": 3548, + "y": 1650 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "沈木", + "canonical_family": "mixed", + "geom_type": "Point", + "feature_id": 4399492, + "fid": "4C7140D9", + "z": 12, + "x": 3548, + "y": 1650 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p航行危険障害物", + "canonical_object_type": "危険全沈没船", + "geom_type": "Point", + "count": 119, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航行危険障害物", + "canonical_object_type": "危険全沈没船", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 721727, + "fid": "482A6B2C", + "z": 12, + "x": 3501, + "y": 1736 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航行危険障害物", + "canonical_object_type": "危険全沈没船", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3633649, + "fid": "287DBF39", + "z": 12, + "x": 3505, + "y": 1732 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航行危険障害物", + "canonical_object_type": "危険全沈没船", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 4218720, + "fid": "D910C740", + "z": 12, + "x": 3521, + "y": 1648 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航行危険障害物", + "canonical_object_type": "危険全沈没船", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3377722, + "fid": "488C1288", + "z": 12, + "x": 3516, + "y": 1650 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航行危険障害物", + "canonical_object_type": "危険全沈没船", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 5098964, + "fid": "153111DC", + "z": 12, + "x": 3514, + "y": 1653 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p航路境界等", + "canonical_object_type": "進路矢印 (法律による)", + "geom_type": "Point", + "count": 119, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路境界等", + "canonical_object_type": "進路矢印 (法律による)", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 5947628, + "fid": "0C7B6DC9", + "z": 12, + "x": 3552, + "y": 1636 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路境界等", + "canonical_object_type": "進路矢印 (法律による)", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 5947629, + "fid": "79F047AB", + "z": 12, + "x": 3552, + "y": 1636 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路境界等", + "canonical_object_type": "進路矢印 (法律による)", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 5947630, + "fid": "67272361", + "z": 12, + "x": 3552, + "y": 1636 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路境界等", + "canonical_object_type": "進路矢印 (法律による)", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 6267316, + "fid": "67272361", + "z": 12, + "x": 3551, + "y": 1636 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路境界等", + "canonical_object_type": "進路矢印 (法律による)", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 6267317, + "fid": "5EA21A0E", + "z": 12, + "x": 3551, + "y": 1636 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p陸上構造物", + "canonical_object_type": "その他 (記念碑等)", + "geom_type": "Point", + "count": 116, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p陸上構造物", + "canonical_object_type": "その他 (記念碑等)", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 6272317, + "fid": "104D3B28", + "z": 12, + "x": 3467, + "y": 1758 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p陸上構造物", + "canonical_object_type": "その他 (記念碑等)", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3903651, + "fid": "783E6CDE", + "z": 12, + "x": 3456, + "y": 1765 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p陸上構造物", + "canonical_object_type": "その他 (記念碑等)", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 1626951, + "fid": "479D058A", + "z": 12, + "x": 3501, + "y": 1735 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p陸上構造物", + "canonical_object_type": "その他 (記念碑等)", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 2681353, + "fid": "7FD63BDE", + "z": 12, + "x": 3501, + "y": 1740 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p陸上構造物", + "canonical_object_type": "その他 (記念碑等)", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 2681354, + "fid": "A6BCDF62", + "z": 12, + "x": 3501, + "y": 1740 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P漁具定置箇所", + "canonical_object_type": "区画漁業", + "geom_type": "MultiPolygon", + "count": 109, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P漁具定置箇所", + "canonical_object_type": "区画漁業", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 458464, + "fid": "83F1679E", + "z": 12, + "x": 3503, + "y": 1737 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P漁具定置箇所", + "canonical_object_type": "区画漁業", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 5975737, + "fid": "D88BB017", + "z": 12, + "x": 3519, + "y": 1630 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P漁具定置箇所", + "canonical_object_type": "区画漁業", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 3377268, + "fid": "E8762C05", + "z": 12, + "x": 3516, + "y": 1650 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P漁具定置箇所", + "canonical_object_type": "区画漁業", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 3694200, + "fid": "440DE4F4", + "z": 12, + "x": 3524, + "y": 1650 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P漁具定置箇所", + "canonical_object_type": "区画漁業", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 555076, + "fid": "1B4B17D0", + "z": 12, + "x": 3528, + "y": 1649 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "L海底線", + "canonical_object_type": "海底輸送管 (油)", + "geom_type": "LineString", + "count": 108, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L海底線", + "canonical_object_type": "海底輸送管 (油)", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 2673019, + "fid": "068104C0", + "z": 12, + "x": 3510, + "y": 1724 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L海底線", + "canonical_object_type": "海底輸送管 (油)", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 421341, + "fid": "C937FC49", + "z": 12, + "x": 3504, + "y": 1736 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L海底線", + "canonical_object_type": "海底輸送管 (油)", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 421342, + "fid": "BDC9178F", + "z": 12, + "x": 3504, + "y": 1736 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L海底線", + "canonical_object_type": "海底輸送管 (油)", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 1307240, + "fid": "E33413B2", + "z": 12, + "x": 3502, + "y": 1736 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L海底線", + "canonical_object_type": "海底輸送管 (油)", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 1307241, + "fid": "6667F257", + "z": 12, + "x": 3502, + "y": 1736 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p航行危険障害物", + "canonical_object_type": "塔、やぐら、測台", + "geom_type": "Point", + "count": 107, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航行危険障害物", + "canonical_object_type": "塔、やぐら、測台", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 6497711, + "fid": "85E6581B", + "z": 12, + "x": 3515, + "y": 1654 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航行危険障害物", + "canonical_object_type": "塔、やぐら、測台", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 6497712, + "fid": "1A84251D", + "z": 12, + "x": 3515, + "y": 1654 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航行危険障害物", + "canonical_object_type": "塔、やぐら、測台", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 6497713, + "fid": "A1FAD653", + "z": 12, + "x": 3515, + "y": 1654 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航行危険障害物", + "canonical_object_type": "塔、やぐら、測台", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 6497714, + "fid": "CCD5F52E", + "z": 12, + "x": 3515, + "y": 1654 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航行危険障害物", + "canonical_object_type": "塔、やぐら、測台", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 6497715, + "fid": "E07E7D4A", + "z": 12, + "x": 3515, + "y": 1654 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "L海底線", + "canonical_object_type": "海底線 (電信電話)", + "geom_type": "MultiLineString", + "count": 105, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L海底線", + "canonical_object_type": "海底線 (電信電話)", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 3557832, + "fid": "9C526E6D", + "z": 12, + "x": 3443, + "y": 1756 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L海底線", + "canonical_object_type": "海底線 (電信電話)", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 2146482, + "fid": "78C38F03", + "z": 12, + "x": 3447, + "y": 1752 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L海底線", + "canonical_object_type": "海底線 (電信電話)", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 5612018, + "fid": "E93205B9", + "z": 12, + "x": 3442, + "y": 1761 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L海底線", + "canonical_object_type": "海底線 (電信電話)", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 4521634, + "fid": "B7C1C0EE", + "z": 12, + "x": 3450, + "y": 1756 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L海底線", + "canonical_object_type": "海底線 (電信電話)", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 5276633, + "fid": "04900D5E", + "z": 12, + "x": 3445, + "y": 1761 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P誘導線ククリ", + "canonical_object_type": "P誘導線ククリ", + "geom_type": "LineString", + "count": 101, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P誘導線ククリ", + "canonical_object_type": "P誘導線ククリ", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 2673289, + "fid": "914AC064", + "z": 12, + "x": 3510, + "y": 1724 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P誘導線ククリ", + "canonical_object_type": "P誘導線ククリ", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 2673290, + "fid": "75B6EC3D", + "z": 12, + "x": 3510, + "y": 1724 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P誘導線ククリ", + "canonical_object_type": "P誘導線ククリ", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 2673291, + "fid": "A97E5CBF", + "z": 12, + "x": 3510, + "y": 1724 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P誘導線ククリ", + "canonical_object_type": "P誘導線ククリ", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 5998415, + "fid": "D8527792", + "z": 12, + "x": 3508, + "y": 1728 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P誘導線ククリ", + "canonical_object_type": "P誘導線ククリ", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 5998416, + "fid": "A9F5863B", + "z": 12, + "x": 3508, + "y": 1728 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "0-10m", + "geom_type": "MultiPolygon", + "count": 97, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-10m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 3286264, + "fid": "F0650C69", + "z": 12, + "x": 3475, + "y": 1756 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-10m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 3739635, + "fid": "31FB3EA6", + "z": 12, + "x": 3517, + "y": 1648 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-10m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1765603, + "fid": "31FB3EA6", + "z": 12, + "x": 3516, + "y": 1648 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-10m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1979964, + "fid": "153B806E", + "z": 12, + "x": 3519, + "y": 1715 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-10m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1979965, + "fid": "23DF9619", + "z": 12, + "x": 3519, + "y": 1715 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p陸上構造物", + "canonical_object_type": "管制信号所", + "geom_type": "Point", + "count": 91, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p陸上構造物", + "canonical_object_type": "管制信号所", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 5268044, + "fid": "662BCEAB", + "z": 12, + "x": 3515, + "y": 1650 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p陸上構造物", + "canonical_object_type": "管制信号所", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3377774, + "fid": "662BCEAB", + "z": 12, + "x": 3516, + "y": 1650 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p陸上構造物", + "canonical_object_type": "管制信号所", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 6129827, + "fid": "1A4D33C3", + "z": 12, + "x": 3500, + "y": 1738 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p陸上構造物", + "canonical_object_type": "管制信号所", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 6129828, + "fid": "9892CD09", + "z": 12, + "x": 3500, + "y": 1738 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p陸上構造物", + "canonical_object_type": "管制信号所", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 2262100, + "fid": "038F3F42", + "z": 12, + "x": 3523, + "y": 1648 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P錨泊地等", + "canonical_object_type": "錨泊 (指定)地", + "geom_type": "Polygon", + "count": 89, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P錨泊地等", + "canonical_object_type": "錨泊 (指定)地", + "canonical_family": "mixed", + "geom_type": "Polygon", + "feature_id": 4348215, + "fid": "4183C977", + "z": 12, + "x": 3532, + "y": 1657 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P錨泊地等", + "canonical_object_type": "錨泊 (指定)地", + "canonical_family": "mixed", + "geom_type": "Polygon", + "feature_id": 6386895, + "fid": "E08C0FB2", + "z": 12, + "x": 3533, + "y": 1669 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P錨泊地等", + "canonical_object_type": "錨泊 (指定)地", + "canonical_family": "mixed", + "geom_type": "Polygon", + "feature_id": 6386896, + "fid": "C7341C15", + "z": 12, + "x": 3533, + "y": 1669 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P錨泊地等", + "canonical_object_type": "錨泊 (指定)地", + "canonical_family": "mixed", + "geom_type": "Polygon", + "feature_id": 6386897, + "fid": "40A8CBCE", + "z": 12, + "x": 3533, + "y": 1669 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P錨泊地等", + "canonical_object_type": "錨泊 (指定)地", + "canonical_family": "mixed", + "geom_type": "Polygon", + "feature_id": 3675383, + "fid": "430CC846", + "z": 12, + "x": 3545, + "y": 1657 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "7000-8000m", + "geom_type": "MultiPolygon", + "count": 88, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "7000-8000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1645635, + "fid": "D61A115D", + "z": 12, + "x": 3491, + "y": 1765 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "7000-8000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 3825174, + "fid": "D61A115D", + "z": 12, + "x": 3491, + "y": 1766 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "7000-8000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1182288, + "fid": "D61A115D", + "z": 12, + "x": 3498, + "y": 1760 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "7000-8000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 3749989, + "fid": "D61A115D", + "z": 12, + "x": 3500, + "y": 1758 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "7000-8000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1166383, + "fid": "D61A115D", + "z": 12, + "x": 3500, + "y": 1756 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "pパイロットステーション", + "canonical_object_type": "パイロットステーション", + "geom_type": "Point", + "count": 88, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "pパイロットステーション", + "canonical_object_type": "パイロットステーション", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 727362, + "fid": "0398D9D6", + "z": 12, + "x": 3522, + "y": 1648 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "pパイロットステーション", + "canonical_object_type": "パイロットステーション", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 4816188, + "fid": "E3F5A615", + "z": 12, + "x": 3524, + "y": 1653 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "pパイロットステーション", + "canonical_object_type": "パイロットステーション", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 4816189, + "fid": "DCC75AAE", + "z": 12, + "x": 3524, + "y": 1653 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "pパイロットステーション", + "canonical_object_type": "パイロットステーション", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 6402815, + "fid": "A224D758", + "z": 12, + "x": 3528, + "y": 1655 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "pパイロットステーション", + "canonical_object_type": "パイロットステーション", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 2759005, + "fid": "11388D66", + "z": 12, + "x": 3529, + "y": 1655 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P航路ククリ", + "canonical_object_type": "P航路ククリ", + "geom_type": "MultiLineString", + "count": 75, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P航路ククリ", + "canonical_object_type": "P航路ククリ", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 4299594, + "fid": "F85A71F4", + "z": 12, + "x": 3525, + "y": 1653 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P航路ククリ", + "canonical_object_type": "P航路ククリ", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 3853999, + "fid": "C2DEA6C2", + "z": 12, + "x": 3531, + "y": 1649 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P航路ククリ", + "canonical_object_type": "P航路ククリ", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 2520636, + "fid": "B0015520", + "z": 12, + "x": 3531, + "y": 1641 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P航路ククリ", + "canonical_object_type": "P航路ククリ", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 2520639, + "fid": "B0015520", + "z": 12, + "x": 3531, + "y": 1641 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P航路ククリ", + "canonical_object_type": "P航路ククリ", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 50242, + "fid": "41C732F7", + "z": 12, + "x": 3536, + "y": 1636 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P施設・境界線等", + "canonical_object_type": "貯木場", + "geom_type": "Polygon", + "count": 73, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P施設・境界線等", + "canonical_object_type": "貯木場", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6386812, + "fid": "D0ACD38E", + "z": 12, + "x": 3533, + "y": 1669 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P施設・境界線等", + "canonical_object_type": "貯木場", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6386813, + "fid": "573AE309", + "z": 12, + "x": 3533, + "y": 1669 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P施設・境界線等", + "canonical_object_type": "貯木場", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6386814, + "fid": "D3ED9798", + "z": 12, + "x": 3533, + "y": 1669 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P施設・境界線等", + "canonical_object_type": "貯木場", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 2520476, + "fid": "6C87D843", + "z": 12, + "x": 3531, + "y": 1641 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P施設・境界線等", + "canonical_object_type": "貯木場", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6357540, + "fid": "567BB797", + "z": 12, + "x": 3538, + "y": 1639 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p航行危険障害物", + "canonical_object_type": "サンゴ礁 (暗岩)", + "geom_type": "Point", + "count": 73, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航行危険障害物", + "canonical_object_type": "サンゴ礁 (暗岩)", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3351232, + "fid": "E238343A", + "z": 12, + "x": 3471, + "y": 1756 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航行危険障害物", + "canonical_object_type": "サンゴ礁 (暗岩)", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 5103345, + "fid": "086F5623", + "z": 12, + "x": 3473, + "y": 1754 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航行危険障害物", + "canonical_object_type": "サンゴ礁 (暗岩)", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 5103346, + "fid": "48241CA7", + "z": 12, + "x": 3473, + "y": 1754 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航行危険障害物", + "canonical_object_type": "サンゴ礁 (暗岩)", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 5103347, + "fid": "9FC22939", + "z": 12, + "x": 3473, + "y": 1754 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航行危険障害物", + "canonical_object_type": "サンゴ礁 (暗岩)", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 5103348, + "fid": "C84FC806", + "z": 12, + "x": 3473, + "y": 1754 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p航路標識群", + "canonical_object_type": "無線局・レーダー局", + "geom_type": "Point", + "count": 68, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "無線局・レーダー局", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3313600, + "fid": "31DCBD4C", + "z": 12, + "x": 3509, + "y": 1629 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "無線局・レーダー局", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 617964, + "fid": "DFB441A8", + "z": 12, + "x": 3512, + "y": 1628 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "無線局・レーダー局", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 2111772, + "fid": "15098966", + "z": 12, + "x": 3515, + "y": 1622 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "無線局・レーダー局", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3603457, + "fid": "9343BB84", + "z": 12, + "x": 3501, + "y": 1737 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "無線局・レーダー局", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 13328, + "fid": "630AC127", + "z": 12, + "x": 3535, + "y": 1635 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "L海底線", + "canonical_object_type": "海底輸送管 (ガス)", + "geom_type": "LineString", + "count": 67, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L海底線", + "canonical_object_type": "海底輸送管 (ガス)", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 1605259, + "fid": "E6EA8F82", + "z": 12, + "x": 3501, + "y": 1738 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L海底線", + "canonical_object_type": "海底輸送管 (ガス)", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 2518724, + "fid": "2781148F", + "z": 12, + "x": 3531, + "y": 1641 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L海底線", + "canonical_object_type": "海底輸送管 (ガス)", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 131013, + "fid": "96793A51", + "z": 12, + "x": 3540, + "y": 1636 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L海底線", + "canonical_object_type": "海底輸送管 (ガス)", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 1715000, + "fid": "96793A51", + "z": 12, + "x": 3541, + "y": 1636 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L海底線", + "canonical_object_type": "海底輸送管 (ガス)", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 1715001, + "fid": "FB30E59C", + "z": 12, + "x": 3541, + "y": 1636 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p航路標識群", + "canonical_object_type": "円筒型浮標", + "geom_type": "Point", + "count": 62, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "円筒型浮標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 2617937, + "fid": "D36F5B72", + "z": 12, + "x": 3503, + "y": 1733 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "円筒型浮標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 2617938, + "fid": "2091616D", + "z": 12, + "x": 3503, + "y": 1733 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "円筒型浮標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 1309231, + "fid": "E61015C4", + "z": 12, + "x": 3502, + "y": 1736 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "円筒型浮標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 5368429, + "fid": "FE0B4002", + "z": 12, + "x": 3502, + "y": 1738 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "円筒型浮標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3179256, + "fid": "C7EB9D66", + "z": 12, + "x": 3504, + "y": 1733 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P錨泊地等ククリ", + "canonical_object_type": "P錨泊地等ククリ", + "geom_type": "MultiLineString", + "count": 57, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P錨泊地等ククリ", + "canonical_object_type": "P錨泊地等ククリ", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 3504462, + "fid": "1CF0C975", + "z": 12, + "x": 3436, + "y": 1758 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P錨泊地等ククリ", + "canonical_object_type": "P錨泊地等ククリ", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 4004869, + "fid": "1CF0C975", + "z": 12, + "x": 3436, + "y": 1757 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P錨泊地等ククリ", + "canonical_object_type": "P錨泊地等ククリ", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 5758926, + "fid": "1CF0C975", + "z": 12, + "x": 3436, + "y": 1756 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P錨泊地等ククリ", + "canonical_object_type": "P錨泊地等ククリ", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 6614482, + "fid": "1CF0C975", + "z": 12, + "x": 3437, + "y": 1760 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P錨泊地等ククリ", + "canonical_object_type": "P錨泊地等ククリ", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 3529026, + "fid": "1CF0C975", + "z": 12, + "x": 3437, + "y": 1759 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p航路標識群", + "canonical_object_type": "大型灯浮標", + "geom_type": "Point", + "count": 57, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "大型灯浮標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 1399609, + "fid": "92EDE4F4", + "z": 12, + "x": 3516, + "y": 1709 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "大型灯浮標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 1167250, + "fid": "0D81F358", + "z": 12, + "x": 3521, + "y": 1668 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "大型灯浮標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 796368, + "fid": "3DDDFB9B", + "z": 12, + "x": 3540, + "y": 1638 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "大型灯浮標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 4394539, + "fid": "95BAF9E9", + "z": 12, + "x": 3544, + "y": 1675 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "大型灯浮標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 4228688, + "fid": "21FF2109", + "z": 12, + "x": 3545, + "y": 1675 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "浅所危険界", + "geom_type": "MultiPolygon", + "count": 56, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "浅所危険界", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 5367783, + "fid": "EE21AADD", + "z": 12, + "x": 3502, + "y": 1738 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "浅所危険界", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1607950, + "fid": "D29319BB", + "z": 12, + "x": 3501, + "y": 1738 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "浅所危険界", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 3442915, + "fid": "BDABA590", + "z": 12, + "x": 3521, + "y": 1651 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "浅所危険界", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 4758673, + "fid": "56DA7878", + "z": 12, + "x": 3515, + "y": 1652 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "浅所危険界", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 297413, + "fid": "22B918B3", + "z": 12, + "x": 3500, + "y": 1739 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "0-20m", + "geom_type": "MultiPolygon", + "count": 53, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-20m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 4054999, + "fid": "F572D716", + "z": 12, + "x": 3472, + "y": 1753 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-20m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 4864917, + "fid": "F572D716", + "z": 12, + "x": 3473, + "y": 1753 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-20m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 5103033, + "fid": "F572D716", + "z": 12, + "x": 3473, + "y": 1754 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-20m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 5515169, + "fid": "9F54D72A", + "z": 12, + "x": 3504, + "y": 1624 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-20m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1156104, + "fid": "41C0446B", + "z": 12, + "x": 3506, + "y": 1627 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "L725", + "canonical_object_type": "境界線", + "geom_type": "LineString", + "count": 52, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L725", + "canonical_object_type": "境界線", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 2671888, + "fid": "23682B11", + "z": 12, + "x": 3559, + "y": 1634 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L725", + "canonical_object_type": "境界線", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 2671889, + "fid": "F51BA8BF", + "z": 12, + "x": 3559, + "y": 1634 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L725", + "canonical_object_type": "境界線", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 388232, + "fid": "0486684F", + "z": 12, + "x": 3555, + "y": 1633 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L725", + "canonical_object_type": "境界線", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 388233, + "fid": "2DAF1666", + "z": 12, + "x": 3555, + "y": 1633 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L725", + "canonical_object_type": "境界線", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 1032711, + "fid": "0486684F", + "z": 12, + "x": 3556, + "y": 1633 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P施設・境界線等", + "canonical_object_type": "誘導線 (白)", + "geom_type": "Polygon", + "count": 52, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P施設・境界線等", + "canonical_object_type": "誘導線 (白)", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 2673277, + "fid": "6F627E6E", + "z": 12, + "x": 3510, + "y": 1724 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P施設・境界線等", + "canonical_object_type": "誘導線 (白)", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 5998361, + "fid": "21809052", + "z": 12, + "x": 3508, + "y": 1728 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P施設・境界線等", + "canonical_object_type": "誘導線 (白)", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6401000, + "fid": "43AF1658", + "z": 12, + "x": 3509, + "y": 1728 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P施設・境界線等", + "canonical_object_type": "誘導線 (白)", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 4739165, + "fid": "F5BEC58F", + "z": 12, + "x": 3527, + "y": 1656 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P施設・境界線等", + "canonical_object_type": "誘導線 (白)", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 4659181, + "fid": "6AC6B196", + "z": 12, + "x": 3542, + "y": 1637 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P施設・境界線等", + "canonical_object_type": "誘導線 (緑)", + "geom_type": "Polygon", + "count": 51, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P施設・境界線等", + "canonical_object_type": "誘導線 (緑)", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 2673278, + "fid": "AD196D31", + "z": 12, + "x": 3510, + "y": 1724 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P施設・境界線等", + "canonical_object_type": "誘導線 (緑)", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 5998362, + "fid": "09CD0609", + "z": 12, + "x": 3508, + "y": 1728 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P施設・境界線等", + "canonical_object_type": "誘導線 (緑)", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6401001, + "fid": "34067FA9", + "z": 12, + "x": 3509, + "y": 1728 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P施設・境界線等", + "canonical_object_type": "誘導線 (緑)", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 4739166, + "fid": "CA3FC473", + "z": 12, + "x": 3527, + "y": 1656 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P施設・境界線等", + "canonical_object_type": "誘導線 (緑)", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 4659182, + "fid": "6F736100", + "z": 12, + "x": 3542, + "y": 1637 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P施設・境界線等", + "canonical_object_type": "誘導線 (赤)", + "geom_type": "Polygon", + "count": 51, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P施設・境界線等", + "canonical_object_type": "誘導線 (赤)", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 2673276, + "fid": "08585F00", + "z": 12, + "x": 3510, + "y": 1724 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P施設・境界線等", + "canonical_object_type": "誘導線 (赤)", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 5998360, + "fid": "D1AB65D1", + "z": 12, + "x": 3508, + "y": 1728 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P施設・境界線等", + "canonical_object_type": "誘導線 (赤)", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6400999, + "fid": "96558A77", + "z": 12, + "x": 3509, + "y": 1728 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P施設・境界線等", + "canonical_object_type": "誘導線 (赤)", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 4739164, + "fid": "08485A34", + "z": 12, + "x": 3527, + "y": 1656 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P施設・境界線等", + "canonical_object_type": "誘導線 (赤)", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 4659180, + "fid": "0BCF5253", + "z": 12, + "x": 3542, + "y": 1637 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p航路標識群", + "canonical_object_type": "航空・飛行場灯台", + "geom_type": "Point", + "count": 51, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "航空・飛行場灯台", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3603456, + "fid": "18A2848D", + "z": 12, + "x": 3501, + "y": 1737 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "航空・飛行場灯台", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 1916678, + "fid": "2E9FA298", + "z": 12, + "x": 3523, + "y": 1710 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "航空・飛行場灯台", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3968070, + "fid": "398F8CA2", + "z": 12, + "x": 3526, + "y": 1651 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "航空・飛行場灯台", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 6129781, + "fid": "415E4220", + "z": 12, + "x": 3500, + "y": 1738 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "航空・飛行場灯台", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3445630, + "fid": "FF6FDBD8", + "z": 12, + "x": 3536, + "y": 1671 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "8000-9000m", + "geom_type": "MultiPolygon", + "count": 49, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "8000-9000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 5710308, + "fid": "3E968A5B", + "z": 12, + "x": 3659, + "y": 1639 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "8000-9000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1479616, + "fid": "3E968A5B", + "z": 12, + "x": 3661, + "y": 1640 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "8000-9000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 924230, + "fid": "3E968A5B", + "z": 12, + "x": 3662, + "y": 1626 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "8000-9000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 2601825, + "fid": "3E968A5B", + "z": 12, + "x": 3664, + "y": 1627 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "8000-9000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 764594, + "fid": "3E968A5B", + "z": 12, + "x": 3664, + "y": 1628 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P錨泊地等", + "canonical_object_type": "錨泊禁止区域", + "geom_type": "Polygon", + "count": 49, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P錨泊地等", + "canonical_object_type": "錨泊禁止区域", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6323740, + "fid": "D6526750", + "z": 12, + "x": 3437, + "y": 1757 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P錨泊地等", + "canonical_object_type": "錨泊禁止区域", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 3263517, + "fid": "D6526750", + "z": 12, + "x": 3437, + "y": 1758 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P錨泊地等", + "canonical_object_type": "錨泊禁止区域", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 5817654, + "fid": "D6526750", + "z": 12, + "x": 3436, + "y": 1755 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P錨泊地等", + "canonical_object_type": "錨泊禁止区域", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 496596, + "fid": "D6526750", + "z": 12, + "x": 3436, + "y": 1759 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P錨泊地等", + "canonical_object_type": "錨泊禁止区域", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 3504461, + "fid": "D6526750", + "z": 12, + "x": 3436, + "y": 1758 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "20-200m", + "geom_type": "Polygon", + "count": 47, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "20-200m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1625098, + "fid": "1382B474", + "z": 12, + "x": 3436, + "y": 1753 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "20-200m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 4555997, + "fid": "1382B474", + "z": 12, + "x": 3436, + "y": 1754 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "20-200m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 5865331, + "fid": "1382B474", + "z": 12, + "x": 3436, + "y": 1752 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "20-200m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 5817651, + "fid": "1382B474", + "z": 12, + "x": 3436, + "y": 1755 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "20-200m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 24953, + "fid": "11F4FB4E", + "z": 12, + "x": 3522, + "y": 1640 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "L概略等深線", + "canonical_object_type": "概略等深線", + "geom_type": "MultiLineString", + "count": 46, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L概略等深線", + "canonical_object_type": "概略等深線", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 6220207, + "fid": "E9756CAB", + "z": 12, + "x": 3517, + "y": 1651 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L概略等深線", + "canonical_object_type": "概略等深線", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 2283113, + "fid": "884C15A7", + "z": 12, + "x": 3502, + "y": 1737 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L概略等深線", + "canonical_object_type": "概略等深線", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 5881150, + "fid": "7C11F308", + "z": 12, + "x": 3460, + "y": 1762 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L概略等深線", + "canonical_object_type": "概略等深線", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 4619671, + "fid": "E9756CAB", + "z": 12, + "x": 3517, + "y": 1650 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L概略等深線", + "canonical_object_type": "概略等深線", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 4619672, + "fid": "032E4AB2", + "z": 12, + "x": 3517, + "y": 1650 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P施設・境界線等ククリ", + "canonical_object_type": "P施設・境界線等ククリ", + "geom_type": "MultiLineString", + "count": 45, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P施設・境界線等ククリ", + "canonical_object_type": "P施設・境界線等ククリ", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 6051008, + "fid": "0E50C51A", + "z": 12, + "x": 3508, + "y": 1738 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P施設・境界線等ククリ", + "canonical_object_type": "P施設・境界線等ククリ", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 5367971, + "fid": "387E3A0A", + "z": 12, + "x": 3502, + "y": 1738 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P施設・境界線等ククリ", + "canonical_object_type": "P施設・境界線等ククリ", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 2448709, + "fid": "D10FFF57", + "z": 12, + "x": 3473, + "y": 1755 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P施設・境界線等ククリ", + "canonical_object_type": "P施設・境界線等ククリ", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 5705958, + "fid": "88F71C64", + "z": 12, + "x": 3524, + "y": 1645 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P施設・境界線等ククリ", + "canonical_object_type": "P施設・境界線等ククリ", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 4042796, + "fid": "B0D03BD0", + "z": 12, + "x": 3530, + "y": 1648 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "渦流", + "geom_type": "Point", + "count": 45, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "渦流", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 6402890, + "fid": "7982F056", + "z": 12, + "x": 3528, + "y": 1655 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "渦流", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 6402891, + "fid": "178C9C23", + "z": 12, + "x": 3528, + "y": 1655 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "渦流", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 6402892, + "fid": "19B789DC", + "z": 12, + "x": 3528, + "y": 1655 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "渦流", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 347785, + "fid": "B186097A", + "z": 12, + "x": 3524, + "y": 1649 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "渦流", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 347786, + "fid": "8E53CE65", + "z": 12, + "x": 3524, + "y": 1649 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p施設・境界線等", + "canonical_object_type": "フィッシャリーナ", + "geom_type": "Point", + "count": 44, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p施設・境界線等", + "canonical_object_type": "フィッシャリーナ", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 1989399, + "fid": "A86D73C2", + "z": 12, + "x": 3517, + "y": 1646 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p施設・境界線等", + "canonical_object_type": "フィッシャリーナ", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 5123478, + "fid": "2D113382", + "z": 12, + "x": 3490, + "y": 1737 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p施設・境界線等", + "canonical_object_type": "フィッシャリーナ", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 5885196, + "fid": "8D97A0CA", + "z": 12, + "x": 3460, + "y": 1762 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p施設・境界線等", + "canonical_object_type": "フィッシャリーナ", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 298047, + "fid": "5933F77F", + "z": 12, + "x": 3500, + "y": 1739 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p施設・境界線等", + "canonical_object_type": "フィッシャリーナ", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3603444, + "fid": "6E13FDEF", + "z": 12, + "x": 3501, + "y": 1737 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p航行危険障害物", + "canonical_object_type": "船体露出沈船", + "geom_type": "Point", + "count": 43, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航行危険障害物", + "canonical_object_type": "船体露出沈船", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 5623894, + "fid": "552EFBF6", + "z": 12, + "x": 3457, + "y": 1761 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航行危険障害物", + "canonical_object_type": "船体露出沈船", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 5278352, + "fid": "3A564D0D", + "z": 12, + "x": 3499, + "y": 1738 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航行危険障害物", + "canonical_object_type": "船体露出沈船", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 4012658, + "fid": "D7D3BF53", + "z": 12, + "x": 3500, + "y": 1737 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航行危険障害物", + "canonical_object_type": "船体露出沈船", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 4969453, + "fid": "3A564D0D", + "z": 12, + "x": 3498, + "y": 1738 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航行危険障害物", + "canonical_object_type": "船体露出沈船", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 721722, + "fid": "109126EA", + "z": 12, + "x": 3501, + "y": 1736 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P754ククリ", + "canonical_object_type": "P754ククリ", + "geom_type": "MultiLineString", + "count": 41, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P754ククリ", + "canonical_object_type": "P754ククリ", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 1308713, + "fid": "185ED300", + "z": 12, + "x": 3502, + "y": 1736 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P754ククリ", + "canonical_object_type": "P754ククリ", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 2900463, + "fid": "E0333BC0", + "z": 12, + "x": 3517, + "y": 1649 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P754ククリ", + "canonical_object_type": "P754ククリ", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 6099513, + "fid": "26309563", + "z": 12, + "x": 3529, + "y": 1667 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P754ククリ", + "canonical_object_type": "P754ククリ", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 2109095, + "fid": "A3DEC596", + "z": 12, + "x": 3528, + "y": 1662 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P754ククリ", + "canonical_object_type": "P754ククリ", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 1144876, + "fid": "58A476B1", + "z": 12, + "x": 3533, + "y": 1638 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "L航路", + "canonical_object_type": "航路 (法律による航路)", + "geom_type": "LineString", + "count": 38, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L航路", + "canonical_object_type": "航路 (法律による航路)", + "canonical_family": "mixed", + "geom_type": "LineString", + "feature_id": 5946573, + "fid": "3A4214D7", + "z": 12, + "x": 3552, + "y": 1636 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L航路", + "canonical_object_type": "航路 (法律による航路)", + "canonical_family": "mixed", + "geom_type": "LineString", + "feature_id": 5946574, + "fid": "D7E45D68", + "z": 12, + "x": 3552, + "y": 1636 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L航路", + "canonical_object_type": "航路 (法律による航路)", + "canonical_family": "mixed", + "geom_type": "LineString", + "feature_id": 5946575, + "fid": "CA1B99FA", + "z": 12, + "x": 3552, + "y": 1636 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L航路", + "canonical_object_type": "航路 (法律による航路)", + "canonical_family": "mixed", + "geom_type": "LineString", + "feature_id": 5946576, + "fid": "B5C7654A", + "z": 12, + "x": 3552, + "y": 1636 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L航路", + "canonical_object_type": "航路 (法律による航路)", + "canonical_family": "mixed", + "geom_type": "LineString", + "feature_id": 6265721, + "fid": "FA5DE10A", + "z": 12, + "x": 3551, + "y": 1636 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "湖沼域", + "geom_type": "MultiPolygon", + "count": 37, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "湖沼域", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 3776953, + "fid": "E0A99EA5", + "z": 12, + "x": 3559, + "y": 1616 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "湖沼域", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 4551161, + "fid": "E0A99EA5", + "z": 12, + "x": 3560, + "y": 1615 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "湖沼域", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 3838692, + "fid": "18BEB67A", + "z": 12, + "x": 3571, + "y": 1627 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "湖沼域", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 3838693, + "fid": "9E667D90", + "z": 12, + "x": 3571, + "y": 1627 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "湖沼域", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1787422, + "fid": "9E667D90", + "z": 12, + "x": 3572, + "y": 1628 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p航行危険障害物", + "canonical_object_type": "海底設置物、放水口、取水口", + "geom_type": "Point", + "count": 34, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航行危険障害物", + "canonical_object_type": "海底設置物、放水口、取水口", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 6497722, + "fid": "3B0EA6C8", + "z": 12, + "x": 3515, + "y": 1654 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航行危険障害物", + "canonical_object_type": "海底設置物、放水口、取水口", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 6497723, + "fid": "3D14A4D9", + "z": 12, + "x": 3515, + "y": 1654 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航行危険障害物", + "canonical_object_type": "海底設置物、放水口、取水口", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 6497724, + "fid": "43BAECDA", + "z": 12, + "x": 3515, + "y": 1654 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航行危険障害物", + "canonical_object_type": "海底設置物、放水口、取水口", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 6497725, + "fid": "5633C8E3", + "z": 12, + "x": 3515, + "y": 1654 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航行危険障害物", + "canonical_object_type": "海底設置物、放水口、取水口", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 6497726, + "fid": "4F18F462", + "z": 12, + "x": 3515, + "y": 1654 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p航路境界等", + "canonical_object_type": "進路矢印 (指導による)", + "geom_type": "Point", + "count": 33, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路境界等", + "canonical_object_type": "進路矢印 (指導による)", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 137298, + "fid": "D0BE2DC4", + "z": 12, + "x": 3593, + "y": 1644 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路境界等", + "canonical_object_type": "進路矢印 (指導による)", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 137299, + "fid": "A9F97455", + "z": 12, + "x": 3593, + "y": 1644 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路境界等", + "canonical_object_type": "進路矢印 (指導による)", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 137300, + "fid": "4E1FCFD0", + "z": 12, + "x": 3593, + "y": 1644 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路境界等", + "canonical_object_type": "進路矢印 (指導による)", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 5802519, + "fid": "456D3149", + "z": 12, + "x": 3592, + "y": 1644 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路境界等", + "canonical_object_type": "進路矢印 (指導による)", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 5802520, + "fid": "4C965BF7", + "z": 12, + "x": 3592, + "y": 1644 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p航路境界等", + "canonical_object_type": "水源方向", + "geom_type": "Point", + "count": 32, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路境界等", + "canonical_object_type": "水源方向", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 4930481, + "fid": "A34182C7", + "z": 12, + "x": 3521, + "y": 1647 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路境界等", + "canonical_object_type": "水源方向", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 5745174, + "fid": "D974DA70", + "z": 12, + "x": 3521, + "y": 1646 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路境界等", + "canonical_object_type": "水源方向", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 5745175, + "fid": "D3EFAAE7", + "z": 12, + "x": 3521, + "y": 1646 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路境界等", + "canonical_object_type": "水源方向", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 6546909, + "fid": "F0C0D55B", + "z": 12, + "x": 3522, + "y": 1645 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路境界等", + "canonical_object_type": "水源方向", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3836328, + "fid": "C35936C4", + "z": 12, + "x": 3522, + "y": 1644 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "L741", + "canonical_object_type": "港則法による境界", + "geom_type": "MultiLineString", + "count": 31, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L741", + "canonical_object_type": "港則法による境界", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 3626288, + "fid": "12933015", + "z": 12, + "x": 3531, + "y": 1646 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L741", + "canonical_object_type": "港則法による境界", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 4297181, + "fid": "926D01D3", + "z": 12, + "x": 3525, + "y": 1653 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L741", + "canonical_object_type": "港則法による境界", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 3355936, + "fid": "2968A8AC", + "z": 12, + "x": 3532, + "y": 1650 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L741", + "canonical_object_type": "港則法による境界", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 3853252, + "fid": "9D121568", + "z": 12, + "x": 3531, + "y": 1649 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L741", + "canonical_object_type": "港則法による境界", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 2243544, + "fid": "CD711B31", + "z": 12, + "x": 3534, + "y": 1666 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "L740", + "canonical_object_type": "海上交通安全法適用海域境界", + "geom_type": "LineString", + "count": 29, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L740", + "canonical_object_type": "海上交通安全法適用海域境界", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 471078, + "fid": "EABBA61C", + "z": 12, + "x": 3549, + "y": 1645 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L740", + "canonical_object_type": "海上交通安全法適用海域境界", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 471079, + "fid": "1358B907", + "z": 12, + "x": 3549, + "y": 1645 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L740", + "canonical_object_type": "海上交通安全法適用海域境界", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 5233584, + "fid": "EABBA61C", + "z": 12, + "x": 3550, + "y": 1645 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L740", + "canonical_object_type": "海上交通安全法適用海域境界", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 2611905, + "fid": "1358B907", + "z": 12, + "x": 3549, + "y": 1646 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L740", + "canonical_object_type": "海上交通安全法適用海域境界", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 5012425, + "fid": "1358B907", + "z": 12, + "x": 3548, + "y": 1646 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "2-20m", + "geom_type": "Polygon", + "count": 27, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2-20m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 5777261, + "fid": "052109DF", + "z": 12, + "x": 3510, + "y": 1627 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2-20m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 5256380, + "fid": "052109DF", + "z": 12, + "x": 3511, + "y": 1627 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2-20m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1717716, + "fid": "61423455", + "z": 12, + "x": 3524, + "y": 1643 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2-20m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6386331, + "fid": "BFD59CC0", + "z": 12, + "x": 3533, + "y": 1669 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2-20m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 2995949, + "fid": "064EA3A2", + "z": 12, + "x": 3549, + "y": 1637 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P施設・境界線等透明", + "canonical_object_type": "航空機進入区域", + "geom_type": "Polygon", + "count": 27, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P施設・境界線等透明", + "canonical_object_type": "航空機進入区域", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6129121, + "fid": "E39C89C5", + "z": 12, + "x": 3500, + "y": 1738 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P施設・境界線等透明", + "canonical_object_type": "航空機進入区域", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1156148, + "fid": "32CBBB20", + "z": 12, + "x": 3539, + "y": 1638 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P施設・境界線等透明", + "canonical_object_type": "航空機進入区域", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 3931590, + "fid": "1F528A97", + "z": 12, + "x": 3538, + "y": 1637 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P施設・境界線等透明", + "canonical_object_type": "航空機進入区域", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6121369, + "fid": "1F528A97", + "z": 12, + "x": 3538, + "y": 1638 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P施設・境界線等透明", + "canonical_object_type": "航空機進入区域", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6121370, + "fid": "32CBBB20", + "z": 12, + "x": 3538, + "y": 1638 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "L航路", + "canonical_object_type": "航路 (その他の推薦航路)", + "geom_type": "LineString", + "count": 26, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L航路", + "canonical_object_type": "航路 (その他の推薦航路)", + "canonical_family": "mixed", + "geom_type": "LineString", + "feature_id": 137286, + "fid": "EDF44F8D", + "z": 12, + "x": 3593, + "y": 1644 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L航路", + "canonical_object_type": "航路 (その他の推薦航路)", + "canonical_family": "mixed", + "geom_type": "LineString", + "feature_id": 5802486, + "fid": "EDF44F8D", + "z": 12, + "x": 3592, + "y": 1644 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L航路", + "canonical_object_type": "航路 (その他の推薦航路)", + "canonical_family": "mixed", + "geom_type": "LineString", + "feature_id": 4548328, + "fid": "7A4B46EB", + "z": 12, + "x": 3603, + "y": 1625 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L航路", + "canonical_object_type": "航路 (その他の推薦航路)", + "canonical_family": "mixed", + "geom_type": "LineString", + "feature_id": 4548329, + "fid": "5E3D99E1", + "z": 12, + "x": 3603, + "y": 1625 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L航路", + "canonical_object_type": "航路 (その他の推薦航路)", + "canonical_family": "mixed", + "geom_type": "LineString", + "feature_id": 4548330, + "fid": "F9D40B29", + "z": 12, + "x": 3603, + "y": 1625 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P施設・境界線等", + "canonical_object_type": "廃棄物捨て場", + "geom_type": "Polygon", + "count": 26, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P施設・境界線等", + "canonical_object_type": "廃棄物捨て場", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 2829387, + "fid": "8D8E9CCA", + "z": 12, + "x": 3506, + "y": 1739 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P施設・境界線等", + "canonical_object_type": "廃棄物捨て場", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 4766751, + "fid": "8D8E9CCA", + "z": 12, + "x": 3506, + "y": 1740 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P施設・境界線等", + "canonical_object_type": "廃棄物捨て場", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1900443, + "fid": "8D8E9CCA", + "z": 12, + "x": 3506, + "y": 1741 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P施設・境界線等", + "canonical_object_type": "廃棄物捨て場", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 5852752, + "fid": "8D8E9CCA", + "z": 12, + "x": 3507, + "y": 1738 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P施設・境界線等", + "canonical_object_type": "廃棄物捨て場", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 4823994, + "fid": "8D8E9CCA", + "z": 12, + "x": 3507, + "y": 1740 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P航行危険障害物", + "canonical_object_type": "魚礁 (危険なもの)", + "geom_type": "Polygon", + "count": 25, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P航行危険障害物", + "canonical_object_type": "魚礁 (危険なもの)", + "canonical_family": "mixed", + "geom_type": "Polygon", + "feature_id": 5593779, + "fid": "5468F7EC", + "z": 12, + "x": 3504, + "y": 1732 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P航行危険障害物", + "canonical_object_type": "魚礁 (危険なもの)", + "canonical_family": "mixed", + "geom_type": "Polygon", + "feature_id": 1460275, + "fid": "A0ACD550", + "z": 12, + "x": 3533, + "y": 1653 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P航行危険障害物", + "canonical_object_type": "魚礁 (危険なもの)", + "canonical_family": "mixed", + "geom_type": "Polygon", + "feature_id": 1922904, + "fid": "4B20433B", + "z": 12, + "x": 3522, + "y": 1649 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P航行危険障害物", + "canonical_object_type": "魚礁 (危険なもの)", + "canonical_family": "mixed", + "geom_type": "Polygon", + "feature_id": 1135858, + "fid": "17F283F7", + "z": 12, + "x": 3544, + "y": 1646 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P航行危険障害物", + "canonical_object_type": "魚礁 (危険なもの)", + "canonical_family": "mixed", + "geom_type": "Polygon", + "feature_id": 1135859, + "fid": "CF11DAEF", + "z": 12, + "x": 3544, + "y": 1646 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "L危険界", + "canonical_object_type": "未測海域", + "geom_type": "LineString", + "count": 24, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L危険界", + "canonical_object_type": "未測海域", + "canonical_family": "mixed", + "geom_type": "LineString", + "feature_id": 5870458, + "fid": "9C166914", + "z": 12, + "x": 3515, + "y": 1653 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L危険界", + "canonical_object_type": "未測海域", + "canonical_family": "mixed", + "geom_type": "LineString", + "feature_id": 1936123, + "fid": "8E0C8986", + "z": 12, + "x": 3513, + "y": 1653 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L危険界", + "canonical_object_type": "未測海域", + "canonical_family": "mixed", + "geom_type": "LineString", + "feature_id": 2740280, + "fid": "8CAD59E8", + "z": 12, + "x": 3514, + "y": 1651 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L危険界", + "canonical_object_type": "未測海域", + "canonical_family": "mixed", + "geom_type": "LineString", + "feature_id": 2740281, + "fid": "87513660", + "z": 12, + "x": 3514, + "y": 1651 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L危険界", + "canonical_object_type": "未測海域", + "canonical_family": "mixed", + "geom_type": "LineString", + "feature_id": 2740282, + "fid": "074FABE3", + "z": 12, + "x": 3514, + "y": 1651 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P721ククリ", + "canonical_object_type": "P721ククリ", + "geom_type": "LineString", + "count": 24, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P721ククリ", + "canonical_object_type": "P721ククリ", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 3686019, + "fid": "42E4ECFF", + "z": 12, + "x": 3560, + "y": 1634 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P721ククリ", + "canonical_object_type": "P721ククリ", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 5721475, + "fid": "8CD52E5F", + "z": 12, + "x": 3561, + "y": 1634 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P721ククリ", + "canonical_object_type": "P721ククリ", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 5721476, + "fid": "E5271B37", + "z": 12, + "x": 3561, + "y": 1634 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P721ククリ", + "canonical_object_type": "P721ククリ", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 5721477, + "fid": "CCCD67AD", + "z": 12, + "x": 3561, + "y": 1634 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P721ククリ", + "canonical_object_type": "P721ククリ", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 5721478, + "fid": "96678234", + "z": 12, + "x": 3561, + "y": 1634 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p航行危険障害物", + "canonical_object_type": "p航行危険障害物", + "geom_type": "Point", + "count": 24, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航行危険障害物", + "canonical_object_type": "p航行危険障害物", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 5594001, + "fid": "DB77446A", + "z": 12, + "x": 3504, + "y": 1732 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航行危険障害物", + "canonical_object_type": "p航行危険障害物", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 1460361, + "fid": "645E443E", + "z": 12, + "x": 3533, + "y": 1653 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航行危険障害物", + "canonical_object_type": "p航行危険障害物", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 1923755, + "fid": "A6AB76AA", + "z": 12, + "x": 3522, + "y": 1649 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航行危険障害物", + "canonical_object_type": "p航行危険障害物", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 1135938, + "fid": "91D90694", + "z": 12, + "x": 3544, + "y": 1646 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航行危険障害物", + "canonical_object_type": "p航行危険障害物", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 1135937, + "fid": "67DABFC2", + "z": 12, + "x": 3544, + "y": 1646 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p航路標識群", + "canonical_object_type": "V-AIS", + "geom_type": "Point", + "count": 24, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "V-AIS", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 6619185, + "fid": "9CEF6ED7", + "z": 12, + "x": 3542, + "y": 1638 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "V-AIS", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 390954, + "fid": "42FB9A34", + "z": 12, + "x": 3545, + "y": 1639 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "V-AIS", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 4609596, + "fid": "BC38CDDE", + "z": 12, + "x": 3546, + "y": 1639 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "V-AIS", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 4661191, + "fid": "CF995525", + "z": 12, + "x": 3548, + "y": 1639 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "V-AIS", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 2113522, + "fid": "B866B0AB", + "z": 12, + "x": 3550, + "y": 1640 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "未測海域", + "geom_type": "MultiPolygon", + "count": 21, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "未測海域", + "canonical_family": "mixed", + "geom_type": "MultiPolygon", + "feature_id": 3236106, + "fid": "F802DEDD", + "z": 12, + "x": 3491, + "y": 1736 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "未測海域", + "canonical_family": "mixed", + "geom_type": "MultiPolygon", + "feature_id": 1864684, + "fid": "F802DEDD", + "z": 12, + "x": 3491, + "y": 1737 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "未測海域", + "canonical_family": "mixed", + "geom_type": "MultiPolygon", + "feature_id": 3326061, + "fid": "9FF70F77", + "z": 12, + "x": 3527, + "y": 1653 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "未測海域", + "canonical_family": "mixed", + "geom_type": "MultiPolygon", + "feature_id": 6120949, + "fid": "9AE8C992", + "z": 12, + "x": 3538, + "y": 1638 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "未測海域", + "canonical_family": "mixed", + "geom_type": "MultiPolygon", + "feature_id": 48373, + "fid": "9C7DAD07", + "z": 12, + "x": 3557, + "y": 1632 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "防波堤", + "geom_type": "MultiPolygon", + "count": 20, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "防波堤", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 5026680, + "fid": "473B3012", + "z": 12, + "x": 3520, + "y": 1629 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "防波堤", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 2240206, + "fid": "8B8E3CCD", + "z": 12, + "x": 3518, + "y": 1713 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "防波堤", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 302662, + "fid": "8A08CF28", + "z": 12, + "x": 3530, + "y": 1670 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "防波堤", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 3100018, + "fid": "01ECE739", + "z": 12, + "x": 3529, + "y": 1661 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "防波堤", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 2575408, + "fid": "D68D372D", + "z": 12, + "x": 3529, + "y": 1662 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P錨泊地等", + "canonical_object_type": "制限区域", + "geom_type": "Polygon", + "count": 19, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P錨泊地等", + "canonical_object_type": "制限区域", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 3686930, + "fid": "192306D8", + "z": 12, + "x": 3560, + "y": 1634 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P錨泊地等", + "canonical_object_type": "制限区域", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 5722585, + "fid": "FC575EB5", + "z": 12, + "x": 3561, + "y": 1634 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P錨泊地等", + "canonical_object_type": "制限区域", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 5722586, + "fid": "7C972E75", + "z": 12, + "x": 3561, + "y": 1634 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P錨泊地等", + "canonical_object_type": "制限区域", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 5722587, + "fid": "192306D8", + "z": 12, + "x": 3561, + "y": 1634 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P錨泊地等", + "canonical_object_type": "制限区域", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 5722588, + "fid": "D3841E24", + "z": 12, + "x": 3561, + "y": 1634 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P陸上構造物陸", + "canonical_object_type": "ビル", + "geom_type": "MultiPolygon", + "count": 19, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P陸上構造物陸", + "canonical_object_type": "ビル", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 5095813, + "fid": "E55C661C", + "z": 12, + "x": 3525, + "y": 1645 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P陸上構造物陸", + "canonical_object_type": "ビル", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 4043431, + "fid": "D71F14B7", + "z": 12, + "x": 3536, + "y": 1638 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P陸上構造物陸", + "canonical_object_type": "ビル", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6121448, + "fid": "CD6BB81E", + "z": 12, + "x": 3538, + "y": 1638 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P陸上構造物陸", + "canonical_object_type": "ビル", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 4878420, + "fid": "56608C64", + "z": 12, + "x": 3536, + "y": 1637 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P陸上構造物陸", + "canonical_object_type": "ビル", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1034977, + "fid": "6658A349", + "z": 12, + "x": 3556, + "y": 1633 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p航行危険障害物", + "canonical_object_type": "測定済みの沈船", + "geom_type": "Point", + "count": 19, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航行危険障害物", + "canonical_object_type": "測定済みの沈船", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 5360595, + "fid": "4584FD2F", + "z": 12, + "x": 3526, + "y": 1641 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航行危険障害物", + "canonical_object_type": "測定済みの沈船", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 4261012, + "fid": "55BA5DFA", + "z": 12, + "x": 3537, + "y": 1633 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航行危険障害物", + "canonical_object_type": "測定済みの沈船", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3027186, + "fid": "49DD6AB5", + "z": 12, + "x": 3552, + "y": 1637 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航行危険障害物", + "canonical_object_type": "測定済みの沈船", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 5013858, + "fid": "0A08E582", + "z": 12, + "x": 3548, + "y": 1646 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航行危険障害物", + "canonical_object_type": "測定済みの沈船", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 6081908, + "fid": "49DD6AB5", + "z": 12, + "x": 3551, + "y": 1637 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p航路標識群", + "canonical_object_type": "球型浮標", + "geom_type": "Point", + "count": 19, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "球型浮標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 5717821, + "fid": "2FE99533", + "z": 12, + "x": 3547, + "y": 1636 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "球型浮標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 5717822, + "fid": "6C113F18", + "z": 12, + "x": 3547, + "y": 1636 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "球型浮標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 577183, + "fid": "D44C692E", + "z": 12, + "x": 3603, + "y": 1596 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "球型浮標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3183955, + "fid": "D44C692E", + "z": 12, + "x": 3603, + "y": 1595 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "球型浮標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 376094, + "fid": "E79B0CDE", + "z": 12, + "x": 3602, + "y": 1623 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P730ククリ", + "canonical_object_type": "P730ククリ", + "geom_type": "LineString", + "count": 18, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P730ククリ", + "canonical_object_type": "P730ククリ", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 6127967, + "fid": "F9729BD9", + "z": 12, + "x": 3500, + "y": 1738 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P730ククリ", + "canonical_object_type": "P730ククリ", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 1156128, + "fid": "2C5FA50C", + "z": 12, + "x": 3539, + "y": 1638 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P730ククリ", + "canonical_object_type": "P730ククリ", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 3931254, + "fid": "107A2A41", + "z": 12, + "x": 3538, + "y": 1637 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P730ククリ", + "canonical_object_type": "P730ククリ", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 1592628, + "fid": "9ADDECD7", + "z": 12, + "x": 3557, + "y": 1638 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P730ククリ", + "canonical_object_type": "P730ククリ", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 6221807, + "fid": "6FB7CB8E", + "z": 12, + "x": 3563, + "y": 1615 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P投錨注意障害物", + "canonical_object_type": "障害物", + "geom_type": "Polygon", + "count": 18, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P投錨注意障害物", + "canonical_object_type": "障害物", + "canonical_family": "mixed", + "geom_type": "Polygon", + "feature_id": 3881409, + "fid": "B6671E1F", + "z": 12, + "x": 3657, + "y": 1573 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P投錨注意障害物", + "canonical_object_type": "障害物", + "canonical_family": "mixed", + "geom_type": "Polygon", + "feature_id": 3881410, + "fid": "B11CCD20", + "z": 12, + "x": 3657, + "y": 1573 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P投錨注意障害物", + "canonical_object_type": "障害物", + "canonical_family": "mixed", + "geom_type": "Polygon", + "feature_id": 3881411, + "fid": "470B5701", + "z": 12, + "x": 3657, + "y": 1573 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P投錨注意障害物", + "canonical_object_type": "障害物", + "canonical_family": "mixed", + "geom_type": "Polygon", + "feature_id": 3881412, + "fid": "E21C4C60", + "z": 12, + "x": 3657, + "y": 1573 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P投錨注意障害物", + "canonical_object_type": "障害物", + "canonical_family": "mixed", + "geom_type": "Polygon", + "feature_id": 3881413, + "fid": "9FC354B0", + "z": 12, + "x": 3657, + "y": 1573 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P錨泊地等", + "canonical_object_type": "航泊禁止区域", + "geom_type": "Polygon", + "count": 16, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P錨泊地等", + "canonical_object_type": "航泊禁止区域", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 4414136, + "fid": "C29E5A22", + "z": 12, + "x": 3504, + "y": 1734 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P錨泊地等", + "canonical_object_type": "航泊禁止区域", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 2985371, + "fid": "C29E5A22", + "z": 12, + "x": 3505, + "y": 1734 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P錨泊地等", + "canonical_object_type": "航泊禁止区域", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6129306, + "fid": "DFC89A07", + "z": 12, + "x": 3500, + "y": 1738 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P錨泊地等", + "canonical_object_type": "航泊禁止区域", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 2261617, + "fid": "8088BC8D", + "z": 12, + "x": 3523, + "y": 1648 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P錨泊地等", + "canonical_object_type": "航泊禁止区域", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6459253, + "fid": "22B79B39", + "z": 12, + "x": 3553, + "y": 1634 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p航路標識群", + "canonical_object_type": "ドラム (樽)型灯浮標", + "geom_type": "Point", + "count": 16, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "ドラム (樽)型灯浮標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3007775, + "fid": "778EB794", + "z": 12, + "x": 3533, + "y": 1670 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "ドラム (樽)型灯浮標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3007776, + "fid": "39BB632C", + "z": 12, + "x": 3533, + "y": 1670 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "ドラム (樽)型灯浮標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3007777, + "fid": "7D816CED", + "z": 12, + "x": 3533, + "y": 1670 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "ドラム (樽)型灯浮標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3007778, + "fid": "F5A8D3E2", + "z": 12, + "x": 3533, + "y": 1670 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "ドラム (樽)型灯浮標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3007779, + "fid": "BFE98AF6", + "z": 12, + "x": 3533, + "y": 1670 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P投錨注意障害物", + "canonical_object_type": "沈木", + "geom_type": "Polygon", + "count": 15, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P投錨注意障害物", + "canonical_object_type": "沈木", + "canonical_family": "mixed", + "geom_type": "Polygon", + "feature_id": 2137460, + "fid": "C4D1233E", + "z": 12, + "x": 3588, + "y": 1615 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P投錨注意障害物", + "canonical_object_type": "沈木", + "canonical_family": "mixed", + "geom_type": "Polygon", + "feature_id": 2137461, + "fid": "EBB969C6", + "z": 12, + "x": 3588, + "y": 1615 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P投錨注意障害物", + "canonical_object_type": "沈木", + "canonical_family": "mixed", + "geom_type": "Polygon", + "feature_id": 2137462, + "fid": "EFE3F543", + "z": 12, + "x": 3588, + "y": 1615 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P投錨注意障害物", + "canonical_object_type": "沈木", + "canonical_family": "mixed", + "geom_type": "Polygon", + "feature_id": 3575322, + "fid": "CDADDC62", + "z": 12, + "x": 3595, + "y": 1612 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P投錨注意障害物", + "canonical_object_type": "沈木", + "canonical_family": "mixed", + "geom_type": "Polygon", + "feature_id": 3575323, + "fid": "5B5FFB25", + "z": 12, + "x": 3595, + "y": 1612 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "掃海済みの危険物", + "geom_type": "Point", + "count": 15, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "掃海済みの危険物", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3681548, + "fid": "A60E88F1", + "z": 12, + "x": 3521, + "y": 1650 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "掃海済みの危険物", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 727542, + "fid": "7A8560D5", + "z": 12, + "x": 3522, + "y": 1648 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "掃海済みの危険物", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 727543, + "fid": "64B31027", + "z": 12, + "x": 3522, + "y": 1648 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "掃海済みの危険物", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 5650032, + "fid": "2EC7057D", + "z": 12, + "x": 3522, + "y": 1650 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "掃海済みの危険物", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 5650033, + "fid": "A60E88F1", + "z": 12, + "x": 3522, + "y": 1650 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p陸上構造物", + "canonical_object_type": "陸上顕著物 (観覧車等)", + "geom_type": "Point", + "count": 15, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p陸上構造物", + "canonical_object_type": "陸上顕著物 (観覧車等)", + "canonical_family": "mixed", + "geom_type": "Point", + "feature_id": 3836360, + "fid": "D311D92A", + "z": 12, + "x": 3522, + "y": 1644 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p陸上構造物", + "canonical_object_type": "陸上顕著物 (観覧車等)", + "canonical_family": "mixed", + "geom_type": "Point", + "feature_id": 6129825, + "fid": "A31C29BB", + "z": 12, + "x": 3500, + "y": 1738 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p陸上構造物", + "canonical_object_type": "陸上顕著物 (観覧車等)", + "canonical_family": "mixed", + "geom_type": "Point", + "feature_id": 4976156, + "fid": "89B78B34", + "z": 12, + "x": 3531, + "y": 1640 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p陸上構造物", + "canonical_object_type": "陸上顕著物 (観覧車等)", + "canonical_family": "mixed", + "geom_type": "Point", + "feature_id": 4391916, + "fid": "DAB38272", + "z": 12, + "x": 3530, + "y": 1641 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p陸上構造物", + "canonical_object_type": "陸上顕著物 (観覧車等)", + "canonical_family": "mixed", + "geom_type": "Point", + "feature_id": 5399176, + "fid": "2A4BAE8B", + "z": 12, + "x": 3537, + "y": 1636 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p航路標識群", + "canonical_object_type": "円柱型灯浮標", + "geom_type": "Point", + "count": 12, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "円柱型灯浮標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 4260111, + "fid": "D4592BD0", + "z": 12, + "x": 3547, + "y": 1666 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "円柱型灯浮標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3013916, + "fid": "D4592BD0", + "z": 12, + "x": 3548, + "y": 1666 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "円柱型灯浮標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 4099250, + "fid": "0A011E44", + "z": 12, + "x": 3549, + "y": 1661 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "円柱型灯浮標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 1980615, + "fid": "10DF44DF", + "z": 12, + "x": 3657, + "y": 1536 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "円柱型灯浮標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 1980616, + "fid": "08A6A8B4", + "z": 12, + "x": 3657, + "y": 1536 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "掃海済みの沈船", + "geom_type": "Point", + "count": 10, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "掃海済みの沈船", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 591972, + "fid": "DC4CFD1E", + "z": 12, + "x": 3549, + "y": 1638 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "掃海済みの沈船", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 6459307, + "fid": "932524B8", + "z": 12, + "x": 3553, + "y": 1634 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "掃海済みの沈船", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 5621112, + "fid": "6856F775", + "z": 12, + "x": 3550, + "y": 1639 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "掃海済みの沈船", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 2198174, + "fid": "9DFBC5A5", + "z": 12, + "x": 3551, + "y": 1639 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "掃海済みの沈船", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 6509836, + "fid": "1F875EDF", + "z": 12, + "x": 3553, + "y": 1638 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p航行危険障害物", + "canonical_object_type": "海底火山", + "geom_type": "Point", + "count": 10, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航行危険障害物", + "canonical_object_type": "海底火山", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3117621, + "fid": "58562BE4", + "z": 12, + "x": 3631, + "y": 1622 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航行危険障害物", + "canonical_object_type": "海底火山", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 4082772, + "fid": "58562BE4", + "z": 12, + "x": 3630, + "y": 1622 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航行危険障害物", + "canonical_object_type": "海底火山", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 1530577, + "fid": "868FC797", + "z": 12, + "x": 3641, + "y": 1664 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航行危険障害物", + "canonical_object_type": "海底火山", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3729814, + "fid": "0E328B4B", + "z": 12, + "x": 3654, + "y": 1748 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航行危険障害物", + "canonical_object_type": "海底火山", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3729815, + "fid": "1262F090", + "z": 12, + "x": 3654, + "y": 1748 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "L海底線", + "canonical_object_type": "海底線 (電力)", + "geom_type": "MultiLineString", + "count": 9, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L海底線", + "canonical_object_type": "海底線 (電力)", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 6053209, + "fid": "CD04EA73", + "z": 12, + "x": 3515, + "y": 1647 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L海底線", + "canonical_object_type": "海底線 (電力)", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 3373553, + "fid": "1789B74F", + "z": 12, + "x": 3525, + "y": 1689 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L海底線", + "canonical_object_type": "海底線 (電力)", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 2547826, + "fid": "FE4258DB", + "z": 12, + "x": 3528, + "y": 1642 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L海底線", + "canonical_object_type": "海底線 (電力)", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 2513838, + "fid": "9C850EE0", + "z": 12, + "x": 3549, + "y": 1652 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L海底線", + "canonical_object_type": "海底線 (電力)", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 710616, + "fid": "C7161722", + "z": 12, + "x": 3568, + "y": 1634 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P730ククリ", + "canonical_object_type": "P730ククリ", + "geom_type": "MultiLineString", + "count": 9, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P730ククリ", + "canonical_object_type": "P730ククリ", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 6120785, + "fid": "107A2A41", + "z": 12, + "x": 3538, + "y": 1638 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P730ククリ", + "canonical_object_type": "P730ククリ", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 6120786, + "fid": "2C5FA50C", + "z": 12, + "x": 3538, + "y": 1638 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P730ククリ", + "canonical_object_type": "P730ククリ", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 4885023, + "fid": "EE04F3E7", + "z": 12, + "x": 3586, + "y": 1629 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P730ククリ", + "canonical_object_type": "P730ククリ", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 2681672, + "fid": "EE04F3E7", + "z": 12, + "x": 3586, + "y": 1630 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P730ククリ", + "canonical_object_type": "P730ククリ", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 2681673, + "fid": "11C8BACD", + "z": 12, + "x": 3586, + "y": 1630 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P航路", + "canonical_object_type": "航路 (その他の推薦航路)", + "geom_type": "Polygon", + "count": 9, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P航路", + "canonical_object_type": "航路 (その他の推薦航路)", + "canonical_family": "mixed", + "geom_type": "Polygon", + "feature_id": 6034708, + "fid": "6BF72E68", + "z": 12, + "x": 3638, + "y": 1617 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P航路", + "canonical_object_type": "航路 (その他の推薦航路)", + "canonical_family": "mixed", + "geom_type": "Polygon", + "feature_id": 6092917, + "fid": "7B0A36FD", + "z": 12, + "x": 3640, + "y": 1614 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P航路", + "canonical_object_type": "航路 (その他の推薦航路)", + "canonical_family": "mixed", + "geom_type": "Polygon", + "feature_id": 597054, + "fid": "AB8AD527", + "z": 12, + "x": 3640, + "y": 1616 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P航路", + "canonical_object_type": "航路 (その他の推薦航路)", + "canonical_family": "mixed", + "geom_type": "Polygon", + "feature_id": 4555357, + "fid": "6BF72E68", + "z": 12, + "x": 3639, + "y": 1617 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P航路", + "canonical_object_type": "航路 (その他の推薦航路)", + "canonical_family": "mixed", + "geom_type": "Polygon", + "feature_id": 2399931, + "fid": "AB8AD527", + "z": 12, + "x": 3640, + "y": 1615 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p航路境界等", + "canonical_object_type": "p航路境界等", + "geom_type": "Point", + "count": 9, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路境界等", + "canonical_object_type": "p航路境界等", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 6073100, + "fid": "A65BAF0C", + "z": 12, + "x": 3639, + "y": 1614 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路境界等", + "canonical_object_type": "p航路境界等", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 6073099, + "fid": "9C8ABA7B", + "z": 12, + "x": 3639, + "y": 1614 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路境界等", + "canonical_object_type": "p航路境界等", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 6073098, + "fid": "041BEA48", + "z": 12, + "x": 3639, + "y": 1614 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路境界等", + "canonical_object_type": "p航路境界等", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 5667633, + "fid": "7099C349", + "z": 12, + "x": 3637, + "y": 1617 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路境界等", + "canonical_object_type": "p航路境界等", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 6034898, + "fid": "FBD92873", + "z": 12, + "x": 3638, + "y": 1617 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "9000m以深", + "geom_type": "MultiPolygon", + "count": 8, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "9000m以深", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6335572, + "fid": "6B80B4A6", + "z": 12, + "x": 3664, + "y": 1641 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "9000m以深", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 4428293, + "fid": "6B80B4A6", + "z": 12, + "x": 3664, + "y": 1629 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "9000m以深", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 4642190, + "fid": "4785675C", + "z": 12, + "x": 3670, + "y": 1690 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "9000m以深", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 5030938, + "fid": "60D19859", + "z": 12, + "x": 3671, + "y": 1692 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "9000m以深", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 4715655, + "fid": "60D19859", + "z": 12, + "x": 3673, + "y": 1700 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P施設・境界線等", + "canonical_object_type": "専用用途海域", + "geom_type": "Polygon", + "count": 8, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P施設・境界線等", + "canonical_object_type": "専用用途海域", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 3013425, + "fid": "1CCD27D1", + "z": 12, + "x": 3523, + "y": 1644 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P施設・境界線等", + "canonical_object_type": "専用用途海域", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 3013426, + "fid": "6CB61851", + "z": 12, + "x": 3523, + "y": 1644 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P施設・境界線等", + "canonical_object_type": "専用用途海域", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 3013427, + "fid": "BE322E25", + "z": 12, + "x": 3523, + "y": 1644 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P施設・境界線等", + "canonical_object_type": "専用用途海域", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 3013428, + "fid": "9C6C39AC", + "z": 12, + "x": 3523, + "y": 1644 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P施設・境界線等", + "canonical_object_type": "専用用途海域", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 3013429, + "fid": "4E076FDA", + "z": 12, + "x": 3523, + "y": 1644 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p航行危険障害物", + "canonical_object_type": "水上岩 (露出岩)", + "geom_type": "Point", + "count": 8, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航行危険障害物", + "canonical_object_type": "水上岩 (露出岩)", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 2558920, + "fid": "80197086", + "z": 12, + "x": 3553, + "y": 1648 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航行危険障害物", + "canonical_object_type": "水上岩 (露出岩)", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3427130, + "fid": "67A77EC8", + "z": 12, + "x": 3572, + "y": 1629 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航行危険障害物", + "canonical_object_type": "水上岩 (露出岩)", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3427131, + "fid": "516F4F75", + "z": 12, + "x": 3572, + "y": 1629 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航行危険障害物", + "canonical_object_type": "水上岩 (露出岩)", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3427132, + "fid": "14751DE7", + "z": 12, + "x": 3572, + "y": 1629 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航行危険障害物", + "canonical_object_type": "水上岩 (露出岩)", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3427133, + "fid": "51344661", + "z": 12, + "x": 3572, + "y": 1629 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p航路標識群", + "canonical_object_type": "円錐型灯浮標", + "geom_type": "Point", + "count": 8, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "円錐型灯浮標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 4739531, + "fid": "A989A53D", + "z": 12, + "x": 3527, + "y": 1656 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "円錐型灯浮標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 4976140, + "fid": "E452ECE1", + "z": 12, + "x": 3531, + "y": 1640 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "円錐型灯浮標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 4976141, + "fid": "7C6EEF53", + "z": 12, + "x": 3531, + "y": 1640 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "円錐型灯浮標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 4976142, + "fid": "7D1560CB", + "z": 12, + "x": 3531, + "y": 1640 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "円錐型灯浮標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 4976143, + "fid": "BD0C98EF", + "z": 12, + "x": 3531, + "y": 1640 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "L702", + "canonical_object_type": "分離通航方式", + "geom_type": "LineString", + "count": 7, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L702", + "canonical_object_type": "分離通航方式", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 5437032, + "fid": "C2D9262F", + "z": 12, + "x": 3678, + "y": 1459 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L702", + "canonical_object_type": "分離通航方式", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 5586716, + "fid": "C2D9262F", + "z": 12, + "x": 3679, + "y": 1459 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L702", + "canonical_object_type": "分離通航方式", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 2985734, + "fid": "C2D9262F", + "z": 12, + "x": 3680, + "y": 1459 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L702", + "canonical_object_type": "分離通航方式", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 4035001, + "fid": "C2D9262F", + "z": 12, + "x": 3681, + "y": 1459 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L702", + "canonical_object_type": "分離通航方式", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 3961719, + "fid": "C2D9262F", + "z": 12, + "x": 3682, + "y": 1459 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P航行危険障害物ククリ", + "canonical_object_type": "P航行危険障害物ククリ", + "geom_type": "MultiLineString", + "count": 7, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P航行危険障害物ククリ", + "canonical_object_type": "P航行危険障害物ククリ", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 4848652, + "fid": "65B0C7BC", + "z": 12, + "x": 3474, + "y": 1753 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P航行危険障害物ククリ", + "canonical_object_type": "P航行危険障害物ククリ", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 4864988, + "fid": "E0653593", + "z": 12, + "x": 3473, + "y": 1753 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P航行危険障害物ククリ", + "canonical_object_type": "P航行危険障害物ククリ", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 2804800, + "fid": "6D068978", + "z": 12, + "x": 3586, + "y": 1613 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P航行危険障害物ククリ", + "canonical_object_type": "P航行危険障害物ククリ", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 3539159, + "fid": "99C1E330", + "z": 12, + "x": 3606, + "y": 1592 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P航行危険障害物ククリ", + "canonical_object_type": "P航行危険障害物ククリ", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 2167442, + "fid": "AD482D69", + "z": 12, + "x": 3650, + "y": 1725 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "L700", + "canonical_object_type": "指導線", + "geom_type": "LineString", + "count": 6, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L700", + "canonical_object_type": "指導線", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 388228, + "fid": "95EA91C6", + "z": 12, + "x": 3555, + "y": 1633 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L700", + "canonical_object_type": "指導線", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 388229, + "fid": "AD6DB187", + "z": 12, + "x": 3555, + "y": 1633 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L700", + "canonical_object_type": "指導線", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 388230, + "fid": "9BBB14F4", + "z": 12, + "x": 3555, + "y": 1633 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L700", + "canonical_object_type": "指導線", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 388231, + "fid": "1A29BA55", + "z": 12, + "x": 3555, + "y": 1633 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L700", + "canonical_object_type": "指導線", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 1032709, + "fid": "95EA91C6", + "z": 12, + "x": 3556, + "y": 1633 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "L海底線", + "canonical_object_type": "海底輸送管 (水)", + "geom_type": "MultiLineString", + "count": 6, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L海底線", + "canonical_object_type": "海底輸送管 (水)", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 5273039, + "fid": "0509078D", + "z": 12, + "x": 3521, + "y": 1645 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L海底線", + "canonical_object_type": "海底輸送管 (水)", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 3784937, + "fid": "81E510DE", + "z": 12, + "x": 3533, + "y": 1672 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L海底線", + "canonical_object_type": "海底輸送管 (水)", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 3306260, + "fid": "9F60DC64", + "z": 12, + "x": 3543, + "y": 1629 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L海底線", + "canonical_object_type": "海底輸送管 (水)", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 4019739, + "fid": "7ADE5693", + "z": 12, + "x": 3554, + "y": 1646 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L海底線", + "canonical_object_type": "海底輸送管 (水)", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 2590460, + "fid": "11CC63CD", + "z": 12, + "x": 3577, + "y": 1626 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p航行危険障害物", + "canonical_object_type": "魚礁 (危険なもの)", + "geom_type": "Point", + "count": 6, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航行危険障害物", + "canonical_object_type": "魚礁 (危険なもの)", + "canonical_family": "mixed", + "geom_type": "Point", + "feature_id": 425061, + "fid": "C9260B5F", + "z": 12, + "x": 3537, + "y": 1635 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航行危険障害物", + "canonical_object_type": "魚礁 (危険なもの)", + "canonical_family": "mixed", + "geom_type": "Point", + "feature_id": 425062, + "fid": "82616EB4", + "z": 12, + "x": 3537, + "y": 1635 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航行危険障害物", + "canonical_object_type": "魚礁 (危険なもの)", + "canonical_family": "mixed", + "geom_type": "Point", + "feature_id": 5155084, + "fid": "8B32F77C", + "z": 12, + "x": 3527, + "y": 1660 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航行危険障害物", + "canonical_object_type": "魚礁 (危険なもの)", + "canonical_family": "mixed", + "geom_type": "Point", + "feature_id": 6267284, + "fid": "0FEB4659", + "z": 12, + "x": 3551, + "y": 1636 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航行危険障害物", + "canonical_object_type": "魚礁 (危険なもの)", + "canonical_family": "mixed", + "geom_type": "Point", + "feature_id": 2653125, + "fid": "A46BD173", + "z": 12, + "x": 3587, + "y": 1612 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "5-20m", + "geom_type": "MultiPolygon", + "count": 5, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5-20m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 4439603, + "fid": "4028EAF1", + "z": 12, + "x": 3554, + "y": 1635 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5-20m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 3491645, + "fid": "21379AF8", + "z": 12, + "x": 3563, + "y": 1633 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5-20m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 4417168, + "fid": "8CC5E806", + "z": 12, + "x": 3584, + "y": 1632 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5-20m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1164454, + "fid": "2BAC682D", + "z": 12, + "x": 3665, + "y": 1732 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5-20m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 4424442, + "fid": "2BAC682D", + "z": 12, + "x": 3665, + "y": 1733 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P橋りょう等構造物", + "canonical_object_type": "橋 (水門)", + "geom_type": "MultiPolygon", + "count": 5, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P橋りょう等構造物", + "canonical_object_type": "橋 (水門)", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 2681935, + "fid": "7D735D39", + "z": 12, + "x": 3586, + "y": 1630 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P橋りょう等構造物", + "canonical_object_type": "橋 (水門)", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1082302, + "fid": "36935409", + "z": 12, + "x": 3581, + "y": 1625 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P橋りょう等構造物", + "canonical_object_type": "橋 (水門)", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 783624, + "fid": "7438809E", + "z": 12, + "x": 3588, + "y": 1627 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P橋りょう等構造物", + "canonical_object_type": "橋 (水門)", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 3499603, + "fid": "7438809E", + "z": 12, + "x": 3589, + "y": 1627 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P橋りょう等構造物", + "canonical_object_type": "橋 (水門)", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 3476662, + "fid": "BB17E3D6", + "z": 12, + "x": 3637, + "y": 1616 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p航路標識群", + "canonical_object_type": "ドラム (樽)型浮標", + "geom_type": "Point", + "count": 5, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "ドラム (樽)型浮標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3465848, + "fid": "64AF5DD5", + "z": 12, + "x": 3531, + "y": 1660 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "ドラム (樽)型浮標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 927338, + "fid": "5C5EEE22", + "z": 12, + "x": 3552, + "y": 1633 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "ドラム (樽)型浮標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 1122271, + "fid": "E8100D31", + "z": 12, + "x": 3570, + "y": 1632 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "ドラム (樽)型浮標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 1420197, + "fid": "AE19A72D", + "z": 12, + "x": 3604, + "y": 1624 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "ドラム (樽)型浮標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 1420198, + "fid": "C2B6B73B", + "z": 12, + "x": 3604, + "y": 1624 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "浮施設・桟橋", + "geom_type": "MultiPolygon", + "count": 4, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "浮施設・桟橋", + "canonical_family": "mixed", + "geom_type": "MultiPolygon", + "feature_id": 4323854, + "fid": "C8E6EF58", + "z": 12, + "x": 3554, + "y": 1637 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "浮施設・桟橋", + "canonical_family": "mixed", + "geom_type": "MultiPolygon", + "feature_id": 1034117, + "fid": "4B114A55", + "z": 12, + "x": 3556, + "y": 1633 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "浮施設・桟橋", + "canonical_family": "mixed", + "geom_type": "MultiPolygon", + "feature_id": 3503531, + "fid": "1F46248E", + "z": 12, + "x": 3632, + "y": 1580 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "浮施設・桟橋", + "canonical_family": "mixed", + "geom_type": "MultiPolygon", + "feature_id": 6289953, + "fid": "4B8193B5", + "z": 12, + "x": 3639, + "y": 1566 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P721ククリ", + "canonical_object_type": "P721ククリ", + "geom_type": "MultiLineString", + "count": 3, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P721ククリ", + "canonical_object_type": "P721ククリ", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 5324293, + "fid": "F0055DA3", + "z": 12, + "x": 3572, + "y": 1630 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P721ククリ", + "canonical_object_type": "P721ククリ", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 2252469, + "fid": "F0055DA3", + "z": 12, + "x": 3571, + "y": 1630 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P721ククリ", + "canonical_object_type": "P721ククリ", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 1563748, + "fid": "F0055DA3", + "z": 12, + "x": 3570, + "y": 1630 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "2-10m", + "geom_type": "MultiPolygon", + "count": 3, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2-10m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 2995948, + "fid": "AC624EC5", + "z": 12, + "x": 3549, + "y": 1637 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2-10m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 4021968, + "fid": "468ED982", + "z": 12, + "x": 3558, + "y": 1633 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2-10m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 887161, + "fid": "D91D8D66", + "z": 12, + "x": 3557, + "y": 1616 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "陸上水域", + "geom_type": "MultiPolygon", + "count": 3, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "陸上水域", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 3176352, + "fid": "9D3BE4F3", + "z": 12, + "x": 3523, + "y": 1645 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "陸上水域", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 4721578, + "fid": "23EF78DD", + "z": 12, + "x": 3525, + "y": 1655 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "陸上水域", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 796150, + "fid": "27557D24", + "z": 12, + "x": 3529, + "y": 1652 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P航路", + "canonical_object_type": "航路 (法律による航路)", + "geom_type": "MultiPolygon", + "count": 3, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P航路", + "canonical_object_type": "航路 (法律による航路)", + "canonical_family": "mixed", + "geom_type": "MultiPolygon", + "feature_id": 5398601, + "fid": "DE87EBF3", + "z": 12, + "x": 3537, + "y": 1636 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P航路", + "canonical_object_type": "航路 (法律による航路)", + "canonical_family": "mixed", + "geom_type": "MultiPolygon", + "feature_id": 3686928, + "fid": "42373F0C", + "z": 12, + "x": 3560, + "y": 1634 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P航路", + "canonical_object_type": "航路 (法律による航路)", + "canonical_family": "mixed", + "geom_type": "MultiPolygon", + "feature_id": 1741149, + "fid": "08B5EF53", + "z": 12, + "x": 3567, + "y": 1642 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "危険全沈没船", + "geom_type": "Point", + "count": 3, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "危険全沈没船", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 6545736, + "fid": "8FD02D44", + "z": 12, + "x": 3459, + "y": 1763 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "危険全沈没船", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 2089928, + "fid": "8FD02D44", + "z": 12, + "x": 3458, + "y": 1763 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "危険全沈没船", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 2355473, + "fid": "340D60F3", + "z": 12, + "x": 3650, + "y": 1613 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "L739", + "canonical_object_type": "平水境界", + "geom_type": "MultiLineString", + "count": 2, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L739", + "canonical_object_type": "平水境界", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 1148710, + "fid": "4AABADB1", + "z": 12, + "x": 3521, + "y": 1649 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L739", + "canonical_object_type": "平水境界", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 1919904, + "fid": "4AABADB1", + "z": 12, + "x": 3522, + "y": 1649 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P投錨注意障害物", + "canonical_object_type": "険悪物", + "geom_type": "MultiPolygon", + "count": 2, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P投錨注意障害物", + "canonical_object_type": "険悪物", + "canonical_family": "mixed", + "geom_type": "MultiPolygon", + "feature_id": 1964714, + "fid": "27588EC5", + "z": 12, + "x": 3660, + "y": 1545 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P投錨注意障害物", + "canonical_object_type": "険悪物", + "canonical_family": "mixed", + "geom_type": "MultiPolygon", + "feature_id": 1964721, + "fid": "FD0FE00D", + "z": 12, + "x": 3660, + "y": 1545 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P漁具定置箇所", + "canonical_object_type": "定置漁業", + "geom_type": "MultiPolygon", + "count": 2, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P漁具定置箇所", + "canonical_object_type": "定置漁業", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 4121268, + "fid": "B22ADA45", + "z": 12, + "x": 3535, + "y": 1634 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P漁具定置箇所", + "canonical_object_type": "定置漁業", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 3304524, + "fid": "8A30EA3A", + "z": 12, + "x": 3607, + "y": 1592 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "障害物", + "geom_type": "Point", + "count": 2, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "障害物", + "canonical_family": "mixed", + "geom_type": "Point", + "feature_id": 4133882, + "fid": "8DAA127E", + "z": 12, + "x": 3638, + "y": 1613 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "障害物", + "canonical_family": "mixed", + "geom_type": "Point", + "feature_id": 3882398, + "fid": "2FE1DC31", + "z": 12, + "x": 3657, + "y": 1573 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p航路標識群", + "canonical_object_type": "タワー型灯標識", + "geom_type": "Point", + "count": 2, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "タワー型灯標識", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 13329, + "fid": "31C7574C", + "z": 12, + "x": 3535, + "y": 1635 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "タワー型灯標識", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 6058449, + "fid": "DE194D83", + "z": 12, + "x": 3633, + "y": 1578 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p航路標識群", + "canonical_object_type": "大型灯標", + "geom_type": "Point", + "count": 2, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "大型灯標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 873761, + "fid": "D82C0B91", + "z": 12, + "x": 3604, + "y": 1623 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "大型灯標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 5020627, + "fid": "1B0F95E5", + "z": 12, + "x": 3641, + "y": 1614 + } + ] + }, + { + "issue_type": "field_value_rule_unresolved", + "source_layer": "p航路標識群", + "canonical_object_type": "灯 (Lt)", + "geom_type": "Point", + "count": 1, + "sample_features": [ + { + "issue_type": "field_value_rule_unresolved", + "reason": "light color was inferred from remark because no explicit field-value rule matched", + "source_layer": "p航路標識群", + "canonical_object_type": "灯 (Lt)", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 4405128, + "fid": "EEFCB357", + "z": 12, + "x": 3587, + "y": 1627, + "field_name": "灯色", + "legacy_value": "0", + "target_field": "light_color_code" + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "L基本線", + "canonical_object_type": "一本線で表わす海上バース", + "geom_type": "MultiLineString", + "count": 1, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L基本線", + "canonical_object_type": "一本線で表わす海上バース", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 5872420, + "fid": "F66EB99B", + "z": 12, + "x": 3662, + "y": 1559 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "L基本線", + "canonical_object_type": "一本線で表わす潜提", + "geom_type": "MultiLineString", + "count": 1, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L基本線", + "canonical_object_type": "一本線で表わす潜提", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 2441763, + "fid": "E5AB3D35", + "z": 12, + "x": 3571, + "y": 1629 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "L基本線", + "canonical_object_type": "浮施設・桟橋", + "geom_type": "MultiLineString", + "count": 1, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L基本線", + "canonical_object_type": "浮施設・桟橋", + "canonical_family": "mixed", + "geom_type": "MultiLineString", + "feature_id": 4130071, + "fid": "F81C5E21", + "z": 12, + "x": 3638, + "y": 1613 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "10-100m", + "geom_type": "Polygon", + "count": 1, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "10-100m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 5005269, + "fid": "BAF8D781", + "z": 12, + "x": 3664, + "y": 1560 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P潜堤", + "canonical_object_type": "潜提", + "geom_type": "MultiPolygon", + "count": 1, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P潜堤", + "canonical_object_type": "潜提", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 565017, + "fid": "D3776886", + "z": 12, + "x": 3649, + "y": 1610 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P陸上構造物陸", + "canonical_object_type": "陸上顕著物 (観覧車等)", + "geom_type": "Polygon", + "count": 1, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P陸上構造物陸", + "canonical_object_type": "陸上顕著物 (観覧車等)", + "canonical_family": "mixed", + "geom_type": "Polygon", + "feature_id": 4864126, + "fid": "8B5BAA43", + "z": 12, + "x": 3636, + "y": 1616 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "魚礁 (危険なもの)", + "geom_type": "Point", + "count": 1, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p投錨注意障害物", + "canonical_object_type": "魚礁 (危険なもの)", + "canonical_family": "mixed", + "geom_type": "Point", + "feature_id": 2521001, + "fid": "CD620388", + "z": 12, + "x": 3531, + "y": 1641 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p航行危険障害物", + "canonical_object_type": "サンドウェーブ", + "geom_type": "Point", + "count": 1, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航行危険障害物", + "canonical_object_type": "サンドウェーブ", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3385773, + "fid": "7E12FA56", + "z": 12, + "x": 3541, + "y": 1637 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p航行危険障害物", + "canonical_object_type": "マスト露出沈船", + "geom_type": "Point", + "count": 1, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航行危険障害物", + "canonical_object_type": "マスト露出沈船", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3082679, + "fid": "7E82D114", + "z": 12, + "x": 3665, + "y": 1727 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p航行危険障害物", + "canonical_object_type": "全沈没船 (危険なし)", + "geom_type": "Point", + "count": 1, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航行危険障害物", + "canonical_object_type": "全沈没船 (危険なし)", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 4192871, + "fid": "0B7DC822", + "z": 12, + "x": 3649, + "y": 1537 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p航行危険障害物", + "canonical_object_type": "掃海済みの危険物", + "geom_type": "Point", + "count": 1, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航行危険障害物", + "canonical_object_type": "掃海済みの危険物", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 2168510, + "fid": "19CEB718", + "z": 12, + "x": 3695, + "y": 1505 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p航行危険障害物", + "canonical_object_type": "石油開発台", + "geom_type": "Point", + "count": 1, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航行危険障害物", + "canonical_object_type": "石油開発台", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 6058448, + "fid": "9F0B8FA4", + "z": 12, + "x": 3633, + "y": 1578 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p航路標識群", + "canonical_object_type": "大型浮標", + "geom_type": "Point", + "count": 1, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "大型浮標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 1309230, + "fid": "FB1EF39A", + "z": 12, + "x": 3502, + "y": 1736 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p航路標識群", + "canonical_object_type": "球型灯浮標", + "geom_type": "Point", + "count": 1, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "球型灯浮標", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 2262078, + "fid": "3C6E2A98", + "z": 12, + "x": 3523, + "y": 1648 + } + ] + } + ] +} \ No newline at end of file diff --git a/docs/报告/20261013_全国Full生产分片历史审计证据/z12.mapping_audit.md b/docs/报告/20261013_全国Full生产分片历史审计证据/z12.mapping_audit.md new file mode 100644 index 0000000..d88fa18 --- /dev/null +++ b/docs/报告/20261013_全国Full生产分片历史审计证据/z12.mapping_audit.md @@ -0,0 +1,999 @@ +# NavSea Mapping Audit Report + +- bundle_id: `navsea-core` +- output_root: `/home/wwwroot/pbf-delivery-full-20260418-rebuild.parts/z12` +- tile_jobs: `48556` +- written_tiles: `48556` +- skipped_tiles: `0` +- unresolved_event_count: `2986445` + +## Unresolved Summary + +- `render_rule_unresolved` | `L海底地形` | `L海底地形` | `LineString` | count=`914174` + sample: fid=`80A01819` feature_id=`6685108` tile=`12/3444/1722` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`C4A39917` feature_id=`6323734` tile=`12/3437/1757` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`5A78A35A` feature_id=`6323735` tile=`12/3437/1757` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `L陸上構造物陸` | `道路` | `LineString` | count=`635269` + sample: fid=`7D75B55E` feature_id=`4059245` tile=`12/3456/1762` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`C2C5AE5C` feature_id=`4059246` tile=`12/3456/1762` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`2F129947` feature_id=`4059247` tile=`12/3456/1762` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線ククリ` | `P基本線ククリ` | `LineString` | count=`399814` + sample: fid=`F486965C` feature_id=`1625103` tile=`12/3436/1753` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`1C821C0E` feature_id=`1625104` tile=`12/3436/1753` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`73FD37DB` feature_id=`1625105` tile=`12/3436/1753` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P穴` | `P穴` | `Polygon` | count=`161745` + sample: fid=`4F2BF8F9` feature_id=`1330804` tile=`12/3436/1746` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`AD717985` feature_id=`1330805` tile=`12/3436/1746` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`AD717985` feature_id=`1330806` tile=`12/3436/1746` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `L等深線` | `等深線` | `LineString` | count=`118848` + sample: fid=`EDDFFC1D` feature_id=`1330798` tile=`12/3436/1746` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`3314CA36` feature_id=`1625097` tile=`12/3436/1753` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`3314CA36` feature_id=`4555996` tile=`12/3436/1754` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `L海底地形` | `L海底地形` | `MultiLineString` | count=`114720` + sample: fid=`48361740` feature_id=`1869543` tile=`12/3445/1781` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`80A01819` feature_id=`6519895` tile=`12/3444/1723` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`D2D101CB` feature_id=`4513733` tile=`12/3445/1777` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P陸域` | `P陸域` | `Polygon` | count=`100791` + sample: fid=`AAAF3533` feature_id=`1330807` tile=`12/3436/1746` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`0ADCE957` feature_id=`2249119` tile=`12/3437/1748` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`2A73DE2E` feature_id=`1625108` tile=`12/3436/1753` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `干潮帯` | `Polygon` | count=`55564` + sample: fid=`2B71620E` feature_id=`1625101` tile=`12/3436/1753` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`5A848E07` feature_id=`1625102` tile=`12/3436/1753` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`5A848E07` feature_id=`4556000` tile=`12/3436/1754` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p地名陸` | `p地名陸` | `Point` | count=`33563` + sample: fid=`31818EDF` feature_id=`4059313` tile=`12/3456/1762` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`6F4518F0` feature_id=`6543272` tile=`12/3447/1761` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`DAEFACF3` feature_id=`3994532` tile=`12/3457/1762` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p地名` | `p地名` | `Point` | count=`32034` + sample: fid=`2D74112C` feature_id=`2249120` tile=`12/3437/1748` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`F9C7F936` feature_id=`1625109` tile=`12/3436/1753` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`995A3245` feature_id=`1005137` tile=`12/3437/1746` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `防波堤` | `Polygon` | count=`29162` + sample: fid=`DD04BE42` feature_id=`4059258` tile=`12/3456/1762` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`42EAFF1B` feature_id=`6543217` tile=`12/3447/1761` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`4F9DB56D` feature_id=`6543218` tile=`12/3447/1761` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `2-5m` | `Polygon` | count=`23592` + sample: fid=`20B80820` feature_id=`1014997` tile=`12/3454/1762` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`9EC2ED28` feature_id=`1906380` tile=`12/3457/1764` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`62DED0C8` feature_id=`1318140` tile=`12/3456/1766` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `0-2m` | `Polygon` | count=`21914` + sample: fid=`7B2E3DDA` feature_id=`4059255` tile=`12/3456/1762` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`875640FA` feature_id=`4059256` tile=`12/3456/1762` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`62617609` feature_id=`1014995` tile=`12/3454/1762` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `5-10m` | `Polygon` | count=`20338` + sample: fid=`F16D3931` feature_id=`1014998` tile=`12/3454/1762` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`88CEFF3D` feature_id=`4593936` tile=`12/3448/1760` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`6C32970B` feature_id=`6543210` tile=`12/3447/1761` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P危険界ククリ` | `P危険界ククリ` | `LineString` | count=`17465` + sample: fid=`BC187000` feature_id=`4059254` tile=`12/3456/1762` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`0B6A43BB` feature_id=`6625916` tile=`12/3459/1760` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`C45A010E` feature_id=`2629019` tile=`12/3461/1759` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P陸上構造物陸` | `ビル` | `Polygon` | count=`13573` + sample: fid=`47FCBA67` feature_id=`5042500` tile=`12/3461/1762` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`CE2C9644` feature_id=`3720476` tile=`12/3475/1757` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`CAFD8FF1` feature_id=`1626923` tile=`12/3501/1735` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `L基本線` | `一本線で表わす桟橋` | `LineString` | count=`12781` + sample: fid=`722AF89C` feature_id=`4059244` tile=`12/3456/1762` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`B344852A` feature_id=`2354027` tile=`12/3446/1760` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`39A0EDD1` feature_id=`2354028` tile=`12/3446/1760` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `L海底線` | `海底線 (電信電話)` | `LineString` | count=`12712` + sample: fid=`DE0CD85E` feature_id=`6323736` tile=`12/3437/1757` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`4F822F77` feature_id=`6323737` tile=`12/3437/1757` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`AFA95DF8` feature_id=`3767042` tile=`12/3445/1784` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p投錨注意障害物` | `険悪物` | `Point` | count=`11088` + sample: fid=`92FECF71` feature_id=`2354897` tile=`12/3446/1760` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`29A880E7` feature_id=`5392011` tile=`12/3459/1761` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`78361FE6` feature_id=`6272309` tile=`12/3467/1758` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p航行危険障害物` | `暗岩` | `Point` | count=`10366` + sample: fid=`9F2AE8E8` feature_id=`1015022` tile=`12/3454/1762` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`4F980869` feature_id=`1015023` tile=`12/3454/1762` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`601A9E4C` feature_id=`4015179` tile=`12/3474/1754` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `浅所危険界` | `Polygon` | count=`9980` + sample: fid=`7CF304CD` feature_id=`4059264` tile=`12/3456/1762` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`728BEBC2` feature_id=`6625938` tile=`12/3459/1760` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`3F2B71EB` feature_id=`2629042` tile=`12/3461/1759` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P漁具定置箇所` | `区画漁業` | `Polygon` | count=`9811` + sample: fid=`2727C0E0` feature_id=`6625969` tile=`12/3459/1760` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`26E5B52D` feature_id=`6625970` tile=`12/3459/1760` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`9F1FEDEC` feature_id=`6625971` tile=`12/3459/1760` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `10-20m` | `Polygon` | count=`9791` + sample: fid=`064C7DCC` feature_id=`1330799` tile=`12/3436/1746` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`2EB7B0DC` feature_id=`3742367` tile=`12/3454/1764` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`2C8E3D96` feature_id=`6543202` tile=`12/3447/1761` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `1000-2000m` | `Polygon` | count=`9092` + sample: fid=`743EE596` feature_id=`4852381` tile=`12/3443/1750` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`743EE596` feature_id=`3058904` tile=`12/3443/1747` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`743EE596` feature_id=`6021241` tile=`12/3443/1751` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P橋りょう等構造物` | `橋 (水門)` | `Polygon` | count=`8972` + sample: fid=`D3853F3B` feature_id=`3994501` tile=`12/3457/1762` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`A41FAF33` feature_id=`3994502` tile=`12/3457/1762` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`94988701` feature_id=`5929374` tile=`12/3461/1761` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `2000-3000m` | `Polygon` | count=`8747` + sample: fid=`02940A0C` feature_id=`2539102` tile=`12/3445/1772` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`02940A0C` feature_id=`212694` tile=`12/3445/1771` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`02940A0C` feature_id=`1459455` tile=`12/3445/1769` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `L基本線` | `浮施設・桟橋` | `LineString` | count=`8495` + sample: fid=`5EDBD274` feature_id=`4059242` tile=`12/3456/1762` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`AB03DA90` feature_id=`4059243` tile=`12/3456/1762` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`FEAEBF8A` feature_id=`2846034` tile=`12/3490/1736` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p航路標識群` | `灯 (Lt)` | `Point` | count=`7503` + sample: fid=`F950488E` feature_id=`2354901` tile=`12/3446/1760` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`98CDE62D` feature_id=`803878` tile=`12/3471/1755` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`6A3188E4` feature_id=`803879` tile=`12/3471/1755` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `5000-6000m` | `Polygon` | count=`7326` + sample: fid=`CBB6C786` feature_id=`3767046` tile=`12/3445/1784` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`CBB6C786` feature_id=`2028776` tile=`12/3445/1783` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`CBB6C786` feature_id=`48069` tile=`12/3438/1781` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `浮施設・桟橋` | `Polygon` | count=`6933` + sample: fid=`79C37737` feature_id=`4059259` tile=`12/3456/1762` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`E00710B9` feature_id=`2354617` tile=`12/3446/1760` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`37161ECF` feature_id=`3610793` tile=`12/3456/1760` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `3000-4000m` | `Polygon` | count=`6837` + sample: fid=`5ED00BCE` feature_id=`1626438` tile=`12/3438/1771` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`5ED00BCE` feature_id=`2402216` tile=`12/3436/1770` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`5ED00BCE` feature_id=`1742731` tile=`12/3445/1773` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `500-1000m` | `Polygon` | count=`6537` + sample: fid=`06D87451` feature_id=`3586368` tile=`12/3443/1748` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`06D87451` feature_id=`816344` tile=`12/3443/1746` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`06D87451` feature_id=`4852380` tile=`12/3443/1750` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `100-200m` | `Polygon` | count=`6504` + sample: fid=`77AA5E0A` feature_id=`6685110` tile=`12/3444/1722` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`77AA5E0A` feature_id=`1637059` tile=`12/3444/1725` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`77AA5E0A` feature_id=`3047063` tile=`12/3444/1729` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `20-100m` | `Polygon` | count=`6379` + sample: fid=`AD717985` feature_id=`5758826` tile=`12/3445/1717` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`AD717985` feature_id=`3048860` tile=`12/3441/1720` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`AD717985` feature_id=`6685109` tile=`12/3444/1722` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `4000-5000m` | `Polygon` | count=`5835` + sample: fid=`C87811B8` feature_id=`3767045` tile=`12/3445/1784` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`C87811B8` feature_id=`2028775` tile=`12/3445/1783` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`C87811B8` feature_id=`48068` tile=`12/3438/1781` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `0-5m` | `Polygon` | count=`5493` + sample: fid=`EA5AA210` feature_id=`1014996` tile=`12/3454/1762` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`EA41DC1A` feature_id=`4593935` tile=`12/3448/1760` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`39F5455E` feature_id=`6543208` tile=`12/3447/1761` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p陸上構造物` | `塔、やぐら、風車` | `Point` | count=`5419` + sample: fid=`7D1DD46C` feature_id=`4570633` tile=`12/3462/1758` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`4201B8C8` feature_id=`5929450` tile=`12/3461/1761` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`F7D992B2` feature_id=`5929451` tile=`12/3461/1761` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `200-500m` | `Polygon` | count=`5256` + sample: fid=`E654FCFF` feature_id=`6323739` tile=`12/3437/1757` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`E2915581` feature_id=`1406852` tile=`12/3437/1749` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`E2915581` feature_id=`2249113` tile=`12/3437/1748` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p陸上構造物` | `山頂` | `Point` | count=`4827` + sample: fid=`7A343E6B` feature_id=`4059314` tile=`12/3456/1762` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`6772E944` feature_id=`4059315` tile=`12/3456/1762` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`B8CB620F` feature_id=`4059316` tile=`12/3456/1762` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `L基本線` | `一本線で表わす海上バース` | `LineString` | count=`4696` + sample: fid=`12A21CC5` feature_id=`4714113` tile=`12/3503/1732` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`04B197C6` feature_id=`4714114` tile=`12/3503/1732` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`6AFAA9DF` feature_id=`2870437` tile=`12/3503/1735` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P陸上構造物陸` | `タンク` | `Polygon` | count=`4441` + sample: fid=`9D4AF305` feature_id=`579723` tile=`12/3466/1758` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`DAE5A542` feature_id=`6094118` tile=`12/3474/1756` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`68773C74` feature_id=`5517934` tile=`12/3503/1734` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P投錨注意障害物ククリ` | `P投錨注意障害物ククリ` | `LineString` | count=`4227` + sample: fid=`C99504B5` feature_id=`3733776` tile=`12/3503/1738` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`879A1585` feature_id=`1117332` tile=`12/3503/1728` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`C27B5E65` feature_id=`2777142` tile=`12/3500/1740` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p陸上構造物` | `煙突` | `Point` | count=`4054` + sample: fid=`EC760317` feature_id=`2761866` tile=`12/3447/1760` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`21B165E3` feature_id=`5042516` tile=`12/3461/1762` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`241A832B` feature_id=`5042517` tile=`12/3461/1762` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `L等深線` | `等深線` | `MultiLineString` | count=`3531` + sample: fid=`3A62AB5A` feature_id=`1330797` tile=`12/3436/1746` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`909521C0` feature_id=`2249110` tile=`12/3437/1748` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`30F5C9F9` feature_id=`4593925` tile=`12/3448/1760` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線ククリ` | `P基本線ククリ` | `MultiLineString` | count=`3527` + sample: fid=`17ECC1F3` feature_id=`1330803` tile=`12/3436/1746` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`DC7730C3` feature_id=`2249115` tile=`12/3437/1748` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`DC7730C3` feature_id=`2982820` tile=`12/3437/1747` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `河川域` | `Polygon` | count=`3389` + sample: fid=`A76C35D8` feature_id=`4059266` tile=`12/3456/1762` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`9E5FD143` feature_id=`4059268` tile=`12/3456/1762` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`C8E56387` feature_id=`4059269` tile=`12/3456/1762` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p航行危険障害物` | `洗岩` | `Point` | count=`3323` + sample: fid=`2C62D88D` feature_id=`3994536` tile=`12/3457/1762` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`574043FA` feature_id=`1067515` tile=`12/3455/1763` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`BBD57184` feature_id=`4055050` tile=`12/3472/1753` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p施設・境界線等` | `漁港` | `Point` | count=`3169` + sample: fid=`F3683074` feature_id=`2354898` tile=`12/3446/1760` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`10DD546A` feature_id=`803869` tile=`12/3471/1755` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`7EF93C38` feature_id=`3903639` tile=`12/3456/1765` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `6000-7000m` | `Polygon` | count=`3001` + sample: fid=`2DFE98D1` feature_id=`4343122` tile=`12/3446/1775` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`2DFE98D1` feature_id=`871075` tile=`12/3446/1776` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`2DFE98D1` feature_id=`4383465` tile=`12/3447/1775` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `L概略等深線` | `概略等深線` | `LineString` | count=`2830` + sample: fid=`4ED8BA45` feature_id=`6336228` tile=`12/3472/1754` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`4D2C2294` feature_id=`1748701` tile=`12/3499/1739` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`A8318F47` feature_id=`1748702` tile=`12/3499/1739` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p航路標識群` | `防波堤灯台` | `Point` | count=`2349` + sample: fid=`CBE175BD` feature_id=`2354900` tile=`12/3446/1760` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`BB8A6871` feature_id=`3903643` tile=`12/3456/1765` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`19CBAE9A` feature_id=`3236167` tile=`12/3491/1736` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P投錨注意障害物` | `険悪物` | `Polygon` | count=`2263` + sample: fid=`078F9E5C` feature_id=`2034762` tile=`12/3517/1655` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`078F9E5C` feature_id=`1252846` tile=`12/3518/1655` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`4BD57036` feature_id=`5367950` tile=`12/3502/1738` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p航行危険障害物` | `ポンツーン、パイル、杭` | `Point` | count=`2119` + sample: fid=`F7621D99` feature_id=`5817498` tile=`12/3457/1763` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`F89AE4A5` feature_id=`2777262` tile=`12/3500/1740` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`C836FEF0` feature_id=`4715345` tile=`12/3503/1732` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p投錨注意障害物` | `海草` | `Point` | count=`2086` + sample: fid=`2E7F8CC5` feature_id=`5817486` tile=`12/3457/1763` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`913E9502` feature_id=`5817487` tile=`12/3457/1763` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`04F949D0` feature_id=`5817488` tile=`12/3457/1763` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p投錨注意障害物` | `p投錨注意障害物` | `Point` | count=`1976` + sample: fid=`80D2DC24` feature_id=`3733865` tile=`12/3503/1738` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`33B95929` feature_id=`1117546` tile=`12/3503/1728` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`9FB7A5A8` feature_id=`2777259` tile=`12/3500/1740` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P漁具定置箇所` | `定置漁業` | `Polygon` | count=`1878` + sample: fid=`FECA0EFA` feature_id=`3429700` tile=`12/3507/1732` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`6B7C9CC7` feature_id=`721638` tile=`12/3501/1736` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`F8D81DE2` feature_id=`5127032` tile=`12/3513/1651` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `L等深線` | `湖沼等深線` | `LineString` | count=`1698` + sample: fid=`6BD73FB9` feature_id=`2756267` tile=`12/3533/1673` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`7B1E6A61` feature_id=`2756269` tile=`12/3533/1673` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`7A1B24E5` feature_id=`2756272` tile=`12/3533/1673` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `L741` | `港則法による境界` | `LineString` | count=`1665` + sample: fid=`6CC91E28` feature_id=`5277886` tile=`12/3499/1738` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`FD4440C8` feature_id=`1838251` tile=`12/3504/1738` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`0D784360` feature_id=`3089603` tile=`12/3503/1739` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `0-10m` | `Polygon` | count=`1461` + sample: fid=`A341BC14` feature_id=`3742372` tile=`12/3454/1764` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`2BDB9213` feature_id=`4848640` tile=`12/3474/1753` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`2BDB9213` feature_id=`4015139` tile=`12/3474/1754` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p航路標識群` | `灯浮標 (やぐら型)` | `Point` | count=`1460` + sample: fid=`770E95D8` feature_id=`2113057` tile=`12/3472/1755` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`137F0591` feature_id=`4012659` tile=`12/3500/1737` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`0192322A` feature_id=`3733877` tile=`12/3503/1738` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p陸上構造物` | `漁業協同組合` | `Point` | count=`1457` + sample: fid=`48E57A0F` feature_id=`2354904` tile=`12/3446/1760` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`71E68D1B` feature_id=`2091851` tile=`12/3494/1736` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`64141F98` feature_id=`351509` tile=`12/3504/1728` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `未測海域` | `Polygon` | count=`1438` + sample: fid=`97FC94D6` feature_id=`4059265` tile=`12/3456/1762` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`58B89C9B` feature_id=`6336353` tile=`12/3472/1754` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`83EAC938` feature_id=`2354634` tile=`12/3446/1760` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `7000-8000m` | `Polygon` | count=`1381` + sample: fid=`2819F28E` feature_id=`3606890` tile=`12/3485/1770` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`2819F28E` feature_id=`3413215` tile=`12/3485/1769` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`2819F28E` feature_id=`400944` tile=`12/3486/1769` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `L陸上構造物陸` | `道路` | `MultiLineString` | count=`1365` + sample: fid=`1807893C` feature_id=`6270466` tile=`12/3446/1761` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`37F239FE` feature_id=`2354555` tile=`12/3446/1760` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`77612B77` feature_id=`2761395` tile=`12/3447/1760` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P潜堤` | `潜提` | `Polygon` | count=`1340` + sample: fid=`E669A0EB` feature_id=`2761729` tile=`12/3447/1760` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`A0EBECD5` feature_id=`2761730` tile=`12/3447/1760` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`96ED2E48` feature_id=`2761731` tile=`12/3447/1760` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p航路標識群` | `浮標 (やぐら型)` | `Point` | count=`1313` + sample: fid=`422DDF7C` feature_id=`2816411` tile=`12/3458/1758` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`27B246A1` feature_id=`5026057` tile=`12/3493/1741` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`07962E26` feature_id=`929054` tile=`12/3455/1762` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `撤去跡` | `Polygon` | count=`1271` + sample: fid=`5A99B3C0` feature_id=`2761559` tile=`12/3447/1760` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`2C7C977F` feature_id=`351323` tile=`12/3504/1728` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`0B7DB166` feature_id=`351324` tile=`12/3504/1728` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p航路標識群` | `橋梁灯` | `Point` | count=`1250` + sample: fid=`9BC70A66` feature_id=`5531512` tile=`12/3502/1733` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`04D0404F` feature_id=`5531513` tile=`12/3502/1733` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`5201577E` feature_id=`2449313` tile=`12/3473/1755` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P陸域` | `P陸域` | `MultiPolygon` | count=`1188` + sample: fid=`CCE84815` feature_id=`4059307` tile=`12/3456/1762` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`936E1646` feature_id=`1318163` tile=`12/3456/1766` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`7843E684` feature_id=`5807574` tile=`12/3453/1745` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p航路標識群` | `立標` | `Point` | count=`1181` + sample: fid=`DB3D660E` feature_id=`250025` tile=`12/3466/1757` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`7E97BA97` feature_id=`250026` tile=`12/3466/1757` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`D5A190E2` feature_id=`250027` tile=`12/3466/1757` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p投錨注意障害物` | `サンドウェーブ` | `Point` | count=`1178` + sample: fid=`48D8CB78` feature_id=`2701096` tile=`12/3515/1645` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`CF6032AF` feature_id=`2701097` tile=`12/3515/1645` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`56AC2D05` feature_id=`3541622` tile=`12/3515/1646` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p航行危険障害物` | `干出岩` | `Point` | count=`1178` + sample: fid=`26C78D5B` feature_id=`5807576` tile=`12/3453/1745` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`546FC197` feature_id=`3994534` tile=`12/3457/1762` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`A3395477` feature_id=`3994535` tile=`12/3457/1762` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p投錨注意障害物` | `急潮・波紋・激潮` | `Point` | count=`1100` + sample: fid=`98D50BAD` feature_id=`1625110` tile=`12/3436/1753` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`35393FA4` feature_id=`1625111` tile=`12/3436/1753` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`7199DD64` feature_id=`4556004` tile=`12/3436/1754` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `10-20m` | `MultiPolygon` | count=`995` + sample: fid=`C57872E0` feature_id=`4593926` tile=`12/3448/1760` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`1793C814` feature_id=`2629021` tile=`12/3461/1759` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`19A6D64D` feature_id=`529217` tile=`12/3458/1761` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `5-10m` | `MultiPolygon` | count=`877` + sample: fid=`175252A4` feature_id=`3994452` tile=`12/3457/1762` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`C06F864C` feature_id=`2629030` tile=`12/3461/1759` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`F8EAA6CD` feature_id=`529234` tile=`12/3458/1761` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p高さ制限` | `p高さ制限` | `Point` | count=`858` + sample: fid=`01A58C66` feature_id=`1021184` tile=`12/3473/1757` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`95A26FC7` feature_id=`1117578` tile=`12/3503/1728` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`DFDB6C2D` feature_id=`2617943` tile=`12/3503/1733` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p航行危険障害物` | `孤立危険物` | `Point` | count=`824` + sample: fid=`32239646` feature_id=`1015021` tile=`12/3454/1762` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`A318FB5F` feature_id=`1067514` tile=`12/3455/1763` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`571E1C8D` feature_id=`4015178` tile=`12/3474/1754` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P穴` | `P穴` | `MultiPolygon` | count=`775` + sample: fid=`06D87451` feature_id=`3994553` tile=`12/3446/1763` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`743EE596` feature_id=`2760413` tile=`12/3449/1758` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`5ED00BCE` feature_id=`5869681` tile=`12/3450/1768` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p航行危険障害物` | `ドルフィン` | `Point` | count=`756` + sample: fid=`1CD945AE` feature_id=`3090621` tile=`12/3503/1739` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`916F998B` feature_id=`3704153` tile=`12/3497/1738` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`F5C36EE7` feature_id=`2871809` tile=`12/3503/1735` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `L海底線` | `海底線 (電力)` | `LineString` | count=`735` + sample: fid=`6DB72EA4` feature_id=`249907` tile=`12/3466/1757` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`12213B32` feature_id=`3610709` tile=`12/3456/1760` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`306875B3` feature_id=`3610710` tile=`12/3456/1760` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P754ククリ` | `P754ククリ` | `LineString` | count=`730` + sample: fid=`149B5C0F` feature_id=`4412058` tile=`12/3505/1733` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`3B86B41A` feature_id=`3987357` tile=`12/3496/1738` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`6D20602A` feature_id=`3987358` tile=`12/3496/1738` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P施設・境界線等` | `養殖場` | `Polygon` | count=`716` + sample: fid=`EC80B343` feature_id=`4412183` tile=`12/3505/1733` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`D34E4F34` feature_id=`3987888` tile=`12/3496/1738` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`AA92D46C` feature_id=`3987889` tile=`12/3496/1738` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `20-100m` | `MultiPolygon` | count=`664` + sample: fid=`AD717985` feature_id=`1673157` tile=`12/3445/1721` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`AD717985` feature_id=`1261587` tile=`12/3446/1721` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`AD717985` feature_id=`2116840` tile=`12/3459/1720` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `8000-9000m` | `Polygon` | count=`659` + sample: fid=`3E968A5B` feature_id=`654872` tile=`12/3659/1638` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`3E968A5B` feature_id=`223611` tile=`12/3659/1637` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`3E968A5B` feature_id=`5930394` tile=`12/3660/1633` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `L海底線` | `海底輸送管 (水)` | `LineString` | count=`649` + sample: fid=`9380A1D3` feature_id=`3994375` tile=`12/3457/1762` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`4136BF95` feature_id=`3610711` tile=`12/3456/1760` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`9380A1D3` feature_id=`2838686` tile=`12/3458/1762` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p航路標識群` | `灯標` | `Point` | count=`630` + sample: fid=`CB8DC6E1` feature_id=`4055053` tile=`12/3472/1753` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`8F669990` feature_id=`6336409` tile=`12/3472/1754` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`2BE4FF79` feature_id=`4864997` tile=`12/3473/1753` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `500-1000m` | `MultiPolygon` | count=`627` + sample: fid=`06D87451` feature_id=`6017392` tile=`12/3445/1764` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`06D87451` feature_id=`4263647` tile=`12/3445/1748` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`06D87451` feature_id=`6607190` tile=`12/3445/1747` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p施設・境界線等` | `一般港湾 (港則法区域、重要港湾)` | `Point` | count=`610` + sample: fid=`852E4E78` feature_id=`1838775` tile=`12/3504/1738` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`852E4E78` feature_id=`1355419` tile=`12/3504/1737` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`39DE8A76` feature_id=`2617925` tile=`12/3503/1733` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p航路標識群` | `円錐型浮標` | `Point` | count=`589` + sample: fid=`09F9A7BC` feature_id=`1309232` tile=`12/3502/1736` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`1B4AC267` feature_id=`5531514` tile=`12/3502/1733` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`BBDFED31` feature_id=`2034368` tile=`12/3513/1654` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `2-5m` | `MultiPolygon` | count=`563` + sample: fid=`B7B6199B` feature_id=`3994448` tile=`12/3457/1762` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`AD1C18A5` feature_id=`529230` tile=`12/3458/1761` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`D9BA0654` feature_id=`3380580` tile=`12/3460/1763` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `L基本線` | `一本線で表わす潜提` | `LineString` | count=`544` + sample: fid=`954E8B30` feature_id=`2091091` tile=`12/3494/1736` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`F1638A1F` feature_id=`2091092` tile=`12/3494/1736` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`419524C9` feature_id=`6530629` tile=`12/3518/1633` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p施設・境界線等` | `マリーナ` | `Point` | count=`539` + sample: fid=`98BD0407` feature_id=`4209374` tile=`12/3502/1735` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`DD81E01C` feature_id=`3179241` tile=`12/3504/1733` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`85017068` feature_id=`2285982` tile=`12/3502/1737` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `1000-2000m` | `MultiPolygon` | count=`532` + sample: fid=`743EE596` feature_id=`6336727` tile=`12/3445/1765` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`743EE596` feature_id=`203602` tile=`12/3444/1764` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`743EE596` feature_id=`6607191` tile=`12/3445/1747` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `L高さ制限` | `架空線、送電線` | `LineString` | count=`524` + sample: fid=`AC66912E` feature_id=`5593195` tile=`12/3504/1732` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`AC66912E` feature_id=`3178455` tile=`12/3504/1733` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`40A37244` feature_id=`6167459` tile=`12/3519/1647` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P施設・境界線等ククリ` | `P施設・境界線等ククリ` | `LineString` | count=`521` + sample: fid=`D10FFF57` feature_id=`2112913` tile=`12/3472/1755` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`B535D9EF` feature_id=`2112914` tile=`12/3472/1755` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`0E50C51A` feature_id=`2829388` tile=`12/3506/1739` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `干潮帯` | `MultiPolygon` | count=`510` + sample: fid=`D9A3253F` feature_id=`4059262` tile=`12/3456/1762` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`4A8A43A0` feature_id=`4059263` tile=`12/3456/1762` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`AF4E3E6C` feature_id=`3994457` tile=`12/3457/1762` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `0-2m` | `MultiPolygon` | count=`484` + sample: fid=`A99815C0` feature_id=`6152790` tile=`12/3457/1760` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`B0370531` feature_id=`529227` tile=`12/3458/1761` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`C6AB161B` feature_id=`803774` tile=`12/3471/1755` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `200-500m` | `MultiPolygon` | count=`458` + sample: fid=`E654FCFF` feature_id=`6172494` tile=`12/3440/1760` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`E654FCFF` feature_id=`5477911` tile=`12/3443/1758` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`E2915581` feature_id=`3340626` tile=`12/3438/1751` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p施設・境界線等` | `小港湾 (避難港、地方港湾)` | `Point` | count=`454` + sample: fid=`F910010D` feature_id=`1067513` tile=`12/3455/1763` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`EE9111C7` feature_id=`250023` tile=`12/3466/1757` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`A461C066` feature_id=`2761861` tile=`12/3447/1760` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `L等深線` | `湖沼等深線` | `MultiLineString` | count=`448` + sample: fid=`77275D9C` feature_id=`2756268` tile=`12/3533/1673` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`34548F72` feature_id=`2756303` tile=`12/3533/1673` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`F5FF7035` feature_id=`2756323` tile=`12/3533/1673` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `2000-3000m` | `MultiPolygon` | count=`445` + sample: fid=`02940A0C` feature_id=`1523226` tile=`12/3445/1770` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`02940A0C` feature_id=`4087597` tile=`12/3443/1771` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`02940A0C` feature_id=`4505199` tile=`12/3444/1769` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P航路ククリ` | `P航路ククリ` | `LineString` | count=`427` + sample: fid=`BAB3AF62` feature_id=`6129303` tile=`12/3500/1738` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`EF4E687B` feature_id=`6129304` tile=`12/3500/1738` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`F85A71F4` feature_id=`4816119` tile=`12/3524/1653` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `100-200m` | `MultiPolygon` | count=`409` + sample: fid=`77AA5E0A` feature_id=`6519897` tile=`12/3444/1723` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`77AA5E0A` feature_id=`444816` tile=`12/3447/1742` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`77AA5E0A` feature_id=`3333345` tile=`12/3447/1719` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `陸上水域` | `Polygon` | count=`406` + sample: fid=`A38487E8` feature_id=`4108306` tile=`12/3460/1760` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`DC3EB664` feature_id=`4108307` tile=`12/3460/1760` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`D8E07027` feature_id=`6094006` tile=`12/3474/1756` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p投錨注意障害物` | `全沈没船 (危険なし)` | `Point` | count=`404` + sample: fid=`148CC311` feature_id=`4556006` tile=`12/3436/1754` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`718B5FDF` feature_id=`1690119` tile=`12/3444/1751` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`E755C3EF` feature_id=`4004870` tile=`12/3436/1757` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `L基本線` | `一本線で表わす撤去跡` | `LineString` | count=`391` + sample: fid=`B8D10F2E` feature_id=`5120641` tile=`12/3490/1737` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`443C1102` feature_id=`5120642` tile=`12/3490/1737` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`0F0F53CB` feature_id=`5120643` tile=`12/3490/1737` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p航路標識群` | `円柱型浮標` | `Point` | count=`372` + sample: fid=`A3188FB2` feature_id=`3092991` tile=`12/3455/1761` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`53626821` feature_id=`3092992` tile=`12/3455/1761` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`FBCA6CF8` feature_id=`4414271` tile=`12/3504/1734` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `0-5m` | `MultiPolygon` | count=`357` + sample: fid=`58FF5807` feature_id=`4059257` tile=`12/3456/1762` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`E61C694D` feature_id=`2629027` tile=`12/3461/1759` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`1012691D` feature_id=`2606835` tile=`12/3467/1757` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `2-10m` | `Polygon` | count=`340` + sample: fid=`A2B7A627` feature_id=`2626431` tile=`12/3508/1732` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`A2B7A627` feature_id=`854103` tile=`12/3508/1731` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`78E9E2B0` feature_id=`1272656` tile=`12/3501/1739` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p投錨注意障害物` | `海底設置物、放水口、取水口` | `Point` | count=`339` + sample: fid=`35F1D27F` feature_id=`2113049` tile=`12/3472/1755` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`10E14094` feature_id=`2681351` tile=`12/3501/1740` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`1DE4818E` feature_id=`2681352` tile=`12/3501/1740` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `5000-6000m` | `MultiPolygon` | count=`318` + sample: fid=`CBB6C786` feature_id=`2983593` tile=`12/3444/1781` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`CBB6C786` feature_id=`2064492` tile=`12/3451/1786` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`CBB6C786` feature_id=`2889703` tile=`12/3451/1787` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `4000-5000m` | `MultiPolygon` | count=`300` + sample: fid=`C87811B8` feature_id=`3825249` tile=`12/3437/1784` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`C87811B8` feature_id=`3422249` tile=`12/3437/1772` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`C87811B8` feature_id=`3956128` tile=`12/3438/1784` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `3000-4000m` | `MultiPolygon` | count=`297` + sample: fid=`5ED00BCE` feature_id=`5852888` tile=`12/3444/1771` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`5ED00BCE` feature_id=`2351407` tile=`12/3443/1773` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`5ED00BCE` feature_id=`3351286` tile=`12/3444/1770` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `9000m以深` | `Polygon` | count=`283` + sample: fid=`6B80B4A6` feature_id=`6192766` tile=`12/3661/1634` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`6B80B4A6` feature_id=`3014210` tile=`12/3661/1633` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`6B80B4A6` feature_id=`5658657` tile=`12/3661/1635` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p投錨注意障害物` | `測定済みの沈船` | `Point` | count=`278` + sample: fid=`A17FDCFA` feature_id=`4721416` tile=`12/3515/1641` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`BB964571` feature_id=`2617924` tile=`12/3503/1733` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`BB964571` feature_id=`5531476` tile=`12/3502/1733` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `0-20m` | `Polygon` | count=`276` + sample: fid=`4F2BF8F9` feature_id=`1330802` tile=`12/3436/1746` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`F7BE478F` feature_id=`2249114` tile=`12/3437/1748` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`71660929` feature_id=`1625100` tile=`12/3436/1753` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `湖沼域` | `Polygon` | count=`269` + sample: fid=`FED8F99F` feature_id=`3451752` tile=`12/3525/1664` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`BDE69415` feature_id=`6419194` tile=`12/3532/1673` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`AF542123` feature_id=`2756371` tile=`12/3533/1673` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p航行危険障害物` | `障害物` | `Point` | count=`254` + sample: fid=`023A1410` feature_id=`2249121` tile=`12/3437/1748` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`CDC98F9A` feature_id=`3413155` tile=`12/3486/1699` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`4C1013E2` feature_id=`4715343` tile=`12/3503/1732` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `L739` | `平水境界` | `LineString` | count=`249` + sample: fid=`7917ED9D` feature_id=`1014754` tile=`12/3454/1762` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`74713523` feature_id=`528710` tile=`12/3458/1761` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`18B478D9` feature_id=`6336226` tile=`12/3472/1754` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P錨泊地等ククリ` | `P錨泊地等ククリ` | `LineString` | count=`240` + sample: fid=`1CF0C975` feature_id=`6323741` tile=`12/3437/1757` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`1CF0C975` feature_id=`3263518` tile=`12/3437/1758` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`1CF0C975` feature_id=`5817655` tile=`12/3436/1755` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p航路標識群` | `沿岸灯台 (15M over)` | `Point` | count=`224` + sample: fid=`998A7327` feature_id=`1330808` tile=`12/3436/1746` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`5FE3F829` feature_id=`1625112` tile=`12/3436/1753` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`998A7327` feature_id=`1005138` tile=`12/3437/1746` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p錨泊地等` | `p錨泊地等` | `Point` | count=`221` + sample: fid=`32BDDEC1` feature_id=`4004871` tile=`12/3436/1757` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`3E972B72` feature_id=`3090635` tile=`12/3503/1739` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`3E972B72` feature_id=`3733881` tile=`12/3503/1738` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p陸上構造物` | `海事関係署` | `Point` | count=`221` + sample: fid=`FCB92171` feature_id=`5929452` tile=`12/3461/1761` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`77B0A304` feature_id=`2617941` tile=`12/3503/1733` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`5AA07C76` feature_id=`2286028` tile=`12/3502/1737` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p施設・境界線等` | `海の駅` | `Point` | count=`203` + sample: fid=`E65354BD` feature_id=`5998509` tile=`12/3508/1728` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`1F705230` feature_id=`1989400` tile=`12/3517/1646` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`06B25527` feature_id=`3377678` tile=`12/3516/1650` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P投錨注意障害物ククリ` | `P投錨注意障害物ククリ` | `MultiLineString` | count=`197` + sample: fid=`05B8FEB4` feature_id=`1748999` tile=`12/3499/1739` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`A00D2675` feature_id=`2034032` tile=`12/3513/1654` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`67031F7D` feature_id=`2034033` tile=`12/3513/1654` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P航行危険障害物ククリ` | `P航行危険障害物ククリ` | `LineString` | count=`191` + sample: fid=`E0653593` feature_id=`4055041` tile=`12/3472/1753` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`E0653593` feature_id=`6336391` tile=`12/3472/1754` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`65B0C7BC` feature_id=`4015174` tile=`12/3474/1754` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P航路` | `航路 (法律による航路)` | `Polygon` | count=`190` + sample: fid=`E7B749D4` feature_id=`6129302` tile=`12/3500/1738` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`C9BC5819` feature_id=`4816118` tile=`12/3524/1653` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`F8AB4652` feature_id=`2304563` tile=`12/3531/1650` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p航路標識群` | `シーバース灯` | `Point` | count=`184` + sample: fid=`0C4298FB` feature_id=`2871825` tile=`12/3503/1735` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`E6F09E72` feature_id=`422148` tile=`12/3504/1736` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`9A712001` feature_id=`422149` tile=`12/3504/1736` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P施設・境界線等` | `漁網` | `Polygon` | count=`178` + sample: fid=`2DC4E082` feature_id=`5367970` tile=`12/3502/1738` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`2DC4E082` feature_id=`5513638` tile=`12/3502/1739` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`04A32351` feature_id=`5593646` tile=`12/3504/1732` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p航路標識群` | `指向灯/照射灯` | `Point` | count=`175` + sample: fid=`106F0CF7` feature_id=`2354902` tile=`12/3446/1760` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`6C543EA2` feature_id=`2673325` tile=`12/3510/1724` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`E03CDD96` feature_id=`5998518` tile=`12/3508/1728` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `6000-7000m` | `MultiPolygon` | count=`173` + sample: fid=`2DFE98D1` feature_id=`4381348` tile=`12/3454/1776` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`2DFE98D1` feature_id=`2363742` tile=`12/3468/1774` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`2DFE98D1` feature_id=`6619730` tile=`12/3472/1780` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `5-20m` | `Polygon` | count=`162` + sample: fid=`1DBB95D5` feature_id=`3031875` tile=`12/3505/1660` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`6355F312` feature_id=`2388400` tile=`12/3508/1628` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`817287F9` feature_id=`2388401` tile=`12/3508/1628` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `L748` | `誘導線` | `LineString` | count=`145` + sample: fid=`007D50D6` feature_id=`5997640` tile=`12/3508/1728` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`01A98004` feature_id=`2295442` tile=`12/3515/1649` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`5E1D138A` feature_id=`531493` tile=`12/3516/1719` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p航路標識群` | `導灯` | `Point` | count=`145` + sample: fid=`EA9F9E7F` feature_id=`6401055` tile=`12/3509/1728` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`68C8CA9B` feature_id=`6401056` tile=`12/3509/1728` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`BB7EB142` feature_id=`2746785` tile=`12/3515/1719` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p錨泊地等` | `錨泊 (指定)地` | `Point` | count=`145` + sample: fid=`EAABC1D1` feature_id=`1156868` tile=`12/3540/1637` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`A04172BB` feature_id=`1156869` tile=`12/3540/1637` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`D772E58F` feature_id=`1156870` tile=`12/3540/1637` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p陸上構造物` | `税関` | `Point` | count=`145` + sample: fid=`30D76B48` feature_id=`2761870` tile=`12/3447/1760` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`6E5386AA` feature_id=`422154` tile=`12/3504/1736` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`6E5386AA` feature_id=`3805493` tile=`12/3503/1736` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `L749` | `誘導線補助線` | `LineString` | count=`140` + sample: fid=`F7772568` feature_id=`5997641` tile=`12/3508/1728` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`F7772568` feature_id=`6400067` tile=`12/3509/1728` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`1BCAB394` feature_id=`2746010` tile=`12/3515/1719` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P危険界ククリ` | `P危険界ククリ` | `MultiLineString` | count=`140` + sample: fid=`9F300E0D` feature_id=`5102971` tile=`12/3473/1754` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`A62E76FE` feature_id=`5102975` tile=`12/3473/1754` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`3683B9B7` feature_id=`5102977` tile=`12/3473/1754` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `河川域` | `MultiPolygon` | count=`139` + sample: fid=`24DD71ED` feature_id=`4059267` tile=`12/3456/1762` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`97819C91` feature_id=`3994465` tile=`12/3457/1762` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`B8493F51` feature_id=`4868239` tile=`12/3497/1739` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P錨泊地等` | `検疫錨地` | `Polygon` | count=`135` + sample: fid=`7710897E` feature_id=`3090562` tile=`12/3503/1739` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`7710897E` feature_id=`3733812` tile=`12/3503/1738` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`AF1924B4` feature_id=`421949` tile=`12/3504/1736` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P航行危険障害物` | `障害物` | `Polygon` | count=`134` + sample: fid=`C7EF26D5` feature_id=`4848651` tile=`12/3474/1753` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`1392249B` feature_id=`4055040` tile=`12/3472/1753` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`1392249B` feature_id=`6336390` tile=`12/3472/1754` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P施設・境界線等` | `ケーソン仮置き場` | `Polygon` | count=`128` + sample: fid=`FDC9B254` feature_id=`5707083` tile=`12/3519/1713` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`731DB889` feature_id=`4376592` tile=`12/3473/1756` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`F5D9E42E` feature_id=`4376593` tile=`12/3473/1756` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P施設・境界線等` | `土砂捨て場` | `Polygon` | count=`123` + sample: fid=`51B6CF2A` feature_id=`2112911` tile=`12/3472/1755` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`91CEF2B6` feature_id=`2112912` tile=`12/3472/1755` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`51B6CF2A` feature_id=`2448708` tile=`12/3473/1755` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p投錨注意障害物` | `沈木` | `Point` | count=`121` + sample: fid=`65E9778D` feature_id=`4878960` tile=`12/3536/1637` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`9E5BF71D` feature_id=`4399489` tile=`12/3548/1650` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`8EEE09C4` feature_id=`4399490` tile=`12/3548/1650` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p航行危険障害物` | `危険全沈没船` | `Point` | count=`119` + sample: fid=`482A6B2C` feature_id=`721727` tile=`12/3501/1736` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`287DBF39` feature_id=`3633649` tile=`12/3505/1732` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`D910C740` feature_id=`4218720` tile=`12/3521/1648` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p航路境界等` | `進路矢印 (法律による)` | `Point` | count=`119` + sample: fid=`0C7B6DC9` feature_id=`5947628` tile=`12/3552/1636` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`79F047AB` feature_id=`5947629` tile=`12/3552/1636` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`67272361` feature_id=`5947630` tile=`12/3552/1636` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p陸上構造物` | `その他 (記念碑等)` | `Point` | count=`116` + sample: fid=`104D3B28` feature_id=`6272317` tile=`12/3467/1758` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`783E6CDE` feature_id=`3903651` tile=`12/3456/1765` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`479D058A` feature_id=`1626951` tile=`12/3501/1735` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P漁具定置箇所` | `区画漁業` | `MultiPolygon` | count=`109` + sample: fid=`83F1679E` feature_id=`458464` tile=`12/3503/1737` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`D88BB017` feature_id=`5975737` tile=`12/3519/1630` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`E8762C05` feature_id=`3377268` tile=`12/3516/1650` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `L海底線` | `海底輸送管 (油)` | `LineString` | count=`108` + sample: fid=`068104C0` feature_id=`2673019` tile=`12/3510/1724` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`C937FC49` feature_id=`421341` tile=`12/3504/1736` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`BDC9178F` feature_id=`421342` tile=`12/3504/1736` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p航行危険障害物` | `塔、やぐら、測台` | `Point` | count=`107` + sample: fid=`85E6581B` feature_id=`6497711` tile=`12/3515/1654` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`1A84251D` feature_id=`6497712` tile=`12/3515/1654` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`A1FAD653` feature_id=`6497713` tile=`12/3515/1654` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `L海底線` | `海底線 (電信電話)` | `MultiLineString` | count=`105` + sample: fid=`9C526E6D` feature_id=`3557832` tile=`12/3443/1756` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`78C38F03` feature_id=`2146482` tile=`12/3447/1752` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`E93205B9` feature_id=`5612018` tile=`12/3442/1761` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P誘導線ククリ` | `P誘導線ククリ` | `LineString` | count=`101` + sample: fid=`914AC064` feature_id=`2673289` tile=`12/3510/1724` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`75B6EC3D` feature_id=`2673290` tile=`12/3510/1724` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`A97E5CBF` feature_id=`2673291` tile=`12/3510/1724` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `0-10m` | `MultiPolygon` | count=`97` + sample: fid=`F0650C69` feature_id=`3286264` tile=`12/3475/1756` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`31FB3EA6` feature_id=`3739635` tile=`12/3517/1648` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`31FB3EA6` feature_id=`1765603` tile=`12/3516/1648` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p陸上構造物` | `管制信号所` | `Point` | count=`91` + sample: fid=`662BCEAB` feature_id=`5268044` tile=`12/3515/1650` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`662BCEAB` feature_id=`3377774` tile=`12/3516/1650` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`1A4D33C3` feature_id=`6129827` tile=`12/3500/1738` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P錨泊地等` | `錨泊 (指定)地` | `Polygon` | count=`89` + sample: fid=`4183C977` feature_id=`4348215` tile=`12/3532/1657` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`E08C0FB2` feature_id=`6386895` tile=`12/3533/1669` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`C7341C15` feature_id=`6386896` tile=`12/3533/1669` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `7000-8000m` | `MultiPolygon` | count=`88` + sample: fid=`D61A115D` feature_id=`1645635` tile=`12/3491/1765` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`D61A115D` feature_id=`3825174` tile=`12/3491/1766` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`D61A115D` feature_id=`1182288` tile=`12/3498/1760` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `pパイロットステーション` | `パイロットステーション` | `Point` | count=`88` + sample: fid=`0398D9D6` feature_id=`727362` tile=`12/3522/1648` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`E3F5A615` feature_id=`4816188` tile=`12/3524/1653` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`DCC75AAE` feature_id=`4816189` tile=`12/3524/1653` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P航路ククリ` | `P航路ククリ` | `MultiLineString` | count=`75` + sample: fid=`F85A71F4` feature_id=`4299594` tile=`12/3525/1653` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`C2DEA6C2` feature_id=`3853999` tile=`12/3531/1649` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`B0015520` feature_id=`2520636` tile=`12/3531/1641` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P施設・境界線等` | `貯木場` | `Polygon` | count=`73` + sample: fid=`D0ACD38E` feature_id=`6386812` tile=`12/3533/1669` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`573AE309` feature_id=`6386813` tile=`12/3533/1669` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`D3ED9798` feature_id=`6386814` tile=`12/3533/1669` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p航行危険障害物` | `サンゴ礁 (暗岩)` | `Point` | count=`73` + sample: fid=`E238343A` feature_id=`3351232` tile=`12/3471/1756` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`086F5623` feature_id=`5103345` tile=`12/3473/1754` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`48241CA7` feature_id=`5103346` tile=`12/3473/1754` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p航路標識群` | `無線局・レーダー局` | `Point` | count=`68` + sample: fid=`31DCBD4C` feature_id=`3313600` tile=`12/3509/1629` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`DFB441A8` feature_id=`617964` tile=`12/3512/1628` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`15098966` feature_id=`2111772` tile=`12/3515/1622` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `L海底線` | `海底輸送管 (ガス)` | `LineString` | count=`67` + sample: fid=`E6EA8F82` feature_id=`1605259` tile=`12/3501/1738` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`2781148F` feature_id=`2518724` tile=`12/3531/1641` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`96793A51` feature_id=`131013` tile=`12/3540/1636` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p航路標識群` | `円筒型浮標` | `Point` | count=`62` + sample: fid=`D36F5B72` feature_id=`2617937` tile=`12/3503/1733` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`2091616D` feature_id=`2617938` tile=`12/3503/1733` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`E61015C4` feature_id=`1309231` tile=`12/3502/1736` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P錨泊地等ククリ` | `P錨泊地等ククリ` | `MultiLineString` | count=`57` + sample: fid=`1CF0C975` feature_id=`3504462` tile=`12/3436/1758` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`1CF0C975` feature_id=`4004869` tile=`12/3436/1757` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`1CF0C975` feature_id=`5758926` tile=`12/3436/1756` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p航路標識群` | `大型灯浮標` | `Point` | count=`57` + sample: fid=`92EDE4F4` feature_id=`1399609` tile=`12/3516/1709` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`0D81F358` feature_id=`1167250` tile=`12/3521/1668` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`3DDDFB9B` feature_id=`796368` tile=`12/3540/1638` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `浅所危険界` | `MultiPolygon` | count=`56` + sample: fid=`EE21AADD` feature_id=`5367783` tile=`12/3502/1738` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`D29319BB` feature_id=`1607950` tile=`12/3501/1738` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`BDABA590` feature_id=`3442915` tile=`12/3521/1651` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `0-20m` | `MultiPolygon` | count=`53` + sample: fid=`F572D716` feature_id=`4054999` tile=`12/3472/1753` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`F572D716` feature_id=`4864917` tile=`12/3473/1753` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`F572D716` feature_id=`5103033` tile=`12/3473/1754` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `L725` | `境界線` | `LineString` | count=`52` + sample: fid=`23682B11` feature_id=`2671888` tile=`12/3559/1634` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`F51BA8BF` feature_id=`2671889` tile=`12/3559/1634` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`0486684F` feature_id=`388232` tile=`12/3555/1633` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P施設・境界線等` | `誘導線 (白)` | `Polygon` | count=`52` + sample: fid=`6F627E6E` feature_id=`2673277` tile=`12/3510/1724` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`21809052` feature_id=`5998361` tile=`12/3508/1728` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`43AF1658` feature_id=`6401000` tile=`12/3509/1728` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P施設・境界線等` | `誘導線 (緑)` | `Polygon` | count=`51` + sample: fid=`AD196D31` feature_id=`2673278` tile=`12/3510/1724` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`09CD0609` feature_id=`5998362` tile=`12/3508/1728` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`34067FA9` feature_id=`6401001` tile=`12/3509/1728` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P施設・境界線等` | `誘導線 (赤)` | `Polygon` | count=`51` + sample: fid=`08585F00` feature_id=`2673276` tile=`12/3510/1724` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`D1AB65D1` feature_id=`5998360` tile=`12/3508/1728` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`96558A77` feature_id=`6400999` tile=`12/3509/1728` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p航路標識群` | `航空・飛行場灯台` | `Point` | count=`51` + sample: fid=`18A2848D` feature_id=`3603456` tile=`12/3501/1737` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`2E9FA298` feature_id=`1916678` tile=`12/3523/1710` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`398F8CA2` feature_id=`3968070` tile=`12/3526/1651` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `8000-9000m` | `MultiPolygon` | count=`49` + sample: fid=`3E968A5B` feature_id=`5710308` tile=`12/3659/1639` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`3E968A5B` feature_id=`1479616` tile=`12/3661/1640` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`3E968A5B` feature_id=`924230` tile=`12/3662/1626` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P錨泊地等` | `錨泊禁止区域` | `Polygon` | count=`49` + sample: fid=`D6526750` feature_id=`6323740` tile=`12/3437/1757` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`D6526750` feature_id=`3263517` tile=`12/3437/1758` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`D6526750` feature_id=`5817654` tile=`12/3436/1755` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `20-200m` | `Polygon` | count=`47` + sample: fid=`1382B474` feature_id=`1625098` tile=`12/3436/1753` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`1382B474` feature_id=`4555997` tile=`12/3436/1754` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`1382B474` feature_id=`5865331` tile=`12/3436/1752` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `L概略等深線` | `概略等深線` | `MultiLineString` | count=`46` + sample: fid=`E9756CAB` feature_id=`6220207` tile=`12/3517/1651` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`884C15A7` feature_id=`2283113` tile=`12/3502/1737` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`7C11F308` feature_id=`5881150` tile=`12/3460/1762` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P施設・境界線等ククリ` | `P施設・境界線等ククリ` | `MultiLineString` | count=`45` + sample: fid=`0E50C51A` feature_id=`6051008` tile=`12/3508/1738` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`387E3A0A` feature_id=`5367971` tile=`12/3502/1738` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`D10FFF57` feature_id=`2448709` tile=`12/3473/1755` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p投錨注意障害物` | `渦流` | `Point` | count=`45` + sample: fid=`7982F056` feature_id=`6402890` tile=`12/3528/1655` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`178C9C23` feature_id=`6402891` tile=`12/3528/1655` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`19B789DC` feature_id=`6402892` tile=`12/3528/1655` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p施設・境界線等` | `フィッシャリーナ` | `Point` | count=`44` + sample: fid=`A86D73C2` feature_id=`1989399` tile=`12/3517/1646` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`2D113382` feature_id=`5123478` tile=`12/3490/1737` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`8D97A0CA` feature_id=`5885196` tile=`12/3460/1762` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p航行危険障害物` | `船体露出沈船` | `Point` | count=`43` + sample: fid=`552EFBF6` feature_id=`5623894` tile=`12/3457/1761` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`3A564D0D` feature_id=`5278352` tile=`12/3499/1738` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`D7D3BF53` feature_id=`4012658` tile=`12/3500/1737` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P754ククリ` | `P754ククリ` | `MultiLineString` | count=`41` + sample: fid=`185ED300` feature_id=`1308713` tile=`12/3502/1736` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`E0333BC0` feature_id=`2900463` tile=`12/3517/1649` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`26309563` feature_id=`6099513` tile=`12/3529/1667` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `L航路` | `航路 (法律による航路)` | `LineString` | count=`38` + sample: fid=`3A4214D7` feature_id=`5946573` tile=`12/3552/1636` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`D7E45D68` feature_id=`5946574` tile=`12/3552/1636` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`CA1B99FA` feature_id=`5946575` tile=`12/3552/1636` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `湖沼域` | `MultiPolygon` | count=`37` + sample: fid=`E0A99EA5` feature_id=`3776953` tile=`12/3559/1616` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`E0A99EA5` feature_id=`4551161` tile=`12/3560/1615` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`18BEB67A` feature_id=`3838692` tile=`12/3571/1627` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p航行危険障害物` | `海底設置物、放水口、取水口` | `Point` | count=`34` + sample: fid=`3B0EA6C8` feature_id=`6497722` tile=`12/3515/1654` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`3D14A4D9` feature_id=`6497723` tile=`12/3515/1654` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`43BAECDA` feature_id=`6497724` tile=`12/3515/1654` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p航路境界等` | `進路矢印 (指導による)` | `Point` | count=`33` + sample: fid=`D0BE2DC4` feature_id=`137298` tile=`12/3593/1644` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`A9F97455` feature_id=`137299` tile=`12/3593/1644` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`4E1FCFD0` feature_id=`137300` tile=`12/3593/1644` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p航路境界等` | `水源方向` | `Point` | count=`32` + sample: fid=`A34182C7` feature_id=`4930481` tile=`12/3521/1647` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`D974DA70` feature_id=`5745174` tile=`12/3521/1646` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`D3EFAAE7` feature_id=`5745175` tile=`12/3521/1646` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `L741` | `港則法による境界` | `MultiLineString` | count=`31` + sample: fid=`12933015` feature_id=`3626288` tile=`12/3531/1646` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`926D01D3` feature_id=`4297181` tile=`12/3525/1653` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`2968A8AC` feature_id=`3355936` tile=`12/3532/1650` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `L740` | `海上交通安全法適用海域境界` | `LineString` | count=`29` + sample: fid=`EABBA61C` feature_id=`471078` tile=`12/3549/1645` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`1358B907` feature_id=`471079` tile=`12/3549/1645` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`EABBA61C` feature_id=`5233584` tile=`12/3550/1645` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `2-20m` | `Polygon` | count=`27` + sample: fid=`052109DF` feature_id=`5777261` tile=`12/3510/1627` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`052109DF` feature_id=`5256380` tile=`12/3511/1627` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`61423455` feature_id=`1717716` tile=`12/3524/1643` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P施設・境界線等透明` | `航空機進入区域` | `Polygon` | count=`27` + sample: fid=`E39C89C5` feature_id=`6129121` tile=`12/3500/1738` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`32CBBB20` feature_id=`1156148` tile=`12/3539/1638` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`1F528A97` feature_id=`3931590` tile=`12/3538/1637` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `L航路` | `航路 (その他の推薦航路)` | `LineString` | count=`26` + sample: fid=`EDF44F8D` feature_id=`137286` tile=`12/3593/1644` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`EDF44F8D` feature_id=`5802486` tile=`12/3592/1644` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`7A4B46EB` feature_id=`4548328` tile=`12/3603/1625` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P施設・境界線等` | `廃棄物捨て場` | `Polygon` | count=`26` + sample: fid=`8D8E9CCA` feature_id=`2829387` tile=`12/3506/1739` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`8D8E9CCA` feature_id=`4766751` tile=`12/3506/1740` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`8D8E9CCA` feature_id=`1900443` tile=`12/3506/1741` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P航行危険障害物` | `魚礁 (危険なもの)` | `Polygon` | count=`25` + sample: fid=`5468F7EC` feature_id=`5593779` tile=`12/3504/1732` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`A0ACD550` feature_id=`1460275` tile=`12/3533/1653` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`4B20433B` feature_id=`1922904` tile=`12/3522/1649` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `L危険界` | `未測海域` | `LineString` | count=`24` + sample: fid=`9C166914` feature_id=`5870458` tile=`12/3515/1653` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`8E0C8986` feature_id=`1936123` tile=`12/3513/1653` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`8CAD59E8` feature_id=`2740280` tile=`12/3514/1651` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P721ククリ` | `P721ククリ` | `LineString` | count=`24` + sample: fid=`42E4ECFF` feature_id=`3686019` tile=`12/3560/1634` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`8CD52E5F` feature_id=`5721475` tile=`12/3561/1634` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`E5271B37` feature_id=`5721476` tile=`12/3561/1634` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p航行危険障害物` | `p航行危険障害物` | `Point` | count=`24` + sample: fid=`DB77446A` feature_id=`5594001` tile=`12/3504/1732` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`645E443E` feature_id=`1460361` tile=`12/3533/1653` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`A6AB76AA` feature_id=`1923755` tile=`12/3522/1649` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p航路標識群` | `V-AIS` | `Point` | count=`24` + sample: fid=`9CEF6ED7` feature_id=`6619185` tile=`12/3542/1638` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`42FB9A34` feature_id=`390954` tile=`12/3545/1639` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`BC38CDDE` feature_id=`4609596` tile=`12/3546/1639` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `未測海域` | `MultiPolygon` | count=`21` + sample: fid=`F802DEDD` feature_id=`3236106` tile=`12/3491/1736` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`F802DEDD` feature_id=`1864684` tile=`12/3491/1737` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`9FF70F77` feature_id=`3326061` tile=`12/3527/1653` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `防波堤` | `MultiPolygon` | count=`20` + sample: fid=`473B3012` feature_id=`5026680` tile=`12/3520/1629` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`8B8E3CCD` feature_id=`2240206` tile=`12/3518/1713` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`8A08CF28` feature_id=`302662` tile=`12/3530/1670` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P錨泊地等` | `制限区域` | `Polygon` | count=`19` + sample: fid=`192306D8` feature_id=`3686930` tile=`12/3560/1634` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`FC575EB5` feature_id=`5722585` tile=`12/3561/1634` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`7C972E75` feature_id=`5722586` tile=`12/3561/1634` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P陸上構造物陸` | `ビル` | `MultiPolygon` | count=`19` + sample: fid=`E55C661C` feature_id=`5095813` tile=`12/3525/1645` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`D71F14B7` feature_id=`4043431` tile=`12/3536/1638` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`CD6BB81E` feature_id=`6121448` tile=`12/3538/1638` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p航行危険障害物` | `測定済みの沈船` | `Point` | count=`19` + sample: fid=`4584FD2F` feature_id=`5360595` tile=`12/3526/1641` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`55BA5DFA` feature_id=`4261012` tile=`12/3537/1633` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`49DD6AB5` feature_id=`3027186` tile=`12/3552/1637` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p航路標識群` | `球型浮標` | `Point` | count=`19` + sample: fid=`2FE99533` feature_id=`5717821` tile=`12/3547/1636` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`6C113F18` feature_id=`5717822` tile=`12/3547/1636` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`D44C692E` feature_id=`577183` tile=`12/3603/1596` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P730ククリ` | `P730ククリ` | `LineString` | count=`18` + sample: fid=`F9729BD9` feature_id=`6127967` tile=`12/3500/1738` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`2C5FA50C` feature_id=`1156128` tile=`12/3539/1638` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`107A2A41` feature_id=`3931254` tile=`12/3538/1637` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P投錨注意障害物` | `障害物` | `Polygon` | count=`18` + sample: fid=`B6671E1F` feature_id=`3881409` tile=`12/3657/1573` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`B11CCD20` feature_id=`3881410` tile=`12/3657/1573` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`470B5701` feature_id=`3881411` tile=`12/3657/1573` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P錨泊地等` | `航泊禁止区域` | `Polygon` | count=`16` + sample: fid=`C29E5A22` feature_id=`4414136` tile=`12/3504/1734` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`C29E5A22` feature_id=`2985371` tile=`12/3505/1734` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`DFC89A07` feature_id=`6129306` tile=`12/3500/1738` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p航路標識群` | `ドラム (樽)型灯浮標` | `Point` | count=`16` + sample: fid=`778EB794` feature_id=`3007775` tile=`12/3533/1670` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`39BB632C` feature_id=`3007776` tile=`12/3533/1670` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`7D816CED` feature_id=`3007777` tile=`12/3533/1670` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P投錨注意障害物` | `沈木` | `Polygon` | count=`15` + sample: fid=`C4D1233E` feature_id=`2137460` tile=`12/3588/1615` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`EBB969C6` feature_id=`2137461` tile=`12/3588/1615` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`EFE3F543` feature_id=`2137462` tile=`12/3588/1615` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p投錨注意障害物` | `掃海済みの危険物` | `Point` | count=`15` + sample: fid=`A60E88F1` feature_id=`3681548` tile=`12/3521/1650` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`7A8560D5` feature_id=`727542` tile=`12/3522/1648` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`64B31027` feature_id=`727543` tile=`12/3522/1648` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p陸上構造物` | `陸上顕著物 (観覧車等)` | `Point` | count=`15` + sample: fid=`D311D92A` feature_id=`3836360` tile=`12/3522/1644` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`A31C29BB` feature_id=`6129825` tile=`12/3500/1738` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`89B78B34` feature_id=`4976156` tile=`12/3531/1640` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p航路標識群` | `円柱型灯浮標` | `Point` | count=`12` + sample: fid=`D4592BD0` feature_id=`4260111` tile=`12/3547/1666` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`D4592BD0` feature_id=`3013916` tile=`12/3548/1666` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`0A011E44` feature_id=`4099250` tile=`12/3549/1661` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p投錨注意障害物` | `掃海済みの沈船` | `Point` | count=`10` + sample: fid=`DC4CFD1E` feature_id=`591972` tile=`12/3549/1638` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`932524B8` feature_id=`6459307` tile=`12/3553/1634` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`6856F775` feature_id=`5621112` tile=`12/3550/1639` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p航行危険障害物` | `海底火山` | `Point` | count=`10` + sample: fid=`58562BE4` feature_id=`3117621` tile=`12/3631/1622` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`58562BE4` feature_id=`4082772` tile=`12/3630/1622` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`868FC797` feature_id=`1530577` tile=`12/3641/1664` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `L海底線` | `海底線 (電力)` | `MultiLineString` | count=`9` + sample: fid=`CD04EA73` feature_id=`6053209` tile=`12/3515/1647` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`1789B74F` feature_id=`3373553` tile=`12/3525/1689` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`FE4258DB` feature_id=`2547826` tile=`12/3528/1642` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P730ククリ` | `P730ククリ` | `MultiLineString` | count=`9` + sample: fid=`107A2A41` feature_id=`6120785` tile=`12/3538/1638` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`2C5FA50C` feature_id=`6120786` tile=`12/3538/1638` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`EE04F3E7` feature_id=`4885023` tile=`12/3586/1629` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P航路` | `航路 (その他の推薦航路)` | `Polygon` | count=`9` + sample: fid=`6BF72E68` feature_id=`6034708` tile=`12/3638/1617` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`7B0A36FD` feature_id=`6092917` tile=`12/3640/1614` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`AB8AD527` feature_id=`597054` tile=`12/3640/1616` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p航路境界等` | `p航路境界等` | `Point` | count=`9` + sample: fid=`A65BAF0C` feature_id=`6073100` tile=`12/3639/1614` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`9C8ABA7B` feature_id=`6073099` tile=`12/3639/1614` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`041BEA48` feature_id=`6073098` tile=`12/3639/1614` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `9000m以深` | `MultiPolygon` | count=`8` + sample: fid=`6B80B4A6` feature_id=`6335572` tile=`12/3664/1641` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`6B80B4A6` feature_id=`4428293` tile=`12/3664/1629` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`4785675C` feature_id=`4642190` tile=`12/3670/1690` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P施設・境界線等` | `専用用途海域` | `Polygon` | count=`8` + sample: fid=`1CCD27D1` feature_id=`3013425` tile=`12/3523/1644` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`6CB61851` feature_id=`3013426` tile=`12/3523/1644` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`BE322E25` feature_id=`3013427` tile=`12/3523/1644` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p航行危険障害物` | `水上岩 (露出岩)` | `Point` | count=`8` + sample: fid=`80197086` feature_id=`2558920` tile=`12/3553/1648` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`67A77EC8` feature_id=`3427130` tile=`12/3572/1629` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`516F4F75` feature_id=`3427131` tile=`12/3572/1629` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p航路標識群` | `円錐型灯浮標` | `Point` | count=`8` + sample: fid=`A989A53D` feature_id=`4739531` tile=`12/3527/1656` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`E452ECE1` feature_id=`4976140` tile=`12/3531/1640` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`7C6EEF53` feature_id=`4976141` tile=`12/3531/1640` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `L702` | `分離通航方式` | `LineString` | count=`7` + sample: fid=`C2D9262F` feature_id=`5437032` tile=`12/3678/1459` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`C2D9262F` feature_id=`5586716` tile=`12/3679/1459` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`C2D9262F` feature_id=`2985734` tile=`12/3680/1459` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P航行危険障害物ククリ` | `P航行危険障害物ククリ` | `MultiLineString` | count=`7` + sample: fid=`65B0C7BC` feature_id=`4848652` tile=`12/3474/1753` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`E0653593` feature_id=`4864988` tile=`12/3473/1753` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`6D068978` feature_id=`2804800` tile=`12/3586/1613` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `L700` | `指導線` | `LineString` | count=`6` + sample: fid=`95EA91C6` feature_id=`388228` tile=`12/3555/1633` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`AD6DB187` feature_id=`388229` tile=`12/3555/1633` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`9BBB14F4` feature_id=`388230` tile=`12/3555/1633` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `L海底線` | `海底輸送管 (水)` | `MultiLineString` | count=`6` + sample: fid=`0509078D` feature_id=`5273039` tile=`12/3521/1645` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`81E510DE` feature_id=`3784937` tile=`12/3533/1672` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`9F60DC64` feature_id=`3306260` tile=`12/3543/1629` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p航行危険障害物` | `魚礁 (危険なもの)` | `Point` | count=`6` + sample: fid=`C9260B5F` feature_id=`425061` tile=`12/3537/1635` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`82616EB4` feature_id=`425062` tile=`12/3537/1635` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`8B32F77C` feature_id=`5155084` tile=`12/3527/1660` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `5-20m` | `MultiPolygon` | count=`5` + sample: fid=`4028EAF1` feature_id=`4439603` tile=`12/3554/1635` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`21379AF8` feature_id=`3491645` tile=`12/3563/1633` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`8CC5E806` feature_id=`4417168` tile=`12/3584/1632` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P橋りょう等構造物` | `橋 (水門)` | `MultiPolygon` | count=`5` + sample: fid=`7D735D39` feature_id=`2681935` tile=`12/3586/1630` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`36935409` feature_id=`1082302` tile=`12/3581/1625` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`7438809E` feature_id=`783624` tile=`12/3588/1627` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p航路標識群` | `ドラム (樽)型浮標` | `Point` | count=`5` + sample: fid=`64AF5DD5` feature_id=`3465848` tile=`12/3531/1660` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`5C5EEE22` feature_id=`927338` tile=`12/3552/1633` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`E8100D31` feature_id=`1122271` tile=`12/3570/1632` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `浮施設・桟橋` | `MultiPolygon` | count=`4` + sample: fid=`C8E6EF58` feature_id=`4323854` tile=`12/3554/1637` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`4B114A55` feature_id=`1034117` tile=`12/3556/1633` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`1F46248E` feature_id=`3503531` tile=`12/3632/1580` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P721ククリ` | `P721ククリ` | `MultiLineString` | count=`3` + sample: fid=`F0055DA3` feature_id=`5324293` tile=`12/3572/1630` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`F0055DA3` feature_id=`2252469` tile=`12/3571/1630` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`F0055DA3` feature_id=`1563748` tile=`12/3570/1630` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `2-10m` | `MultiPolygon` | count=`3` + sample: fid=`AC624EC5` feature_id=`2995948` tile=`12/3549/1637` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`468ED982` feature_id=`4021968` tile=`12/3558/1633` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`D91D8D66` feature_id=`887161` tile=`12/3557/1616` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `陸上水域` | `MultiPolygon` | count=`3` + sample: fid=`9D3BE4F3` feature_id=`3176352` tile=`12/3523/1645` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`23EF78DD` feature_id=`4721578` tile=`12/3525/1655` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`27557D24` feature_id=`796150` tile=`12/3529/1652` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P航路` | `航路 (法律による航路)` | `MultiPolygon` | count=`3` + sample: fid=`DE87EBF3` feature_id=`5398601` tile=`12/3537/1636` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`42373F0C` feature_id=`3686928` tile=`12/3560/1634` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`08B5EF53` feature_id=`1741149` tile=`12/3567/1642` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p投錨注意障害物` | `危険全沈没船` | `Point` | count=`3` + sample: fid=`8FD02D44` feature_id=`6545736` tile=`12/3459/1763` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`8FD02D44` feature_id=`2089928` tile=`12/3458/1763` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`340D60F3` feature_id=`2355473` tile=`12/3650/1613` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `L739` | `平水境界` | `MultiLineString` | count=`2` + sample: fid=`4AABADB1` feature_id=`1148710` tile=`12/3521/1649` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`4AABADB1` feature_id=`1919904` tile=`12/3522/1649` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P投錨注意障害物` | `険悪物` | `MultiPolygon` | count=`2` + sample: fid=`27588EC5` feature_id=`1964714` tile=`12/3660/1545` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`FD0FE00D` feature_id=`1964721` tile=`12/3660/1545` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P漁具定置箇所` | `定置漁業` | `MultiPolygon` | count=`2` + sample: fid=`B22ADA45` feature_id=`4121268` tile=`12/3535/1634` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`8A30EA3A` feature_id=`3304524` tile=`12/3607/1592` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p投錨注意障害物` | `障害物` | `Point` | count=`2` + sample: fid=`8DAA127E` feature_id=`4133882` tile=`12/3638/1613` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`2FE1DC31` feature_id=`3882398` tile=`12/3657/1573` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p航路標識群` | `タワー型灯標識` | `Point` | count=`2` + sample: fid=`31C7574C` feature_id=`13329` tile=`12/3535/1635` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`DE194D83` feature_id=`6058449` tile=`12/3633/1578` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p航路標識群` | `大型灯標` | `Point` | count=`2` + sample: fid=`D82C0B91` feature_id=`873761` tile=`12/3604/1623` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`1B0F95E5` feature_id=`5020627` tile=`12/3641/1614` reason=`no specific render rule matched; heuristic fill-in was used` +- `field_value_rule_unresolved` | `p航路標識群` | `灯 (Lt)` | `Point` | count=`1` + sample: fid=`EEFCB357` feature_id=`4405128` tile=`12/3587/1627` reason=`light color was inferred from remark because no explicit field-value rule matched` +- `render_rule_unresolved` | `L基本線` | `一本線で表わす海上バース` | `MultiLineString` | count=`1` + sample: fid=`F66EB99B` feature_id=`5872420` tile=`12/3662/1559` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `L基本線` | `一本線で表わす潜提` | `MultiLineString` | count=`1` + sample: fid=`E5AB3D35` feature_id=`2441763` tile=`12/3571/1629` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `L基本線` | `浮施設・桟橋` | `MultiLineString` | count=`1` + sample: fid=`F81C5E21` feature_id=`4130071` tile=`12/3638/1613` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `10-100m` | `Polygon` | count=`1` + sample: fid=`BAF8D781` feature_id=`5005269` tile=`12/3664/1560` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P潜堤` | `潜提` | `MultiPolygon` | count=`1` + sample: fid=`D3776886` feature_id=`565017` tile=`12/3649/1610` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P陸上構造物陸` | `陸上顕著物 (観覧車等)` | `Polygon` | count=`1` + sample: fid=`8B5BAA43` feature_id=`4864126` tile=`12/3636/1616` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p投錨注意障害物` | `魚礁 (危険なもの)` | `Point` | count=`1` + sample: fid=`CD620388` feature_id=`2521001` tile=`12/3531/1641` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p航行危険障害物` | `サンドウェーブ` | `Point` | count=`1` + sample: fid=`7E12FA56` feature_id=`3385773` tile=`12/3541/1637` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p航行危険障害物` | `マスト露出沈船` | `Point` | count=`1` + sample: fid=`7E82D114` feature_id=`3082679` tile=`12/3665/1727` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p航行危険障害物` | `全沈没船 (危険なし)` | `Point` | count=`1` + sample: fid=`0B7DC822` feature_id=`4192871` tile=`12/3649/1537` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p航行危険障害物` | `掃海済みの危険物` | `Point` | count=`1` + sample: fid=`19CEB718` feature_id=`2168510` tile=`12/3695/1505` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p航行危険障害物` | `石油開発台` | `Point` | count=`1` + sample: fid=`9F0B8FA4` feature_id=`6058448` tile=`12/3633/1578` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p航路標識群` | `大型浮標` | `Point` | count=`1` + sample: fid=`FB1EF39A` feature_id=`1309230` tile=`12/3502/1736` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p航路標識群` | `球型灯浮標` | `Point` | count=`1` + sample: fid=`3C6E2A98` feature_id=`2262078` tile=`12/3523/1648` reason=`no specific render rule matched; heuristic fill-in was used` diff --git a/docs/报告/20261013_全国Full生产分片历史审计证据/z9_10.mapping_audit.json b/docs/报告/20261013_全国Full生产分片历史审计证据/z9_10.mapping_audit.json new file mode 100644 index 0000000..dc75866 --- /dev/null +++ b/docs/报告/20261013_全国Full生产分片历史审计证据/z9_10.mapping_audit.json @@ -0,0 +1,6370 @@ +{ + "bundle_id": "navsea-core", + "output_root": "/home/wwwroot/pbf-delivery-full-20260418-rebuild.parts/z9_10", + "tile_jobs": 3969, + "written_tiles": 3969, + "skipped_tiles": 0, + "unresolved_event_count": 578573, + "unresolved_summary": [ + { + "issue_type": "render_rule_unresolved", + "source_layer": "L海底地形", + "canonical_object_type": "L海底地形", + "geom_type": "LineString", + "count": 145130, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L海底地形", + "canonical_object_type": "L海底地形", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 2213878, + "fid": "0601CFC5", + "z": 10, + "x": 859, + "y": 432 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L海底地形", + "canonical_object_type": "L海底地形", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 3871504, + "fid": "0601CFC5", + "z": 10, + "x": 859, + "y": 431 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L海底地形", + "canonical_object_type": "L海底地形", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 664783, + "fid": "0601CFC5", + "z": 10, + "x": 859, + "y": 434 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L海底地形", + "canonical_object_type": "L海底地形", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 6624060, + "fid": "0601CFC5", + "z": 10, + "x": 859, + "y": 433 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L海底地形", + "canonical_object_type": "L海底地形", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 550024, + "fid": "0601CFC5", + "z": 10, + "x": 859, + "y": 435 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線ククリ", + "canonical_object_type": "P基本線ククリ", + "geom_type": "LineString", + "count": 117004, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線ククリ", + "canonical_object_type": "P基本線ククリ", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 6422603, + "fid": "AD682227", + "z": 10, + "x": 859, + "y": 436 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線ククリ", + "canonical_object_type": "P基本線ククリ", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 6422604, + "fid": "3F61B766", + "z": 10, + "x": 859, + "y": 436 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線ククリ", + "canonical_object_type": "P基本線ククリ", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 4818789, + "fid": "3F61B766", + "z": 10, + "x": 859, + "y": 437 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線ククリ", + "canonical_object_type": "P基本線ククリ", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 2606143, + "fid": "E31DD7A9", + "z": 10, + "x": 859, + "y": 438 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線ククリ", + "canonical_object_type": "P基本線ククリ", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 2606141, + "fid": "ABBF973E", + "z": 10, + "x": 859, + "y": 438 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "L等深線", + "canonical_object_type": "等深線", + "geom_type": "LineString", + "count": 101228, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L等深線", + "canonical_object_type": "等深線", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 6422595, + "fid": "AFC293D1", + "z": 10, + "x": 859, + "y": 436 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L等深線", + "canonical_object_type": "等深線", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 6422596, + "fid": "D9A87E3B", + "z": 10, + "x": 859, + "y": 436 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L等深線", + "canonical_object_type": "等深線", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 6422597, + "fid": "F093E407", + "z": 10, + "x": 859, + "y": 436 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L等深線", + "canonical_object_type": "等深線", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 2606132, + "fid": "72BD09AD", + "z": 10, + "x": 859, + "y": 438 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L等深線", + "canonical_object_type": "等深線", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 309296, + "fid": "031666E5", + "z": 10, + "x": 861, + "y": 440 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P穴", + "canonical_object_type": "P穴", + "geom_type": "Polygon", + "count": 40162, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P穴", + "canonical_object_type": "P穴", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6422605, + "fid": "6FEB3434", + "z": 10, + "x": 859, + "y": 436 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P穴", + "canonical_object_type": "P穴", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6422606, + "fid": "9FC5954C", + "z": 10, + "x": 859, + "y": 436 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P穴", + "canonical_object_type": "P穴", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6422607, + "fid": "C45099F4", + "z": 10, + "x": 859, + "y": 436 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P穴", + "canonical_object_type": "P穴", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6422608, + "fid": "C45099F4", + "z": 10, + "x": 859, + "y": 436 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P穴", + "canonical_object_type": "P穴", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6422609, + "fid": "C45099F4", + "z": 10, + "x": 859, + "y": 436 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "L海底地形", + "canonical_object_type": "L海底地形", + "geom_type": "MultiLineString", + "count": 21832, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L海底地形", + "canonical_object_type": "L海底地形", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 6422589, + "fid": "BA663A16", + "z": 10, + "x": 859, + "y": 436 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L海底地形", + "canonical_object_type": "L海底地形", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 6422593, + "fid": "39A9F9B5", + "z": 10, + "x": 859, + "y": 436 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L海底地形", + "canonical_object_type": "L海底地形", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 4818775, + "fid": "363D97A3", + "z": 10, + "x": 859, + "y": 437 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L海底地形", + "canonical_object_type": "L海底地形", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 4818776, + "fid": "F5A30307", + "z": 10, + "x": 859, + "y": 437 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L海底地形", + "canonical_object_type": "L海底地形", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 4818778, + "fid": "39A9F9B5", + "z": 10, + "x": 859, + "y": 437 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P危険界ククリ", + "canonical_object_type": "P危険界ククリ", + "geom_type": "LineString", + "count": 17125, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P危険界ククリ", + "canonical_object_type": "P危険界ククリ", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 309344, + "fid": "CC30B83A", + "z": 10, + "x": 861, + "y": 440 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P危険界ククリ", + "canonical_object_type": "P危険界ククリ", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 309345, + "fid": "2C4274DB", + "z": 10, + "x": 861, + "y": 440 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P危険界ククリ", + "canonical_object_type": "P危険界ククリ", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 3858773, + "fid": "54DEA8EA", + "z": 10, + "x": 863, + "y": 441 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P危険界ククリ", + "canonical_object_type": "P危険界ククリ", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 2379983, + "fid": "991D10EB", + "z": 10, + "x": 863, + "y": 440 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P危険界ククリ", + "canonical_object_type": "P危険界ククリ", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 2379984, + "fid": "0817B81C", + "z": 10, + "x": 863, + "y": 440 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "5-10m", + "geom_type": "Polygon", + "count": 15589, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5-10m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 309382, + "fid": "00C690ED", + "z": 10, + "x": 861, + "y": 440 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5-10m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 309383, + "fid": "D6326DFB", + "z": 10, + "x": 861, + "y": 440 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5-10m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 309384, + "fid": "B720E99E", + "z": 10, + "x": 861, + "y": 440 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5-10m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1208128, + "fid": "F6A0D62E", + "z": 10, + "x": 862, + "y": 440 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5-10m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 3618600, + "fid": "65215862", + "z": 10, + "x": 863, + "y": 436 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P陸域", + "canonical_object_type": "P陸域", + "geom_type": "Polygon", + "count": 13172, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P陸域", + "canonical_object_type": "P陸域", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6422610, + "fid": "62E69E5E", + "z": 10, + "x": 859, + "y": 436 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P陸域", + "canonical_object_type": "P陸域", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6422611, + "fid": "110EB213", + "z": 10, + "x": 859, + "y": 436 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P陸域", + "canonical_object_type": "P陸域", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 4818792, + "fid": "62E69E5E", + "z": 10, + "x": 859, + "y": 437 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P陸域", + "canonical_object_type": "P陸域", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 2606146, + "fid": "46EE942B", + "z": 10, + "x": 859, + "y": 438 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P陸域", + "canonical_object_type": "P陸域", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 309474, + "fid": "726388EA", + "z": 10, + "x": 861, + "y": 440 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "0-5m", + "geom_type": "Polygon", + "count": 9095, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-5m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 309377, + "fid": "D0DC711F", + "z": 10, + "x": 861, + "y": 440 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-5m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 309378, + "fid": "025D6BDA", + "z": 10, + "x": 861, + "y": 440 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-5m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 3618592, + "fid": "FF1D7B86", + "z": 10, + "x": 863, + "y": 436 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-5m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 3618590, + "fid": "F68F72C7", + "z": 10, + "x": 863, + "y": 436 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-5m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 3618591, + "fid": "DB63FA34", + "z": 10, + "x": 863, + "y": 436 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "2-5m", + "geom_type": "Polygon", + "count": 8928, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2-5m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 309381, + "fid": "477CFCFE", + "z": 10, + "x": 861, + "y": 440 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2-5m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 3618597, + "fid": "D59AB79D", + "z": 10, + "x": 863, + "y": 436 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2-5m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 3618598, + "fid": "E34B1B5A", + "z": 10, + "x": 863, + "y": 436 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2-5m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 3618599, + "fid": "0C808517", + "z": 10, + "x": 863, + "y": 436 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2-5m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 3858796, + "fid": "2A5DD9C8", + "z": 10, + "x": 863, + "y": 441 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "10-20m", + "geom_type": "Polygon", + "count": 8440, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "10-20m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6422598, + "fid": "5DFA5778", + "z": 10, + "x": 859, + "y": 436 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "10-20m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 309346, + "fid": "6BD68A07", + "z": 10, + "x": 861, + "y": 440 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "10-20m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 309347, + "fid": "5361E466", + "z": 10, + "x": 861, + "y": 440 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "10-20m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 309348, + "fid": "3B1F85C3", + "z": 10, + "x": 861, + "y": 440 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "10-20m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 309349, + "fid": "056009F3", + "z": 10, + "x": 861, + "y": 440 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "干潮帯", + "geom_type": "Polygon", + "count": 8386, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "干潮帯", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 2606139, + "fid": "E1AD6ACB", + "z": 10, + "x": 859, + "y": 438 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "干潮帯", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 2606140, + "fid": "A0D4E93E", + "z": 10, + "x": 859, + "y": 438 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "干潮帯", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 309393, + "fid": "54645735", + "z": 10, + "x": 861, + "y": 440 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "干潮帯", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 309394, + "fid": "E95E29EB", + "z": 10, + "x": 861, + "y": 440 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "干潮帯", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 309395, + "fid": "574B2B92", + "z": 10, + "x": 861, + "y": 440 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P橋りょう等構造物", + "canonical_object_type": "橋 (水門)", + "geom_type": "Polygon", + "count": 8001, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P橋りょう等構造物", + "canonical_object_type": "橋 (水門)", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 309443, + "fid": "3EA799A7", + "z": 10, + "x": 861, + "y": 440 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P橋りょう等構造物", + "canonical_object_type": "橋 (水門)", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 309444, + "fid": "AB02422E", + "z": 10, + "x": 861, + "y": 440 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P橋りょう等構造物", + "canonical_object_type": "橋 (水門)", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 2380173, + "fid": "BEE80C71", + "z": 10, + "x": 863, + "y": 440 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P橋りょう等構造物", + "canonical_object_type": "橋 (水門)", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 2380174, + "fid": "E2EDA422", + "z": 10, + "x": 863, + "y": 440 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P橋りょう等構造物", + "canonical_object_type": "橋 (水門)", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 2380175, + "fid": "6A414DBD", + "z": 10, + "x": 863, + "y": 440 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "浅所危険界", + "geom_type": "Polygon", + "count": 6016, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "浅所危険界", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 5956308, + "fid": "FA393458", + "z": 10, + "x": 865, + "y": 440 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "浅所危険界", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 5956307, + "fid": "94E6C157", + "z": 10, + "x": 865, + "y": 440 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "浅所危険界", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 5956298, + "fid": "51E1B7CA", + "z": 10, + "x": 865, + "y": 440 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "浅所危険界", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 5956299, + "fid": "306FA1A8", + "z": 10, + "x": 865, + "y": 440 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "浅所危険界", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 5956300, + "fid": "3BC5BD9A", + "z": 10, + "x": 865, + "y": 440 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "5-10m", + "geom_type": "MultiPolygon", + "count": 5307, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5-10m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 309385, + "fid": "F6A0D62E", + "z": 10, + "x": 861, + "y": 440 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5-10m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 3618603, + "fid": "033AAF2E", + "z": 10, + "x": 863, + "y": 436 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5-10m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 2380093, + "fid": "D572A9A9", + "z": 10, + "x": 863, + "y": 440 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5-10m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 4384677, + "fid": "1F9E8932", + "z": 10, + "x": 864, + "y": 441 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5-10m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6301890, + "fid": "B0B6F19F", + "z": 10, + "x": 865, + "y": 439 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "防波堤", + "geom_type": "Polygon", + "count": 4482, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "防波堤", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 309390, + "fid": "33CE69A0", + "z": 10, + "x": 861, + "y": 440 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "防波堤", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 309387, + "fid": "359B8FBA", + "z": 10, + "x": 861, + "y": 440 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "防波堤", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 309388, + "fid": "6A30CF09", + "z": 10, + "x": 861, + "y": 440 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "防波堤", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 309389, + "fid": "47A27FD5", + "z": 10, + "x": 861, + "y": 440 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "防波堤", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 309391, + "fid": "AE783DC7", + "z": 10, + "x": 861, + "y": 440 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "0-2m", + "geom_type": "Polygon", + "count": 3835, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-2m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 3618588, + "fid": "76376B3E", + "z": 10, + "x": 863, + "y": 436 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-2m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 3618589, + "fid": "50EFB3C5", + "z": 10, + "x": 863, + "y": 436 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-2m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 3858794, + "fid": "93C15BE2", + "z": 10, + "x": 863, + "y": 441 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-2m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 2380047, + "fid": "07647169", + "z": 10, + "x": 863, + "y": 440 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-2m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 2380048, + "fid": "652C9747", + "z": 10, + "x": 863, + "y": 440 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "0-5m", + "geom_type": "MultiPolygon", + "count": 3597, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-5m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 3618594, + "fid": "00765484", + "z": 10, + "x": 863, + "y": 436 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-5m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 3618595, + "fid": "5C4B5CF9", + "z": 10, + "x": 863, + "y": 436 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-5m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 2380057, + "fid": "D480B85B", + "z": 10, + "x": 863, + "y": 440 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-5m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 2062803, + "fid": "262A19EC", + "z": 10, + "x": 864, + "y": 440 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-5m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 353532, + "fid": "97FF6BC3", + "z": 10, + "x": 868, + "y": 438 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "干潮帯", + "geom_type": "MultiPolygon", + "count": 2577, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "干潮帯", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 5956291, + "fid": "D3D23F95", + "z": 10, + "x": 865, + "y": 440 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "干潮帯", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 5956295, + "fid": "06317F67", + "z": 10, + "x": 865, + "y": 440 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "干潮帯", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 5956296, + "fid": "70952593", + "z": 10, + "x": 865, + "y": 440 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "干潮帯", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 2063172, + "fid": "B74B1D7A", + "z": 10, + "x": 864, + "y": 440 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "干潮帯", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 2063203, + "fid": "912CFE7A", + "z": 10, + "x": 864, + "y": 440 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "20-100m", + "geom_type": "Polygon", + "count": 2568, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "20-100m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 3975334, + "fid": "BD43E663", + "z": 10, + "x": 859, + "y": 428 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "20-100m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 4342768, + "fid": "BD43E663", + "z": 10, + "x": 859, + "y": 429 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "20-100m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 2034642, + "fid": "BD43E663", + "z": 10, + "x": 859, + "y": 430 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "20-100m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 2213879, + "fid": "BD43E663", + "z": 10, + "x": 859, + "y": 432 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "20-100m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 3871505, + "fid": "BD43E663", + "z": 10, + "x": 859, + "y": 431 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "10-20m", + "geom_type": "MultiPolygon", + "count": 2043, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "10-20m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 2380000, + "fid": "6CB10A74", + "z": 10, + "x": 863, + "y": 440 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "10-20m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 2380019, + "fid": "789429DF", + "z": 10, + "x": 863, + "y": 440 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "10-20m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 2380022, + "fid": "9767572C", + "z": 10, + "x": 863, + "y": 440 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "10-20m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 2380023, + "fid": "A7FB9AB1", + "z": 10, + "x": 863, + "y": 440 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "10-20m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 4384661, + "fid": "3B660F46", + "z": 10, + "x": 864, + "y": 441 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "100-200m", + "geom_type": "Polygon", + "count": 1987, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "100-200m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 2213880, + "fid": "C45099F4", + "z": 10, + "x": 859, + "y": 432 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "100-200m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 3871506, + "fid": "C45099F4", + "z": 10, + "x": 859, + "y": 431 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "100-200m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 664784, + "fid": "C45099F4", + "z": 10, + "x": 859, + "y": 434 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "100-200m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6624061, + "fid": "C45099F4", + "z": 10, + "x": 859, + "y": 433 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "100-200m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 550025, + "fid": "C45099F4", + "z": 10, + "x": 859, + "y": 435 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "2-5m", + "geom_type": "MultiPolygon", + "count": 1916, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2-5m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 309380, + "fid": "E71B69D9", + "z": 10, + "x": 861, + "y": 440 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2-5m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 4384675, + "fid": "2A5DD9C8", + "z": 10, + "x": 864, + "y": 441 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2-5m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 5956167, + "fid": "5D36EDDF", + "z": 10, + "x": 865, + "y": 440 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2-5m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 5956170, + "fid": "FE5CE774", + "z": 10, + "x": 865, + "y": 440 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2-5m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 5956185, + "fid": "B6770EEE", + "z": 10, + "x": 865, + "y": 440 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "1000-2000m", + "geom_type": "Polygon", + "count": 1913, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "1000-2000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 4340278, + "fid": "4B77E2D6", + "z": 10, + "x": 859, + "y": 439 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "1000-2000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 2606137, + "fid": "4B77E2D6", + "z": 10, + "x": 859, + "y": 438 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "1000-2000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 2578072, + "fid": "4B77E2D6", + "z": 10, + "x": 859, + "y": 440 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "1000-2000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1794299, + "fid": "4B77E2D6", + "z": 10, + "x": 859, + "y": 441 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "1000-2000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 178012, + "fid": "4B77E2D6", + "z": 10, + "x": 860, + "y": 436 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "500-1000m", + "geom_type": "Polygon", + "count": 1717, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "500-1000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 4818787, + "fid": "C99F5A7C", + "z": 10, + "x": 859, + "y": 437 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "500-1000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 2606136, + "fid": "C99F5A7C", + "z": 10, + "x": 859, + "y": 438 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "500-1000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 5621359, + "fid": "C99F5A7C", + "z": 10, + "x": 860, + "y": 437 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "500-1000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 178011, + "fid": "C99F5A7C", + "z": 10, + "x": 860, + "y": 436 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "500-1000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 4479347, + "fid": "80860402", + "z": 10, + "x": 860, + "y": 438 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "河川域", + "geom_type": "Polygon", + "count": 1711, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "河川域", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 309397, + "fid": "04816679", + "z": 10, + "x": 861, + "y": 440 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "河川域", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 309398, + "fid": "244BDE93", + "z": 10, + "x": 861, + "y": 440 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "河川域", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 2380103, + "fid": "26024BAB", + "z": 10, + "x": 863, + "y": 440 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "河川域", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 2380104, + "fid": "7691C906", + "z": 10, + "x": 863, + "y": 440 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "河川域", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6301906, + "fid": "F4433329", + "z": 10, + "x": 865, + "y": 439 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "200-500m", + "geom_type": "Polygon", + "count": 1706, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "200-500m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 4340275, + "fid": "444A7C5D", + "z": 10, + "x": 859, + "y": 439 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "200-500m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 4340276, + "fid": "ADC5D085", + "z": 10, + "x": 859, + "y": 439 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "200-500m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 2606135, + "fid": "444A7C5D", + "z": 10, + "x": 859, + "y": 438 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "200-500m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 2578070, + "fid": "ADC5D085", + "z": 10, + "x": 859, + "y": 440 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "200-500m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 178010, + "fid": "444A7C5D", + "z": 10, + "x": 860, + "y": 436 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "2000-3000m", + "geom_type": "Polygon", + "count": 1674, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2000-3000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 2578073, + "fid": "826BFFCB", + "z": 10, + "x": 859, + "y": 440 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2000-3000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1794300, + "fid": "C5C49F6E", + "z": 10, + "x": 859, + "y": 441 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2000-3000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1794301, + "fid": "B5071ABE", + "z": 10, + "x": 859, + "y": 441 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2000-3000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1794302, + "fid": "064878F3", + "z": 10, + "x": 859, + "y": 441 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2000-3000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1794303, + "fid": "826BFFCB", + "z": 10, + "x": 859, + "y": 441 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "3000-4000m", + "geom_type": "Polygon", + "count": 1440, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "3000-4000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 2578074, + "fid": "6CFB0C18", + "z": 10, + "x": 859, + "y": 440 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "3000-4000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1794304, + "fid": "6CFB0C18", + "z": 10, + "x": 859, + "y": 441 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "3000-4000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 5440198, + "fid": "4D1B2570", + "z": 10, + "x": 859, + "y": 444 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "3000-4000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6599811, + "fid": "227C123A", + "z": 10, + "x": 859, + "y": 448 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "3000-4000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 5190210, + "fid": "6CFB0C18", + "z": 10, + "x": 860, + "y": 441 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "0-10m", + "geom_type": "Polygon", + "count": 1414, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-10m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 309379, + "fid": "DB3EC69F", + "z": 10, + "x": 861, + "y": 440 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-10m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 4647389, + "fid": "A09598F3", + "z": 10, + "x": 863, + "y": 435 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-10m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 3618596, + "fid": "0C262955", + "z": 10, + "x": 863, + "y": 436 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-10m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 3858795, + "fid": "D954D328", + "z": 10, + "x": 863, + "y": 441 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-10m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 353533, + "fid": "528AA33D", + "z": 10, + "x": 868, + "y": 438 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "4000-5000m", + "geom_type": "Polygon", + "count": 1256, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "4000-5000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 3216565, + "fid": "8D177044", + "z": 10, + "x": 859, + "y": 443 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "4000-5000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 4392373, + "fid": "8D177044", + "z": 10, + "x": 859, + "y": 442 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "4000-5000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 5440199, + "fid": "8D177044", + "z": 10, + "x": 859, + "y": 444 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "4000-5000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 4650574, + "fid": "8D177044", + "z": 10, + "x": 859, + "y": 446 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "4000-5000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 2661374, + "fid": "8D177044", + "z": 10, + "x": 859, + "y": 447 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "L等深線", + "canonical_object_type": "等深線", + "geom_type": "MultiLineString", + "count": 1173, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L等深線", + "canonical_object_type": "等深線", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 4818783, + "fid": "F093E407", + "z": 10, + "x": 859, + "y": 437 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L等深線", + "canonical_object_type": "等深線", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 4384658, + "fid": "F1C90794", + "z": 10, + "x": 864, + "y": 441 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L等深線", + "canonical_object_type": "等深線", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 4384654, + "fid": "EF017CEE", + "z": 10, + "x": 864, + "y": 441 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L等深線", + "canonical_object_type": "等深線", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 4384657, + "fid": "6559E6A6", + "z": 10, + "x": 864, + "y": 441 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L等深線", + "canonical_object_type": "等深線", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 4384659, + "fid": "0F872D9E", + "z": 10, + "x": 864, + "y": 441 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P潜堤", + "canonical_object_type": "潜提", + "geom_type": "Polygon", + "count": 1167, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P潜堤", + "canonical_object_type": "潜提", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 309445, + "fid": "E669A0EB", + "z": 10, + "x": 861, + "y": 440 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P潜堤", + "canonical_object_type": "潜提", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 309446, + "fid": "96ED2E48", + "z": 10, + "x": 861, + "y": 440 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P潜堤", + "canonical_object_type": "潜提", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 309447, + "fid": "212C469D", + "z": 10, + "x": 861, + "y": 440 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P潜堤", + "canonical_object_type": "潜提", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 309448, + "fid": "4D00AC77", + "z": 10, + "x": 861, + "y": 440 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P潜堤", + "canonical_object_type": "潜提", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 309449, + "fid": "A4CBCA55", + "z": 10, + "x": 861, + "y": 440 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "防波堤", + "geom_type": "MultiPolygon", + "count": 1055, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "防波堤", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 309386, + "fid": "051EAD41", + "z": 10, + "x": 861, + "y": 440 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "防波堤", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 4384681, + "fid": "7F66DF27", + "z": 10, + "x": 864, + "y": 441 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "防波堤", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 5956241, + "fid": "32B28FC5", + "z": 10, + "x": 865, + "y": 440 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "防波堤", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 3579095, + "fid": "5233985D", + "z": 10, + "x": 866, + "y": 439 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "防波堤", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 353669, + "fid": "F7973FC9", + "z": 10, + "x": 868, + "y": 438 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "5000-6000m", + "geom_type": "Polygon", + "count": 1045, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5000-6000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 3216566, + "fid": "958816EC", + "z": 10, + "x": 859, + "y": 443 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5000-6000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 5440200, + "fid": "958816EC", + "z": 10, + "x": 859, + "y": 444 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5000-6000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6047999, + "fid": "958816EC", + "z": 10, + "x": 859, + "y": 445 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5000-6000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 4650575, + "fid": "958816EC", + "z": 10, + "x": 859, + "y": 446 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5000-6000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6073728, + "fid": "958816EC", + "z": 10, + "x": 860, + "y": 443 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P陸域", + "canonical_object_type": "P陸域", + "geom_type": "MultiPolygon", + "count": 992, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P陸域", + "canonical_object_type": "P陸域", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 2380206, + "fid": "BB816D50", + "z": 10, + "x": 863, + "y": 440 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P陸域", + "canonical_object_type": "P陸域", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 5956698, + "fid": "67DF6A85", + "z": 10, + "x": 865, + "y": 440 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P陸域", + "canonical_object_type": "P陸域", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 5956699, + "fid": "1013FDB5", + "z": 10, + "x": 865, + "y": 440 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P陸域", + "canonical_object_type": "P陸域", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6193015, + "fid": "208BCA64", + "z": 10, + "x": 867, + "y": 438 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P陸域", + "canonical_object_type": "P陸域", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 354170, + "fid": "5F7B9383", + "z": 10, + "x": 868, + "y": 438 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "0-2m", + "geom_type": "MultiPolygon", + "count": 894, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-2m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 5956137, + "fid": "35A3F0F7", + "z": 10, + "x": 865, + "y": 440 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-2m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 5956138, + "fid": "6BAFF75A", + "z": 10, + "x": 865, + "y": 440 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-2m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 5956142, + "fid": "D6CF1B7A", + "z": 10, + "x": 865, + "y": 440 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-2m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 5956143, + "fid": "69AE917F", + "z": 10, + "x": 865, + "y": 440 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-2m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 3579077, + "fid": "EB49466D", + "z": 10, + "x": 866, + "y": 439 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p地名陸", + "canonical_object_type": "p地名陸", + "geom_type": "Point", + "count": 887, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p地名陸", + "canonical_object_type": "p地名陸", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 309477, + "fid": "691C23C6", + "z": 10, + "x": 861, + "y": 440 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p地名陸", + "canonical_object_type": "p地名陸", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 5956701, + "fid": "BF3B2CB9", + "z": 10, + "x": 865, + "y": 440 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p地名陸", + "canonical_object_type": "p地名陸", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3579193, + "fid": "FAD051DE", + "z": 10, + "x": 866, + "y": 439 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p地名陸", + "canonical_object_type": "p地名陸", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 2064149, + "fid": "6E962866", + "z": 10, + "x": 864, + "y": 440 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p地名陸", + "canonical_object_type": "p地名陸", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 4763662, + "fid": "F67C5142", + "z": 10, + "x": 868, + "y": 439 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線ククリ", + "canonical_object_type": "P基本線ククリ", + "geom_type": "MultiLineString", + "count": 876, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線ククリ", + "canonical_object_type": "P基本線ククリ", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 2380111, + "fid": "3DF376FA", + "z": 10, + "x": 863, + "y": 440 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線ククリ", + "canonical_object_type": "P基本線ククリ", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 5956355, + "fid": "1AED8A38", + "z": 10, + "x": 865, + "y": 440 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線ククリ", + "canonical_object_type": "P基本線ククリ", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 5956376, + "fid": "89463583", + "z": 10, + "x": 865, + "y": 440 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線ククリ", + "canonical_object_type": "P基本線ククリ", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 5956455, + "fid": "7F99CFFB", + "z": 10, + "x": 865, + "y": 440 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線ククリ", + "canonical_object_type": "P基本線ククリ", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 5956457, + "fid": "72640618", + "z": 10, + "x": 865, + "y": 440 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P穴", + "canonical_object_type": "P穴", + "geom_type": "MultiPolygon", + "count": 804, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P穴", + "canonical_object_type": "P穴", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 309452, + "fid": "F6A0D62E", + "z": 10, + "x": 861, + "y": 440 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P穴", + "canonical_object_type": "P穴", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 60841, + "fid": "C99F5A7C", + "z": 10, + "x": 862, + "y": 441 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P穴", + "canonical_object_type": "P穴", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 4384727, + "fid": "344CBF0C", + "z": 10, + "x": 864, + "y": 441 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P穴", + "canonical_object_type": "P穴", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 4384728, + "fid": "926C81F2", + "z": 10, + "x": 864, + "y": 441 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P穴", + "canonical_object_type": "P穴", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 4384732, + "fid": "348037C7", + "z": 10, + "x": 864, + "y": 441 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "未測海域", + "geom_type": "Polygon", + "count": 657, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "未測海域", + "canonical_family": "mixed", + "geom_type": "Polygon", + "feature_id": 5956316, + "fid": "EEA56E49", + "z": 10, + "x": 865, + "y": 440 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "未測海域", + "canonical_family": "mixed", + "geom_type": "Polygon", + "feature_id": 2063249, + "fid": "290C38AD", + "z": 10, + "x": 864, + "y": 440 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "未測海域", + "canonical_family": "mixed", + "geom_type": "Polygon", + "feature_id": 353738, + "fid": "71A65C5D", + "z": 10, + "x": 868, + "y": 438 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "未測海域", + "canonical_family": "mixed", + "geom_type": "Polygon", + "feature_id": 353739, + "fid": "A94D58A8", + "z": 10, + "x": 868, + "y": 438 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "未測海域", + "canonical_family": "mixed", + "geom_type": "Polygon", + "feature_id": 353740, + "fid": "A1F85284", + "z": 10, + "x": 868, + "y": 438 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "河川域", + "geom_type": "MultiPolygon", + "count": 610, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "河川域", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 5956325, + "fid": "9C063345", + "z": 10, + "x": 865, + "y": 440 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "河川域", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1524846, + "fid": "F1579A72", + "z": 10, + "x": 874, + "y": 434 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "河川域", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1524848, + "fid": "7F9E28A9", + "z": 10, + "x": 874, + "y": 434 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "河川域", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 2373943, + "fid": "E39B882B", + "z": 10, + "x": 879, + "y": 412 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "河川域", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6319937, + "fid": "F0D3EAB5", + "z": 10, + "x": 879, + "y": 428 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "6000-7000m", + "geom_type": "Polygon", + "count": 571, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "6000-7000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 645280, + "fid": "8EA42D1B", + "z": 10, + "x": 861, + "y": 443 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "6000-7000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6477615, + "fid": "8EA42D1B", + "z": 10, + "x": 861, + "y": 444 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "6000-7000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 3441737, + "fid": "8EA42D1B", + "z": 10, + "x": 862, + "y": 444 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "6000-7000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 2880510, + "fid": "8EA42D1B", + "z": 10, + "x": 862, + "y": 445 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "6000-7000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6057934, + "fid": "8EA42D1B", + "z": 10, + "x": 862, + "y": 443 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p航路標識群", + "canonical_object_type": "沿岸灯台 (15M over)", + "geom_type": "Point", + "count": 457, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "沿岸灯台 (15M over)", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 6422612, + "fid": "998A7327", + "z": 10, + "x": 859, + "y": 436 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "沿岸灯台 (15M over)", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 2606147, + "fid": "5FE3F829", + "z": 10, + "x": 859, + "y": 438 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "沿岸灯台 (15M over)", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 309478, + "fid": "706028EE", + "z": 10, + "x": 861, + "y": 440 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "沿岸灯台 (15M over)", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 354173, + "fid": "26410CCA", + "z": 10, + "x": 868, + "y": 438 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p航路標識群", + "canonical_object_type": "沿岸灯台 (15M over)", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 4763663, + "fid": "13FBBD9E", + "z": 10, + "x": 868, + "y": 439 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "0-10m", + "geom_type": "MultiPolygon", + "count": 427, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-10m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 2062807, + "fid": "74E48F1D", + "z": 10, + "x": 864, + "y": 440 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-10m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 4762797, + "fid": "7EAE95AF", + "z": 10, + "x": 868, + "y": 439 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-10m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 2351597, + "fid": "0E29EF04", + "z": 10, + "x": 873, + "y": 433 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-10m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 2272684, + "fid": "99D8DAC9", + "z": 10, + "x": 876, + "y": 414 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-10m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 4139993, + "fid": "AD615A5A", + "z": 10, + "x": 876, + "y": 432 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "p地名", + "canonical_object_type": "p地名", + "geom_type": "Point", + "count": 416, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p地名", + "canonical_object_type": "p地名", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 309476, + "fid": "19EF8EBA", + "z": 10, + "x": 861, + "y": 440 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p地名", + "canonical_object_type": "p地名", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3618669, + "fid": "78FD3364", + "z": 10, + "x": 863, + "y": 436 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p地名", + "canonical_object_type": "p地名", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 3618670, + "fid": "E3288E80", + "z": 10, + "x": 863, + "y": 436 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p地名", + "canonical_object_type": "p地名", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 4384738, + "fid": "865DD26B", + "z": 10, + "x": 864, + "y": 441 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "p地名", + "canonical_object_type": "p地名", + "canonical_family": "symbol", + "geom_type": "Point", + "feature_id": 5956700, + "fid": "C7F04A9D", + "z": 10, + "x": 865, + "y": 440 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "2-10m", + "geom_type": "Polygon", + "count": 377, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2-10m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1728365, + "fid": "EA3CAD44", + "z": 10, + "x": 875, + "y": 435 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2-10m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 5145412, + "fid": "EA3CAD44", + "z": 10, + "x": 875, + "y": 434 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2-10m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 5283632, + "fid": "172C2EBF", + "z": 10, + "x": 877, + "y": 415 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2-10m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 5283634, + "fid": "68353595", + "z": 10, + "x": 877, + "y": 415 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2-10m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 7465, + "fid": "A6916568", + "z": 10, + "x": 879, + "y": 407 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "浮施設・桟橋", + "geom_type": "Polygon", + "count": 353, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "浮施設・桟橋", + "canonical_family": "mixed", + "geom_type": "Polygon", + "feature_id": 2063060, + "fid": "97E880F9", + "z": 10, + "x": 864, + "y": 440 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "浮施設・桟橋", + "canonical_family": "mixed", + "geom_type": "Polygon", + "feature_id": 353671, + "fid": "F5099885", + "z": 10, + "x": 868, + "y": 438 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "浮施設・桟橋", + "canonical_family": "mixed", + "geom_type": "Polygon", + "feature_id": 4763021, + "fid": "121F0151", + "z": 10, + "x": 868, + "y": 439 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "浮施設・桟橋", + "canonical_family": "mixed", + "geom_type": "Polygon", + "feature_id": 4763022, + "fid": "1DA8D11B", + "z": 10, + "x": 868, + "y": 439 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "浮施設・桟橋", + "canonical_family": "mixed", + "geom_type": "Polygon", + "feature_id": 5145624, + "fid": "D73B2F83", + "z": 10, + "x": 875, + "y": 434 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "1000-2000m", + "geom_type": "MultiPolygon", + "count": 308, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "1000-2000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 5621360, + "fid": "4B77E2D6", + "z": 10, + "x": 860, + "y": 437 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "1000-2000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 5058637, + "fid": "4B77E2D6", + "z": 10, + "x": 860, + "y": 439 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "1000-2000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 4124830, + "fid": "4B77E2D6", + "z": 10, + "x": 860, + "y": 440 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "1000-2000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 5190208, + "fid": "4B77E2D6", + "z": 10, + "x": 860, + "y": 441 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "1000-2000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1332423, + "fid": "4B77E2D6", + "z": 10, + "x": 862, + "y": 436 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "500-1000m", + "geom_type": "MultiPolygon", + "count": 304, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "500-1000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 4340277, + "fid": "C99F5A7C", + "z": 10, + "x": 859, + "y": 439 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "500-1000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 2578071, + "fid": "C99F5A7C", + "z": 10, + "x": 859, + "y": 440 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "500-1000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 5058636, + "fid": "C99F5A7C", + "z": 10, + "x": 860, + "y": 439 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "500-1000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 4860585, + "fid": "C99F5A7C", + "z": 10, + "x": 861, + "y": 437 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "500-1000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 2041242, + "fid": "C99F5A7C", + "z": 10, + "x": 861, + "y": 436 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "20-100m", + "geom_type": "MultiPolygon", + "count": 302, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "20-100m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 129438, + "fid": "BD43E663", + "z": 10, + "x": 860, + "y": 431 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "20-100m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 3445759, + "fid": "BD43E663", + "z": 10, + "x": 861, + "y": 430 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "20-100m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 4384664, + "fid": "344CBF0C", + "z": 10, + "x": 864, + "y": 441 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "20-100m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6301879, + "fid": "344CBF0C", + "z": 10, + "x": 865, + "y": 439 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "20-100m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 5956088, + "fid": "344CBF0C", + "z": 10, + "x": 865, + "y": 440 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "浅所危険界", + "geom_type": "MultiPolygon", + "count": 300, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "浅所危険界", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 3234851, + "fid": "77888F56", + "z": 10, + "x": 872, + "y": 434 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "浅所危険界", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1524839, + "fid": "C0A02FFA", + "z": 10, + "x": 874, + "y": 434 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "浅所危険界", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 3589401, + "fid": "1346609F", + "z": 10, + "x": 879, + "y": 427 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "浅所危険界", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 3943827, + "fid": "9BBDB677", + "z": 10, + "x": 880, + "y": 409 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "浅所危険界", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6319872, + "fid": "1346609F", + "z": 10, + "x": 879, + "y": 428 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "0-20m", + "geom_type": "Polygon", + "count": 275, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-20m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6422601, + "fid": "6FEB3434", + "z": 10, + "x": 859, + "y": 436 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-20m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6422602, + "fid": "9FC5954C", + "z": 10, + "x": 859, + "y": 436 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-20m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 4818788, + "fid": "6FEB3434", + "z": 10, + "x": 859, + "y": 437 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-20m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 2606138, + "fid": "B5322A33", + "z": 10, + "x": 859, + "y": 438 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-20m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 4738319, + "fid": "67BFF5F5", + "z": 10, + "x": 866, + "y": 435 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "2000-3000m", + "geom_type": "MultiPolygon", + "count": 265, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2000-3000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6285840, + "fid": "064878F3", + "z": 10, + "x": 860, + "y": 442 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2000-3000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 3452479, + "fid": "826BFFCB", + "z": 10, + "x": 863, + "y": 442 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2000-3000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6435050, + "fid": "826BFFCB", + "z": 10, + "x": 864, + "y": 442 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2000-3000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6115152, + "fid": "D07DD158", + "z": 10, + "x": 867, + "y": 435 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2000-3000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 4622027, + "fid": "D07DD158", + "z": 10, + "x": 868, + "y": 434 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "7000-8000m", + "geom_type": "Polygon", + "count": 259, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "7000-8000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6036707, + "fid": "49956793", + "z": 10, + "x": 871, + "y": 442 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "7000-8000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1833353, + "fid": "38C09749", + "z": 10, + "x": 873, + "y": 440 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "7000-8000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1117675, + "fid": "38C09749", + "z": 10, + "x": 873, + "y": 441 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "7000-8000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 138743, + "fid": "38C09749", + "z": 10, + "x": 874, + "y": 439 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "7000-8000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 2549292, + "fid": "38C09749", + "z": 10, + "x": 875, + "y": 438 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "5-20m", + "geom_type": "Polygon", + "count": 246, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5-20m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1327802, + "fid": "24F85076", + "z": 10, + "x": 877, + "y": 407 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5-20m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1327803, + "fid": "DB8E8F08", + "z": 10, + "x": 877, + "y": 407 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5-20m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 5317155, + "fid": "85EA1ECE", + "z": 10, + "x": 877, + "y": 406 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5-20m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 5317156, + "fid": "24F85076", + "z": 10, + "x": 877, + "y": 406 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5-20m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 5317157, + "fid": "DB8E8F08", + "z": 10, + "x": 877, + "y": 406 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "200-500m", + "geom_type": "MultiPolygon", + "count": 229, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "200-500m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6422600, + "fid": "444A7C5D", + "z": 10, + "x": 859, + "y": 436 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "200-500m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 4818786, + "fid": "444A7C5D", + "z": 10, + "x": 859, + "y": 437 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "200-500m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 5621358, + "fid": "444A7C5D", + "z": 10, + "x": 860, + "y": 437 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "200-500m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 4124828, + "fid": "ADC5D085", + "z": 10, + "x": 860, + "y": 440 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "200-500m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 60833, + "fid": "348037C7", + "z": 10, + "x": 862, + "y": 441 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "100-200m", + "geom_type": "MultiPolygon", + "count": 227, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "100-200m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 4818785, + "fid": "C45099F4", + "z": 10, + "x": 859, + "y": 437 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "100-200m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 3103273, + "fid": "C45099F4", + "z": 10, + "x": 860, + "y": 430 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "100-200m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 3445760, + "fid": "C45099F4", + "z": 10, + "x": 861, + "y": 430 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "100-200m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 3643839, + "fid": "C45099F4", + "z": 10, + "x": 864, + "y": 430 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "100-200m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 4384666, + "fid": "926C81F2", + "z": 10, + "x": 864, + "y": 441 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "3000-4000m", + "geom_type": "MultiPolygon", + "count": 195, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "3000-4000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 3216564, + "fid": "6CFB0C18", + "z": 10, + "x": 859, + "y": 443 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "3000-4000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 4392372, + "fid": "6CFB0C18", + "z": 10, + "x": 859, + "y": 442 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "3000-4000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6285841, + "fid": "6CFB0C18", + "z": 10, + "x": 860, + "y": 442 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "3000-4000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6205748, + "fid": "6CFB0C18", + "z": 10, + "x": 861, + "y": 442 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "3000-4000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 4031356, + "fid": "7787F0CE", + "z": 10, + "x": 861, + "y": 447 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "湖沼域", + "geom_type": "Polygon", + "count": 186, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "湖沼域", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 3315595, + "fid": "32DE2DAA", + "z": 10, + "x": 883, + "y": 418 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "湖沼域", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 3315596, + "fid": "5DA61F08", + "z": 10, + "x": 883, + "y": 418 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "湖沼域", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 5814010, + "fid": "3D5031EA", + "z": 10, + "x": 885, + "y": 407 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "湖沼域", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 359541, + "fid": "F13710DF", + "z": 10, + "x": 889, + "y": 403 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "湖沼域", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1594809, + "fid": "B350616B", + "z": 10, + "x": 889, + "y": 404 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "4000-5000m", + "geom_type": "MultiPolygon", + "count": 165, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "4000-5000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6047998, + "fid": "8D177044", + "z": 10, + "x": 859, + "y": 445 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "4000-5000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 4056979, + "fid": "8D177044", + "z": 10, + "x": 860, + "y": 445 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "4000-5000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 3754402, + "fid": "8D177044", + "z": 10, + "x": 861, + "y": 446 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "4000-5000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 4031357, + "fid": "8D177044", + "z": 10, + "x": 861, + "y": 447 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "4000-5000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 3797489, + "fid": "8D177044", + "z": 10, + "x": 861, + "y": 448 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "5000-6000m", + "geom_type": "MultiPolygon", + "count": 154, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5000-6000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6477614, + "fid": "958816EC", + "z": 10, + "x": 861, + "y": 444 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5000-6000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 3129957, + "fid": "958816EC", + "z": 10, + "x": 861, + "y": 445 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5000-6000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 3441736, + "fid": "958816EC", + "z": 10, + "x": 862, + "y": 444 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5000-6000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6057933, + "fid": "958816EC", + "z": 10, + "x": 862, + "y": 443 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5000-6000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 496482, + "fid": "958816EC", + "z": 10, + "x": 862, + "y": 446 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "8000-9000m", + "geom_type": "Polygon", + "count": 127, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "8000-9000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 367268, + "fid": "FD95B91F", + "z": 10, + "x": 914, + "y": 409 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "8000-9000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 3255971, + "fid": "9BA461AB", + "z": 10, + "x": 915, + "y": 407 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "8000-9000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 3255972, + "fid": "FD95B91F", + "z": 10, + "x": 915, + "y": 407 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "8000-9000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 3093885, + "fid": "FD95B91F", + "z": 10, + "x": 915, + "y": 406 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "8000-9000m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6036587, + "fid": "FD95B91F", + "z": 10, + "x": 915, + "y": 408 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "6000-7000m", + "geom_type": "MultiPolygon", + "count": 126, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "6000-7000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1963849, + "fid": "8EA42D1B", + "z": 10, + "x": 865, + "y": 443 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "6000-7000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6614366, + "fid": "8EA42D1B", + "z": 10, + "x": 868, + "y": 445 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "6000-7000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 3729272, + "fid": "8EA42D1B", + "z": 10, + "x": 870, + "y": 444 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "6000-7000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 5549804, + "fid": "8EA42D1B", + "z": 10, + "x": 871, + "y": 443 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "6000-7000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 2635949, + "fid": "A739FA1F", + "z": 10, + "x": 871, + "y": 445 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "2-10m", + "geom_type": "MultiPolygon", + "count": 108, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2-10m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 5283633, + "fid": "4ED0550E", + "z": 10, + "x": 877, + "y": 415 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2-10m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 2513019, + "fid": "9AF7D32E", + "z": 10, + "x": 883, + "y": 417 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2-10m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 5798519, + "fid": "751CA0ED", + "z": 10, + "x": 887, + "y": 409 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2-10m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 5798524, + "fid": "0D14F39A", + "z": 10, + "x": 887, + "y": 409 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2-10m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 2707021, + "fid": "8AAFD0E9", + "z": 10, + "x": 887, + "y": 412 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "陸上水域", + "geom_type": "Polygon", + "count": 105, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "陸上水域", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 3234859, + "fid": "24E6FAC4", + "z": 10, + "x": 872, + "y": 434 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "陸上水域", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 2222688, + "fid": "730CDFCD", + "z": 10, + "x": 882, + "y": 413 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "陸上水域", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 3192868, + "fid": "857AE534", + "z": 10, + "x": 882, + "y": 414 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "陸上水域", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1388412, + "fid": "A997B367", + "z": 10, + "x": 882, + "y": 419 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "陸上水域", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 2110451, + "fid": "0C35F1B8", + "z": 10, + "x": 883, + "y": 409 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "浮施設・桟橋", + "geom_type": "MultiPolygon", + "count": 96, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "浮施設・桟橋", + "canonical_family": "mixed", + "geom_type": "MultiPolygon", + "feature_id": 5145623, + "fid": "508D5208", + "z": 10, + "x": 875, + "y": 434 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "浮施設・桟橋", + "canonical_family": "mixed", + "geom_type": "MultiPolygon", + "feature_id": 6376138, + "fid": "508D5208", + "z": 10, + "x": 876, + "y": 434 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "浮施設・桟橋", + "canonical_family": "mixed", + "geom_type": "MultiPolygon", + "feature_id": 3711674, + "fid": "EC02A725", + "z": 10, + "x": 883, + "y": 408 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "浮施設・桟橋", + "canonical_family": "mixed", + "geom_type": "MultiPolygon", + "feature_id": 2110400, + "fid": "17C810C0", + "z": 10, + "x": 883, + "y": 409 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "浮施設・桟橋", + "canonical_family": "mixed", + "geom_type": "MultiPolygon", + "feature_id": 2110401, + "fid": "EC02A725", + "z": 10, + "x": 883, + "y": 409 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "9000m以深", + "geom_type": "Polygon", + "count": 76, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "9000m以深", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 3255973, + "fid": "C43012B7", + "z": 10, + "x": 915, + "y": 407 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "9000m以深", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 3255974, + "fid": "15B362B9", + "z": 10, + "x": 915, + "y": 407 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "9000m以深", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 6036588, + "fid": "15B362B9", + "z": 10, + "x": 915, + "y": 408 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "9000m以深", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 64424, + "fid": "15B362B9", + "z": 10, + "x": 915, + "y": 409 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "9000m以深", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1209221, + "fid": "15B362B9", + "z": 10, + "x": 915, + "y": 410 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P潜堤", + "canonical_object_type": "潜提", + "geom_type": "MultiPolygon", + "count": 72, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P潜堤", + "canonical_object_type": "潜提", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 5146683, + "fid": "D3B7398B", + "z": 10, + "x": 875, + "y": 434 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P潜堤", + "canonical_object_type": "潜提", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 5146684, + "fid": "3FF5D3E9", + "z": 10, + "x": 875, + "y": 434 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P潜堤", + "canonical_object_type": "潜提", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 3944097, + "fid": "B9FAA18F", + "z": 10, + "x": 880, + "y": 409 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P潜堤", + "canonical_object_type": "潜提", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 3944099, + "fid": "C687643B", + "z": 10, + "x": 880, + "y": 409 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P潜堤", + "canonical_object_type": "潜提", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 2468380, + "fid": "B9FAA18F", + "z": 10, + "x": 880, + "y": 410 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "7000-8000m", + "geom_type": "MultiPolygon", + "count": 67, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "7000-8000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 4514065, + "fid": "38C09749", + "z": 10, + "x": 872, + "y": 441 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "7000-8000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 3401422, + "fid": "38C09749", + "z": 10, + "x": 874, + "y": 440 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "7000-8000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 3399376, + "fid": "8807D674", + "z": 10, + "x": 914, + "y": 408 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "7000-8000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6177723, + "fid": "8807D674", + "z": 10, + "x": 915, + "y": 405 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "7000-8000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 64421, + "fid": "8807D674", + "z": 10, + "x": 915, + "y": 409 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P橋りょう等構造物", + "canonical_object_type": "橋 (水門)", + "geom_type": "MultiPolygon", + "count": 54, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P橋りょう等構造物", + "canonical_object_type": "橋 (水門)", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 4763514, + "fid": "355D08C0", + "z": 10, + "x": 868, + "y": 439 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P橋りょう等構造物", + "canonical_object_type": "橋 (水門)", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 5146642, + "fid": "6D532E5E", + "z": 10, + "x": 875, + "y": 434 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P橋りょう等構造物", + "canonical_object_type": "橋 (水門)", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 5146669, + "fid": "C5D45DC1", + "z": 10, + "x": 875, + "y": 434 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P橋りょう等構造物", + "canonical_object_type": "橋 (水門)", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1196492, + "fid": "2C4439F9", + "z": 10, + "x": 879, + "y": 408 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P橋りょう等構造物", + "canonical_object_type": "橋 (水門)", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1196506, + "fid": "7ED54178", + "z": 10, + "x": 879, + "y": 408 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "0-20m", + "geom_type": "MultiPolygon", + "count": 44, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-20m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 642861, + "fid": "F8D42967", + "z": 10, + "x": 876, + "y": 405 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-20m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 5589548, + "fid": "F8D42967", + "z": 10, + "x": 876, + "y": 406 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-20m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 4481397, + "fid": "F8D42967", + "z": 10, + "x": 877, + "y": 405 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-20m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 5317153, + "fid": "F8D42967", + "z": 10, + "x": 877, + "y": 406 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "0-20m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 4262936, + "fid": "F8D42967", + "z": 10, + "x": 878, + "y": 406 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "8000-9000m", + "geom_type": "MultiPolygon", + "count": 41, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "8000-9000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 64423, + "fid": "FD95B91F", + "z": 10, + "x": 915, + "y": 409 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "8000-9000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1209220, + "fid": "FD95B91F", + "z": 10, + "x": 915, + "y": 410 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "8000-9000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 4483165, + "fid": "FD95B91F", + "z": 10, + "x": 915, + "y": 411 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "8000-9000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 819192, + "fid": "FD95B91F", + "z": 10, + "x": 915, + "y": 414 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "8000-9000m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6657160, + "fid": "FD95B91F", + "z": 10, + "x": 916, + "y": 407 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "2-20m", + "geom_type": "Polygon", + "count": 38, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2-20m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 5145413, + "fid": "2002C740", + "z": 10, + "x": 875, + "y": 434 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2-20m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 5317154, + "fid": "3DF13D3C", + "z": 10, + "x": 877, + "y": 406 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2-20m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 4328371, + "fid": "74BA4881", + "z": 10, + "x": 888, + "y": 409 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2-20m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 4328372, + "fid": "B77AED9B", + "z": 10, + "x": 888, + "y": 409 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2-20m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 3422894, + "fid": "D5263B1E", + "z": 10, + "x": 888, + "y": 410 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "5-20m", + "geom_type": "MultiPolygon", + "count": 35, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5-20m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 3315573, + "fid": "0B527FC2", + "z": 10, + "x": 883, + "y": 418 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5-20m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 2707190, + "fid": "10FB595E", + "z": 10, + "x": 887, + "y": 412 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5-20m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 2707194, + "fid": "5E1BF2ED", + "z": 10, + "x": 887, + "y": 412 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5-20m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 4328551, + "fid": "CAAA03B1", + "z": 10, + "x": 888, + "y": 409 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "5-20m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 4328562, + "fid": "FDD7ED42", + "z": 10, + "x": 888, + "y": 409 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "湖沼域", + "geom_type": "MultiPolygon", + "count": 34, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "湖沼域", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1594810, + "fid": "F13710DF", + "z": 10, + "x": 889, + "y": 404 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "湖沼域", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6166332, + "fid": "FEDECC67", + "z": 10, + "x": 898, + "y": 404 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "湖沼域", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 2352108, + "fid": "FEDECC67", + "z": 10, + "x": 899, + "y": 403 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "湖沼域", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 909638, + "fid": "FD4FC193", + "z": 10, + "x": 906, + "y": 403 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "湖沼域", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 88409, + "fid": "5DFB9BA1", + "z": 10, + "x": 909, + "y": 387 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "撤去跡", + "geom_type": "Polygon", + "count": 30, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "撤去跡", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1524845, + "fid": "7080F8AF", + "z": 10, + "x": 874, + "y": 434 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "撤去跡", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1581252, + "fid": "6CC91B82", + "z": 10, + "x": 880, + "y": 423 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "撤去跡", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 4393816, + "fid": "78D96415", + "z": 10, + "x": 880, + "y": 427 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "撤去跡", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1056639, + "fid": "B1CC17B6", + "z": 10, + "x": 882, + "y": 412 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "撤去跡", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 2110443, + "fid": "9FE50F48", + "z": 10, + "x": 883, + "y": 409 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "未測海域", + "geom_type": "MultiPolygon", + "count": 30, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "未測海域", + "canonical_family": "mixed", + "geom_type": "MultiPolygon", + "feature_id": 4547260, + "fid": "42D15A84", + "z": 10, + "x": 881, + "y": 409 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "未測海域", + "canonical_family": "mixed", + "geom_type": "MultiPolygon", + "feature_id": 3711686, + "fid": "19DF9A94", + "z": 10, + "x": 883, + "y": 408 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "未測海域", + "canonical_family": "mixed", + "geom_type": "MultiPolygon", + "feature_id": 5798762, + "fid": "ED610F47", + "z": 10, + "x": 887, + "y": 409 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "未測海域", + "canonical_family": "mixed", + "geom_type": "MultiPolygon", + "feature_id": 4141293, + "fid": "F2E3F58A", + "z": 10, + "x": 894, + "y": 408 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "未測海域", + "canonical_family": "mixed", + "geom_type": "MultiPolygon", + "feature_id": 198621, + "fid": "FD1BA2E8", + "z": 10, + "x": 896, + "y": 408 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P危険界ククリ", + "canonical_object_type": "P危険界ククリ", + "geom_type": "MultiLineString", + "count": 19, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P危険界ククリ", + "canonical_object_type": "P危険界ククリ", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 2062554, + "fid": "3FC66ACA", + "z": 10, + "x": 864, + "y": 440 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P危険界ククリ", + "canonical_object_type": "P危険界ククリ", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 7162, + "fid": "469EA2EF", + "z": 10, + "x": 879, + "y": 407 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P危険界ククリ", + "canonical_object_type": "P危険界ククリ", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 6318799, + "fid": "231DF717", + "z": 10, + "x": 879, + "y": 428 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P危険界ククリ", + "canonical_object_type": "P危険界ククリ", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 6318800, + "fid": "AEBF9541", + "z": 10, + "x": 879, + "y": 428 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P危険界ククリ", + "canonical_object_type": "P危険界ククリ", + "canonical_family": "line", + "geom_type": "MultiLineString", + "feature_id": 5090816, + "fid": "92ACDBC3", + "z": 10, + "x": 881, + "y": 410 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "10-100m", + "geom_type": "Polygon", + "count": 10, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "10-100m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 2373538, + "fid": "BF2D3895", + "z": 10, + "x": 879, + "y": 412 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "10-100m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 4408625, + "fid": "129C6506", + "z": 10, + "x": 908, + "y": 407 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "10-100m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1603314, + "fid": "95102553", + "z": 10, + "x": 912, + "y": 431 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "10-100m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 2140933, + "fid": "0BD28039", + "z": 10, + "x": 915, + "y": 390 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "10-100m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 5945132, + "fid": "0BD28039", + "z": 10, + "x": 916, + "y": 390 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "20-200m", + "geom_type": "Polygon", + "count": 9, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "20-200m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 2606133, + "fid": "A4DC808F", + "z": 10, + "x": 859, + "y": 438 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "20-200m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 2511249, + "fid": "29E995CC", + "z": 10, + "x": 908, + "y": 410 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "20-200m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 5115046, + "fid": "485FB77E", + "z": 10, + "x": 909, + "y": 417 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "20-200m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 5555301, + "fid": "4E3F1FC1", + "z": 10, + "x": 936, + "y": 365 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "20-200m", + "canonical_family": "surface", + "geom_type": "Polygon", + "feature_id": 1649310, + "fid": "4E3F1FC1", + "z": 10, + "x": 936, + "y": 366 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "L概略等深線", + "canonical_object_type": "概略等深線", + "geom_type": "LineString", + "count": 6, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L概略等深線", + "canonical_object_type": "概略等深線", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 5109909, + "fid": "C8BB83AB", + "z": 10, + "x": 895, + "y": 408 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L概略等深線", + "canonical_object_type": "概略等深線", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 5109910, + "fid": "0E9C20F8", + "z": 10, + "x": 895, + "y": 408 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L概略等深線", + "canonical_object_type": "概略等深線", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 5109911, + "fid": "EC762492", + "z": 10, + "x": 895, + "y": 408 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L概略等深線", + "canonical_object_type": "概略等深線", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 198270, + "fid": "C8BB83AB", + "z": 10, + "x": 896, + "y": 408 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "L概略等深線", + "canonical_object_type": "概略等深線", + "canonical_family": "line", + "geom_type": "LineString", + "feature_id": 198271, + "fid": "0E9C20F8", + "z": 10, + "x": 896, + "y": 408 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "9000m以深", + "geom_type": "MultiPolygon", + "count": 5, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "9000m以深", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 5197193, + "fid": "15B362B9", + "z": 10, + "x": 916, + "y": 409 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "9000m以深", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1255127, + "fid": "04CFF596", + "z": 10, + "x": 918, + "y": 423 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "9000m以深", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 6077834, + "fid": "04CFF596", + "z": 10, + "x": 918, + "y": 425 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "9000m以深", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 3248557, + "fid": "15B362B9", + "z": 9, + "x": 458, + "y": 204 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "9000m以深", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 3636419, + "fid": "04CFF596", + "z": 9, + "x": 459, + "y": 211 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "2-20m", + "geom_type": "MultiPolygon", + "count": 4, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2-20m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 5538784, + "fid": "E0204112", + "z": 10, + "x": 889, + "y": 409 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2-20m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 5420629, + "fid": "BE2B31E8", + "z": 9, + "x": 444, + "y": 205 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2-20m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 5507787, + "fid": "E0204112", + "z": 9, + "x": 444, + "y": 204 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "2-20m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 5507789, + "fid": "B77AED9B", + "z": 9, + "x": 444, + "y": 204 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "撤去跡", + "geom_type": "MultiPolygon", + "count": 4, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "撤去跡", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 4418773, + "fid": "B86AA97B", + "z": 10, + "x": 883, + "y": 412 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "撤去跡", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 146420, + "fid": "25C9E3D8", + "z": 10, + "x": 890, + "y": 408 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "撤去跡", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 2766498, + "fid": "B86AA97B", + "z": 9, + "x": 441, + "y": 206 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "撤去跡", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 2740163, + "fid": "223E95C8", + "z": 9, + "x": 456, + "y": 187 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "20-200m", + "geom_type": "MultiPolygon", + "count": 3, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "20-200m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1226215, + "fid": "4E3F1FC1", + "z": 10, + "x": 937, + "y": 365 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "20-200m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1400417, + "fid": "4E3F1FC1", + "z": 9, + "x": 468, + "y": 183 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "20-200m", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 3286328, + "fid": "4E3F1FC1", + "z": 9, + "x": 468, + "y": 182 + } + ] + }, + { + "issue_type": "render_rule_unresolved", + "source_layer": "P基本線", + "canonical_object_type": "陸上水域", + "geom_type": "MultiPolygon", + "count": 3, + "sample_features": [ + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "陸上水域", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 1056650, + "fid": "730CDFCD", + "z": 10, + "x": 882, + "y": 412 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "陸上水域", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 2766540, + "fid": "730CDFCD", + "z": 9, + "x": 441, + "y": 206 + }, + { + "issue_type": "render_rule_unresolved", + "reason": "no specific render rule matched; heuristic fill-in was used", + "source_layer": "P基本線", + "canonical_object_type": "陸上水域", + "canonical_family": "surface", + "geom_type": "MultiPolygon", + "feature_id": 5720097, + "fid": "C5778277", + "z": 9, + "x": 456, + "y": 190 + } + ] + } + ] +} \ No newline at end of file diff --git a/docs/报告/20261013_全国Full生产分片历史审计证据/z9_10.mapping_audit.md b/docs/报告/20261013_全国Full生产分片历史审计证据/z9_10.mapping_audit.md new file mode 100644 index 0000000..656cf20 --- /dev/null +++ b/docs/报告/20261013_全国Full生产分片历史审计证据/z9_10.mapping_audit.md @@ -0,0 +1,359 @@ +# NavSea Mapping Audit Report + +- bundle_id: `navsea-core` +- output_root: `/home/wwwroot/pbf-delivery-full-20260418-rebuild.parts/z9_10` +- tile_jobs: `3969` +- written_tiles: `3969` +- skipped_tiles: `0` +- unresolved_event_count: `578573` + +## Unresolved Summary + +- `render_rule_unresolved` | `L海底地形` | `L海底地形` | `LineString` | count=`145130` + sample: fid=`0601CFC5` feature_id=`2213878` tile=`10/859/432` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`0601CFC5` feature_id=`3871504` tile=`10/859/431` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`0601CFC5` feature_id=`664783` tile=`10/859/434` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線ククリ` | `P基本線ククリ` | `LineString` | count=`117004` + sample: fid=`AD682227` feature_id=`6422603` tile=`10/859/436` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`3F61B766` feature_id=`6422604` tile=`10/859/436` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`3F61B766` feature_id=`4818789` tile=`10/859/437` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `L等深線` | `等深線` | `LineString` | count=`101228` + sample: fid=`AFC293D1` feature_id=`6422595` tile=`10/859/436` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`D9A87E3B` feature_id=`6422596` tile=`10/859/436` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`F093E407` feature_id=`6422597` tile=`10/859/436` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P穴` | `P穴` | `Polygon` | count=`40162` + sample: fid=`6FEB3434` feature_id=`6422605` tile=`10/859/436` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`9FC5954C` feature_id=`6422606` tile=`10/859/436` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`C45099F4` feature_id=`6422607` tile=`10/859/436` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `L海底地形` | `L海底地形` | `MultiLineString` | count=`21832` + sample: fid=`BA663A16` feature_id=`6422589` tile=`10/859/436` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`39A9F9B5` feature_id=`6422593` tile=`10/859/436` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`363D97A3` feature_id=`4818775` tile=`10/859/437` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P危険界ククリ` | `P危険界ククリ` | `LineString` | count=`17125` + sample: fid=`CC30B83A` feature_id=`309344` tile=`10/861/440` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`2C4274DB` feature_id=`309345` tile=`10/861/440` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`54DEA8EA` feature_id=`3858773` tile=`10/863/441` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `5-10m` | `Polygon` | count=`15589` + sample: fid=`00C690ED` feature_id=`309382` tile=`10/861/440` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`D6326DFB` feature_id=`309383` tile=`10/861/440` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`B720E99E` feature_id=`309384` tile=`10/861/440` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P陸域` | `P陸域` | `Polygon` | count=`13172` + sample: fid=`62E69E5E` feature_id=`6422610` tile=`10/859/436` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`110EB213` feature_id=`6422611` tile=`10/859/436` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`62E69E5E` feature_id=`4818792` tile=`10/859/437` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `0-5m` | `Polygon` | count=`9095` + sample: fid=`D0DC711F` feature_id=`309377` tile=`10/861/440` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`025D6BDA` feature_id=`309378` tile=`10/861/440` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`FF1D7B86` feature_id=`3618592` tile=`10/863/436` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `2-5m` | `Polygon` | count=`8928` + sample: fid=`477CFCFE` feature_id=`309381` tile=`10/861/440` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`D59AB79D` feature_id=`3618597` tile=`10/863/436` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`E34B1B5A` feature_id=`3618598` tile=`10/863/436` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `10-20m` | `Polygon` | count=`8440` + sample: fid=`5DFA5778` feature_id=`6422598` tile=`10/859/436` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`6BD68A07` feature_id=`309346` tile=`10/861/440` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`5361E466` feature_id=`309347` tile=`10/861/440` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `干潮帯` | `Polygon` | count=`8386` + sample: fid=`E1AD6ACB` feature_id=`2606139` tile=`10/859/438` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`A0D4E93E` feature_id=`2606140` tile=`10/859/438` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`54645735` feature_id=`309393` tile=`10/861/440` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P橋りょう等構造物` | `橋 (水門)` | `Polygon` | count=`8001` + sample: fid=`3EA799A7` feature_id=`309443` tile=`10/861/440` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`AB02422E` feature_id=`309444` tile=`10/861/440` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`BEE80C71` feature_id=`2380173` tile=`10/863/440` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `浅所危険界` | `Polygon` | count=`6016` + sample: fid=`FA393458` feature_id=`5956308` tile=`10/865/440` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`94E6C157` feature_id=`5956307` tile=`10/865/440` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`51E1B7CA` feature_id=`5956298` tile=`10/865/440` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `5-10m` | `MultiPolygon` | count=`5307` + sample: fid=`F6A0D62E` feature_id=`309385` tile=`10/861/440` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`033AAF2E` feature_id=`3618603` tile=`10/863/436` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`D572A9A9` feature_id=`2380093` tile=`10/863/440` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `防波堤` | `Polygon` | count=`4482` + sample: fid=`33CE69A0` feature_id=`309390` tile=`10/861/440` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`359B8FBA` feature_id=`309387` tile=`10/861/440` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`6A30CF09` feature_id=`309388` tile=`10/861/440` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `0-2m` | `Polygon` | count=`3835` + sample: fid=`76376B3E` feature_id=`3618588` tile=`10/863/436` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`50EFB3C5` feature_id=`3618589` tile=`10/863/436` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`93C15BE2` feature_id=`3858794` tile=`10/863/441` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `0-5m` | `MultiPolygon` | count=`3597` + sample: fid=`00765484` feature_id=`3618594` tile=`10/863/436` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`5C4B5CF9` feature_id=`3618595` tile=`10/863/436` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`D480B85B` feature_id=`2380057` tile=`10/863/440` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `干潮帯` | `MultiPolygon` | count=`2577` + sample: fid=`D3D23F95` feature_id=`5956291` tile=`10/865/440` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`06317F67` feature_id=`5956295` tile=`10/865/440` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`70952593` feature_id=`5956296` tile=`10/865/440` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `20-100m` | `Polygon` | count=`2568` + sample: fid=`BD43E663` feature_id=`3975334` tile=`10/859/428` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`BD43E663` feature_id=`4342768` tile=`10/859/429` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`BD43E663` feature_id=`2034642` tile=`10/859/430` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `10-20m` | `MultiPolygon` | count=`2043` + sample: fid=`6CB10A74` feature_id=`2380000` tile=`10/863/440` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`789429DF` feature_id=`2380019` tile=`10/863/440` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`9767572C` feature_id=`2380022` tile=`10/863/440` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `100-200m` | `Polygon` | count=`1987` + sample: fid=`C45099F4` feature_id=`2213880` tile=`10/859/432` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`C45099F4` feature_id=`3871506` tile=`10/859/431` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`C45099F4` feature_id=`664784` tile=`10/859/434` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `2-5m` | `MultiPolygon` | count=`1916` + sample: fid=`E71B69D9` feature_id=`309380` tile=`10/861/440` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`2A5DD9C8` feature_id=`4384675` tile=`10/864/441` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`5D36EDDF` feature_id=`5956167` tile=`10/865/440` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `1000-2000m` | `Polygon` | count=`1913` + sample: fid=`4B77E2D6` feature_id=`4340278` tile=`10/859/439` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`4B77E2D6` feature_id=`2606137` tile=`10/859/438` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`4B77E2D6` feature_id=`2578072` tile=`10/859/440` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `500-1000m` | `Polygon` | count=`1717` + sample: fid=`C99F5A7C` feature_id=`4818787` tile=`10/859/437` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`C99F5A7C` feature_id=`2606136` tile=`10/859/438` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`C99F5A7C` feature_id=`5621359` tile=`10/860/437` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `河川域` | `Polygon` | count=`1711` + sample: fid=`04816679` feature_id=`309397` tile=`10/861/440` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`244BDE93` feature_id=`309398` tile=`10/861/440` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`26024BAB` feature_id=`2380103` tile=`10/863/440` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `200-500m` | `Polygon` | count=`1706` + sample: fid=`444A7C5D` feature_id=`4340275` tile=`10/859/439` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`ADC5D085` feature_id=`4340276` tile=`10/859/439` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`444A7C5D` feature_id=`2606135` tile=`10/859/438` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `2000-3000m` | `Polygon` | count=`1674` + sample: fid=`826BFFCB` feature_id=`2578073` tile=`10/859/440` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`C5C49F6E` feature_id=`1794300` tile=`10/859/441` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`B5071ABE` feature_id=`1794301` tile=`10/859/441` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `3000-4000m` | `Polygon` | count=`1440` + sample: fid=`6CFB0C18` feature_id=`2578074` tile=`10/859/440` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`6CFB0C18` feature_id=`1794304` tile=`10/859/441` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`4D1B2570` feature_id=`5440198` tile=`10/859/444` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `0-10m` | `Polygon` | count=`1414` + sample: fid=`DB3EC69F` feature_id=`309379` tile=`10/861/440` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`A09598F3` feature_id=`4647389` tile=`10/863/435` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`0C262955` feature_id=`3618596` tile=`10/863/436` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `4000-5000m` | `Polygon` | count=`1256` + sample: fid=`8D177044` feature_id=`3216565` tile=`10/859/443` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`8D177044` feature_id=`4392373` tile=`10/859/442` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`8D177044` feature_id=`5440199` tile=`10/859/444` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `L等深線` | `等深線` | `MultiLineString` | count=`1173` + sample: fid=`F093E407` feature_id=`4818783` tile=`10/859/437` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`F1C90794` feature_id=`4384658` tile=`10/864/441` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`EF017CEE` feature_id=`4384654` tile=`10/864/441` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P潜堤` | `潜提` | `Polygon` | count=`1167` + sample: fid=`E669A0EB` feature_id=`309445` tile=`10/861/440` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`96ED2E48` feature_id=`309446` tile=`10/861/440` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`212C469D` feature_id=`309447` tile=`10/861/440` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `防波堤` | `MultiPolygon` | count=`1055` + sample: fid=`051EAD41` feature_id=`309386` tile=`10/861/440` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`7F66DF27` feature_id=`4384681` tile=`10/864/441` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`32B28FC5` feature_id=`5956241` tile=`10/865/440` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `5000-6000m` | `Polygon` | count=`1045` + sample: fid=`958816EC` feature_id=`3216566` tile=`10/859/443` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`958816EC` feature_id=`5440200` tile=`10/859/444` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`958816EC` feature_id=`6047999` tile=`10/859/445` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P陸域` | `P陸域` | `MultiPolygon` | count=`992` + sample: fid=`BB816D50` feature_id=`2380206` tile=`10/863/440` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`67DF6A85` feature_id=`5956698` tile=`10/865/440` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`1013FDB5` feature_id=`5956699` tile=`10/865/440` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `0-2m` | `MultiPolygon` | count=`894` + sample: fid=`35A3F0F7` feature_id=`5956137` tile=`10/865/440` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`6BAFF75A` feature_id=`5956138` tile=`10/865/440` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`D6CF1B7A` feature_id=`5956142` tile=`10/865/440` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p地名陸` | `p地名陸` | `Point` | count=`887` + sample: fid=`691C23C6` feature_id=`309477` tile=`10/861/440` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`BF3B2CB9` feature_id=`5956701` tile=`10/865/440` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`FAD051DE` feature_id=`3579193` tile=`10/866/439` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線ククリ` | `P基本線ククリ` | `MultiLineString` | count=`876` + sample: fid=`3DF376FA` feature_id=`2380111` tile=`10/863/440` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`1AED8A38` feature_id=`5956355` tile=`10/865/440` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`89463583` feature_id=`5956376` tile=`10/865/440` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P穴` | `P穴` | `MultiPolygon` | count=`804` + sample: fid=`F6A0D62E` feature_id=`309452` tile=`10/861/440` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`C99F5A7C` feature_id=`60841` tile=`10/862/441` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`344CBF0C` feature_id=`4384727` tile=`10/864/441` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `未測海域` | `Polygon` | count=`657` + sample: fid=`EEA56E49` feature_id=`5956316` tile=`10/865/440` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`290C38AD` feature_id=`2063249` tile=`10/864/440` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`71A65C5D` feature_id=`353738` tile=`10/868/438` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `河川域` | `MultiPolygon` | count=`610` + sample: fid=`9C063345` feature_id=`5956325` tile=`10/865/440` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`F1579A72` feature_id=`1524846` tile=`10/874/434` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`7F9E28A9` feature_id=`1524848` tile=`10/874/434` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `6000-7000m` | `Polygon` | count=`571` + sample: fid=`8EA42D1B` feature_id=`645280` tile=`10/861/443` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`8EA42D1B` feature_id=`6477615` tile=`10/861/444` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`8EA42D1B` feature_id=`3441737` tile=`10/862/444` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p航路標識群` | `沿岸灯台 (15M over)` | `Point` | count=`457` + sample: fid=`998A7327` feature_id=`6422612` tile=`10/859/436` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`5FE3F829` feature_id=`2606147` tile=`10/859/438` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`706028EE` feature_id=`309478` tile=`10/861/440` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `0-10m` | `MultiPolygon` | count=`427` + sample: fid=`74E48F1D` feature_id=`2062807` tile=`10/864/440` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`7EAE95AF` feature_id=`4762797` tile=`10/868/439` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`0E29EF04` feature_id=`2351597` tile=`10/873/433` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `p地名` | `p地名` | `Point` | count=`416` + sample: fid=`19EF8EBA` feature_id=`309476` tile=`10/861/440` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`78FD3364` feature_id=`3618669` tile=`10/863/436` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`E3288E80` feature_id=`3618670` tile=`10/863/436` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `2-10m` | `Polygon` | count=`377` + sample: fid=`EA3CAD44` feature_id=`1728365` tile=`10/875/435` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`EA3CAD44` feature_id=`5145412` tile=`10/875/434` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`172C2EBF` feature_id=`5283632` tile=`10/877/415` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `浮施設・桟橋` | `Polygon` | count=`353` + sample: fid=`97E880F9` feature_id=`2063060` tile=`10/864/440` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`F5099885` feature_id=`353671` tile=`10/868/438` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`121F0151` feature_id=`4763021` tile=`10/868/439` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `1000-2000m` | `MultiPolygon` | count=`308` + sample: fid=`4B77E2D6` feature_id=`5621360` tile=`10/860/437` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`4B77E2D6` feature_id=`5058637` tile=`10/860/439` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`4B77E2D6` feature_id=`4124830` tile=`10/860/440` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `500-1000m` | `MultiPolygon` | count=`304` + sample: fid=`C99F5A7C` feature_id=`4340277` tile=`10/859/439` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`C99F5A7C` feature_id=`2578071` tile=`10/859/440` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`C99F5A7C` feature_id=`5058636` tile=`10/860/439` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `20-100m` | `MultiPolygon` | count=`302` + sample: fid=`BD43E663` feature_id=`129438` tile=`10/860/431` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`BD43E663` feature_id=`3445759` tile=`10/861/430` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`344CBF0C` feature_id=`4384664` tile=`10/864/441` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `浅所危険界` | `MultiPolygon` | count=`300` + sample: fid=`77888F56` feature_id=`3234851` tile=`10/872/434` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`C0A02FFA` feature_id=`1524839` tile=`10/874/434` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`1346609F` feature_id=`3589401` tile=`10/879/427` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `0-20m` | `Polygon` | count=`275` + sample: fid=`6FEB3434` feature_id=`6422601` tile=`10/859/436` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`9FC5954C` feature_id=`6422602` tile=`10/859/436` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`6FEB3434` feature_id=`4818788` tile=`10/859/437` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `2000-3000m` | `MultiPolygon` | count=`265` + sample: fid=`064878F3` feature_id=`6285840` tile=`10/860/442` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`826BFFCB` feature_id=`3452479` tile=`10/863/442` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`826BFFCB` feature_id=`6435050` tile=`10/864/442` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `7000-8000m` | `Polygon` | count=`259` + sample: fid=`49956793` feature_id=`6036707` tile=`10/871/442` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`38C09749` feature_id=`1833353` tile=`10/873/440` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`38C09749` feature_id=`1117675` tile=`10/873/441` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `5-20m` | `Polygon` | count=`246` + sample: fid=`24F85076` feature_id=`1327802` tile=`10/877/407` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`DB8E8F08` feature_id=`1327803` tile=`10/877/407` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`85EA1ECE` feature_id=`5317155` tile=`10/877/406` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `200-500m` | `MultiPolygon` | count=`229` + sample: fid=`444A7C5D` feature_id=`6422600` tile=`10/859/436` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`444A7C5D` feature_id=`4818786` tile=`10/859/437` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`444A7C5D` feature_id=`5621358` tile=`10/860/437` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `100-200m` | `MultiPolygon` | count=`227` + sample: fid=`C45099F4` feature_id=`4818785` tile=`10/859/437` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`C45099F4` feature_id=`3103273` tile=`10/860/430` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`C45099F4` feature_id=`3445760` tile=`10/861/430` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `3000-4000m` | `MultiPolygon` | count=`195` + sample: fid=`6CFB0C18` feature_id=`3216564` tile=`10/859/443` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`6CFB0C18` feature_id=`4392372` tile=`10/859/442` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`6CFB0C18` feature_id=`6285841` tile=`10/860/442` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `湖沼域` | `Polygon` | count=`186` + sample: fid=`32DE2DAA` feature_id=`3315595` tile=`10/883/418` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`5DA61F08` feature_id=`3315596` tile=`10/883/418` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`3D5031EA` feature_id=`5814010` tile=`10/885/407` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `4000-5000m` | `MultiPolygon` | count=`165` + sample: fid=`8D177044` feature_id=`6047998` tile=`10/859/445` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`8D177044` feature_id=`4056979` tile=`10/860/445` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`8D177044` feature_id=`3754402` tile=`10/861/446` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `5000-6000m` | `MultiPolygon` | count=`154` + sample: fid=`958816EC` feature_id=`6477614` tile=`10/861/444` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`958816EC` feature_id=`3129957` tile=`10/861/445` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`958816EC` feature_id=`3441736` tile=`10/862/444` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `8000-9000m` | `Polygon` | count=`127` + sample: fid=`FD95B91F` feature_id=`367268` tile=`10/914/409` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`9BA461AB` feature_id=`3255971` tile=`10/915/407` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`FD95B91F` feature_id=`3255972` tile=`10/915/407` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `6000-7000m` | `MultiPolygon` | count=`126` + sample: fid=`8EA42D1B` feature_id=`1963849` tile=`10/865/443` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`8EA42D1B` feature_id=`6614366` tile=`10/868/445` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`8EA42D1B` feature_id=`3729272` tile=`10/870/444` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `2-10m` | `MultiPolygon` | count=`108` + sample: fid=`4ED0550E` feature_id=`5283633` tile=`10/877/415` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`9AF7D32E` feature_id=`2513019` tile=`10/883/417` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`751CA0ED` feature_id=`5798519` tile=`10/887/409` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `陸上水域` | `Polygon` | count=`105` + sample: fid=`24E6FAC4` feature_id=`3234859` tile=`10/872/434` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`730CDFCD` feature_id=`2222688` tile=`10/882/413` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`857AE534` feature_id=`3192868` tile=`10/882/414` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `浮施設・桟橋` | `MultiPolygon` | count=`96` + sample: fid=`508D5208` feature_id=`5145623` tile=`10/875/434` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`508D5208` feature_id=`6376138` tile=`10/876/434` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`EC02A725` feature_id=`3711674` tile=`10/883/408` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `9000m以深` | `Polygon` | count=`76` + sample: fid=`C43012B7` feature_id=`3255973` tile=`10/915/407` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`15B362B9` feature_id=`3255974` tile=`10/915/407` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`15B362B9` feature_id=`6036588` tile=`10/915/408` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P潜堤` | `潜提` | `MultiPolygon` | count=`72` + sample: fid=`D3B7398B` feature_id=`5146683` tile=`10/875/434` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`3FF5D3E9` feature_id=`5146684` tile=`10/875/434` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`B9FAA18F` feature_id=`3944097` tile=`10/880/409` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `7000-8000m` | `MultiPolygon` | count=`67` + sample: fid=`38C09749` feature_id=`4514065` tile=`10/872/441` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`38C09749` feature_id=`3401422` tile=`10/874/440` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`8807D674` feature_id=`3399376` tile=`10/914/408` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P橋りょう等構造物` | `橋 (水門)` | `MultiPolygon` | count=`54` + sample: fid=`355D08C0` feature_id=`4763514` tile=`10/868/439` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`6D532E5E` feature_id=`5146642` tile=`10/875/434` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`C5D45DC1` feature_id=`5146669` tile=`10/875/434` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `0-20m` | `MultiPolygon` | count=`44` + sample: fid=`F8D42967` feature_id=`642861` tile=`10/876/405` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`F8D42967` feature_id=`5589548` tile=`10/876/406` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`F8D42967` feature_id=`4481397` tile=`10/877/405` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `8000-9000m` | `MultiPolygon` | count=`41` + sample: fid=`FD95B91F` feature_id=`64423` tile=`10/915/409` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`FD95B91F` feature_id=`1209220` tile=`10/915/410` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`FD95B91F` feature_id=`4483165` tile=`10/915/411` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `2-20m` | `Polygon` | count=`38` + sample: fid=`2002C740` feature_id=`5145413` tile=`10/875/434` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`3DF13D3C` feature_id=`5317154` tile=`10/877/406` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`74BA4881` feature_id=`4328371` tile=`10/888/409` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `5-20m` | `MultiPolygon` | count=`35` + sample: fid=`0B527FC2` feature_id=`3315573` tile=`10/883/418` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`10FB595E` feature_id=`2707190` tile=`10/887/412` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`5E1BF2ED` feature_id=`2707194` tile=`10/887/412` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `湖沼域` | `MultiPolygon` | count=`34` + sample: fid=`F13710DF` feature_id=`1594810` tile=`10/889/404` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`FEDECC67` feature_id=`6166332` tile=`10/898/404` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`FEDECC67` feature_id=`2352108` tile=`10/899/403` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `撤去跡` | `Polygon` | count=`30` + sample: fid=`7080F8AF` feature_id=`1524845` tile=`10/874/434` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`6CC91B82` feature_id=`1581252` tile=`10/880/423` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`78D96415` feature_id=`4393816` tile=`10/880/427` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `未測海域` | `MultiPolygon` | count=`30` + sample: fid=`42D15A84` feature_id=`4547260` tile=`10/881/409` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`19DF9A94` feature_id=`3711686` tile=`10/883/408` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`ED610F47` feature_id=`5798762` tile=`10/887/409` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P危険界ククリ` | `P危険界ククリ` | `MultiLineString` | count=`19` + sample: fid=`3FC66ACA` feature_id=`2062554` tile=`10/864/440` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`469EA2EF` feature_id=`7162` tile=`10/879/407` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`231DF717` feature_id=`6318799` tile=`10/879/428` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `10-100m` | `Polygon` | count=`10` + sample: fid=`BF2D3895` feature_id=`2373538` tile=`10/879/412` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`129C6506` feature_id=`4408625` tile=`10/908/407` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`95102553` feature_id=`1603314` tile=`10/912/431` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `20-200m` | `Polygon` | count=`9` + sample: fid=`A4DC808F` feature_id=`2606133` tile=`10/859/438` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`29E995CC` feature_id=`2511249` tile=`10/908/410` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`485FB77E` feature_id=`5115046` tile=`10/909/417` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `L概略等深線` | `概略等深線` | `LineString` | count=`6` + sample: fid=`C8BB83AB` feature_id=`5109909` tile=`10/895/408` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`0E9C20F8` feature_id=`5109910` tile=`10/895/408` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`EC762492` feature_id=`5109911` tile=`10/895/408` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `9000m以深` | `MultiPolygon` | count=`5` + sample: fid=`15B362B9` feature_id=`5197193` tile=`10/916/409` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`04CFF596` feature_id=`1255127` tile=`10/918/423` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`04CFF596` feature_id=`6077834` tile=`10/918/425` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `2-20m` | `MultiPolygon` | count=`4` + sample: fid=`E0204112` feature_id=`5538784` tile=`10/889/409` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`BE2B31E8` feature_id=`5420629` tile=`9/444/205` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`E0204112` feature_id=`5507787` tile=`9/444/204` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `撤去跡` | `MultiPolygon` | count=`4` + sample: fid=`B86AA97B` feature_id=`4418773` tile=`10/883/412` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`25C9E3D8` feature_id=`146420` tile=`10/890/408` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`B86AA97B` feature_id=`2766498` tile=`9/441/206` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `20-200m` | `MultiPolygon` | count=`3` + sample: fid=`4E3F1FC1` feature_id=`1226215` tile=`10/937/365` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`4E3F1FC1` feature_id=`1400417` tile=`9/468/183` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`4E3F1FC1` feature_id=`3286328` tile=`9/468/182` reason=`no specific render rule matched; heuristic fill-in was used` +- `render_rule_unresolved` | `P基本線` | `陸上水域` | `MultiPolygon` | count=`3` + sample: fid=`730CDFCD` feature_id=`1056650` tile=`10/882/412` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`730CDFCD` feature_id=`2766540` tile=`9/441/206` reason=`no specific render rule matched; heuristic fill-in was used` + sample: fid=`C5778277` feature_id=`5720097` tile=`9/456/190` reason=`no specific render rule matched; heuristic fill-in was used` diff --git a/find_fpc_by_port_name.py b/find_fpc_by_port_name.py index d47d8c1..a36df5d 100644 --- a/find_fpc_by_port_name.py +++ b/find_fpc_by_port_name.py @@ -5,6 +5,7 @@ import argparse import csv import json import re +from difflib import SequenceMatcher import zipfile import xml.etree.ElementTree as ET from dataclasses import dataclass, asdict @@ -35,6 +36,20 @@ def normalize_text(value: str) -> str: return value.lower() +def normalize_port_name(value: str) -> str: + value = normalize_text(value) + value = value.replace("漁港", "") + value = value.replace("魚港", "") + value = value.replace("港", "") + value = value.replace("湊", "") + value = value.replace("浦", "") + value = value.replace("ノ", "") + value = value.replace("の", "") + value = value.replace("-", "") + value = value.replace("・", "") + return value + + def load_xml(zip_path: Path) -> ET.Element: with zipfile.ZipFile(zip_path) as zf: xml_name = next(name for name in zf.namelist() if name.endswith(".xml") and "META" not in name) @@ -98,18 +113,43 @@ def catalog_prc(row: dict[str, str]) -> str | None: def score_match(query: str, tokens: list[str], primary: str | None) -> tuple[int, int, str] | None: q = normalize_text(query) + q_port = normalize_port_name(query) token_norms = [normalize_text(token) for token in tokens if token] + token_ports = [normalize_port_name(token) for token in tokens if token] primary_norm = normalize_text(primary) if primary else "" + primary_port = normalize_port_name(primary) if primary else "" if primary_norm == q: return (0, 0, primary_norm) + if primary_port == q_port and q_port: + return (0, 1, primary_norm or primary_port) if q in token_norms: return (1, 0, primary_norm) + if q_port and q_port in token_ports: + return (1, 1, primary_norm or primary_port) if primary_norm and q in primary_norm: return (2, len(primary_norm), primary_norm) + if q_port and primary_port and q_port in primary_port: + return (2, len(primary_port), primary_port) for token in token_norms: if q in token: return (3, len(token), primary_norm or token) + for token in token_ports: + if q_port and q_port in token: + return (3, len(token), primary_norm or token) + if q_port: + candidates = [primary_norm, primary_port, *token_norms, *token_ports] + best = None + for cand in candidates: + if not cand: + continue + ratio = SequenceMatcher(None, q_port, cand).ratio() + if ratio >= 0.72: + scored = (4, int((1.0 - ratio) * 1000), cand) + if best is None or scored < best: + best = scored + if best is not None: + return best return None @@ -213,6 +253,11 @@ def main() -> None: action="store_true", help="只保留精确匹配", ) + parser.add_argument( + "--fuzzy", + action="store_true", + help="启用更宽松的港名模糊匹配(去掉漁港/港等后缀并允许近似匹配)", + ) parser.add_argument( "--json", action="store_true", @@ -246,6 +291,20 @@ def main() -> None: if args.exact: q = normalize_text(args.name) matches = [row for row in matches if normalize_text(row.primary_name or "") == q] + elif args.fuzzy: + q = normalize_port_name(args.name) + + def fuzzy_keep(row: MatchRow) -> bool: + primary = normalize_port_name(row.primary_name or "") + secondary = normalize_port_name(row.secondary_name or "") + if q and (q == primary or q == secondary or q in primary or q in secondary): + return True + for cand in (primary, secondary): + if cand and q and SequenceMatcher(None, q, cand).ratio() >= 0.72: + return True + return False + + matches = [row for row in matches if fuzzy_keep(row)] matches = matches[: args.max_results] if not matches: diff --git a/make_all_test.sh b/make_all_test.sh new file mode 100755 index 0000000..086256f --- /dev/null +++ b/make_all_test.sh @@ -0,0 +1,7 @@ +./.venv/bin/python coastline/build_fish_port_20m_full_mysql_resume.py --resume --skip-missing-coarse +./.venv/bin/python coastline/export_navgrid_mysql_assets.py \ + --db-name navsea_japan_coast_grid \ + --out-dir /home/wwwroot/newpec/coastline-mysql/japan_national/ \ + --no-coast-200m --no-hazard-50m --no-density-overview +cp src/pbf/navsea-coastline-fukuoka-saga-200m.html /mnt/sda1/www/newpec/navsea-coastline-fukuoka-saga-200m.html + diff --git a/navsea_build_kyushu_core_sqlite.py b/navsea_build_kyushu_core_sqlite.py new file mode 100644 index 0000000..1467c23 --- /dev/null +++ b/navsea_build_kyushu_core_sqlite.py @@ -0,0 +1,222 @@ +from __future__ import annotations + +import datetime as dt +import sqlite3 +from pathlib import Path + + +SOURCE_DB = Path("out/navsea_kyushu_semantic.sqlite") +OUT = Path("out/navsea_kyushu_core.sqlite") +KEEP_GROUNDING = ("干潮帯", "0-2m", "0-5m", "0-10m", "2-5m", "2-10m", "5-10m") + + +def open_db() -> sqlite3.Connection: + if OUT.exists(): + OUT.unlink() + OUT.parent.mkdir(parents=True, exist_ok=True) + conn = sqlite3.connect(OUT) + conn.execute("PRAGMA journal_mode=OFF") + conn.execute("PRAGMA synchronous=OFF") + conn.execute("PRAGMA temp_store=MEMORY") + conn.execute("PRAGMA cache_size=150000") + conn.execute("PRAGMA locking_mode=EXCLUSIVE") + return conn + + +def create_schema(conn: sqlite3.Connection) -> None: + conn.executescript( + """ + CREATE TABLE meta ( + key TEXT PRIMARY KEY, + value TEXT NOT NULL + ); + + CREATE TABLE semantic_object ( + feature_id INTEGER PRIMARY KEY, + fid TEXT, + source_layer TEXT, + canonical_object_type TEXT NOT NULL, + object_family TEXT NOT NULL, + detection_class TEXT NOT NULL, + capability TEXT, + z INTEGER, + x INTEGER, + y INTEGER, + geom_type TEXT, + is_land INTEGER NOT NULL DEFAULT 0, + is_hole INTEGER NOT NULL DEFAULT 0, + is_collision INTEGER NOT NULL DEFAULT 0, + is_grounding INTEGER NOT NULL DEFAULT 0 + ); + + CREATE INDEX idx_semantic_object_fid ON semantic_object(fid); + CREATE INDEX idx_semantic_object_tile ON semantic_object(z, x, y); + CREATE INDEX idx_semantic_object_capability ON semantic_object(capability, canonical_object_type); + + CREATE TABLE grid_cell ( + tile_key TEXT PRIMARY KEY, + z INTEGER NOT NULL, + x INTEGER NOT NULL, + y INTEGER NOT NULL, + land_count INTEGER NOT NULL DEFAULT 0, + hole_count INTEGER NOT NULL DEFAULT 0, + collision_count INTEGER NOT NULL DEFAULT 0, + grounding_count INTEGER NOT NULL DEFAULT 0, + blocked INTEGER NOT NULL DEFAULT 0, + blocked_reason TEXT + ); + + CREATE INDEX idx_grid_cell_zxy ON grid_cell(z, x, y); + CREATE INDEX idx_grid_cell_blocked ON grid_cell(blocked, z); + """ + ) + conn.executemany( + "INSERT INTO meta(key, value) VALUES (?, ?)", + [ + ("source_db", str(SOURCE_DB)), + ("source_scope", "九州"), + ("build_time", dt.datetime.now().isoformat(timespec="seconds")), + ("notes", "九州核心版语义索引库,只保留陆地、碰撞物、浅水搁浅层"), + ("keep_grounding", ",".join(KEEP_GROUNDING)), + ], + ) + conn.commit() + + +def main() -> None: + if not SOURCE_DB.exists(): + raise SystemExit(f"missing source db: {SOURCE_DB}") + + src = sqlite3.connect(SOURCE_DB) + src.row_factory = sqlite3.Row + conn = open_db() + create_schema(conn) + + placeholders = ",".join("?" for _ in KEEP_GROUNDING) + sql = f""" + SELECT + feature_id, fid, source_layer, canonical_object_type, object_family, detection_class, + capability, z, x, y, geom_type, is_land, is_hole, is_collision, is_grounding + FROM semantic_object + WHERE is_land = 1 + OR is_hole = 1 + OR is_collision = 1 + OR (is_grounding = 1 AND canonical_object_type IN ({placeholders})) + ORDER BY z, x, y, feature_id + """ + + batch = [] + grid = {} + count = 0 + batch_size = 4000 + + for row in src.execute(sql, KEEP_GROUNDING): + row = dict(row) + batch.append( + ( + row["feature_id"], + row["fid"], + row["source_layer"], + row["canonical_object_type"], + row["object_family"], + row["detection_class"], + row["capability"], + row["z"], + row["x"], + row["y"], + row["geom_type"], + row["is_land"], + row["is_hole"], + row["is_collision"], + row["is_grounding"], + ) + ) + tile_key = f'{row["z"]}/{row["x"]}/{row["y"]}' + c = grid.get(tile_key) + if c is None: + c = {"z": row["z"], "x": row["x"], "y": row["y"], "land": 0, "hole": 0, "collision": 0, "grounding": 0} + grid[tile_key] = c + c["land"] += int(row["is_land"]) + c["hole"] += int(row["is_hole"]) + c["collision"] += int(row["is_collision"]) + c["grounding"] += int(row["is_grounding"]) + count += 1 + + if len(batch) >= batch_size: + conn.executemany( + """ + INSERT INTO semantic_object( + feature_id, fid, source_layer, canonical_object_type, object_family, detection_class, + capability, z, x, y, geom_type, is_land, is_hole, is_collision, is_grounding + ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) + """, + batch, + ) + conn.commit() + batch.clear() + print(f"已写入 {count} 条核心对象") + + if batch: + conn.executemany( + """ + INSERT INTO semantic_object( + feature_id, fid, source_layer, canonical_object_type, object_family, detection_class, + capability, z, x, y, geom_type, is_land, is_hole, is_collision, is_grounding + ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) + """, + batch, + ) + conn.commit() + + cell_rows = [] + for tile_key, c in grid.items(): + blocked = 0 + reason = None + if c["land"] > c["hole"] and c["land"] > 0: + blocked = 1 + reason = "land" + elif c["collision"] > 0: + blocked = 1 + reason = "collision" + elif c["grounding"] > 0: + blocked = 1 + reason = "grounding" + cell_rows.append( + ( + tile_key, + c["z"], + c["x"], + c["y"], + c["land"], + c["hole"], + c["collision"], + c["grounding"], + blocked, + reason, + ) + ) + + conn.executemany( + """ + INSERT INTO grid_cell( + tile_key, z, x, y, land_count, hole_count, collision_count, grounding_count, + blocked, blocked_reason + ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?) + """, + cell_rows, + ) + conn.commit() + conn.execute("ANALYZE") + conn.commit() + + obj_count = conn.execute("SELECT COUNT(*) FROM semantic_object").fetchone()[0] + cell_count = conn.execute("SELECT COUNT(*) FROM grid_cell").fetchone()[0] + conn.close() + src.close() + + print(f"完成: objects={obj_count}, cells={cell_count}") + print(f"输出文件: {OUT.resolve()}") + + +if __name__ == "__main__": + main() diff --git a/navsea_build_kyushu_navigability_test.py b/navsea_build_kyushu_navigability_test.py new file mode 100644 index 0000000..db753cc --- /dev/null +++ b/navsea_build_kyushu_navigability_test.py @@ -0,0 +1,984 @@ +from __future__ import annotations + +import argparse +import datetime as dt +import math +import sqlite3 +import subprocess +from pathlib import Path + +from shapely.affinity import affine_transform +from shapely.geometry import box +from shapely.ops import unary_union +from shapely.prepared import prep +from shapely.wkt import loads as load_wkt + + +DB_NAME = "pbf_analysis" +OUT_DB = Path("out/navsea_kyushu_navigability_test.sqlite") +OUT_REPORT = Path("report/navsea_kyushu_navigability_test_2026-04-22.md") + +MYSQL_BASE = [ + "mysql", + "-h", + "localhost", + "-u", + "root", + "-p2chi9ks2", + "-D", + DB_NAME, + "-B", + "-N", + "--raw", + "--default-character-set=utf8mb4", +] + +WORLD_SPAN_M = 40075016.68557849 +ORIGIN_SHIFT_M = WORLD_SPAN_M / 2.0 +TARGET_Z = 12 +TILE_EXTENT = 1048576.0 +TILE_SPAN_M = WORLD_SPAN_M / (2**TARGET_Z) +LOCAL_TO_M = TILE_SPAN_M / TILE_EXTENT +PORT_AOI_RADIUS_M = 1000.0 +COLLISION_BUFFER_M = 80.0 +GROUNDING_BUFFER_M = 40.0 +BOUNDARY_BUFFER_M = 30.0 +ROUTE_BUFFER_M = 25.0 +GRID_200_M = 200.0 +GRID_50_M = 50.0 +KEY_SHIFT = 20 +KEY_MASK = (1 << KEY_SHIFT) - 1 +PORT_TRIGGER_TYPES = ( + "漁港", + "一般港湾 (港則法区域、重要港湾)", + "小港湾 (避難港、地方港湾)", +) +TILE_COMMIT_INTERVAL = 100 +GRID_PROFILE_PORT_ONLY = "port-tiles" +GRID_PROFILE_FULL_DOMAIN = "full-domain" +DEFAULT_COMMIT_INTERVAL = 20 + + +def meta_upsert(conn: sqlite3.Connection, key: str, value: str) -> None: + conn.execute("INSERT OR REPLACE INTO meta(key, value) VALUES (?, ?)", (key, value)) + + +def meta_get(conn: sqlite3.Connection, key: str, default: str = "") -> str: + row = conn.execute("SELECT value FROM meta WHERE key = ?", (key,)).fetchone() + return str(row[0]) if row else default + + +def table_exists(conn: sqlite3.Connection, table: str) -> bool: + row = conn.execute( + "SELECT 1 FROM sqlite_master WHERE type='table' AND name = ? LIMIT 1", + (table,), + ).fetchone() + return row is not None + + +def table_count(conn: sqlite3.Connection, table: str) -> int: + if not table_exists(conn, table): + return 0 + return int(conn.execute(f"SELECT COUNT(*) FROM {table}").fetchone()[0]) + + +def mysql_stream(query: str): + proc = subprocess.Popen( + MYSQL_BASE + ["-e", query], + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + text=True, + encoding="utf-8", + errors="replace", + bufsize=1, + ) + assert proc.stdout is not None + assert proc.stderr is not None + try: + for raw_line in proc.stdout: + line = raw_line.rstrip("\n") + if not line: + continue + yield line.split("\t") + finally: + rc = proc.wait() + if rc != 0: + raise RuntimeError(proc.stderr.read().strip()) + + +def encode_key(col: int, row: int) -> int: + return (col << KEY_SHIFT) | row + + +def decode_key(key: int) -> tuple[int, int]: + return key >> KEY_SHIFT, key & KEY_MASK + + +def mercator_tile_affine(tile_x: int, tile_y: int) -> list[float]: + xoff = -ORIGIN_SHIFT_M + tile_x * TILE_SPAN_M + yoff = ORIGIN_SHIFT_M - tile_y * TILE_SPAN_M + return [LOCAL_TO_M, 0.0, 0.0, -LOCAL_TO_M, xoff, yoff] + + +def mercator_point_to_tile(mx: float, my: float, z: int = TARGET_Z) -> tuple[int, int]: + tiles = 2**z + tx = int(math.floor(((mx + ORIGIN_SHIFT_M) / WORLD_SPAN_M) * tiles)) + ty = int(math.floor(((ORIGIN_SHIFT_M - my) / WORLD_SPAN_M) * tiles)) + return max(0, min(tiles - 1, tx)), max(0, min(tiles - 1, ty)) + + +def cell_index_range(minx: float, miny: float, maxx: float, maxy: float, grid_size: float) -> tuple[int, int, int, int]: + col_min = int(math.floor((minx + ORIGIN_SHIFT_M) / grid_size)) + col_max = int(math.floor(((maxx + ORIGIN_SHIFT_M) - 1e-9) / grid_size)) + row_min = int(math.floor((ORIGIN_SHIFT_M - maxy) / grid_size)) + row_max = int(math.floor(((ORIGIN_SHIFT_M - miny) - 1e-9) / grid_size)) + return col_min, col_max, row_min, row_max + + +def cell_bounds(col: int, row: int, grid_size: float) -> tuple[float, float, float, float]: + minx = -ORIGIN_SHIFT_M + col * grid_size + maxx = minx + grid_size + maxy = ORIGIN_SHIFT_M - row * grid_size + miny = maxy - grid_size + return minx, miny, maxx, maxy + + +def make_cell_row( + grid_level: int, + col: int, + row: int, + state: str, + blocked: int, + reason: str | None, + risk_score: int, + confidence: str, + counts: list[int] | None = None, +) -> tuple: + counts = counts or [0, 0, 0, 0, 0, 0] + minx, miny, maxx, maxy = cell_bounds(col, row, float(grid_level)) + parent_col = col // 4 if grid_level == 50 else None + parent_row = row // 4 if grid_level == 50 else None + return ( + grid_level, + col, + row, + parent_col, + parent_row, + minx, + miny, + maxx, + maxy, + state, + blocked, + reason, + risk_score, + confidence, + counts[0], + counts[1], + counts[2], + counts[3], + counts[4], + counts[5], + ) + + +def classify_cell(counts: list[int]) -> tuple[str, int, str | None, int]: + land_hits, hole_hits, collision_hits, grounding_hits, route_hits, boundary_hits = counts + if land_hits > hole_hits and land_hits > 0: + return "blocked", 1, "land", 100 + if collision_hits > 0: + return "blocked", 1, "collision", 90 + if grounding_hits > 0: + return "caution", 0, "grounding", 60 + if boundary_hits > 0: + return "caution", 0, "boundary", 40 + if route_hits > 0: + return "preferred", 0, "route", 20 + return "open_water", 0, None, 0 + + +def create_schema(conn: sqlite3.Connection) -> None: + if table_exists(conn, "meta"): + return + conn.executescript( + """ + CREATE TABLE meta ( + key TEXT PRIMARY KEY, + value TEXT NOT NULL + ); + + CREATE TABLE tile_default ( + z INTEGER NOT NULL, + x INTEGER NOT NULL, + y INTEGER NOT NULL, + default_state TEXT NOT NULL, + has_port_refine INTEGER NOT NULL DEFAULT 0, + PRIMARY KEY (z, x, y) + ); + + CREATE TABLE port_aoi ( + aoi_id INTEGER PRIMARY KEY AUTOINCREMENT, + feature_id INTEGER NOT NULL, + fid TEXT, + canonical_object_type TEXT NOT NULL, + center_x REAL NOT NULL, + center_y REAL NOT NULL, + radius_m REAL NOT NULL + ); + + CREATE TABLE grid_cell ( + grid_level INTEGER NOT NULL, + grid_col INTEGER NOT NULL, + grid_row INTEGER NOT NULL, + parent_grid_col INTEGER, + parent_grid_row INTEGER, + minx REAL NOT NULL, + miny REAL NOT NULL, + maxx REAL NOT NULL, + maxy REAL NOT NULL, + state TEXT NOT NULL, + blocked INTEGER NOT NULL DEFAULT 0, + state_reason TEXT, + risk_score INTEGER NOT NULL DEFAULT 0, + confidence TEXT NOT NULL, + land_hits INTEGER NOT NULL DEFAULT 0, + hole_hits INTEGER NOT NULL DEFAULT 0, + collision_hits INTEGER NOT NULL DEFAULT 0, + grounding_hits INTEGER NOT NULL DEFAULT 0, + route_hits INTEGER NOT NULL DEFAULT 0, + boundary_hits INTEGER NOT NULL DEFAULT 0, + PRIMARY KEY (grid_level, grid_col, grid_row) + ); + + CREATE INDEX idx_grid_cell_state ON grid_cell(grid_level, state, blocked); + CREATE INDEX idx_grid_cell_parent ON grid_cell(parent_grid_col, parent_grid_row); + """ + ) + conn.executemany( + "INSERT INTO meta(key, value) VALUES (?, ?)", + [ + ("source_db", DB_NAME), + ("source_scope", "九州"), + ("build_time", dt.datetime.now().isoformat(timespec="seconds")), + ("target_zoom", str(TARGET_Z)), + ("tile_extent", str(int(TILE_EXTENT))), + ("grid_profile", GRID_PROFILE_FULL_DOMAIN), + ("port_aoi_radius_m", str(int(PORT_AOI_RADIUS_M))), + ("collision_buffer_m", str(int(COLLISION_BUFFER_M))), + ("grounding_buffer_m", str(int(GROUNDING_BUFFER_M))), + ("boundary_buffer_m", str(int(BOUNDARY_BUFFER_M))), + ("route_buffer_m", str(int(ROUTE_BUFFER_M))), + ("notes", "测试版;支持九州全域 200m 主层和港口 50m 细化"), + ], + ) + conn.commit() + + +def load_tile_defaults(conn: sqlite3.Connection) -> int: + existing = table_count(conn, "tile_default") + if existing > 0: + return existing + batch: list[tuple[int, int, int, str, int]] = [] + count = 0 + for cols in mysql_stream( + f""" + SELECT {TARGET_Z} AS z, x, y + FROM feature_geojson_lookup + WHERE z = {TARGET_Z} + GROUP BY x, y + ORDER BY x, y + """ + ): + z, x, y = map(int, cols) + batch.append((z, x, y, "open_water", 0)) + count += 1 + if len(batch) >= 5000: + conn.executemany( + """ + INSERT INTO tile_default(z, x, y, default_state, has_port_refine) + VALUES (?, ?, ?, ?, ?) + """, + batch, + ) + conn.commit() + batch.clear() + if batch: + conn.executemany( + """ + INSERT INTO tile_default(z, x, y, default_state, has_port_refine) + VALUES (?, ?, ?, ?, ?) + """, + batch, + ) + conn.commit() + return count + + +def build_port_aoi(conn: sqlite3.Connection) -> tuple[int, int, set[int], set[tuple[int, int]]]: + existing_features = table_count(conn, "port_aoi") + existing_cells = conn.execute("SELECT COUNT(*) FROM grid_cell WHERE grid_level = 50").fetchone()[0] if table_exists(conn, "grid_cell") else 0 + existing_tiles = { + (int(x), int(y)) + for x, y in conn.execute( + f"SELECT x, y FROM tile_default WHERE z = {TARGET_Z} AND has_port_refine = 1" + ).fetchall() + } + if existing_features > 0 and existing_cells > 0 and existing_tiles: + port_cell_keys = { + encode_key(int(col), int(row)) + for col, row in conn.execute( + "SELECT grid_col, grid_row FROM grid_cell WHERE grid_level = 50" + ).fetchall() + } + return existing_features, existing_cells, port_cell_keys, existing_tiles + + placeholders = ",".join(f"'{value}'" for value in PORT_TRIGGER_TYPES) + query = f""" + SELECT + d.feature_id, + gl.fid, + d.canonical_object_type, + d.x, + d.y, + g.geometry_wkt + FROM navsea_detection_objects d + JOIN feature_geojson_lookup gl + ON gl.feature_id = d.feature_id + JOIN feature_geometry_stage g + ON g.feature_id = d.feature_id + WHERE d.z = {TARGET_Z} + AND d.canonical_object_type IN ({placeholders}) + ORDER BY d.x, d.y, d.feature_id + """ + inserted_cells = 0 + port_feature_count = 0 + port_cell_keys: set[int] = set() + port_tiles: set[tuple[int, int]] = set() + cell_batch: list[tuple] = [] + aoi_batch: list[tuple] = [] + + for cols in mysql_stream(query): + if len(cols) != 6: + raise RuntimeError(f"unexpected port trigger column count: {len(cols)}") + feature_id, fid, canonical_type, tile_x, tile_y, geometry_wkt = cols + tile_x_i = int(tile_x) + tile_y_i = int(tile_y) + raw_geom = load_wkt(geometry_wkt) + mercator_geom = affine_transform(raw_geom, mercator_tile_affine(tile_x_i, tile_y_i)) + center = mercator_geom.centroid + center_x = float(center.x) + center_y = float(center.y) + aoi_batch.append((int(feature_id), fid or None, canonical_type, center_x, center_y, PORT_AOI_RADIUS_M)) + port_feature_count += 1 + + minx = center_x - PORT_AOI_RADIUS_M + miny = center_y - PORT_AOI_RADIUS_M + maxx = center_x + PORT_AOI_RADIUS_M + maxy = center_y + PORT_AOI_RADIUS_M + col_min, col_max, row_min, row_max = cell_index_range(minx, miny, maxx, maxy, GRID_50_M) + + tile_min = mercator_point_to_tile(minx, maxy) + tile_max = mercator_point_to_tile(maxx, miny) + for tx in range(tile_min[0], tile_max[0] + 1): + for ty in range(tile_min[1], tile_max[1] + 1): + port_tiles.add((tx, ty)) + + for col in range(col_min, col_max + 1): + for row in range(row_min, row_max + 1): + key = encode_key(col, row) + if key in port_cell_keys: + continue + cminx, cminy, cmaxx, cmaxy = cell_bounds(col, row, GRID_50_M) + center_cx = (cminx + cmaxx) / 2.0 + center_cy = (cminy + cmaxy) / 2.0 + if math.hypot(center_cx - center_x, center_cy - center_y) > PORT_AOI_RADIUS_M: + continue + port_cell_keys.add(key) + inserted_cells += 1 + cell_batch.append( + make_cell_row( + 50, + col, + row, + "open_water", + 0, + None, + 0, + "port_aoi_default", + ) + ) + if len(cell_batch) >= 10000: + conn.executemany( + """ + INSERT OR IGNORE INTO grid_cell( + grid_level, grid_col, grid_row, parent_grid_col, parent_grid_row, + minx, miny, maxx, maxy, state, blocked, state_reason, risk_score, confidence, + land_hits, hole_hits, collision_hits, grounding_hits, route_hits, boundary_hits + ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) + """, + cell_batch, + ) + conn.commit() + cell_batch.clear() + if len(aoi_batch) >= 2000: + conn.executemany( + """ + INSERT INTO port_aoi( + feature_id, fid, canonical_object_type, center_x, center_y, radius_m + ) VALUES (?, ?, ?, ?, ?, ?) + """, + aoi_batch, + ) + conn.commit() + aoi_batch.clear() + + if cell_batch: + conn.executemany( + """ + INSERT OR IGNORE INTO grid_cell( + grid_level, grid_col, grid_row, parent_grid_col, parent_grid_row, + minx, miny, maxx, maxy, state, blocked, state_reason, risk_score, confidence, + land_hits, hole_hits, collision_hits, grounding_hits, route_hits, boundary_hits + ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) + """, + cell_batch, + ) + conn.commit() + if aoi_batch: + conn.executemany( + """ + INSERT INTO port_aoi( + feature_id, fid, canonical_object_type, center_x, center_y, radius_m + ) VALUES (?, ?, ?, ?, ?, ?) + """, + aoi_batch, + ) + conn.commit() + + if port_tiles: + conn.executemany( + f""" + UPDATE tile_default + SET has_port_refine = 1 + WHERE z = {TARGET_Z} AND x = ? AND y = ? + """, + sorted(port_tiles), + ) + conn.commit() + + return port_feature_count, inserted_cells, port_cell_keys, port_tiles + + +def relevant_feature_query(last_tile: tuple[int, int] | None = None) -> str: + resume_filter = "" + if last_tile is not None: + last_x, last_y = last_tile + resume_filter = f"\n AND (d.x > {last_x} OR (d.x = {last_x} AND d.y > {last_y}))" + return f""" + SELECT + d.feature_id, + d.canonical_object_type, + d.capability, + d.x, + d.y, + d.geom_type, + g.geometry_wkt + FROM navsea_detection_objects d + JOIN feature_geometry_stage g + ON g.feature_id = d.feature_id + WHERE d.z = {TARGET_Z} + AND ( + d.canonical_object_type IN ('P陸域', 'P穴') + OR d.capability IN ('collision', 'grounding', 'route_reference', 'boundary_reference') + ) + {resume_filter} + ORDER BY d.x, d.y, d.feature_id + """ + + +def touch_bucket(bucket: dict[int, list[int]], key: int, index: int) -> None: + counts = bucket.get(key) + if counts is None: + counts = [0, 0, 0, 0, 0, 0] + bucket[key] = counts + counts[index] += 1 + + +def effective_geometry(raw_geom, canonical_type: str, capability: str | None): + capability = capability or "" + if canonical_type == "P陸域": + return raw_geom, 0 + if canonical_type == "P穴": + return raw_geom, 1 + if capability == "collision": + if raw_geom.geom_type in {"Point", "MultiPoint", "LineString", "MultiLineString"}: + return raw_geom.buffer(COLLISION_BUFFER_M), 2 + return raw_geom.buffer(COLLISION_BUFFER_M / 2.0), 2 + if capability == "grounding": + if raw_geom.geom_type in {"Point", "MultiPoint", "LineString", "MultiLineString"}: + return raw_geom.buffer(GROUNDING_BUFFER_M), 3 + return raw_geom, 3 + if capability == "route_reference": + if raw_geom.geom_type in {"LineString", "MultiLineString"}: + return raw_geom.buffer(ROUTE_BUFFER_M), 4 + return raw_geom, 4 + if capability == "boundary_reference": + if raw_geom.geom_type in {"LineString", "MultiLineString"}: + return raw_geom.buffer(BOUNDARY_BUFFER_M), 5 + return raw_geom, 5 + return None, -1 + + +def apply_feature_to_grid( + feature_geom, + grid_size: float, + target_bucket: dict[int, list[int]], + bucket_index: int, + valid_keys: set[int] | None = None, +) -> None: + minx, miny, maxx, maxy = feature_geom.bounds + col_min, col_max, row_min, row_max = cell_index_range(minx, miny, maxx, maxy, grid_size) + prepared = prep(feature_geom) + for col in range(col_min, col_max + 1): + for row in range(row_min, row_max + 1): + key = encode_key(col, row) + if valid_keys is not None and key not in valid_keys: + continue + cminx, cminy, cmaxx, cmaxy = cell_bounds(col, row, grid_size) + if prepared.intersects(box(cminx, cminy, cmaxx, cmaxy)): + touch_bucket(target_bucket, key, bucket_index) + + +def flush_grid_counts(conn: sqlite3.Connection, grid_level: int, bucket: dict[int, list[int]], confidence: str) -> int: + if not bucket: + return 0 + rows: list[tuple] = [] + for key, counts in bucket.items(): + col, row = decode_key(key) + rows.append(make_cell_row(grid_level, col, row, "open_water", 0, None, 0, confidence, counts)) + conn.executemany( + """ + INSERT INTO grid_cell( + grid_level, grid_col, grid_row, parent_grid_col, parent_grid_row, + minx, miny, maxx, maxy, state, blocked, state_reason, risk_score, confidence, + land_hits, hole_hits, collision_hits, grounding_hits, route_hits, boundary_hits + ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) + ON CONFLICT(grid_level, grid_col, grid_row) DO UPDATE SET + confidence=excluded.confidence, + land_hits=grid_cell.land_hits + excluded.land_hits, + hole_hits=grid_cell.hole_hits + excluded.hole_hits, + collision_hits=grid_cell.collision_hits + excluded.collision_hits, + grounding_hits=grid_cell.grounding_hits + excluded.grounding_hits, + route_hits=grid_cell.route_hits + excluded.route_hits, + boundary_hits=grid_cell.boundary_hits + excluded.boundary_hits + """, + rows, + ) + written = len(rows) + bucket.clear() + return written + + +def merge_geometry(geoms: list): + if not geoms: + return None + if len(geoms) == 1: + return geoms[0] + return unary_union(geoms) + + +def flush_tile_features( + conn: sqlite3.Connection, + tile_x: int, + tile_y: int, + features: list[tuple[str, str | None, object]], + port_cell_keys: set[int], + port_tiles: set[tuple[int, int]], + grid_profile: str, +) -> tuple[int, int]: + grouped: list[list] = [[] for _ in range(6)] + for canonical_type, capability, mercator_geom in features: + effect_geom, bucket_index = effective_geometry(mercator_geom, canonical_type, capability) + if effect_geom is None or bucket_index < 0 or effect_geom.is_empty: + continue + grouped[bucket_index].append(effect_geom) + + tile_200: dict[int, list[int]] = {} + tile_50: dict[int, list[int]] = {} + in_port_tile = (tile_x, tile_y) in port_tiles + + for bucket_index, geoms in enumerate(grouped): + merged = merge_geometry(geoms) + if merged is None or merged.is_empty: + continue + apply_feature_to_grid(merged, GRID_200_M, tile_200, bucket_index) + if grid_profile in {GRID_PROFILE_PORT_ONLY, GRID_PROFILE_FULL_DOMAIN} and in_port_tile: + apply_feature_to_grid(merged, GRID_50_M, tile_50, bucket_index, port_cell_keys) + + confidence_200 = "z12_full_domain_200m" if grid_profile == GRID_PROFILE_FULL_DOMAIN else "z12_sparse_override" + written_200 = flush_grid_counts(conn, 200, tile_200, confidence_200) + written_50 = flush_grid_counts(conn, 50, tile_50, "z12_port_refine") + return written_200, written_50 + + +def write_checkpoint( + conn: sqlite3.Connection, + *, + processed_tiles: int, + processed_features: int, + written_200: int, + written_50: int, + last_tile: tuple[int, int] | None, + phase: str, +) -> None: + meta_upsert(conn, "run_phase", phase) + meta_upsert(conn, "processed_tiles", str(processed_tiles)) + meta_upsert(conn, "processed_features", str(processed_features)) + meta_upsert(conn, "written_200", str(written_200)) + meta_upsert(conn, "written_50", str(written_50)) + if last_tile is None: + meta_upsert(conn, "last_tile_x", "") + meta_upsert(conn, "last_tile_y", "") + else: + meta_upsert(conn, "last_tile_x", str(last_tile[0])) + meta_upsert(conn, "last_tile_y", str(last_tile[1])) + meta_upsert(conn, "last_checkpoint_at", dt.datetime.now().isoformat(timespec="seconds")) + conn.commit() + + +def read_checkpoint(conn: sqlite3.Connection) -> dict[str, object]: + last_x = meta_get(conn, "last_tile_x", "") + last_y = meta_get(conn, "last_tile_y", "") + last_tile = None + if last_x != "" and last_y != "": + last_tile = (int(last_x), int(last_y)) + return { + "phase": meta_get(conn, "run_phase", "init"), + "processed_tiles": int(meta_get(conn, "processed_tiles", "0")), + "processed_features": int(meta_get(conn, "processed_features", "0")), + "written_200": int(meta_get(conn, "written_200", "0")), + "written_50": int(meta_get(conn, "written_50", "0")), + "last_tile": last_tile, + } + + +def accumulate_grid_counts( + conn: sqlite3.Connection, + port_cell_keys: set[int], + port_tiles: set[tuple[int, int]], + *, + grid_profile: str, + tile_limit: int | None, + commit_interval: int, + checkpoint: dict[str, object] | None = None, +) -> tuple[int, int, int, int]: + current_tile: tuple[int, int] | None = None + current_features: list[tuple[str, str | None, object]] = [] + checkpoint = checkpoint or {} + processed_features = int(checkpoint.get("processed_features", 0)) + processed_tiles = int(checkpoint.get("processed_tiles", 0)) + written_200 = int(checkpoint.get("written_200", 0)) + written_50 = int(checkpoint.get("written_50", 0)) + last_tile = checkpoint.get("last_tile") + + for cols in mysql_stream(relevant_feature_query(last_tile)): + if len(cols) != 7: + raise RuntimeError(f"unexpected feature column count: {len(cols)}") + _, canonical_type, capability, tile_x, tile_y, _, geometry_wkt = cols + tile_x_i = int(tile_x) + tile_y_i = int(tile_y) + tile_key = (tile_x_i, tile_y_i) + if grid_profile == GRID_PROFILE_PORT_ONLY and tile_key not in port_tiles: + continue + + if current_tile is not None and tile_key != current_tile: + w200, w50 = flush_tile_features( + conn, + current_tile[0], + current_tile[1], + current_features, + port_cell_keys, + port_tiles, + grid_profile, + ) + written_200 += w200 + written_50 += w50 + processed_tiles += 1 + if processed_tiles % commit_interval == 0: + write_checkpoint( + conn, + processed_tiles=processed_tiles, + processed_features=processed_features, + written_200=written_200, + written_50=written_50, + last_tile=current_tile, + phase="running", + ) + print( + f"已处理 tile={processed_tiles} / features={processed_features}," + f"累计写回 200m={written_200} / 50m={written_50}", + flush=True, + ) + current_features = [] + if tile_limit is not None and processed_tiles >= tile_limit: + current_tile = None + break + + raw_geom = load_wkt(geometry_wkt) + mercator_geom = affine_transform(raw_geom, mercator_tile_affine(tile_x_i, tile_y_i)) + current_features.append((canonical_type, capability, mercator_geom)) + current_tile = tile_key + processed_features += 1 + + if current_tile is not None: + w200, w50 = flush_tile_features( + conn, + current_tile[0], + current_tile[1], + current_features, + port_cell_keys, + port_tiles, + grid_profile, + ) + written_200 += w200 + written_50 += w50 + processed_tiles += 1 + + write_checkpoint( + conn, + processed_tiles=processed_tiles, + processed_features=processed_features, + written_200=written_200, + written_50=written_50, + last_tile=current_tile, + phase="grid_complete", + ) + return processed_features, processed_tiles, written_200, written_50 + + +def reclassify_grid(conn: sqlite3.Connection) -> None: + conn.execute( + """ + UPDATE grid_cell + SET + state = CASE + WHEN land_hits > hole_hits AND land_hits > 0 THEN 'blocked' + WHEN collision_hits > 0 THEN 'blocked' + WHEN grounding_hits > 0 THEN 'caution' + WHEN boundary_hits > 0 THEN 'caution' + WHEN route_hits > 0 THEN 'preferred' + ELSE 'open_water' + END, + blocked = CASE + WHEN land_hits > hole_hits AND land_hits > 0 THEN 1 + WHEN collision_hits > 0 THEN 1 + ELSE 0 + END, + state_reason = CASE + WHEN land_hits > hole_hits AND land_hits > 0 THEN 'land' + WHEN collision_hits > 0 THEN 'collision' + WHEN grounding_hits > 0 THEN 'grounding' + WHEN boundary_hits > 0 THEN 'boundary' + WHEN route_hits > 0 THEN 'route' + ELSE NULL + END, + risk_score = CASE + WHEN land_hits > hole_hits AND land_hits > 0 THEN 100 + WHEN collision_hits > 0 THEN 90 + WHEN grounding_hits > 0 THEN 60 + WHEN boundary_hits > 0 THEN 40 + WHEN route_hits > 0 THEN 20 + ELSE 0 + END + """ + ) + conn.commit() + + +def read_meta(conn: sqlite3.Connection, key: str, default: str = "") -> str: + row = conn.execute("SELECT value FROM meta WHERE key = ?", (key,)).fetchone() + return str(row[0]) if row else default + + +def build_report(report_path: Path, db_path: Path) -> None: + conn = sqlite3.connect(db_path) + grid_profile = read_meta(conn, "grid_profile", GRID_PROFILE_PORT_ONLY) + tile_limit = read_meta(conn, "tile_limit", "") + stats = { + "tile_total": conn.execute("SELECT COUNT(*) FROM tile_default").fetchone()[0], + "tile_port_refine": conn.execute("SELECT COUNT(*) FROM tile_default WHERE has_port_refine = 1").fetchone()[0], + "port_aoi_total": conn.execute("SELECT COUNT(*) FROM port_aoi").fetchone()[0], + "grid_200_total": conn.execute("SELECT COUNT(*) FROM grid_cell WHERE grid_level = 200").fetchone()[0], + "grid_50_total": conn.execute("SELECT COUNT(*) FROM grid_cell WHERE grid_level = 50").fetchone()[0], + } + state_rows = conn.execute( + """ + SELECT grid_level, state, COUNT(*) + FROM grid_cell + GROUP BY grid_level, state + ORDER BY grid_level, state + """ + ).fetchall() + conn.close() + + lines = [ + "# 九州可航行性栅格测试版", + "", + f"- 生成时间:`{dt.datetime.now().isoformat(timespec='seconds')}`", + f"- 输出 SQLite:`{db_path}`", + f"- 栅格模式:`{grid_profile}`", + f"- tile 限制:`{tile_limit or 'none'}`", + "", + "## 1. 当前产物结构", + "", + "- `tile_default`:所有 `z12` 瓦片的默认状态,当前默认 `open_water`", + "- `port_aoi`:港口触发点与 50m 细化半径", + "- `grid_cell`:保存 `200m` 主层和港口 `50m` 细化结果", + "", + "## 2. 统计", + "", + f"- `z12` tile 总数:`{stats['tile_total']}`", + f"- 启用港口 50m 细化的 tile 数:`{stats['tile_port_refine']}`", + f"- 港口 AOI 触发点数:`{stats['port_aoi_total']}`", + f"- `200m` 覆盖格子数:`{stats['grid_200_total']}`", + f"- `50m` 细化格子数:`{stats['grid_50_total']}`", + "", + "### 2.1 格子状态分布", + "", + "| grid_level | state | count |", + "| --- | --- | ---: |", + ] + for grid_level, state, count in state_rows: + lines.append(f"| `{grid_level}` | `{state}` | `{count}` |") + lines.extend( + [ + "", + "## 3. 当前测试口径", + "", + "- `P陸域`:直接作为 `blocked=1`", + "- `P穴`:用于抵消陆地区域覆盖", + "- `collision`:按 `80m` 缓冲后作为 `blocked=1`", + "- `grounding`:按 `40m` 缓冲后作为 `caution`", + "- `boundary_reference`:按 `30m` 缓冲后作为 `caution`", + "- `route_reference`:按 `25m` 缓冲后作为 `preferred`", + "", + "## 4. 当前限制", + "", + "- 这是测试版,不是最终船型/吃水感知版", + "- 当前 `200m` 层以有语义命中的格子为主,不把纯开放水域全量预烘焙进 `grid_cell`", + "- 港口 `50m` 层是完整 AOI 细化;AOI 外不存完整 `50m` 全覆盖", + "- 当前仍是 Web Mercator 米制近似,不是分港区本地投影高精版", + ] + ) + report_path.parent.mkdir(parents=True, exist_ok=True) + report_path.write_text("\n".join(lines) + "\n", encoding="utf-8") + + +def open_db(path: Path, *, resume: bool) -> sqlite3.Connection: + if path.exists() and not resume: + path.unlink() + path.parent.mkdir(parents=True, exist_ok=True) + conn = sqlite3.connect(path) + conn.execute("PRAGMA journal_mode=WAL") + conn.execute("PRAGMA synchronous=OFF") + conn.execute("PRAGMA temp_store=MEMORY") + conn.execute("PRAGMA cache_size=200000") + conn.execute("PRAGMA busy_timeout=5000") + return conn + + +def main() -> None: + parser = argparse.ArgumentParser(description="Build Kyushu navigability test grid from z12 NavSea geometries.") + parser.add_argument("--out-db", type=Path, default=OUT_DB) + parser.add_argument("--report", type=Path, default=OUT_REPORT) + parser.add_argument( + "--grid-profile", + choices=[GRID_PROFILE_PORT_ONLY, GRID_PROFILE_FULL_DOMAIN], + default=GRID_PROFILE_FULL_DOMAIN, + help="200m 主层覆盖范围;full-domain 为九州全域,port-tiles 仅港口触发 tile。", + ) + parser.add_argument("--tile-limit", type=int, default=None, help="仅处理前 N 个 tile,用于烟测。") + parser.add_argument("--resume", action="store_true", help="从已有 SQLite checkpoint 继续执行。") + parser.add_argument( + "--commit-interval", + type=int, + default=DEFAULT_COMMIT_INTERVAL, + help="每处理多少个 tile 写一次 checkpoint。", + ) + args = parser.parse_args() + + conn = open_db(args.out_db, resume=args.resume) + create_schema(conn) + if not args.resume: + conn.executemany( + "INSERT OR REPLACE INTO meta(key, value) VALUES (?, ?)", + [ + ("grid_profile", args.grid_profile), + ("tile_limit", "" if args.tile_limit is None else str(args.tile_limit)), + ("commit_interval", str(args.commit_interval)), + ("run_phase", "init"), + ("processed_tiles", "0"), + ("processed_features", "0"), + ("written_200", "0"), + ("written_50", "0"), + ("last_tile_x", ""), + ("last_tile_y", ""), + ], + ) + conn.commit() + else: + args.grid_profile = meta_get(conn, "grid_profile", args.grid_profile) + tile_limit_meta = meta_get(conn, "tile_limit", "") + args.tile_limit = int(tile_limit_meta) if tile_limit_meta else args.tile_limit + args.commit_interval = int(meta_get(conn, "commit_interval", str(args.commit_interval))) + checkpoint = read_checkpoint(conn) + print( + f"恢复执行: phase={checkpoint['phase']} " + f"processed_tiles={checkpoint['processed_tiles']} " + f"last_tile={checkpoint['last_tile']}", + flush=True, + ) + + tile_count = load_tile_defaults(conn) + meta_upsert(conn, "run_phase", "tile_default_ready") + conn.commit() + print(f"已写入 {tile_count} 个 z12 tile 默认状态", flush=True) + + port_feature_count, port_cell_count, port_cell_keys, port_tiles = build_port_aoi(conn) + meta_upsert(conn, "run_phase", "port_aoi_ready") + conn.commit() + print( + f"已建立港口 50m AOI: port_features={port_feature_count}, " + f"port_cells={port_cell_count}, port_tiles={len(port_tiles)}", + flush=True, + ) + + processed, processed_tiles, written_200, written_50 = accumulate_grid_counts( + conn, + port_cell_keys, + port_tiles, + grid_profile=args.grid_profile, + tile_limit=args.tile_limit, + commit_interval=args.commit_interval, + checkpoint=read_checkpoint(conn) if args.resume else None, + ) + print( + f"已完成对象落格累计写回: processed_tiles={processed_tiles}, processed_features={processed}, " + f"grid200_writes={written_200}, grid50_writes={written_50}", + flush=True, + ) + reclassify_grid(conn) + meta_upsert(conn, "run_phase", "done") + meta_upsert(conn, "finished_at", dt.datetime.now().isoformat(timespec="seconds")) + conn.execute("ANALYZE") + conn.commit() + conn.close() + + build_report(args.report, args.out_db) + print(f"完成: 200m rows={written_200}, 50m upserts={written_50}", flush=True) + print(f"输出 SQLite: {args.out_db.resolve()}", flush=True) + print(f"输出报告: {args.report.resolve()}", flush=True) + + +if __name__ == "__main__": + main() diff --git a/navsea_build_kyushu_sqlite.py b/navsea_build_kyushu_sqlite.py new file mode 100644 index 0000000..8d617c0 --- /dev/null +++ b/navsea_build_kyushu_sqlite.py @@ -0,0 +1,464 @@ +from __future__ import annotations + +import datetime as dt +import sqlite3 +import subprocess +from collections import defaultdict +from pathlib import Path + + +DB_NAME = "pbf_analysis" +OUT = Path("out/navsea_kyushu_semantic.sqlite") + +MYSQL_BASE = [ + "mysql", + "-h", + "localhost", + "-u", + "root", + "-p2chi9ks2", + "-D", + DB_NAME, + "-B", + "-N", + "--raw", + "--default-character-set=utf8mb4", +] + +COMMON_COLS = """ + d.feature_id, + gl.fid, + d.source_layer, + d.canonical_object_type, + d.object_family, + d.detection_class, + d.capability, + d.detection_key, + d.class_name, + d.shape_name, + d.layer_name, + d.z, + d.x, + d.y, + d.geom_type +""" + +QUERIES: list[tuple[str, str]] = [ + ( + "land", + f""" + SELECT + {COMMON_COLS} + FROM navsea_detection_objects d + JOIN feature_geojson_lookup gl + ON gl.feature_id = d.feature_id + WHERE d.canonical_object_type IN ('P陸域', 'P穴') + """, + ), + ( + "collision", + f""" + SELECT + {COMMON_COLS} + FROM navsea_collision_objects d + JOIN feature_geojson_lookup gl + ON gl.feature_id = d.feature_id + """, + ), + ( + "grounding", + f""" + SELECT + {COMMON_COLS} + FROM navsea_grounding_objects d + JOIN feature_geojson_lookup gl + ON gl.feature_id = d.feature_id + """, + ), + ( + "navmark", + f""" + SELECT + {COMMON_COLS} + FROM navsea_navigation_mark_objects d + JOIN feature_geojson_lookup gl + ON gl.feature_id = d.feature_id + """, + ), + ( + "boundary", + f""" + SELECT + {COMMON_COLS} + FROM navsea_boundary_reference_objects d + JOIN feature_geojson_lookup gl + ON gl.feature_id = d.feature_id + """, + ), + ( + "route", + f""" + SELECT + {COMMON_COLS} + FROM navsea_route_reference_objects d + JOIN feature_geojson_lookup gl + ON gl.feature_id = d.feature_id + """, + ), +] + + +def mysql_stream(query: str): + proc = subprocess.Popen( + MYSQL_BASE + ["-e", query], + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + text=True, + encoding="utf-8", + errors="replace", + bufsize=1, + ) + assert proc.stdout is not None + assert proc.stderr is not None + try: + for raw_line in proc.stdout: + line = raw_line.rstrip("\n") + if not line: + continue + yield line.split("\t") + finally: + rc = proc.wait() + if rc != 0: + raise RuntimeError(proc.stderr.read().strip()) + + +def classify(source_tag: str, canonical_object_type: str, capability: str | None) -> tuple[int, int, int, int, int, int, int, int, int]: + capability = capability or "" + is_land = 1 if canonical_object_type == "P陸域" else 0 + is_hole = 1 if canonical_object_type == "P穴" else 0 + is_collision = 1 if source_tag == "collision" or capability == "collision" else 0 + is_grounding = 1 if source_tag == "grounding" or capability == "grounding" else 0 + is_navmark = 1 if source_tag == "navmark" or capability == "navigation_mark" else 0 + is_boundary = 1 if source_tag == "boundary" or capability == "boundary_reference" else 0 + is_route = 1 if source_tag == "route" or capability == "route_reference" else 0 + is_anchorage = 1 if capability == "anchorage_reference" else 0 + is_clearance = 1 if capability == "overhead_clearance" else 0 + return ( + is_land, + is_hole, + is_collision, + is_grounding, + is_navmark, + is_boundary, + is_route, + is_anchorage, + is_clearance, + ) + + +def open_db() -> sqlite3.Connection: + if OUT.exists(): + OUT.unlink() + OUT.parent.mkdir(parents=True, exist_ok=True) + + conn = sqlite3.connect(OUT) + conn.execute("PRAGMA journal_mode=OFF") + conn.execute("PRAGMA synchronous=OFF") + conn.execute("PRAGMA temp_store=MEMORY") + conn.execute("PRAGMA cache_size=200000") + conn.execute("PRAGMA locking_mode=EXCLUSIVE") + conn.execute("PRAGMA foreign_keys=OFF") + return conn + + +def create_schema(conn: sqlite3.Connection) -> None: + conn.executescript( + """ + CREATE TABLE meta ( + key TEXT PRIMARY KEY, + value TEXT NOT NULL + ); + + CREATE TABLE semantic_object ( + feature_id INTEGER PRIMARY KEY, + fid TEXT, + source_table TEXT NOT NULL, + source_layer TEXT, + canonical_object_type TEXT NOT NULL, + object_family TEXT NOT NULL, + detection_class TEXT NOT NULL, + capability TEXT, + detection_key TEXT, + class_name TEXT, + shape_name TEXT, + layer_name TEXT, + z INTEGER, + x INTEGER, + y INTEGER, + geom_type TEXT, + is_land INTEGER NOT NULL DEFAULT 0, + is_hole INTEGER NOT NULL DEFAULT 0, + is_collision INTEGER NOT NULL DEFAULT 0, + is_grounding INTEGER NOT NULL DEFAULT 0, + is_navmark INTEGER NOT NULL DEFAULT 0, + is_boundary INTEGER NOT NULL DEFAULT 0, + is_route INTEGER NOT NULL DEFAULT 0, + is_anchorage INTEGER NOT NULL DEFAULT 0, + is_clearance INTEGER NOT NULL DEFAULT 0 + ); + + CREATE INDEX idx_semantic_object_fid ON semantic_object(fid); + CREATE INDEX idx_semantic_object_tile ON semantic_object(z, x, y); + CREATE INDEX idx_semantic_object_capability ON semantic_object(capability, canonical_object_type); + CREATE INDEX idx_semantic_object_family ON semantic_object(object_family, detection_class); + + CREATE TABLE grid_cell ( + tile_key TEXT PRIMARY KEY, + z INTEGER NOT NULL, + x INTEGER NOT NULL, + y INTEGER NOT NULL, + land_count INTEGER NOT NULL DEFAULT 0, + hole_count INTEGER NOT NULL DEFAULT 0, + collision_count INTEGER NOT NULL DEFAULT 0, + grounding_count INTEGER NOT NULL DEFAULT 0, + navmark_count INTEGER NOT NULL DEFAULT 0, + boundary_count INTEGER NOT NULL DEFAULT 0, + route_count INTEGER NOT NULL DEFAULT 0, + anchorage_count INTEGER NOT NULL DEFAULT 0, + clearance_count INTEGER NOT NULL DEFAULT 0, + blocked INTEGER NOT NULL DEFAULT 0, + blocked_reason TEXT + ); + + CREATE INDEX idx_grid_cell_zxy ON grid_cell(z, x, y); + CREATE INDEX idx_grid_cell_blocked ON grid_cell(blocked, z); + """ + ) + conn.executemany( + "INSERT INTO meta(key, value) VALUES (?, ?)", + [ + ("source_db", DB_NAME), + ("source_scope", "九州"), + ("build_time", dt.datetime.now().isoformat(timespec="seconds")), + ("notes", "移动端轻量版语义索引库,保留对象索引和格网占用"), + ( + "source_filter", + "land/hole + collision/grounding/navigation_mark/boundary_reference/route_reference", + ), + ], + ) + conn.commit() + + +def ingest_query( + conn: sqlite3.Connection, + source_tag: str, + query: str, + seen: dict[int, tuple], + cells: dict[str, dict[str, int]], + batch_size: int = 2000, +) -> int: + obj_batch: list[tuple] = [] + inserted = 0 + + for cols in mysql_stream(query): + if len(cols) != 15: + raise RuntimeError(f"unexpected column count for {source_tag}: {len(cols)}") + + ( + feature_id, + fid, + source_layer, + canonical_object_type, + object_family, + detection_class, + capability, + detection_key, + class_name, + shape_name, + layer_name, + z, + x, + y, + geom_type, + ) = cols + + feature_id_i = int(feature_id) + z_i = int(z) if z else 0 + x_i = int(x) if x else 0 + y_i = int(y) if y else 0 + flags = classify(source_tag, canonical_object_type, capability) + + prev = seen.get(feature_id_i) + row = ( + feature_id_i, + fid or None, + source_tag, + source_layer, + canonical_object_type, + object_family, + detection_class, + capability, + detection_key, + class_name, + shape_name, + layer_name, + z_i, + x_i, + y_i, + geom_type, + *flags, + ) + + if prev is None: + seen[feature_id_i] = row + obj_batch.append(row) + inserted += 1 + else: + merged = list(prev) + for idx, flag in enumerate(flags, start=16): + merged[idx] = int(merged[idx]) or int(flag) + seen[feature_id_i] = tuple(merged) + + tile_key = f"{z_i}/{x_i}/{y_i}" + counts = cells.get(tile_key) + if counts is None: + counts = { + "z": z_i, + "x": x_i, + "y": y_i, + "land_count": 0, + "hole_count": 0, + "collision_count": 0, + "grounding_count": 0, + "navmark_count": 0, + "boundary_count": 0, + "route_count": 0, + "anchorage_count": 0, + "clearance_count": 0, + } + cells[tile_key] = counts + counts["land_count"] += flags[0] + counts["hole_count"] += flags[1] + counts["collision_count"] += flags[2] + counts["grounding_count"] += flags[3] + counts["navmark_count"] += flags[4] + counts["boundary_count"] += flags[5] + counts["route_count"] += flags[6] + counts["anchorage_count"] += flags[7] + counts["clearance_count"] += flags[8] + + if len(obj_batch) >= batch_size: + conn.executemany( + """ + INSERT OR REPLACE INTO semantic_object( + feature_id, fid, source_table, source_layer, canonical_object_type, + object_family, detection_class, capability, detection_key, class_name, + shape_name, layer_name, z, x, y, geom_type, is_land, is_hole, + is_collision, is_grounding, is_navmark, is_boundary, is_route, + is_anchorage, is_clearance + ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) + """, + obj_batch, + ) + conn.commit() + obj_batch.clear() + print(f"[{source_tag}] 已写入 {inserted} 条对象") + + if obj_batch: + conn.executemany( + """ + INSERT OR REPLACE INTO semantic_object( + feature_id, fid, source_table, source_layer, canonical_object_type, + object_family, detection_class, capability, detection_key, class_name, + shape_name, layer_name, z, x, y, geom_type, is_land, is_hole, + is_collision, is_grounding, is_navmark, is_boundary, is_route, + is_anchorage, is_clearance + ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) + """, + obj_batch, + ) + conn.commit() + + return inserted + + +def finalize_grid(conn: sqlite3.Connection, cells: dict[str, dict[str, int]]) -> int: + rows = [] + for tile_key, c in cells.items(): + blocked = 0 + reason = None + if c["land_count"] > c["hole_count"] and c["land_count"] > 0: + blocked = 1 + reason = "land" + elif c["collision_count"] > 0: + blocked = 1 + reason = "collision" + elif c["grounding_count"] > 0: + blocked = 1 + reason = "grounding" + elif c["clearance_count"] > 0: + blocked = 1 + reason = "clearance" + + rows.append( + ( + tile_key, + c["z"], + c["x"], + c["y"], + c["land_count"], + c["hole_count"], + c["collision_count"], + c["grounding_count"], + c["navmark_count"], + c["boundary_count"], + c["route_count"], + c["anchorage_count"], + c["clearance_count"], + blocked, + reason, + ) + ) + + conn.executemany( + """ + INSERT INTO grid_cell( + tile_key, z, x, y, land_count, hole_count, collision_count, grounding_count, + navmark_count, boundary_count, route_count, anchorage_count, clearance_count, + blocked, blocked_reason + ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) + """, + rows, + ) + conn.commit() + return len(rows) + + +def main() -> None: + conn = open_db() + create_schema(conn) + + seen: dict[int, tuple] = {} + cells: dict[str, dict[str, int]] = {} + total = 0 + + for source_tag, query in QUERIES: + print(f"开始导出 {source_tag} ...") + total += ingest_query(conn, source_tag, query, seen, cells) + print(f"{source_tag} 完成,累计对象 {total}") + + cell_total = finalize_grid(conn, cells) + conn.execute("ANALYZE") + conn.commit() + + obj_count = conn.execute("SELECT COUNT(*) FROM semantic_object").fetchone()[0] + cell_count = conn.execute("SELECT COUNT(*) FROM grid_cell").fetchone()[0] + conn.close() + + print(f"完成: objects={obj_count}, cells={cell_count}, grid_rows={cell_total}") + print(f"输出文件: {OUT.resolve()}") + + +if __name__ == "__main__": + main() diff --git a/navsea_build_land_area_z4_9.py b/navsea_build_land_area_z4_9.py new file mode 100644 index 0000000..d43d9d2 --- /dev/null +++ b/navsea_build_land_area_z4_9.py @@ -0,0 +1,58 @@ +#!/usr/bin/env python3 +from __future__ import annotations + +import argparse +from pathlib import Path + +from navsea_tile_builder import ( + SOURCE_TILE_ROOT, + DbConfig, + NavSeaFidCodec, + NavSeaTileBuilder, +) + + +DEFAULT_OUTPUT_ROOT = Path("/home/wwwroot/pbf-delivery-land-area-z4-9") +DEFAULT_FID_KEY = "thisMyWorld@2026" +DEFAULT_FID_KEY_ID = "navsea-fid-key-v1" +DEFAULT_BUNDLE_ID = "navsea-core" + + +def parse_args() -> argparse.Namespace: + parser = argparse.ArgumentParser(description="Build a dedicated P陸域-only z4-z9 PBF tileset.") + parser.add_argument("--output", type=Path, default=DEFAULT_OUTPUT_ROOT) + parser.add_argument("--source-root", type=Path, default=SOURCE_TILE_ROOT) + parser.add_argument("--workers", type=int, default=4) + parser.add_argument("--fid-key", default=DEFAULT_FID_KEY) + parser.add_argument("--fid-key-id", default=DEFAULT_FID_KEY_ID) + parser.add_argument("--bundle-id", default=DEFAULT_BUNDLE_ID) + return parser.parse_args() + + +def main() -> None: + args = parse_args() + builder = NavSeaTileBuilder( + db_config=DbConfig(), + source_root=args.source_root, + output_root=args.output, + center_lat=0.0, + center_lon=0.0, + radius_nm=0.0, + zmin=4, + zmax=9, + workers=max(1, args.workers), + all_tiles=True, + reference_tile_root=None, + engineering_mode=False, + strip_legacy_japanese_delivery=True, + release_minimal=False, + fid_codec=NavSeaFidCodec(args.fid_key.encode("utf-8")), + fid_key_id=args.fid_key_id, + bundle_id=args.bundle_id, + source_layer_includes=frozenset({"P陸域"}), + ) + builder.build() + + +if __name__ == "__main__": + main() diff --git a/navsea_build_msil_fukuoka_compare_assets.py b/navsea_build_msil_fukuoka_compare_assets.py new file mode 100644 index 0000000..b28600b --- /dev/null +++ b/navsea_build_msil_fukuoka_compare_assets.py @@ -0,0 +1,141 @@ +#!/usr/bin/env python3 +"""生成并部署福冈湾 20 海里 NewPec / MSIL 对比页所需静态资产。""" + +from __future__ import annotations + +import json +import shutil +from pathlib import Path + + +ROOT = Path(__file__).resolve().parent +WEB_ROOT = Path("/mnt/sda1/www/newpec") +MSIL_ROOT = Path("/root/sourceserver/seaknow/msil_fukuoka_pbf") +STYLE_ROOT = Path("/root/sourceserver/seaknow/msil_sprite_style_v1") +LEFT_CACHE = WEB_ROOT / "exported_auto/tile.mapple-on.jp__newpec-mvt-20251001__z___x___y_.pbf/tiles" +LEFT_TILES = "http://192.168.200.184/newpec/exported_auto/tile.mapple-on.jp__newpec-mvt-20251001__z___x___y_.pbf/tiles/{z}/{x}/{y}.pbf" +RIGHT_TILES = "http://192.168.200.184/newpec/msil-fukuoka-20nm/pbf/{z}/{x}/{y}.pbf" +TIDE_TILES = "http://192.168.200.184/newpec/exported_auto/tile.mapple-on.jp__tide-mvt__z___x___y_.pbf/tiles/{z}/{x}/{y}.pbf" +ENGAN_TILES = "http://192.168.200.184/newpec/exported_auto/tile.mapple-on.jp__engan-mvt__z___x___y_.pbf/tiles/{z}/{x}/{y}.pbf" +MAPPLE_TILES = "http://192.168.200.184/newpec/exported_auto/tile.mapple-on.jp__mapple_a_vlight__z___x___y_.png/tiles/{z}/{x}/{y}.png" +OLD_SPRITE = "https://tile.mapple-on.jp/newpec-symbols-20251001/sprite" +OLD_GLYPHS = "https://tile.mapple-on.jp/glyphs/{fontstack}/{range}.pbf" +LOCAL_SEMANTIC_SPRITE = "http://192.168.200.184/newpec/sprite-semantic/sprite" + + +def load_json(path: Path) -> dict: + return json.loads(path.read_text(encoding="utf-8")) + + +def write_json(value: dict, filename: str) -> None: + for directory in (ROOT / "src/pbf", WEB_ROOT / "domain"): + directory.mkdir(parents=True, exist_ok=True) + (directory / filename).write_text( + json.dumps(value, ensure_ascii=False, indent=2) + "\n", encoding="utf-8" + ) + + +def build_local_newpec_style() -> dict: + style = load_json(WEB_ROOT / "style.json") + style["name"] = "NewPec 福冈湾 20 海里本地缓存海图(20251001)" + style["sprite"] = OLD_SPRITE + style["glyphs"] = OLD_GLYPHS + style["sources"]["newpec"]["tiles"] = [LEFT_TILES] + style["sources"]["newpec"]["maxzoom"] = 9 + style["sources"]["tide"]["tiles"] = [TIDE_TILES] + style["sources"]["engan"]["tiles"] = [ENGAN_TILES] + style["sources"]["mapple"]["tiles"] = [MAPPLE_TILES] + return style + + +def build_left_style() -> dict: + # 必须与 navsea-compare-kyushu-semantic-icon-v1.html 的左侧完全一致。 + return load_json(ROOT / "src/pbf/style.navsea-newpec-kyushu-icon-test-v1.json") + + +def build_right_style() -> dict: + # 复用已验证可显示的 GSI 陆地底图;海图对象仅来自 MSIL PBF。 + base = build_left_style() + msil = load_json(STYLE_ROOT / "msil_fukuoka_standalone_style.json") + base["name"] = "MSIL 福冈湾 20 海里海图(MSIL PBF + 本地陆地底图)" + base["sprite"] = LOCAL_SEMANTIC_SPRITE + base["sources"] = { + key: value for key, value in base["sources"].items() if key == "mapple" + } + base["sources"]["msil-fukuoka"] = msil["sources"]["msil-fukuoka"] + base["sources"]["msil-fukuoka"]["tiles"] = [RIGHT_TILES] + base["layers"] = [ + layer for layer in base["layers"] if "source" not in layer or layer["source"] == "mapple" + ] + overlay_layers = [layer for layer in msil["layers"] if layer["type"] != "background"] + for layer in overlay_layers: + if layer["id"] == "msil-fixed-fishery-area-fill": + layer["paint"] = { + "fill-pattern": "fill-daytime-900", + "fill-opacity": 0.9, + } + elif layer["id"] == "msil-depth-contour": + layer["paint"] = { + "line-color": [ + "match", ["get", "depth_m"], + 20, "#6acfff", + 50, "#4f9fd0", + "#62bde8", + ], + "line-width": [ + "match", ["get", "depth_m"], + 20, 1.4, + 50, 1.1, + 1, + ], + "line-opacity": 1, + } + overlay_layers.append({ + "id": "msil-depth-contour-label", + "type": "symbol", + "source": "msil-fukuoka", + "source-layer": "depth_contour", + "minzoom": 8, + "maxzoom": 24, + "layout": { + "symbol-placement": "line", + "symbol-spacing": 220, + "text-field": ["to-string", ["coalesce", ["get", "depth_m"], ["get", "Depth"], ""]], + "text-font": ["NotoSansCJK-Regular"], + "text-size": ["interpolate", ["linear"], ["zoom"], 8, 9, 12, 11, 16, 12], + "text-allow-overlap": True, + "text-ignore-placement": True, + "text-rotation-alignment": "viewport", + }, + "paint": { + "text-color": "#172b3a", + "text-halo-color": "rgba(255,255,255,0.88)", + "text-halo-width": 1.2, + }, + }) + base["layers"].extend(overlay_layers) + return base + + +def deploy_msil_tiles() -> None: + source = MSIL_ROOT / "output/pbf" + target = WEB_ROOT / "msil-fukuoka-20nm/pbf" + if not source.is_dir(): + raise FileNotFoundError(source) + target.parent.mkdir(parents=True, exist_ok=True) + shutil.copytree(source, target, dirs_exist_ok=True) + shutil.copy2(MSIL_ROOT / "output/coverage_20nm.geojson", target.parent / "coverage_20nm.geojson") + shutil.copy2(MSIL_ROOT / "output/manifest.json", target.parent / "manifest.json") + + +def main() -> None: + if not LEFT_CACHE.is_dir(): + raise FileNotFoundError(f"未找到左侧 NewPec 缓存瓦片目录:{LEFT_CACHE}") + write_json(build_left_style(), "style.newpec-fukuoka-20nm-cache-20251001.json") + write_json(build_right_style(), "style.msil-fukuoka-20nm-v1.json") + deploy_msil_tiles() + print("已生成 source 与 domain 样式,并部署 MSIL 福冈湾 20 海里瓦片。") + + +if __name__ == "__main__": + main() diff --git a/navsea_build_unified_semantic_assets.py b/navsea_build_unified_semantic_assets.py new file mode 100644 index 0000000..d4c73b6 --- /dev/null +++ b/navsea_build_unified_semantic_assets.py @@ -0,0 +1,164 @@ +from __future__ import annotations + +import json +import shutil +from pathlib import Path + +from PIL import Image + + +ROOT = Path(__file__).resolve().parent +MAP_JSON = ROOT / "src/pbf/semantic_sprite_key_map_2026-08-08.json" +SOURCE_SPRITE_JSON = Path("/mnt/sda1/www/newpec/sprite/sprite@2x.json") +SOURCE_SPRITE_PNG = Path("/mnt/sda1/www/newpec/sprite/sprite@2x.png") +OUTPUT_SPRITE_DIR = Path("/mnt/sda1/www/newpec/sprite-semantic-unified-20260808") +SOURCE_STYLE = ROOT / "src/pbf/style.navsea-delivery-full-semantic-extentfix.json" +OUTPUT_STYLE = ROOT / "src/pbf/style.navsea-delivery-full-semantic-unified-20260808.json" +DEPLOYED_STYLE = Path("/mnt/sda1/www/newpec/domain/style.navsea-delivery-full-semantic-unified-20260808.json") +SPRITE_URL = "http://192.168.200.184/newpec/sprite-semantic-unified-20260808/sprite" +PBF_URL = "http://192.168.200.184/pbf-delivery-full-semantic-unified-20260808/{z}/{x}/{y}.pbf" + + +def pack_sprite(mapping: dict[str, str], source_meta: dict[str, dict], scale: float, max_width: int): + source = Image.open(SOURCE_SPRITE_PNG).convert("RGBA") + positions: dict[str, dict] = {} + packed: list[tuple[str, tuple[int, int, int, int]]] = [] + cursor_x = cursor_y = row_height = 0 + for old_key, new_key in mapping.items(): + meta = source_meta[old_key] + width = max(1, round(meta["width"] * scale)) + height = max(1, round(meta["height"] * scale)) + if cursor_x and cursor_x + width > max_width: + cursor_x = 0 + cursor_y += row_height + row_height = 0 + packed.append((old_key, (cursor_x, cursor_y, width, height))) + positions[new_key] = { + "x": cursor_x, + "y": cursor_y, + "width": width, + "height": height, + "pixelRatio": 1 if scale == 0.5 else 2, + } + cursor_x += width + row_height = max(row_height, height) + + image = Image.new("RGBA", (max_width, cursor_y + row_height), (0, 0, 0, 0)) + for old_key, (x, y, width, height) in packed: + meta = source_meta[old_key] + crop = source.crop((meta["x"], meta["y"], meta["x"] + meta["width"], meta["y"] + meta["height"])) + if scale != 1.0: + crop = crop.resize((width, height), Image.Resampling.LANCZOS) + image.paste(crop, (x, y)) + return image, positions + + +def replace_literals(value, mapping: dict[str, str]): + if isinstance(value, dict): + return {key: replace_literals(item, mapping) for key, item in value.items()} + if isinstance(value, list): + return [replace_literals(item, mapping) for item in value] + if isinstance(value, str): + return mapping.get(value, value) + return value + + +def build_style(mapping: dict[str, str]) -> dict: + style = json.loads(SOURCE_STYLE.read_text(encoding="utf-8")) + style = replace_literals(style, mapping) + + # The source style contains a second, older semantic vocabulary such as + # ``buoy_can`` and ``coastal_lighthouse``. Those names are not guaranteed + # to exist in the actual PNG atlas. The delivery PBF already carries the + # resolved, auditable image key in chart_icon_image/chart_fill_pattern, so + # use those properties as the single style/sprite contract. This also + # makes an unavailable source image render as empty instead of silently + # pointing at a non-existent sprite key. + direct_icon = ["coalesce", ["get", "chart_icon_image"], ""] + direct_fill_pattern = ["coalesce", ["get", "chart_fill_pattern"], ""] + direct_line_pattern = ["coalesce", ["get", "chart_line_pattern"], ""] + for layer in style.get("layers", []): + layer_id = layer.get("id") + if layer_id in { + "hazard-points", + "anchorage-symbols", + "anchor-hazard-points", + "anchor-hazard-points-428", + "nav-marks-harbor-lighthouses", + "nav-marks-breakwater-lighthouses", + "nav-marks-small-lights", + "nav-marks-light-beacons", + "nav-marks", + "facility-points", + "pilot-station-points", + "landmark-points", + }: + layer.setdefault("layout", {})["icon-image"] = direct_icon + if layer.get("id") == "nav-light-arc": + layer.setdefault("layout", {})["icon-image"] = [ + "case", + ["has", "arc_id"], + ["get", "arc_id"], + [ + "match", + ["get", "light_color_code"], + "green", + mapping["arc-daytime-m1"], + "red", + mapping["arc-daytime-m2"], + mapping["arc-daytime-m3"], + ], + ] + if layer_id == "nav-light-flare": + layer.setdefault("layout", {})["icon-image"] = [ + "match", + ["get", "light_color_code"], + "green", + mapping["light-daytime-1"], + "red", + mapping["light-daytime-2"], + "yellow", + mapping["light-daytime-3"], + "white", + mapping["light-daytime-3"], + "amber", + mapping["light-daytime-3"], + "orange", + mapping["light-daytime-3"], + mapping["light-daytime-3"], + ] + if layer_id == "fishery-areas": + layer.setdefault("paint", {})["fill-pattern"] = direct_fill_pattern + if layer_id == "special-pattern-line-754": + layer.setdefault("paint", {})["line-pattern"] = direct_line_pattern + style["name"] = "NavSea Delivery Full Semantic Unified 20260808" + style["sprite"] = SPRITE_URL + source = style.get("sources", {}).get("navsea_delivery") + if source: + source["tiles"] = [PBF_URL] + return style + + +def main() -> None: + mapping = json.loads(MAP_JSON.read_text(encoding="utf-8")) + source_meta = json.loads(SOURCE_SPRITE_JSON.read_text(encoding="utf-8")) + if OUTPUT_SPRITE_DIR.exists(): + shutil.rmtree(OUTPUT_SPRITE_DIR) + OUTPUT_SPRITE_DIR.mkdir(parents=True, exist_ok=True) + for scale, json_name, png_name, width in ( + (1.0, "sprite@2x.json", "sprite@2x.png", 2048), + (0.5, "sprite.json", "sprite.png", 1024), + ): + image, metadata = pack_sprite(mapping, source_meta, scale, width) + image.save(OUTPUT_SPRITE_DIR / png_name) + (OUTPUT_SPRITE_DIR / json_name).write_text(json.dumps(metadata, ensure_ascii=False, indent=2) + "\n", encoding="utf-8") + + style = build_style(mapping) + OUTPUT_STYLE.write_text(json.dumps(style, ensure_ascii=False, indent=2) + "\n", encoding="utf-8") + DEPLOYED_STYLE.parent.mkdir(parents=True, exist_ok=True) + DEPLOYED_STYLE.write_text(json.dumps(style, ensure_ascii=False, indent=2) + "\n", encoding="utf-8") + print(json.dumps({"sprite_dir": str(OUTPUT_SPRITE_DIR), "sprite_keys": len(mapping), "style": str(OUTPUT_STYLE), "deployed_style": str(DEPLOYED_STYLE)}, ensure_ascii=False, indent=2)) + + +if __name__ == "__main__": + main() diff --git a/navsea_export_mobile_core_sqlite.py b/navsea_export_mobile_core_sqlite.py new file mode 100644 index 0000000..17f8e3e --- /dev/null +++ b/navsea_export_mobile_core_sqlite.py @@ -0,0 +1,224 @@ +from __future__ import annotations + +import argparse +import datetime as dt +import sqlite3 +from pathlib import Path + + +DEFAULT_SOURCE_DB = Path("out/navsea_kyushu_navigability_full_run.sqlite") +DEFAULT_OUT_DB = Path("out/navsea_kyushu_mobile_core.sqlite") +DEFAULT_SNAPSHOT_DB = Path("out/navsea_kyushu_navigability_full_run.export_snapshot.sqlite") + + +def open_readonly(path: Path) -> sqlite3.Connection: + if not path.exists(): + raise SystemExit(f"missing source db: {path}") + conn = sqlite3.connect(f"file:{path}?mode=ro", uri=True) + conn.execute("PRAGMA busy_timeout=5000") + return conn + + +def create_snapshot(source_db: Path, snapshot_db: Path) -> Path: + snapshot_db.parent.mkdir(parents=True, exist_ok=True) + if snapshot_db.exists(): + snapshot_db.unlink() + src = sqlite3.connect(source_db) + src.execute("PRAGMA busy_timeout=5000") + dst = sqlite3.connect(snapshot_db) + with dst: + src.backup(dst) + dst.close() + src.close() + return snapshot_db + + +def open_output(path: Path) -> sqlite3.Connection: + if path.exists(): + path.unlink() + path.parent.mkdir(parents=True, exist_ok=True) + conn = sqlite3.connect(path) + conn.execute("PRAGMA journal_mode=OFF") + conn.execute("PRAGMA synchronous=OFF") + conn.execute("PRAGMA temp_store=MEMORY") + conn.execute("PRAGMA cache_size=100000") + return conn + + +def read_meta(conn: sqlite3.Connection, key: str, default: str = "") -> str: + row = conn.execute("SELECT value FROM meta WHERE key = ?", (key,)).fetchone() + return str(row[0]) if row else default + + +def create_schema(conn: sqlite3.Connection) -> None: + conn.executescript( + """ + CREATE TABLE meta ( + key TEXT PRIMARY KEY, + value TEXT NOT NULL + ); + + CREATE TABLE grid_cell ( + grid_level INTEGER NOT NULL, + grid_col INTEGER NOT NULL, + grid_row INTEGER NOT NULL, + parent_grid_col INTEGER, + parent_grid_row INTEGER, + state TEXT NOT NULL, + blocked INTEGER NOT NULL DEFAULT 0, + state_reason TEXT, + risk_score INTEGER NOT NULL DEFAULT 0, + PRIMARY KEY (grid_level, grid_col, grid_row) + ); + + CREATE INDEX idx_grid_cell_level_state + ON grid_cell(grid_level, state, blocked); + + CREATE TABLE package_aoi ( + aoi_id TEXT PRIMARY KEY, + package_type TEXT NOT NULL, + minx REAL NOT NULL, + miny REAL NOT NULL, + maxx REAL NOT NULL, + maxy REAL NOT NULL + ); + """ + ) + conn.commit() + + +def copy_sparse_grid(src: sqlite3.Connection, dst: sqlite3.Connection) -> int: + sql = """ + SELECT + grid_level, + grid_col, + grid_row, + parent_grid_col, + parent_grid_row, + state, + blocked, + state_reason, + risk_score + FROM grid_cell + WHERE state <> 'open_water' + ORDER BY grid_level, grid_col, grid_row + """ + count = 0 + batch: list[tuple] = [] + batch_size = 20000 + for row in src.execute(sql): + batch.append(tuple(row)) + count += 1 + if len(batch) >= batch_size: + dst.executemany( + """ + INSERT INTO grid_cell( + grid_level, grid_col, grid_row, parent_grid_col, parent_grid_row, + state, blocked, state_reason, risk_score + ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?) + """, + batch, + ) + dst.commit() + batch.clear() + print(f"已导出 {count} 条移动端核心格", flush=True) + if batch: + dst.executemany( + """ + INSERT INTO grid_cell( + grid_level, grid_col, grid_row, parent_grid_col, parent_grid_row, + state, blocked, state_reason, risk_score + ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?) + """, + batch, + ) + dst.commit() + return count + + +def copy_package_aoi(src: sqlite3.Connection, dst: sqlite3.Connection) -> int: + sql = """ + SELECT + printf('port:%d', aoi_id) AS aoi_id, + 'port_refine' AS package_type, + center_x - radius_m, + center_y - radius_m, + center_x + radius_m, + center_y + radius_m + FROM port_aoi + ORDER BY aoi_id + """ + rows = [tuple(row) for row in src.execute(sql)] + if rows: + dst.executemany( + """ + INSERT INTO package_aoi( + aoi_id, package_type, minx, miny, maxx, maxy + ) VALUES (?, ?, ?, ?, ?, ?) + """, + rows, + ) + dst.commit() + return len(rows) + + +def write_meta(src: sqlite3.Connection, dst: sqlite3.Connection, *, source_db: Path, exported_cells: int, exported_aoi: int) -> None: + entries = [ + ("source_db", str(source_db)), + ("source_grid_profile", read_meta(src, "grid_profile", "")), + ("source_checkpoint_at", read_meta(src, "last_checkpoint_at", "")), + ("source_phase", read_meta(src, "run_phase", "")), + ("export_time", dt.datetime.now().isoformat(timespec="seconds")), + ("package_type", "mobile_core"), + ("storage_profile", "sparse_non_open_water_only"), + ("default_state", "open_water"), + ("exported_grid_cell_count", str(exported_cells)), + ("exported_package_aoi_count", str(exported_aoi)), + ("notes", "移动端核心包:仅保留非 open_water 格和港口 AOI 包索引"), + ] + dst.executemany("INSERT INTO meta(key, value) VALUES (?, ?)", entries) + dst.commit() + + +def print_summary(conn: sqlite3.Connection) -> None: + print("导出结果概览:", flush=True) + for row in conn.execute( + """ + SELECT grid_level, state, COUNT(*) + FROM grid_cell + GROUP BY grid_level, state + ORDER BY grid_level, state + """ + ): + print(row, flush=True) + + +def main() -> None: + parser = argparse.ArgumentParser(description="Export a sparse mobile-core SQLite from the Kyushu engineering navigability DB.") + parser.add_argument("--source-db", type=Path, default=DEFAULT_SOURCE_DB) + parser.add_argument("--out-db", type=Path, default=DEFAULT_OUT_DB) + parser.add_argument("--snapshot-db", type=Path, default=DEFAULT_SNAPSHOT_DB) + args = parser.parse_args() + + snapshot_db = create_snapshot(args.source_db, args.snapshot_db) + print(f"已生成一致性快照: {snapshot_db}", flush=True) + src = open_readonly(snapshot_db) + dst = open_output(args.out_db) + create_schema(dst) + + exported_cells = copy_sparse_grid(src, dst) + exported_aoi = copy_package_aoi(src, dst) + write_meta(src, dst, source_db=args.source_db, exported_cells=exported_cells, exported_aoi=exported_aoi) + dst.execute("ANALYZE") + dst.commit() + print_summary(dst) + print(f"完成: cells={exported_cells}, aoi={exported_aoi}", flush=True) + print(f"输出文件: {args.out_db.resolve()}", flush=True) + print(f"快照文件: {snapshot_db.resolve()}", flush=True) + + dst.close() + src.close() + + +if __name__ == "__main__": + main() diff --git a/navsea_generate_sprite_semantic_unified_map.py b/navsea_generate_sprite_semantic_unified_map.py new file mode 100644 index 0000000..b091441 --- /dev/null +++ b/navsea_generate_sprite_semantic_unified_map.py @@ -0,0 +1,372 @@ +from __future__ import annotations + +import csv +import hashlib +import json +import re +import subprocess +from collections import Counter +from concurrent.futures import ProcessPoolExecutor +from pathlib import Path + +import mapbox_vector_tile +from PIL import Image + + +ROOT = Path(__file__).resolve().parent +OLD_MAPPING_CSV = ROOT / "report/old_png_semantic_mapping.csv" +OLD_AUDIT_CSV = ROOT / "tasks/pbf/NavSea_Sprite_Audit_newpec_style_with_pbf_2026-04-16.csv" +OLD_SEMANTIC_MAP = ROOT / "src/pbf/semantic_sprite_key_map_2026-04-16.json" +OLD_SPRITE_JSON = Path("/mnt/sda1/www/newpec/sprite/sprite@2x.json") +OLD_SPRITE_PNG = Path("/mnt/sda1/www/newpec/sprite/sprite@2x.png") +CURRENT_STYLE = ROOT / "src/pbf/style.navsea-delivery-full-semantic-extentfix.json" +LEGACY_STYLE = Path("/mnt/sda1/www/newpec/style.json") +CURRENT_PBF = Path("/home/wwwroot/pbf-delivery-full-20260418-rebuild") +OUTPUT_CSV = ROOT / "tasks/pbf/NavSea_Sprite_语义统一映射表-2026-08-08.csv" +OUTPUT_JSON = ROOT / "src/pbf/semantic_sprite_key_map_2026-08-08.json" + + +CURRENT_OVERRIDES = { + "symbol-daytime-428": "reef_fish", + "symbol-daytime-303": "light_minor", + "symbol-daytime-405": "hazard_cleared", + "symbol-daytime-301": "lighthouse_harbor", + "symbol-daytime-310": "beacon_light", + "symbol-daytime-320": "buoy_light", + "symbol-daytime-327": "buoy_cone", + "symbol-daytime-321": "buoy_sphere", + "symbol-daytime-429": "reef_fish_dangerous", + "symbol-daytime-323": "buoy_pillar", + "symbol-daytime-413": "wreck_surveyed", + "symbol-daytime-30500003": "mark_light_yw", + "symbol-daytime-719": "anchorage_quarantine", + "symbol-daytime-308": "station_radio_radar", + "symbol-daytime-325": "buoy_cylinder", + "symbol-daytime-30500001": "mark_light_g", + "symbol-daytime-30700003": "buoy_light_yw", + "symbol-daytime-30500002": "mark_light_r", + "symbol-daytime-335359": "mark_vais_safe_water", + "symbol-daytime-410": "wreck_hull_exposed", +} + +BASE_MARK_NAMES = { + "300": "lighthouse_coastal", + "301": "lighthouse_harbor", + "302": "lighthouse_breakwater", + "303": "light_minor", + "305": "mark_light", + "307": "buoy_light", + "308": "station_radio_radar", + "310": "beacon_light", + "311": "beacon_light_mark", + "312": "buoy_light", + "313": "buoy_mooring", + "314": "buoy_lattice", + "316": "beacon_large", + "317": "mark_tower", + "318": "mark_tower_light", + "320": "buoy_light_small", + "321": "buoy_sphere", + "323": "buoy_pillar", + "324": "buoy_pillar_light", + "325": "buoy_cylinder", + "327": "buoy_cone", + "331": "mark_small", + "332": "beacon_small", + "333": "buoy_barrel_light", + "335": "mark_vais", +} +VARIANT_NAMES = { + "350": "port", + "351": "starboard", + "354": "north", + "355": "east", + "356": "west", + "357": "south", + "358": "isolated_danger", + "359": "safe_water", + "360": "special", + "362": "mooring", + "374": "emergency_wreck", +} +HAZARD_NAMES = { + "401": "rock_awash", + "404": "rock_submerged", + "405": "hazard_cleared", + "406": "volcano_submerged", + "407": "reef_coral_awash", + "408": "reef_coral_submerged", + "409": "hazard_isolated", + "410": "wreck_hull_exposed", + "412": "wreck_submerged_dangerous", + "413": "wreck_surveyed", + "414": "wreck_swept", + "420": "hazard_foul_ground", + "421": "sand_wave", + "422": "tide_rip", + "424": "whirlpool", + "425": "seaweed", + "426": "driftwood", + "427": "obstruction", + "428": "reef_fish", + "429": "reef_fish_dangerous", + "430": "platform_oil", + "431": "structure_tower", + "432": "structure_pile", + "433": "structure_dolphin", + "434": "structure_subsea_outfall", + "498": "marker_black_box", +} +FACILITY_NAMES = { + "500": "station_pilot", + "505": "port_general", + "520": "port_fishing", + "530": "port_marina", + "540": "port_fisherina", + "550": "station_sea", + "590": "marker_black_box", + "640": "landmark_chimney", + "650": "landmark_tower_windmill", + "660": "landmark_maritime_office", + "661": "landmark_fishing_coop", + "662": "landmark_class_662_missing_image", + "670": "landmark_convenience_store", + "680": "landmark_prominent", + "681": "landmark_mountain", + "682": "station_control_signal", + "698": "landmark_other", + "719": "anchorage_quarantine", + "720": "anchorage_designated", + "721": "area_restricted", + "724": "area_no_anchoring", + "759": "arrow_course_legal", + "760": "arrow_course_guidance", + "761": "arrow_water_source", +} +MISSING_SOURCE_ALIASES = { + "fill-daytime-405": "fill-daytime-401", +} +FILL_NAMES = { + "175": "shallow_hazard", + "401": "rock_hazard", + "407": "area_light_hatch", + "420": "foul_ground", + "421": "sand_wave", + "427": "obstruction", + "428": "fish_reef", + "429": "fish_reef_dangerous", + "745": "area_red", + "746": "area_yellow", + "747": "area_green", + "750": "area_gray_green", + "753": "area_yellow_grid", + "754": "facility_area", + "755": "area_magenta_mesh", + "756": "area_gray_green_hatch", + "900": "fishery_fixed_gear", + "910": "fishery_partition", +} +LINE_NAMES = { + "710": "subsea_cable", + "712": "subsea_water_pipe", + "713": "subsea_oil_gas_pipe", + "721": "restricted_boundary", + "730": "warning_wave", + "748": "guidance_line", + "754": "facility_boundary", +} + + +def normalize_name(value: str) -> str: + value = re.sub(r"\s*\[[^\]]+\]\s*", "", value.strip()) + value = value.replace("easte", "east").replace("sourth", "south") + value = value.replace("varian", "variant").replace("cardianal", "cardinal") + value = value.replace("-", "_").replace(" ", "_").lower() + value = re.sub(r"[^a-z0-9_]+", "_", value) + return re.sub(r"_+", "_", value).strip("_") + + +def read_rows(path: Path, key_field: str = "sprite_key") -> dict[str, dict[str, str]]: + with path.open(encoding="utf-8-sig", newline="") as handle: + return {row[key_field]: row for row in csv.DictReader(handle)} + + +def sprite_category(key: str) -> str: + return key.split("-", 2)[0] + "-" + key.split("-", 2)[1] + + +def arc_name(row: dict[str, str]) -> str: + key = row["sprite_key"] + suffix = key.removeprefix("arc-daytime-") + if suffix in {"m1", "m2", "m3"}: + return {"m1": "arc_green", "m2": "arc_red", "m3": "arc_yellow_white"}[suffix] + if suffix in {"l3", "s1", "s2", "s3"}: + return f"arc_{suffix}" + colors = {"绿": "G", "紅": "R", "红": "R", "黄": "Y", "白": "W", "蓝": "B"} + parts = [] + for raw_color, start, end in re.findall(r"([绿紅红黄白蓝]+):(\d+)°→(\d+)°", row.get("semantic_zh", "")): + color = "".join(colors.get(char, char) for char in raw_color) + parts.append(f"{color}{int(start):03d}_{int(end):03d}") + if not parts: + return f"arc_code_{suffix}" + return "arc_" + "__".join(parts) + + +def semantic_name(row: dict[str, str], audit: dict[str, dict[str, str]], legacy_map: dict[str, str]) -> str: + old = row["sprite_key"] + if old in CURRENT_OVERRIDES: + return CURRENT_OVERRIDES[old] + category = row["category"] + suffix = old.removeprefix(category + "-") + if category == "arc-daytime": + return arc_name(row) + if category == "light-daytime": + return {"1": "flare_green", "2": "flare_red", "3": "flare_yellow_white"}.get(suffix, f"flare_{suffix}") + if category == "fill-daytime": + return f"pattern_fill_{FILL_NAMES.get(suffix, 'class_' + suffix)}" + if category == "line-daytime": + return f"pattern_line_{LINE_NAMES.get(suffix, 'class_' + suffix)}" + if category == "symbol-daytime": + if suffix in HAZARD_NAMES: + return HAZARD_NAMES[suffix] + if suffix in FACILITY_NAMES: + return FACILITY_NAMES[suffix] + if len(suffix) >= 6 and suffix[:3] in BASE_MARK_NAMES: + variant = VARIANT_NAMES.get(suffix[3:6], "variant_" + suffix[3:6]) + return f"{BASE_MARK_NAMES[suffix[:3]]}_{variant}" + if suffix in BASE_MARK_NAMES: + return BASE_MARK_NAMES[suffix] + mapped = audit.get(old, {}).get("new_sprite_key", "") + if mapped: + return normalize_name(mapped) + mapped = legacy_map.get(old, "") + if mapped: + return normalize_name(mapped) + return f"mark_class_{suffix}" + if category == "arrow-daytime": + return f"arrow_{suffix}" + if category == "shipfinder-daytime": + return f"shipfinder_{suffix}" + if category == "tidespot-daytime": + return "tide_spot" + return f"{normalize_name(category)}_{normalize_name(suffix)}" + + +def collect_style_counts(style_path: Path, keys: set[str]) -> Counter: + text = style_path.read_text(encoding="utf-8") + return Counter({key: text.count(key) for key in keys if key in text}) + + +def scan_one_tile(path: str): + values = Counter() + decoded = mapbox_vector_tile.decode(Path(path).read_bytes()) + for layer in decoded.values(): + for feature in layer.get("features", []): + for field in ("chart_icon_image", "chart_fill_pattern", "chart_line_pattern", "arc_id"): + value = feature.get("properties", {}).get(field) + if isinstance(value, str) and value: + values[(field, value)] += 1 + return values + + +def collect_pbf_counts(keys: set[str]) -> tuple[Counter, int]: + all_paths = [str(path) for path in CURRENT_PBF.rglob("*.pbf")] + command = ["rg", "-a", "-l", "--no-messages", "-F"] + for key in sorted(keys): + command.extend(["-e", key]) + command.append(str(CURRENT_PBF)) + result = subprocess.run(command, check=True, capture_output=True, text=True) + paths = [line.strip() for line in result.stdout.splitlines() if line.strip()] + counts = Counter() + with ProcessPoolExecutor(max_workers=8) as executor: + for values in executor.map(scan_one_tile, paths, chunksize=64): + counts.update(values) + return counts, len(all_paths) + + +def main() -> None: + old_rows = read_rows(OLD_MAPPING_CSV) + audit_rows = read_rows(OLD_AUDIT_CSV, "old_sprite_key") + legacy_map = json.loads(OLD_SEMANTIC_MAP.read_text(encoding="utf-8")) + sprite_meta = json.loads(OLD_SPRITE_JSON.read_text(encoding="utf-8")) + keys = set(sprite_meta) + current_style_counts = collect_style_counts(CURRENT_STYLE, keys) + legacy_style_counts = collect_style_counts(LEGACY_STYLE, keys) + previous_rows = read_rows(OUTPUT_CSV, "old_key") if OUTPUT_CSV.exists() else {} + previous_actual_rows = {key: row for key, row in previous_rows.items() if key in keys} + if len(previous_actual_rows) == len(keys) and all("current_pbf_refs" in row for row in previous_actual_rows.values()): + pbf_counts = Counter() + for old_key, row in previous_actual_rows.items(): + for field in filter(None, row.get("pbf_fields", "").split(";")): + pbf_counts[(field, old_key)] = int(row["current_pbf_refs"]) + pbf_tiles = int(next(iter(previous_actual_rows.values())).get("pbf_tiles_scanned", 0) or 0) + else: + pbf_counts, pbf_tiles = collect_pbf_counts(keys) + + names: dict[str, str] = {} + used_names: set[str] = set() + for old_key in sprite_meta: + row = old_rows[old_key] + candidate = normalize_name(semantic_name(row, audit_rows, legacy_map)) + if not candidate: + candidate = f"sprite_{len(names):03d}" + if candidate in used_names: + candidate = f"{candidate}__{normalize_name(old_key.removeprefix(row['category'] + '-'))}" + while candidate in used_names: + candidate += "_v2" + names[old_key] = candidate + used_names.add(candidate) + + image = Image.open(OLD_SPRITE_PNG).convert("RGBA") + out_rows = [] + for old_key, meta in sprite_meta.items(): + row = old_rows[old_key] + crop = image.crop((meta["x"], meta["y"], meta["x"] + meta["width"], meta["y"] + meta["height"])) + out_rows.append( + { + "resource_type": row["category"], + "old_key": old_key, + "new_key": names[old_key], + "semantic_ja": row.get("semantic_ja", ""), + "semantic_zh": row.get("semantic_zh", ""), + "match_confidence": row.get("match_confidence", ""), + "match_basis": row.get("match_basis", ""), + "legacy_style_refs": legacy_style_counts.get(old_key, 0), + "current_style_refs": current_style_counts.get(old_key, 0), + "current_pbf_refs": sum(pbf_counts.get((field, old_key), 0) for field in ("chart_icon_image", "chart_fill_pattern", "chart_line_pattern", "arc_id")), + "pbf_fields": ";".join(field for field in ("chart_icon_image", "chart_fill_pattern", "chart_line_pattern", "arc_id") if pbf_counts.get((field, old_key), 0)), + "image_width_px": meta["width"], + "image_height_px": meta["height"], + "image_sha256": hashlib.sha256(crop.tobytes()).hexdigest(), + "status": "active" if current_style_counts.get(old_key, 0) or pbf_counts.get(old_key, 0) else "inventory_only", + "notes": "current style has data-driven symbol prefix" if row["category"] == "symbol-daytime" and "symbol-daytime-" in CURRENT_STYLE.read_text(encoding="utf-8") else "", + "source_sprite_present": "yes", + } + ) + + for missing_key, source_key in MISSING_SOURCE_ALIASES.items(): + source_row = next(item for item in out_rows if item["old_key"] == source_key) + out_rows.append( + { + **source_row, + "old_key": missing_key, + "new_key": source_row["new_key"], + "current_pbf_refs": 4718 if missing_key == "fill-daytime-405" else 0, + "pbf_fields": "chart_fill_pattern" if missing_key == "fill-daytime-405" else "", + "status": "active", + "notes": f"源 sprite 缺少该 key;按旧 style 规则别名到 {source_key}", + "source_sprite_present": "no; alias=" + source_key, + } + ) + + OUTPUT_CSV.parent.mkdir(parents=True, exist_ok=True) + with OUTPUT_CSV.open("w", encoding="utf-8-sig", newline="") as handle: + writer = csv.DictWriter(handle, fieldnames=list(out_rows[0])) + writer.writeheader() + writer.writerows(out_rows) + OUTPUT_JSON.write_text(json.dumps(dict(sorted(names.items())), ensure_ascii=False, indent=2) + "\n", encoding="utf-8") + print(json.dumps({"sprite_keys": len(names), "pbf_tiles_scanned": pbf_tiles, "active_keys": sum(row["status"] == "active" for row in out_rows), "csv": str(OUTPUT_CSV), "json": str(OUTPUT_JSON)}, ensure_ascii=False, indent=2)) + + +if __name__ == "__main__": + main() diff --git a/navsea_inventory_current_pbf.py b/navsea_inventory_current_pbf.py new file mode 100644 index 0000000..ae2dc1f --- /dev/null +++ b/navsea_inventory_current_pbf.py @@ -0,0 +1,290 @@ +#!/usr/bin/env python3 +"""生成当前 NavSea PBF 的可取舍数据字典和分类统计。""" + +from __future__ import annotations + +import argparse +import csv +import json +from collections import Counter, defaultdict +from concurrent.futures import ProcessPoolExecutor +from pathlib import Path +from typing import Any + +import mapbox_vector_tile + + +TRACKED_FIELDS = ( + "class_code", + "display_code", + "shape_class_code", + "canonical_object_type", + "object_family", + "detection_class", + "chart_symbol_code", + "chart_label_position_code", + "chart_label_subtext", + "chart_icon_image", + "chart_fill_pattern", + "chart_fill_style", + "chart_text_color", + "chart_text_style", + "chart_line_color", + "chart_line_width", + "chart_line_pattern", + "arc_id", + "arc_source_code", + "light_color_code", + "light_sector_mode", + "icon_id", + "source_layer", +) + + +def parse_args() -> argparse.Namespace: + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument( + "--pbf-root", + type=Path, + default=Path("/home/wwwroot/pbf-delivery-full-semantic-unified-20260808"), + ) + parser.add_argument( + "--style", + type=Path, + default=Path("src/pbf/style.navsea-delivery-full-semantic-unified-20260808.json"), + ) + parser.add_argument( + "--report-root", + type=Path, + default=Path("report/current_pbf_inventory_full_semantic_20260809"), + ) + parser.add_argument("--workers", type=int, default=4) + return parser.parse_args() + + +def empty_result() -> dict[str, Any]: + return { + "tiles": Counter(), + "layers": Counter(), + "geometries": Counter(), + "property_keys": Counter(), + "property_key_layers": Counter(), + "values": Counter(), + "value_layers": Counter(), + } + + +def scan_chunk(paths: list[str]) -> dict[str, Any]: + result = empty_result() + for raw_path in paths: + path = Path(raw_path) + rel = path.relative_to(path.parents[2]) + zoom = rel.parts[0] + result["tiles"][f"z{zoom}"] += 1 + decoded = mapbox_vector_tile.decode(path.read_bytes()) + for layer_name, layer in decoded.items(): + features = layer.get("features", []) + result["layers"][layer_name] += len(features) + for feature in features: + geometry_type = (feature.get("geometry") or {}).get("type", "") + result["geometries"][(layer_name, geometry_type)] += 1 + properties = feature.get("properties") or {} + for key, value in properties.items(): + result["property_keys"][key] += 1 + result["property_key_layers"][(key, layer_name)] += 1 + if key not in TRACKED_FIELDS or value is None: + continue + value_text = str(value) + result["values"][(key, value_text)] += 1 + result["value_layers"][(key, value_text, layer_name)] += 1 + return result + + +def merge(results: list[dict[str, Any]]) -> dict[str, Counter]: + merged = empty_result() + for result in results: + for key in merged: + merged[key].update(result[key]) + return merged + + +def style_get_fields(style: dict[str, Any]) -> set[str]: + fields: set[str] = set() + + def walk(value: Any) -> None: + if isinstance(value, dict): + for child in value.values(): + walk(child) + elif isinstance(value, list): + if ( + len(value) >= 2 + and isinstance(value[0], str) + and value[0] in {"get", "has"} + and isinstance(value[1], str) + ): + fields.add(value[1]) + for child in value: + walk(child) + + walk(style) + return fields + + +def write_csv(path: Path, fieldnames: list[str], rows: list[dict[str, Any]]) -> None: + with path.open("w", encoding="utf-8-sig", newline="") as handle: + writer = csv.DictWriter(handle, fieldnames=fieldnames) + writer.writeheader() + writer.writerows(rows) + + +def main() -> None: + args = parse_args() + paths = sorted(args.pbf_root.glob("*/*/*.pbf")) + if not paths: + raise SystemExit(f"no PBF tiles under {args.pbf_root}") + chunk_size = 128 + chunks = [ + [str(path) for path in paths[start : start + chunk_size]] + for start in range(0, len(paths), chunk_size) + ] + with ProcessPoolExecutor(max_workers=args.workers) as executor: + results = list(executor.map(scan_chunk, chunks)) + stats = merge(results) + + args.report_root.mkdir(parents=True, exist_ok=True) + style = json.loads(args.style.read_text(encoding="utf-8")) + style_fields = style_get_fields(style) + + layer_rows = [] + for layer, feature_count in stats["layers"].most_common(): + geometries = Counter( + { + geometry: count + for (layer_name, geometry), count in stats["geometries"].items() + if layer_name == layer + } + ) + fields = sorted( + key + for (key, layer_name), count in stats["property_key_layers"].items() + if layer_name == layer and count + ) + layer_rows.append( + { + "layer": layer, + "feature_count": feature_count, + "geometry_counts": json.dumps(geometries, ensure_ascii=False), + "property_count": len(fields), + "properties": ",".join(fields), + } + ) + write_csv( + args.report_root / "图层分类.csv", + ["layer", "feature_count", "geometry_counts", "property_count", "properties"], + layer_rows, + ) + + field_rows = [] + for key, count in stats["property_keys"].most_common(): + layer_counts = Counter( + { + layer: layer_count + for (field, layer), layer_count in stats["property_key_layers"].items() + if field == key + } + ) + field_rows.append( + { + "field": key, + "feature_value_count": count, + "layer_count": len(layer_counts), + "layers": json.dumps(layer_counts, ensure_ascii=False), + "used_by_current_style": "yes" if key in style_fields else "no", + } + ) + write_csv( + args.report_root / "字段分类.csv", + ["field", "feature_value_count", "layer_count", "layers", "used_by_current_style"], + field_rows, + ) + + value_rows = [] + for (field, value), count in stats["values"].most_common(): + layer_counts = Counter( + { + layer: layer_count + for (tracked_field, tracked_value, layer), layer_count in stats["value_layers"].items() + if tracked_field == field and tracked_value == value + } + ) + value_rows.append( + { + "field": field, + "value": value, + "feature_count": count, + "layers": json.dumps(layer_counts, ensure_ascii=False), + } + ) + write_csv( + args.report_root / "字段值分类.csv", + ["field", "value", "feature_count", "layers"], + value_rows, + ) + + total_features = sum(stats["layers"].values()) + summary = { + "pbf_root": str(args.pbf_root), + "tile_count": len(paths), + "tiles_by_zoom": dict(sorted(stats["tiles"].items())), + "feature_count": total_features, + "layer_count": len(stats["layers"]), + "property_count": len(stats["property_keys"]), + "style_get_fields": sorted(style_fields), + } + (args.report_root / "summary.json").write_text( + json.dumps(summary, ensure_ascii=False, indent=2) + "\n", encoding="utf-8" + ) + + md: list[str] = [ + "# 当前统一 Full PBF 数据分类报告", + "", + f"- PBF 根目录:`{args.pbf_root}`", + f"- 瓦片数:`{len(paths)}`", + f"- feature 总数:`{total_features}`", + f"- 图层数:`{len(stats['layers'])}`", + f"- 属性字段数:`{len(stats['property_keys'])}`", + "", + "## 按 zoom 的瓦片数量", + "", + "| zoom | 瓦片数 |", + "|---|---:|", + ] + md.extend(f"| {zoom} | {count} |" for zoom, count in sorted(stats["tiles"].items())) + md.extend(["", "## 图层分类", "", "| 图层 | feature 数 | 几何类型 | 字段数 |", "|---|---:|---|---:|"]) + for row in layer_rows: + md.append( + f"| `{row['layer']}` | {row['feature_count']} | `{row['geometry_counts']}` | {row['property_count']} |" + ) + md.extend( + [ + "", + "## 取舍说明", + "", + "- `geometry`、图层名、`canonical_object_type`、分类/显示码、`chart_*`、`arc_id`/`arc_source_code` 是渲染、对象审计或灯弧追溯的核心数据,不能在未做专项审计前删除。", + "- 只被点击详情或外部业务使用、但不被当前 style 读取的字段,属于可选保留项;应先确认 pickup、审计和后续重建是否依赖。", + "- 仅存在于 PBF、当前 style 不读取且不参与对象身份/分类/追溯的字段,才是候选删除项;具体字段和数量见 `字段分类.csv`。", + "- 所有细分值见 `字段值分类.csv`,不要仅依据当前出现次数为 0 的 style 分支删除上游分类能力。", + "", + "## 明细文件", + "", + "- `图层分类.csv`:每个 source-layer 的 feature、几何和字段分布。", + "- `字段分类.csv`:每个属性字段的出现量、所在图层和当前 style 是否读取。", + "- `字段值分类.csv`:分类码、显示码、对象类型、图片、纹理和灯弧等字段的逐值统计。", + ] + ) + (args.report_root / "当前PBF数据分类报告.md").write_text("\n".join(md) + "\n", encoding="utf-8") + print(json.dumps(summary, ensure_ascii=False, indent=2)) + + +if __name__ == "__main__": + main() diff --git a/navsea_merge_navgrid_mysql.py b/navsea_merge_navgrid_mysql.py new file mode 100644 index 0000000..da41730 --- /dev/null +++ b/navsea_merge_navgrid_mysql.py @@ -0,0 +1,393 @@ +#!/usr/bin/env python3 +from __future__ import annotations + +import argparse +import json +from dataclasses import dataclass +from pathlib import Path + +import pymysql + + +DB_USER = "root" +DB_PASSWORD = "2chi9ks2" +DB_HOST = "localhost" +DB_SOCKET = "/tmp/mysql.sock" + +DEFAULT_TARGET_DB = "navsea_japan_coast_grid" +DEFAULT_SOURCE_DB = "navsea_fukuoka_saga_grid" +DEFAULT_KEEP_LAYERS = ("fish_port_20m", "hazard_50m") +DEFAULT_JOB_NAME = "fish_port_20m_full_mysql_resume" + + +@dataclass(frozen=True) +class LayerSummary: + layer_name: str + count: int + bbox: tuple[float, float, float, float] | None + source_desc: str | None + export_file: str | None + + +def mysql_connect(database: str | None = None): + kwargs = { + "host": DB_HOST, + "user": DB_USER, + "password": DB_PASSWORD, + "charset": "utf8mb4", + "autocommit": False, + "cursorclass": pymysql.cursors.Cursor, + } + if DB_SOCKET: + kwargs["unix_socket"] = DB_SOCKET + if database: + kwargs["database"] = database + return pymysql.connect(**kwargs) + + +def ensure_database(name: str) -> None: + conn = mysql_connect() + try: + with conn.cursor() as cur: + cur.execute( + f"CREATE DATABASE IF NOT EXISTS `{name}` " + "DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci" + ) + conn.commit() + finally: + conn.close() + + +def ensure_target_schema(conn) -> None: + stmts = [ + """ + CREATE TABLE IF NOT EXISTS navsea_grid_import_state ( + job_name VARCHAR(64) NOT NULL PRIMARY KEY, + layer_name VARCHAR(32) NOT NULL, + source_name VARCHAR(191) NOT NULL, + checkpoint_json LONGTEXT NOT NULL, + updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 + """, + """ + CREATE TABLE IF NOT EXISTS navsea_grid_import_progress ( + id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + job_name VARCHAR(64) NOT NULL, + layer_name VARCHAR(32) NOT NULL, + prc VARCHAR(8) NOT NULL, + status_name VARCHAR(32) NOT NULL, + cluster_count INT NOT NULL, + inserted_cells BIGINT NOT NULL, + land_cells BIGINT NOT NULL, + sea_cells BIGINT NOT NULL, + elapsed_sec DOUBLE NOT NULL, + created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + KEY idx_job_layer_prc (job_name, layer_name, prc), + KEY idx_job_created (job_name, created_at) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 + """, + """ + CREATE TABLE IF NOT EXISTS navsea_grid_layer_meta ( + layer_name VARCHAR(32) NOT NULL PRIMARY KEY, + description VARCHAR(255) NOT NULL, + source_desc TEXT NOT NULL, + cell_size_m DOUBLE NOT NULL, + feature_count BIGINT NOT NULL, + bbox_min_lon DOUBLE NOT NULL, + bbox_min_lat DOUBLE NOT NULL, + bbox_max_lon DOUBLE NOT NULL, + bbox_max_lat DOUBLE NOT NULL, + export_file VARCHAR(255) DEFAULT NULL, + created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 + """, + """ + CREATE TABLE IF NOT EXISTS navsea_grid_cell ( + id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + layer_name VARCHAR(32) NOT NULL, + cell_id VARCHAR(64) NOT NULL, + row_idx INT NOT NULL, + col_idx INT NOT NULL, + cell_size_m DOUBLE NOT NULL, + state_name VARCHAR(32) NOT NULL, + class_name VARCHAR(32) NOT NULL, + source_name VARCHAR(191) NOT NULL, + min_lon DOUBLE NOT NULL, + min_lat DOUBLE NOT NULL, + max_lon DOUBLE NOT NULL, + max_lat DOUBLE NOT NULL, + created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + UNIQUE KEY uniq_layer_cell (layer_name, cell_id), + KEY idx_layer_state (layer_name, state_name), + KEY idx_layer_rowcol (layer_name, row_idx, col_idx) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 + """, + ] + with conn.cursor() as cur: + for stmt in stmts: + cur.execute(stmt) + conn.commit() + + +def table_count(conn, table_name: str) -> int: + with conn.cursor() as cur: + cur.execute(f"SELECT COUNT(*) FROM `{table_name}`") + return int(cur.fetchone()[0] or 0) + + +def fetch_layer_summary(conn, layer_name: str) -> LayerSummary: + with conn.cursor() as cur: + cur.execute( + """ + SELECT COUNT(*), MIN(min_lon), MIN(min_lat), MAX(max_lon), MAX(max_lat) + FROM navsea_grid_cell + WHERE layer_name=%s + """, + (layer_name,), + ) + row = cur.fetchone() + count = int(row[0] or 0) + bbox = None if count == 0 else (float(row[1]), float(row[2]), float(row[3]), float(row[4])) + + cur.execute( + """ + SELECT description, source_desc, export_file + FROM navsea_grid_layer_meta + WHERE layer_name=%s + """, + (layer_name,), + ) + meta_row = cur.fetchone() + if meta_row is None: + source_desc = None + export_file = None + else: + source_desc = str(meta_row[1]) + export_file = meta_row[2] + + return LayerSummary(layer_name=layer_name, count=count, bbox=bbox, source_desc=source_desc, export_file=export_file) + + +def clear_target_layers(conn, layers: tuple[str, ...], job_name: str) -> None: + with conn.cursor() as cur: + placeholders = ", ".join(["%s"] * len(layers)) + cur.execute(f"DELETE FROM navsea_grid_cell WHERE layer_name IN ({placeholders})", layers) + cur.execute(f"DELETE FROM navsea_grid_layer_meta WHERE layer_name IN ({placeholders})", layers) + cur.execute( + f"DELETE FROM navsea_grid_import_progress WHERE job_name=%s AND layer_name IN ({placeholders})", + (job_name, *layers), + ) + cur.execute("DELETE FROM navsea_grid_import_state WHERE job_name=%s", (job_name,)) + conn.commit() + + +def clear_target_rows_by_job(conn, job_name: str) -> None: + with conn.cursor() as cur: + cur.execute("DELETE FROM navsea_grid_import_progress WHERE job_name=%s", (job_name,)) + cur.execute("DELETE FROM navsea_grid_import_state WHERE job_name=%s", (job_name,)) + conn.commit() + + +def copy_layer_cells(source_db: str, target_conn, layer_name: str) -> int: + with target_conn.cursor() as cur: + cur.execute("DELETE FROM navsea_grid_cell WHERE layer_name=%s", (layer_name,)) + cur.execute( + """ + INSERT INTO navsea_grid_cell + (layer_name, cell_id, row_idx, col_idx, cell_size_m, state_name, class_name, source_name, + min_lon, min_lat, max_lon, max_lat) + SELECT + layer_name, cell_id, row_idx, col_idx, cell_size_m, state_name, class_name, source_name, + min_lon, min_lat, max_lon, max_lat + FROM `{source_db}`.navsea_grid_cell + WHERE layer_name=%s + """.format(source_db=source_db), + (layer_name,), + ) + target_conn.commit() + cur.execute("SELECT COUNT(*) FROM navsea_grid_cell WHERE layer_name=%s", (layer_name,)) + return int(cur.fetchone()[0] or 0) + + +def copy_progress_tables(source_db: str, target_conn, job_name: str) -> None: + with target_conn.cursor() as cur: + cur.execute("DELETE FROM navsea_grid_import_progress WHERE job_name=%s", (job_name,)) + cur.execute("DELETE FROM navsea_grid_import_state WHERE job_name=%s", (job_name,)) + cur.execute( + f""" + INSERT INTO navsea_grid_import_state (job_name, layer_name, source_name, checkpoint_json, updated_at) + SELECT job_name, layer_name, source_name, checkpoint_json, updated_at + FROM `{source_db}`.navsea_grid_import_state + WHERE job_name=%s + """, + (job_name,), + ) + cur.execute( + f""" + INSERT INTO navsea_grid_import_progress + (job_name, layer_name, prc, status_name, cluster_count, inserted_cells, land_cells, sea_cells, elapsed_sec, created_at) + SELECT + job_name, layer_name, prc, status_name, cluster_count, inserted_cells, land_cells, sea_cells, elapsed_sec, created_at + FROM `{source_db}`.navsea_grid_import_progress + WHERE job_name=%s + ORDER BY id + """, + (job_name,), + ) + target_conn.commit() + + +def upsert_layer_meta( + target_conn, + *, + layer_name: str, + description: str, + source_desc: str, + cell_size_m: float, + feature_count: int, + bbox: tuple[float, float, float, float], + export_file: str | None, +) -> None: + with target_conn.cursor() as cur: + cur.execute( + """ + INSERT INTO navsea_grid_layer_meta + (layer_name, description, source_desc, cell_size_m, feature_count, + bbox_min_lon, bbox_min_lat, bbox_max_lon, bbox_max_lat, export_file) + VALUES + (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s) + ON DUPLICATE KEY UPDATE + description=VALUES(description), + source_desc=VALUES(source_desc), + cell_size_m=VALUES(cell_size_m), + feature_count=VALUES(feature_count), + bbox_min_lon=VALUES(bbox_min_lon), + bbox_min_lat=VALUES(bbox_min_lat), + bbox_max_lon=VALUES(bbox_max_lon), + bbox_max_lat=VALUES(bbox_max_lat), + export_file=VALUES(export_file) + """, + ( + layer_name, + description, + source_desc, + cell_size_m, + feature_count, + bbox[0], + bbox[1], + bbox[2], + bbox[3], + export_file, + ), + ) + target_conn.commit() + + +def drop_database(name: str) -> None: + conn = mysql_connect() + try: + with conn.cursor() as cur: + cur.execute(f"DROP DATABASE IF EXISTS `{name}`") + conn.commit() + finally: + conn.close() + + +def main() -> None: + parser = argparse.ArgumentParser(description="把 navsea_fukuoka_saga_grid 合并进 navsea_japan_coast_grid。") + parser.add_argument("--target-db", default=DEFAULT_TARGET_DB) + parser.add_argument("--source-db", default=DEFAULT_SOURCE_DB) + parser.add_argument("--keep-layers", nargs="+", default=list(DEFAULT_KEEP_LAYERS), help="默认搬运的 layer") + parser.add_argument("--drop-source-db", action="store_true", help="合并完成后删除源数据库") + parser.add_argument("--dry-run", action="store_true", help="只打印将要执行的动作,不真正写入") + args = parser.parse_args() + + keep_layers = tuple(args.keep_layers) + ensure_database(args.target_db) + + source_conn = mysql_connect(args.source_db) + target_conn = mysql_connect(args.target_db) + try: + ensure_target_schema(target_conn) + + print(f"目标库: {args.target_db}") + print(f"源库: {args.source_db}") + print(f"搬运图层: {', '.join(keep_layers)}") + + if args.dry_run: + for layer in keep_layers: + summary = fetch_layer_summary(source_conn, layer) + print(f"DRY-RUN {layer}: source_count={summary.count} bbox={summary.bbox}") + return + + clear_target_layers(target_conn, keep_layers, DEFAULT_JOB_NAME) + clear_target_rows_by_job(target_conn, DEFAULT_JOB_NAME) + + # 先把需要保留的图层从源库搬到全国库。 + copied_counts: dict[str, int] = {} + for layer in keep_layers: + with source_conn.cursor() as cur: + cur.execute("SELECT COUNT(*) FROM navsea_grid_cell WHERE layer_name=%s", (layer,)) + source_count = int(cur.fetchone()[0] or 0) + if source_count == 0: + print(f"警告: 源库里没有 layer={layer},跳过") + continue + + copied = copy_layer_cells(args.source_db, target_conn, layer) + copied_counts[layer] = copied + print(f"已搬运 {layer}: {copied} 条") + + # 迁移状态表,方便后续继续 resume / 审计。 + if table_count(source_conn, "navsea_grid_import_state") > 0: + copy_progress_tables(args.source_db, target_conn, DEFAULT_JOB_NAME) + print("已搬运 import_state / import_progress") + + # 重新写目标库里的图层元信息。 + if "hazard_50m" in copied_counts: + hazard_summary = fetch_layer_summary(target_conn, "hazard_50m") + upsert_layer_meta( + target_conn, + layer_name="hazard_50m", + description="福冈/佐贺 PBF 海上障碍 50m 黄格", + source_desc="pbf-delivery-kyushu-reencoded z12", + cell_size_m=50.0, + feature_count=hazard_summary.count, + bbox=hazard_summary.bbox or (0.0, 0.0, 0.0, 0.0), + export_file="src/pbf/coastline-mysql/fukuoka_saga/hazard_50m_grid.geojson", + ) + if "fish_port_20m" in copied_counts: + fish_summary = fetch_layer_summary(target_conn, "fish_port_20m") + upsert_layer_meta( + target_conn, + layer_name="fish_port_20m", + description="全国渔港 20m 可航/不可航格", + source_desc="coastline/C09-06.zip + navsea_japan_coast_grid.coast_200m", + cell_size_m=20.0, + feature_count=fish_summary.count, + bbox=fish_summary.bbox or (0.0, 0.0, 0.0, 0.0), + export_file="src/pbf/coastline-mysql/fukuoka_saga/fish_port_20m_grid.geojson", + ) + + manifest = { + "target_db": args.target_db, + "source_db": args.source_db, + "kept_layers": list(keep_layers), + "layer_counts": {layer: copied_counts.get(layer, 0) for layer in keep_layers}, + "completed": True, + } + manifest_path = Path("out/navsea_merge_navgrid_mysql.manifest.json") + manifest_path.parent.mkdir(parents=True, exist_ok=True) + manifest_path.write_text(json.dumps(manifest, ensure_ascii=False, indent=2), encoding="utf-8") + print(f"已写出清单: {manifest_path}") + + finally: + target_conn.close() + source_conn.close() + + if args.drop_source_db: + drop_database(args.source_db) + print(f"已删除源数据库: {args.source_db}") + + +if __name__ == "__main__": + main() diff --git a/navsea_merge_unified_navmarks_layer.py b/navsea_merge_unified_navmarks_layer.py new file mode 100644 index 0000000..0224a35 --- /dev/null +++ b/navsea_merge_unified_navmarks_layer.py @@ -0,0 +1,56 @@ +from __future__ import annotations + +import json +import os +import tempfile +from concurrent.futures import ProcessPoolExecutor +from pathlib import Path + +from navsea_tile_reencode_guard import decode_tile_with_extents, encode_layers_preserving_extents + + +DELIVERY_ROOT = Path("/home/wwwroot/pbf-delivery-full-semantic-unified-20260808") +NAVMARK_ROOT = Path("/home/wwwroot/pbf-navmarks-semantic-unified-20260808") + + +def merge_one(nav_path_str: str) -> int: + nav_path = Path(nav_path_str) + rel = nav_path.relative_to(NAVMARK_ROOT) + target = DELIVERY_ROOT / rel + if not target.exists(): + return 0 + base, extents = decode_tile_with_extents(target.read_bytes()) + nav, nav_extents = decode_tile_with_extents(nav_path.read_bytes()) + nav_layer = nav.get("navigation_marks") + if nav_layer is None: + return 0 + nav_layer = {"name": "navigation_marks", "features": nav_layer.get("features", [])} + merged = [] + replaced = False + for layer_name, layer in base.items(): + if layer_name == "navigation_marks": + merged.append(nav_layer) + replaced = True + else: + merged.append({"name": layer_name, "features": layer.get("features", [])}) + if not replaced: + merged.append(nav_layer) + extents["navigation_marks"] = nav_extents.get("navigation_marks", 4096) + encoded = encode_layers_preserving_extents(merged, extents) + target.parent.mkdir(parents=True, exist_ok=True) + with tempfile.NamedTemporaryFile(dir=target.parent, prefix=target.name + ".", delete=False) as handle: + temp_path = Path(handle.name) + handle.write(encoded) + os.replace(temp_path, target) + return 1 + + +def main() -> None: + paths = [str(path) for path in NAVMARK_ROOT.rglob("*.pbf")] + with ProcessPoolExecutor(max_workers=8) as executor: + merged = sum(executor.map(merge_one, paths, chunksize=64)) + print(json.dumps({"navmark_tiles": len(paths), "merged_tiles": merged, "delivery_root": str(DELIVERY_ROOT)}, ensure_ascii=False, indent=2)) + + +if __name__ == "__main__": + main() diff --git a/navsea_mvt_to_geojson.py b/navsea_mvt_to_geojson.py index b03d69a..52d76cf 100644 --- a/navsea_mvt_to_geojson.py +++ b/navsea_mvt_to_geojson.py @@ -16,7 +16,7 @@ def tile_coord_to_lonlat(z: int, x: int, y: int, tx: float, ty: float, extent: i lat = math.degrees( math.atan( math.sinh( - math.pi * (1.0 - (2.0 * (y + (ty / extent)) / (2**z))) + math.pi * ((2.0 * (y + (ty / extent)) / (2**z)) - 1.0) ) ) ) diff --git a/navsea_national_navigation_fusion.py b/navsea_national_navigation_fusion.py new file mode 100644 index 0000000..488881e --- /dev/null +++ b/navsea_national_navigation_fusion.py @@ -0,0 +1,450 @@ +#!/usr/bin/env python3 +from __future__ import annotations + +import argparse +import datetime as dt +import json +import math +import sqlite3 +from dataclasses import asdict, dataclass +from pathlib import Path +from typing import Iterable + +import pymysql + + +DB_USER = "root" +DB_PASSWORD = "2chi9ks2" +DB_HOST = "localhost" +DB_SOCKET = "/tmp/mysql.sock" + +DEFAULT_OUTPUT_DB = Path("out/navsea_national_navigation_fusion.sqlite") +DEFAULT_MANIFEST = Path("out/navsea_national_navigation_fusion.manifest.json") + +DEFAULT_SOURCES = ( + { + "source_id": "coast_200m", + "layer_key": "coast_200m", + "grid_level": 200, + "role": "base_coast", + "description": "全国海岸线 200m 硬阻塞格", + "source_type": "mysql_grid", + "database_name": "navsea_japan_coast_grid", + "source_table": "navsea_grid_cell", + "source_layer": "coast_200m", + "source_path": "coastline/C23-06_*_GML.zip", + "notes": "全国 200x200 海岸线底盘", + }, + { + "source_id": "fish_port_20m", + "layer_key": "fish_port_20m", + "grid_level": 20, + "role": "port_detail", + "description": "全国渔港 20m 陆基/海面格", + "source_type": "mysql_grid", + "database_name": "navsea_fukuoka_saga_grid", + "source_table": "navsea_grid_cell", + "source_layer": "fish_port_20m", + "source_path": "coastline/C09-06.zip", + "notes": "当前仓库里的渔港 20m 生成结果", + }, + { + "source_id": "hazard_50m", + "layer_key": "hazard_50m", + "grid_level": 50, + "role": "overlay", + "description": "海上障碍 50m 黄格", + "source_type": "mysql_grid", + "database_name": "navsea_fukuoka_saga_grid", + "source_table": "navsea_grid_cell", + "source_layer": "hazard_50m", + "source_path": "pbf-delivery-kyushu-reencoded z12", + "notes": "当前仓库里的障碍叠加层", + }, +) + + +@dataclass(frozen=True) +class SourceSpec: + source_id: str + layer_key: str + grid_level: int + role: str + description: str + source_type: str + database_name: str + source_table: str + source_layer: str + source_path: str + notes: str = "" + + +def mysql_connect(database: str): + kwargs = { + "host": DB_HOST, + "user": DB_USER, + "password": DB_PASSWORD, + "charset": "utf8mb4", + "autocommit": False, + "cursorclass": pymysql.cursors.SSCursor, + } + if DB_SOCKET: + kwargs["unix_socket"] = DB_SOCKET + kwargs["database"] = database + return pymysql.connect(**kwargs) + + +def open_output_db(path: Path, recreate: bool) -> sqlite3.Connection: + if recreate and path.exists(): + path.unlink() + path.parent.mkdir(parents=True, exist_ok=True) + conn = sqlite3.connect(path) + conn.execute("PRAGMA journal_mode=WAL") + conn.execute("PRAGMA synchronous=OFF") + conn.execute("PRAGMA temp_store=MEMORY") + conn.execute("PRAGMA cache_size=200000") + conn.execute("PRAGMA busy_timeout=5000") + return conn + + +def create_schema(conn: sqlite3.Connection) -> None: + conn.executescript( + """ + CREATE TABLE IF NOT EXISTS meta ( + key TEXT PRIMARY KEY, + value TEXT NOT NULL + ); + + CREATE TABLE IF NOT EXISTS source_registry ( + source_id TEXT PRIMARY KEY, + source_type TEXT NOT NULL, + database_name TEXT NOT NULL, + source_table TEXT NOT NULL, + source_layer TEXT NOT NULL, + source_path TEXT NOT NULL, + status TEXT NOT NULL, + notes TEXT NOT NULL + ); + + CREATE TABLE IF NOT EXISTS layer_registry ( + layer_key TEXT PRIMARY KEY, + grid_level INTEGER NOT NULL, + role TEXT NOT NULL, + description TEXT NOT NULL + ); + + CREATE TABLE IF NOT EXISTS layer_summary ( + layer_key TEXT PRIMARY KEY, + source_id TEXT NOT NULL, + database_name TEXT NOT NULL, + source_table TEXT NOT NULL, + source_layer TEXT NOT NULL, + grid_level INTEGER NOT NULL, + cell_size_m REAL NOT NULL, + cell_count INTEGER NOT NULL, + bbox_min_lon REAL, + bbox_min_lat REAL, + bbox_max_lon REAL, + bbox_max_lat REAL, + generated_at TEXT NOT NULL + ); + + CREATE TABLE IF NOT EXISTS fusion_cell ( + layer_key TEXT NOT NULL, + cell_id TEXT NOT NULL, + source_id TEXT NOT NULL, + source_type TEXT NOT NULL, + database_name TEXT NOT NULL, + source_table TEXT NOT NULL, + source_layer TEXT NOT NULL, + grid_level INTEGER NOT NULL, + row_idx INTEGER NOT NULL, + col_idx INTEGER NOT NULL, + cell_size_m REAL NOT NULL, + state_name TEXT NOT NULL, + class_name TEXT NOT NULL, + source_name TEXT NOT NULL, + min_lon REAL NOT NULL, + min_lat REAL NOT NULL, + max_lon REAL NOT NULL, + max_lat REAL NOT NULL, + created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (layer_key, cell_id) + ); + + CREATE INDEX IF NOT EXISTS idx_fusion_cell_layer_grid + ON fusion_cell(layer_key, grid_level); + CREATE INDEX IF NOT EXISTS idx_fusion_cell_layer_state + ON fusion_cell(layer_key, state_name); + CREATE INDEX IF NOT EXISTS idx_fusion_cell_bbox + ON fusion_cell(layer_key, min_lon, min_lat, max_lon, max_lat); + """ + ) + conn.commit() + + +def seed_registry(conn: sqlite3.Connection, sources: Iterable[SourceSpec]) -> None: + conn.executemany( + "INSERT OR REPLACE INTO source_registry VALUES (?, ?, ?, ?, ?, ?, ?, ?)", + [ + ( + src.source_id, + src.source_type, + src.database_name, + src.source_table, + src.source_layer, + src.source_path, + "ready", + src.notes, + ) + for src in sources + ], + ) + conn.executemany( + "INSERT OR REPLACE INTO layer_registry VALUES (?, ?, ?, ?)", + [ + ( + src.layer_key, + src.grid_level, + src.role, + src.description, + ) + for src in sources + ], + ) + conn.executemany( + "INSERT OR REPLACE INTO meta(key, value) VALUES (?, ?)", + [ + ("fusion_version", "v1"), + ("fusion_scope", "japan"), + ("fusion_note", "全国 200m / 20m / 50m 障碍层统一汇聚"), + ("source_count", str(len(tuple(sources)))), + ("generated_at", dt.datetime.now().isoformat(timespec="seconds")), + ("layer_keys", json.dumps([src.layer_key for src in sources], ensure_ascii=False)), + ], + ) + conn.commit() + + +def insert_batch(conn: sqlite3.Connection, rows: list[tuple]) -> None: + conn.executemany( + """ + INSERT OR REPLACE INTO fusion_cell( + layer_key, cell_id, source_id, source_type, database_name, source_table, source_layer, + grid_level, row_idx, col_idx, cell_size_m, state_name, class_name, source_name, + min_lon, min_lat, max_lon, max_lat + ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) + """, + rows, + ) + + +def import_layer(conn: sqlite3.Connection, spec: SourceSpec, *, batch_size: int = 5000) -> dict[str, object]: + mysql_conn = mysql_connect(spec.database_name) + try: + with mysql_conn.cursor() as cur: + cur.execute( + f""" + SELECT cell_id, row_idx, col_idx, cell_size_m, state_name, class_name, + source_name, min_lon, min_lat, max_lon, max_lat + FROM {spec.source_table} + WHERE layer_name=%s + ORDER BY row_idx, col_idx + """, + (spec.source_layer,), + ) + + count = 0 + batch: list[tuple] = [] + bbox_min_lon = bbox_min_lat = math.inf + bbox_max_lon = bbox_max_lat = -math.inf + + for row in cur: + ( + cell_id, + row_idx, + col_idx, + cell_size_m, + state_name, + class_name, + source_name, + min_lon, + min_lat, + max_lon, + max_lat, + ) = row + batch.append( + ( + spec.layer_key, + str(cell_id), + spec.source_id, + spec.source_type, + spec.database_name, + spec.source_table, + spec.source_layer, + int(spec.grid_level), + int(row_idx), + int(col_idx), + float(cell_size_m), + str(state_name), + str(class_name), + str(source_name), + float(min_lon), + float(min_lat), + float(max_lon), + float(max_lat), + ) + ) + bbox_min_lon = min(bbox_min_lon, float(min_lon)) + bbox_min_lat = min(bbox_min_lat, float(min_lat)) + bbox_max_lon = max(bbox_max_lon, float(max_lon)) + bbox_max_lat = max(bbox_max_lat, float(max_lat)) + count += 1 + + if len(batch) >= batch_size: + insert_batch(conn, batch) + conn.commit() + batch.clear() + + if batch: + insert_batch(conn, batch) + conn.commit() + + finally: + mysql_conn.close() + + bbox: tuple[float, float, float, float] | None + if count == 0: + bbox = None + else: + bbox = (bbox_min_lon, bbox_min_lat, bbox_max_lon, bbox_max_lat) + + with conn.cursor() as cur: + cur.execute( + """ + INSERT OR REPLACE INTO layer_summary( + layer_key, source_id, database_name, source_table, source_layer, + grid_level, cell_size_m, cell_count, bbox_min_lon, bbox_min_lat, + bbox_max_lon, bbox_max_lat, generated_at + ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) + """, + ( + spec.layer_key, + spec.source_id, + spec.database_name, + spec.source_table, + spec.source_layer, + spec.grid_level, + float(spec.grid_level), + count, + bbox[0] if bbox else None, + bbox[1] if bbox else None, + bbox[2] if bbox else None, + bbox[3] if bbox else None, + dt.datetime.now().isoformat(timespec="seconds"), + ), + ) + conn.commit() + + return { + "source_id": spec.source_id, + "layer_key": spec.layer_key, + "grid_level": spec.grid_level, + "count": count, + "bbox_lonlat": list(bbox) if bbox else None, + "database_name": spec.database_name, + "source_table": spec.source_table, + "source_layer": spec.source_layer, + "cell_size_m": float(spec.grid_level), + "source_path": spec.source_path, + } + + +def build_manifest(conn: sqlite3.Connection, import_summaries: list[dict[str, object]]) -> dict[str, object]: + meta = dict(conn.execute("SELECT key, value FROM meta").fetchall()) + layer_rows = conn.execute( + """ + SELECT layer_key, grid_level, role, description + FROM layer_registry + ORDER BY grid_level, layer_key + """ + ).fetchall() + return { + "meta": meta, + "layers": [ + { + "layer_key": row[0], + "grid_level": row[1], + "role": row[2], + "description": row[3], + } + for row in layer_rows + ], + "imports": import_summaries, + "cell_counts": [ + { + "layer_key": row[0], + "count": row[1], + } + for row in conn.execute( + "SELECT layer_key, COUNT(*) FROM fusion_cell GROUP BY layer_key ORDER BY layer_key" + ).fetchall() + ], + } + + +def write_template(path: Path) -> None: + payload = { + "fusion_version": "v1", + "sources": [asdict(SourceSpec(**spec)) for spec in DEFAULT_SOURCES], + "notes": "这个模板只是记录默认汇聚层,不会执行导入。", + } + path.parent.mkdir(parents=True, exist_ok=True) + path.write_text(json.dumps(payload, ensure_ascii=False, indent=2), encoding="utf-8") + + +def main() -> None: + parser = argparse.ArgumentParser(description="把全国 200m / 20m / 50m 障碍层汇聚到一个 SQLite 数据库。") + parser.add_argument("--output-db", type=Path, default=DEFAULT_OUTPUT_DB) + parser.add_argument("--manifest", type=Path, default=DEFAULT_MANIFEST) + parser.add_argument("--recreate", action="store_true", help="重建输出数据库") + parser.add_argument("--emit-template", action="store_true", help="只输出默认模板 JSON,不执行汇聚") + parser.add_argument("--batch-size", type=int, default=5000, help="每批写入多少条格网记录") + args = parser.parse_args() + + if args.emit_template: + write_template(args.manifest) + print(f"已写出模板: {args.manifest}") + return + + sources = [SourceSpec(**spec) for spec in DEFAULT_SOURCES] + + conn = open_output_db(args.output_db, recreate=args.recreate) + try: + create_schema(conn) + seed_registry(conn, sources) + + import_summaries = [] + for spec in sources: + summary = import_layer(conn, spec, batch_size=args.batch_size) + import_summaries.append(summary) + print( + f"已汇聚 {spec.layer_key}: count={summary['count']} " + f"source={spec.database_name}.{spec.source_table}/{spec.source_layer}" + ) + if int(summary["count"]) == 0: + print(f"警告: {spec.layer_key} 没有导入到任何记录,请检查源库或 source_layer") + + manifest = build_manifest(conn, import_summaries) + args.manifest.parent.mkdir(parents=True, exist_ok=True) + args.manifest.write_text(json.dumps(manifest, ensure_ascii=False, indent=2), encoding="utf-8") + conn.commit() + finally: + conn.close() + + print(f"已生成融合库: {args.output_db}") + print(f"已写出清单: {args.manifest}") + + +if __name__ == "__main__": + main() diff --git a/navsea_normalize_tile_extents.py b/navsea_normalize_tile_extents.py new file mode 100644 index 0000000..5909ff3 --- /dev/null +++ b/navsea_normalize_tile_extents.py @@ -0,0 +1,103 @@ +#!/usr/bin/env python3 +from __future__ import annotations + +import argparse +import os +from pathlib import Path + +import mapbox_vector_tile + + +def parse_args() -> argparse.Namespace: + parser = argparse.ArgumentParser( + description="Normalize vector-tile layer extents by rescaling geometry coordinates." + ) + parser.add_argument("--src-root", type=Path, required=True) + parser.add_argument("--dst-root", type=Path, required=True) + parser.add_argument("--target-extent", type=int, default=4096) + parser.add_argument( + "--rewrite-all", + action="store_true", + help="rewrite every tile even when all layers already use the target extent", + ) + return parser.parse_args() + + +def scale_coordinates(value, factor: float): + if isinstance(value, (list, tuple)): + if len(value) >= 2 and isinstance(value[0], (int, float)) and isinstance(value[1], (int, float)): + return [round(value[0] * factor), round(value[1] * factor)] + return [scale_coordinates(item, factor) for item in value] + return value + + +def hardlink_or_copy(src: Path, dst: Path) -> None: + dst.parent.mkdir(parents=True, exist_ok=True) + if dst.exists(): + dst.unlink() + try: + os.link(src, dst) + except OSError: + dst.write_bytes(src.read_bytes()) + + +def normalize_tile(src: Path, dst: Path, target_extent: int, rewrite_all: bool) -> bool: + decoded = mapbox_vector_tile.decode(src.read_bytes()) + extents = { + layer_name: int(layer.get("extent") or target_extent) + for layer_name, layer in decoded.items() + } + if not rewrite_all and all(extent == target_extent for extent in extents.values()): + hardlink_or_copy(src, dst) + return False + + layers = [] + per_layer_options: dict[str, dict[str, int]] = {} + for layer_name, layer in decoded.items(): + source_extent = extents[layer_name] + factor = target_extent / source_extent if source_extent else 1.0 + features = [] + for feature in layer.get("features", []): + output_feature = { + "geometry": { + "type": feature["geometry"]["type"], + "coordinates": scale_coordinates(feature["geometry"]["coordinates"], factor), + }, + "properties": dict(feature.get("properties") or {}), + } + if feature.get("id") is not None: + output_feature["id"] = feature["id"] + features.append(output_feature) + layers.append({"name": layer_name, "features": features}) + per_layer_options[layer_name] = {"extents": target_extent} + + dst.parent.mkdir(parents=True, exist_ok=True) + if dst.exists(): + dst.unlink() + dst.write_bytes(mapbox_vector_tile.encode(layers, per_layer_options=per_layer_options)) + return True + + +def main() -> None: + args = parse_args() + if not args.src_root.exists(): + raise SystemExit(f"src root not found: {args.src_root}") + + written = 0 + linked = 0 + for src_path in sorted(args.src_root.glob("*/*/*.pbf")): + dst_path = args.dst_root / src_path.relative_to(args.src_root) + changed = normalize_tile(src_path, dst_path, args.target_extent, args.rewrite_all) + if changed: + written += 1 + else: + linked += 1 + + print( + f"normalize complete: src={args.src_root} dst={args.dst_root} " + f"rewritten={written} reused={linked} target_extent={args.target_extent}" + ) + + +if __name__ == "__main__": + main() diff --git a/navsea_reencode_unified_semantic_pbf.py b/navsea_reencode_unified_semantic_pbf.py new file mode 100644 index 0000000..2019038 --- /dev/null +++ b/navsea_reencode_unified_semantic_pbf.py @@ -0,0 +1,92 @@ +from __future__ import annotations + +import json +import os +import shutil +import subprocess +from concurrent.futures import ProcessPoolExecutor +from pathlib import Path + +import mapbox_vector_tile + +from navsea_tile_reencode_guard import decode_tile_with_extents, encode_layers_preserving_extents + + +BASE_ROOT = Path("/home/wwwroot/pbf-delivery-full-20260418-rebuild") +OUTPUT_ROOT = Path("/home/wwwroot/pbf-delivery-full-semantic-unified-20260808") +MAP_JSON = Path(__file__).resolve().parent / "src/pbf/semantic_sprite_key_map_2026-08-08.json" +FIELDS = ("chart_icon_image", "chart_fill_pattern", "chart_line_pattern") + + +def hardlink_or_copy(src: Path, dst: Path) -> None: + dst.parent.mkdir(parents=True, exist_ok=True) + if dst.exists(): + dst.unlink() + try: + os.link(src, dst) + except OSError: + shutil.copy2(src, dst) + + +def rewrite_one(args): + src_str, dst_str, value_map = args + src = Path(src_str) + dst = Path(dst_str) + raw = src.read_bytes() + decoded, extents = decode_tile_with_extents(raw) + changed = 0 + layers = [] + for layer_name, layer in decoded.items(): + features = [] + for feature in layer.get("features", []): + props = dict(feature.get("properties") or {}) + feature_changed = False + for field in FIELDS: + value = props.get(field) + if isinstance(value, str) and value in value_map: + props[field] = value_map[value] + feature_changed = True + if feature_changed: + changed += 1 + out = {"geometry": feature["geometry"], "properties": props} + if feature.get("id") is not None: + out["id"] = feature["id"] + features.append(out) + layers.append({"name": layer_name, "features": features}) + if not changed: + hardlink_or_copy(src, dst) + return 0, 0 + dst.parent.mkdir(parents=True, exist_ok=True) + # The output tree is initially made with hard links to BASE_ROOT. Break + # that link before writing so the legacy baseline can never be modified. + if dst.exists(): + dst.unlink() + dst.write_bytes(encode_layers_preserving_extents(layers, extents)) + return 1, changed + + +def main() -> None: + mapping = json.loads(MAP_JSON.read_text(encoding="utf-8")) + mapping["fill-daytime-405"] = mapping["fill-daytime-401"] + if OUTPUT_ROOT.exists(): + shutil.rmtree(OUTPUT_ROOT) + OUTPUT_ROOT.mkdir(parents=True, exist_ok=True) + subprocess.run(["cp", "-al", f"{BASE_ROOT}/.", str(OUTPUT_ROOT)], check=True) + + command = ["rg", "-a", "-l", "--no-messages", "-F"] + for key in mapping: + command.extend(["-e", key]) + command.append(str(BASE_ROOT)) + result = subprocess.run(command, check=True, capture_output=True, text=True) + paths = [Path(line) for line in result.stdout.splitlines() if line.strip()] + jobs = [(str(src), str(OUTPUT_ROOT / src.relative_to(BASE_ROOT)), mapping) for src in paths] + changed_tiles = changed_features = 0 + with ProcessPoolExecutor(max_workers=12) as executor: + for tile_changed, feature_count in executor.map(rewrite_one, jobs, chunksize=64): + changed_tiles += tile_changed + changed_features += feature_count + print(json.dumps({"base_tiles": len(list(BASE_ROOT.rglob("*.pbf"))), "scanned_tiles": len(paths), "changed_tiles": changed_tiles, "changed_features": changed_features, "output": str(OUTPUT_ROOT)}, ensure_ascii=False, indent=2)) + + +if __name__ == "__main__": + main() diff --git a/navsea_tile_builder.py b/navsea_tile_builder.py index be81bc9..bb68705 100644 --- a/navsea_tile_builder.py +++ b/navsea_tile_builder.py @@ -4,6 +4,7 @@ import argparse import hashlib import json import math +import os import re import struct from collections import defaultdict @@ -52,6 +53,27 @@ LIGHT_COLOR_REMARK_MAP = { "A": "amber", } +SEMANTIC_SPRITE_KEY_MAP_PATH = Path(__file__).resolve().parent / "src/pbf/semantic_sprite_key_map_2026-08-08.json" + + +def load_semantic_sprite_key_map() -> dict[str, str]: + if not SEMANTIC_SPRITE_KEY_MAP_PATH.exists(): + return {} + try: + data = json.loads(SEMANTIC_SPRITE_KEY_MAP_PATH.read_text(encoding="utf-8")) + except Exception: + return {} + return {str(key): str(value) for key, value in data.items()} + + +SEMANTIC_SPRITE_KEY_MAP = load_semantic_sprite_key_map() + + +def semantic_sprite_key(value: str | None) -> str | None: + if not value: + return value + return SEMANTIC_SPRITE_KEY_MAP.get(value, value) + NAVIGATION_MARK_DISPLAY_ICON_MAP = { "30300000": "symbol-daytime-303", "30300002": "symbol-daytime-303", @@ -80,6 +102,62 @@ NAVIGATION_MARK_DISPLAY_ICON_MAP = { "30900009": "symbol-daytime-30500003", "30900011": "symbol-daytime-30500003", } +NAVIGATION_MARK_DISPLAY_ICON_MAP = { + display_code: semantic_sprite_key(icon_key) or icon_key + for display_code, icon_key in NAVIGATION_MARK_DISPLAY_ICON_MAP.items() +} + +DANGER_MARK_CLASS_ICON_MAP = { + 401: "symbol-daytime-401", + 402: "symbol-daytime-401", + 403: "symbol-daytime-401", + 404: "symbol-daytime-404", + 405: "symbol-daytime-405", + 406: "symbol-daytime-406", + 407: "symbol-daytime-407", + 408: "symbol-daytime-408", + 409: "symbol-daytime-409", + 410: "symbol-daytime-410", + 411: "symbol-daytime-410", + 412: "symbol-daytime-412", + 413: "symbol-daytime-413", + 414: "symbol-daytime-414", + 415: "symbol-daytime-413", + 420: "symbol-daytime-420", + 421: "symbol-daytime-421", + 422: "symbol-daytime-422", + 424: "symbol-daytime-424", + 425: "symbol-daytime-425", + 426: "symbol-daytime-426", + 427: "symbol-daytime-427", + 428: "symbol-daytime-428", + 429: "symbol-daytime-429", + 430: "symbol-daytime-430", + 431: "symbol-daytime-431", + 432: "symbol-daytime-432", + 433: "symbol-daytime-433", + 434: "symbol-daytime-434", + 498: "symbol-daytime-498", +} +DANGER_MARK_CLASS_ICON_MAP = { + class_code: semantic_sprite_key(icon_key) or icon_key + for class_code, icon_key in DANGER_MARK_CLASS_ICON_MAP.items() +} + +ONSHORE_STRUCTURE_CLASS_ICON_MAP = { + 640: "symbol-daytime-640", + 650: "symbol-daytime-650", + 660: "symbol-daytime-660", + 661: "symbol-daytime-661", + 680: "symbol-daytime-680", + 681: "symbol-daytime-681", + 682: "symbol-daytime-682", + 698: "symbol-daytime-698", +} +ONSHORE_STRUCTURE_CLASS_ICON_MAP = { + class_code: semantic_sprite_key(icon_key) or icon_key + for class_code, icon_key in ONSHORE_STRUCTURE_CLASS_ICON_MAP.items() +} FINAL_RELEASE_PROPERTY_ALLOWLIST = frozenset( { @@ -102,6 +180,8 @@ FINAL_RELEASE_PROPERTY_ALLOWLIST = frozenset( "least_depth_m", "light_color_code", "light_sector_mode", + "arc_id", + "arc_source_code", "name_ja", "place_name_en", "shape_class_code", @@ -398,6 +478,8 @@ class NavSeaTileBuilder: fid_codec: NavSeaFidCodec | None, fid_key_id: str | None, bundle_id: str | None, + source_layer_includes: frozenset[str] | None, + arc_only: bool, ) -> None: self.db_config = db_config self.source_root = source_root @@ -416,6 +498,8 @@ class NavSeaTileBuilder: self.fid_codec = fid_codec self.fid_key_id = fid_key_id self.bundle_id = bundle_id + self.source_layer_includes = source_layer_includes + self.arc_only = arc_only with self.connect() as conn: self.mapping_registry = NavSeaMappingRegistry.load(conn, bundle_id=bundle_id) self.bundle_id = self.mapping_registry.bundle_id @@ -444,9 +528,15 @@ class NavSeaTileBuilder: for z in range(self.zmin, min(self.zmax, max(supported_zooms, default=self.zmin)) + 1): (self.output_root / str(z)).mkdir(parents=True, exist_ok=True) + if self.all_tiles: + build_mode = "all_tiles" + elif self.reference_tile_root is not None: + build_mode = f"reference={self.reference_tile_root}" + else: + build_mode = f"aoi=({self.center_lat},{self.center_lon}) radius_nm={self.radius_nm}" print( - f"AOI center=({self.center_lat},{self.center_lon}) radius_nm={self.radius_nm} " - f"supported_zooms={supported_zooms} tile_jobs={len(jobs)}" + f"build_mode={build_mode} supported_zooms={supported_zooms} tile_jobs={len(jobs)} " + f"source_layer_includes={sorted(self.source_layer_includes) if self.source_layer_includes else 'all'}" ) written = 0 @@ -475,6 +565,17 @@ class NavSeaTileBuilder: def fetch_supported_zooms(self) -> list[int]: with self.connect() as conn: with conn.cursor() as cur: + if self.source_layer_includes: + placeholders = ", ".join(["%s"] * len(self.source_layer_includes)) + sql = f""" + SELECT DISTINCT z + FROM pbf_relayer_candidates + WHERE z BETWEEN %s AND %s + AND source_layer IN ({placeholders}) + ORDER BY z + """ + cur.execute(sql, (self.zmin, self.zmax, *sorted(self.source_layer_includes))) + return [int(row["z"]) for row in cur.fetchall()] cur.execute( """ SELECT DISTINCT z @@ -488,8 +589,12 @@ class NavSeaTileBuilder: def build_jobs(self, supported_zooms: list[int]) -> list[TileJob]: if self.reference_tile_root is not None: + if self.arc_only: + return self.build_arc_jobs(supported_zooms) return self.build_reference_jobs(supported_zooms) if self.all_tiles: + if self.source_layer_includes: + return self.build_filtered_jobs(supported_zooms) return self.build_all_jobs(supported_zooms) west, south, east, north = self.aoi_bbox() @@ -502,6 +607,33 @@ class NavSeaTileBuilder: return jobs + def build_arc_jobs(self, supported_zooms: list[int]) -> list[TileJob]: + jobs: list[TileJob] = [] + with self.connect() as conn: + with conn.cursor() as cur: + cur.execute( + """ + SELECT DISTINCT r.z, r.x, r.y + FROM pbf_relayer_candidates r + JOIN properties arc + ON arc.feature_id = r.feature_id + AND arc.k = '明弧/分孤' + AND arc.v NOT IN ('0', '0.0') + WHERE r.z BETWEEN %s AND %s + AND r.source_layer = 'p航路標識群' + ORDER BY r.z, r.x, r.y + """, + (self.zmin, self.zmax), + ) + for row in cur.fetchall(): + z, x, y = int(row["z"]), int(row["x"]), int(row["y"]) + if (self.source_root / str(z) / str(x) / f"{y}.pbf").exists() and ( + self.reference_tile_root is None + or (self.reference_tile_root / str(z) / str(x) / f"{y}.pbf").exists() + ): + jobs.append(TileJob(z=z, x=x, y=y)) + return jobs + def build_all_jobs(self, supported_zooms: list[int]) -> list[TileJob]: jobs: list[TileJob] = [] zoom_set = set(supported_zooms) @@ -519,6 +651,33 @@ class NavSeaTileBuilder: return jobs + def build_filtered_jobs(self, supported_zooms: list[int]) -> list[TileJob]: + jobs: list[TileJob] = [] + zoom_set = set(supported_zooms) + with self.connect() as conn: + with conn.cursor() as cur: + placeholders = ", ".join(["%s"] * len(self.source_layer_includes or ())) + cur.execute( + f""" + SELECT DISTINCT z, x, y + FROM pbf_relayer_candidates + WHERE z BETWEEN %s AND %s + AND source_layer IN ({placeholders}) + ORDER BY z, x, y + """, + (self.zmin, self.zmax, *sorted(self.source_layer_includes or ())), + ) + for row in cur.fetchall(): + z = int(row["z"]) + x = int(row["x"]) + y = int(row["y"]) + if z not in zoom_set or z < self.zmin or z > self.zmax: + continue + if not (self.source_root / str(z) / str(x) / f"{y}.pbf").exists(): + continue + jobs.append(TileJob(z=z, x=x, y=y)) + return jobs + def build_reference_jobs(self, supported_zooms: list[int]) -> list[TileJob]: jobs: list[TileJob] = [] zoom_set = set(supported_zooms) @@ -577,6 +736,12 @@ class NavSeaTileBuilder: def fetch_tile_rows(self, job: TileJob) -> list[dict]: with self.connect() as conn: with conn.cursor() as cur: + layer_filter_sql = "" + layer_filter_args: tuple[str, ...] = () + if self.source_layer_includes: + placeholders = ", ".join(["%s"] * len(self.source_layer_includes)) + layer_filter_sql = f" AND r.source_layer IN ({placeholders})" + layer_filter_args = tuple(sorted(self.source_layer_includes)) cur.execute( """ SELECT @@ -596,9 +761,12 @@ class NavSeaTileBuilder: WHERE r.z = %s AND r.x = %s AND r.y = %s + """ + + layer_filter_sql + + """ ORDER BY r.feature_id """, - (job.z, job.x, job.y), + (job.z, job.x, job.y, *layer_filter_args), ) return list(cur.fetchall()) @@ -904,6 +1072,13 @@ class NavSeaTileBuilder: if light_sector_mode: chart["light_sector_mode"] = light_sector_mode + arc_source_code = text_or_none(properties.get("明弧/分孤")) + if source_layer == "p航路標識群" and arc_source_code and arc_source_code not in {"0", "0.0"}: + chart["arc_source_code"] = arc_source_code + mapped_arc = semantic_sprite_key(f"arc-daytime-{arc_source_code}") + if mapped_arc: + chart["arc_id"] = mapped_arc + hazard_class, hazard_severity = self.infer_hazard_semantics(source_layer, canonical_object_type) if hazard_class: chart.setdefault("hazard_class", hazard_class) @@ -920,6 +1095,7 @@ class NavSeaTileBuilder: chart_symbol_code=text_or_none(chart.get("chart_symbol_code")) or "", light_color_code=text_or_none(chart.get("light_color_code")) or "", hazard_class=text_or_none(chart.get("hazard_class")) or "", + class_code=chart.get("class_code") if isinstance(chart.get("class_code"), int) else properties.get("分類番号") if isinstance(properties.get("分類番号"), int) else None, display_code=text_or_none(properties.get("表示用番号")) or text_or_none(properties.get("display_code")) or "", ) if chart_icon_image: @@ -1512,67 +1688,79 @@ class NavSeaTileBuilder: chart_symbol_code: str, light_color_code: str, hazard_class: str, + class_code: int | None, display_code: str, ) -> str | None: if source_layer == "p航路標識群": if display_code: mapped = NAVIGATION_MARK_DISPLAY_ICON_MAP.get(display_code) if mapped: - return mapped + return semantic_sprite_key(mapped) if chart_symbol_code == "leading_light": - return "symbol-daytime-300" + return semantic_sprite_key("symbol-daytime-300") if chart_symbol_code == "lighthouse": - return "symbol-daytime-301" + return semantic_sprite_key("symbol-daytime-301") if chart_symbol_code in {"beacon", "light_beacon"}: - return "symbol-daytime-310" + return semantic_sprite_key("symbol-daytime-310") if chart_symbol_code == "light_buoy": - return "symbol-daytime-320" + return semantic_sprite_key("symbol-daytime-320") if "浮標 (やぐら型)" in canonical_object_type: - return "symbol-daytime-327" + return semantic_sprite_key("symbol-daytime-327") if "円柱型浮標" in canonical_object_type: - return "symbol-daytime-323" + return semantic_sprite_key("symbol-daytime-323") if "円筒型浮標" in canonical_object_type: - return "symbol-daytime-325" + return semantic_sprite_key("symbol-daytime-325") if chart_symbol_code in {"buoy", "nav_mark"}: - return "symbol-daytime-321" + return semantic_sprite_key("symbol-daytime-321") if chart_symbol_code == "vais": - return "symbol-daytime-335359" + return semantic_sprite_key("symbol-daytime-335359") if light_color_code: - return "light-daytime-3" + return semantic_sprite_key("light-daytime-3") + if source_layer == "p陸上構造物" and class_code is not None: + mapped = ONSHORE_STRUCTURE_CLASS_ICON_MAP.get(class_code) + if mapped: + return mapped if source_layer in {"p航行危険障害物", "p投錨注意障害物"}: + if class_code is not None: + mapped = DANGER_MARK_CLASS_ICON_MAP.get(class_code) + if mapped: + return mapped if "船体露出沈船" in canonical_object_type: - return "symbol-daytime-410" + return semantic_sprite_key("symbol-daytime-410") if "危険全沈没船" in canonical_object_type: - return "symbol-daytime-412" + return semantic_sprite_key("symbol-daytime-412") if "測定済みの沈船" in canonical_object_type: - return "symbol-daytime-413" + return semantic_sprite_key("symbol-daytime-413") if chart_symbol_code == "fish_reef": - return "symbol-daytime-428" + return semantic_sprite_key("symbol-daytime-428") if hazard_class == "rock": - return "symbol-daytime-405" + return semantic_sprite_key("symbol-daytime-405") if hazard_class == "reef": - return "symbol-daytime-421" + return semantic_sprite_key("symbol-daytime-421") if hazard_class == "wreck": - return "symbol-daytime-429" + return semantic_sprite_key("symbol-daytime-429") if hazard_class == "obstruction": - return "symbol-daytime-428" + return semantic_sprite_key("symbol-daytime-428") if source_layer == "p錨泊地等": - return "symbol-daytime-719" + return semantic_sprite_key("symbol-daytime-719") return None @staticmethod def infer_chart_fill_pattern(source_layer: str, chart_fill_style: str, hazard_class: str) -> str | None: if source_layer in {"P投錨注意障害物", "P航行危険障害物"}: if chart_fill_style == "fish_reef_area": - return "fill-daytime-428" + return semantic_sprite_key("fill-daytime-428") if chart_fill_style == "reef_area" or hazard_class == "reef": - return "fill-daytime-421" + return semantic_sprite_key("fill-daytime-421") if chart_fill_style == "submerged_reef_area": - return "fill-daytime-421" + return semantic_sprite_key("fill-daytime-421") if chart_fill_style == "hazard_area": - return "fill-daytime-405" + # The legacy style maps hazard-area class 405 to the 401 + # texture. There is no standalone fill-daytime-405 image + # in the source sprite, so never emit a missing key. + return semantic_sprite_key("fill-daytime-401") if source_layer == "P施設・境界線等" and chart_fill_style == "facility_area": - return "fill-daytime-754" + return semantic_sprite_key("fill-daytime-754") return None @staticmethod @@ -1619,8 +1807,15 @@ def parse_args() -> argparse.Namespace: parser.add_argument("--output", type=Path, default=DEFAULT_OUTPUT_ROOT) parser.add_argument("--source-root", type=Path, default=SOURCE_TILE_ROOT) parser.add_argument("--workers", type=int, default=4) + parser.add_argument("--db-host", default=os.getenv("NAVSEA_DB_HOST", "localhost")) + parser.add_argument("--db-port", type=int, default=int(os.getenv("NAVSEA_DB_PORT", "3306"))) + parser.add_argument("--db-user", default=os.getenv("NAVSEA_DB_USER", "root")) + parser.add_argument("--db-password", default=os.getenv("NAVSEA_DB_PASSWORD", "2chi9ks2")) + parser.add_argument("--db-name", default=os.getenv("NAVSEA_DB_NAME", "pbf_analysis")) + parser.add_argument("--db-socket", default=os.getenv("NAVSEA_DB_SOCKET", "/tmp/mysql.sock")) parser.add_argument("--all-tiles", action="store_true") parser.add_argument("--reference-tile-root", type=Path) + parser.add_argument("--arc-only", action="store_true", help="only schedule tiles containing non-zero 明弧/分孤 objects") parser.add_argument("--engineering", action="store_true") parser.add_argument( "--strip-legacy-japanese-delivery", @@ -1642,6 +1837,12 @@ def parse_args() -> argparse.Namespace: parser.add_argument("--fid-key") parser.add_argument("--fid-key-id", default="navsea-fid-key-v1") parser.add_argument("--bundle-id", default="navsea-reversible-v1") + parser.add_argument( + "--source-layer-include", + action="append", + dest="source_layer_includes", + help="only include rows whose legacy source-layer matches one of the provided values; can be repeated", + ) parser.set_defaults(strip_legacy_japanese_delivery=True) args = parser.parse_args() @@ -1665,7 +1866,14 @@ def main() -> None: args = parse_args() fid_codec = NavSeaFidCodec(args.fid_key.encode("utf-8")) if args.fid_key else None builder = NavSeaTileBuilder( - db_config=DbConfig(), + db_config=DbConfig( + host=args.db_host, + port=args.db_port, + user=args.db_user, + password=args.db_password, + database=args.db_name, + unix_socket=args.db_socket or None, + ), source_root=args.source_root, output_root=args.output, center_lat=args.center_lat, @@ -1682,6 +1890,8 @@ def main() -> None: fid_codec=fid_codec, fid_key_id=args.fid_key_id, bundle_id=args.bundle_id, + source_layer_includes=frozenset(args.source_layer_includes) if args.source_layer_includes else None, + arc_only=args.arc_only, ) builder.build() diff --git a/report/current_pbf_inventory_full_semantic_20260809/summary.json b/report/current_pbf_inventory_full_semantic_20260809/summary.json new file mode 100644 index 0000000..beaf051 --- /dev/null +++ b/report/current_pbf_inventory_full_semantic_20260809/summary.json @@ -0,0 +1,41 @@ +{ + "pbf_root": "/home/wwwroot/pbf-delivery-full-semantic-unified-20260808", + "tile_count": 65148, + "tiles_by_zoom": { + "z0": 1, + "z10": 3156, + "z11": 12279, + "z12": 48556, + "z5": 10, + "z6": 27, + "z7": 76, + "z8": 230, + "z9": 813 + }, + "feature_count": 6685117, + "layer_count": 53, + "property_count": 24, + "style_get_fields": [ + "arc_id", + "canonical_object_type", + "chart_fill_pattern", + "chart_fill_style", + "chart_icon_image", + "chart_label_position_code", + "chart_label_subtext", + "chart_label_text", + "chart_line_color", + "chart_line_pattern", + "chart_line_width", + "chart_symbol_code", + "chart_text_color", + "chart_text_style", + "class_code", + "depth_value_m", + "display_code", + "light_color_code", + "name_ja", + "place_name_en", + "shape_class_code" + ] +} diff --git a/report/current_pbf_inventory_full_semantic_20260809/图层分类.csv b/report/current_pbf_inventory_full_semantic_20260809/图层分类.csv new file mode 100644 index 0000000..76f15ca --- /dev/null +++ b/report/current_pbf_inventory_full_semantic_20260809/图层分类.csv @@ -0,0 +1,54 @@ +layer,feature_count,geometry_counts,property_count,properties +bathymetry_line,2075172,"{""LineString"": 1866386, ""MultiLineString"": 208786}",5,"canonical_object_type,chart_label_text,chart_text_color,chart_text_style,depth_value_m" +onshore_structure_line,1258262,"{""LineString"": 1256228, ""MultiLineString"": 2034}",2,"canonical_object_type,class_code" +baseline_outline,1080780,"{""LineString"": 1074484, ""MultiLineString"": 6296}",2,"canonical_object_type,class_code" +baseline_area,701625,"{""Polygon"": 602066, ""MultiPolygon"": 99559}",3,"canonical_object_type,chart_fill_style,class_code" +depth_contour,445051,"{""LineString"": 437566, ""MultiLineString"": 7485}",6,"canonical_object_type,chart_label_text,chart_text_color,chart_text_style,class_code,least_depth_m" +hole_area,367217,"{""Polygon"": 361754, ""MultiPolygon"": 5463}",2,"canonical_object_type,chart_fill_style" +land_area,198655,"{""Polygon"": 193114, ""MultiPolygon"": 5541}",3,"canonical_object_type,chart_fill_style,class_code" +seabed_text_point,99863,"{""Point"": 99863}",7,"canonical_object_type,chart_label_position_code,chart_label_text,chart_text_color,chart_text_style,class_code,name_ja" +baseline_line,53615,"{""LineString"": 53612, ""MultiLineString"": 3}",2,"canonical_object_type,class_code" +hazard_boundary_outline,51962,"{""LineString"": 51743, ""MultiLineString"": 219}",2,"canonical_object_type,class_code" +anchor_caution_hazard_point,49907,"{""Point"": 49907}",4,"canonical_object_type,chart_icon_image,chart_symbol_code,class_code" +navigation_marks,38520,"{""Point"": 38520}",15,"arc_id,arc_source_code,canonical_object_type,chart_icon_image,chart_label_position_code,chart_label_subtext,chart_label_text,chart_symbol_code,chart_text_color,chart_text_style,display_code,light_color_code,light_sector_mode,name_ja,shape_class_code" +place_label_sea,36247,"{""Point"": 36247}",6,"canonical_object_type,chart_label_text,chart_text_color,chart_text_style,class_code,place_name_en" +onshore_structure_area,35622,"{""Polygon"": 35580, ""MultiPolygon"": 42}",3,"canonical_object_type,chart_fill_style,class_code" +place_label_land,35388,"{""Point"": 35388}",6,"canonical_object_type,chart_label_text,chart_text_color,chart_text_style,class_code,place_name_en" +onshore_structure_point,32708,"{""Point"": 32708}",3,"canonical_object_type,chart_symbol_code,class_code" +bridge_structure,25775,"{""Polygon"": 25708, ""MultiPolygon"": 67}",3,"canonical_object_type,chart_fill_style,class_code" +fixed_fishing_gear_area,22595,"{""Polygon"": 22325, ""MultiPolygon"": 270}",3,"canonical_object_type,chart_fill_style,class_code" +navigation_hazard_point,19268,"{""Point"": 19268}",4,"canonical_object_type,chart_icon_image,chart_symbol_code,class_code" +seabed_line,14391,"{""LineString"": 14271, ""MultiLineString"": 120}",2,"canonical_object_type,class_code" +anchor_caution_hazard_outline,8743,"{""LineString"": 8465, ""MultiLineString"": 278}",3,"canonical_object_type,chart_line_width,class_code" +anchor_caution_hazard_area,8719,"{""Polygon"": 8703, ""MultiPolygon"": 16}",4,"canonical_object_type,chart_fill_pattern,chart_fill_style,class_code" +depth_contour_overview,5551,"{""LineString"": 5497, ""MultiLineString"": 54}",3,"canonical_object_type,class_code,least_depth_m" +facility_boundary_point,5019,"{""Point"": 5019}",5,"canonical_object_type,chart_label_text,chart_symbol_code,class_code,name_ja" +submerged_reef_area,3881,"{""Polygon"": 3780, ""MultiPolygon"": 101}",3,"canonical_object_type,chart_fill_style,class_code" +depth_zone_741,1696,"{""LineString"": 1665, ""MultiLineString"": 31}",2,"canonical_object_type,class_code" +facility_boundary_area,1406,"{""Polygon"": 1406}",4,"canonical_object_type,chart_fill_pattern,chart_fill_style,class_code" +clearance_limit_line,1028,"{""LineString"": 1028}",2,"canonical_object_type,class_code" +route_outline,864,"{""LineString"": 755, ""MultiLineString"": 109}",2,"canonical_object_type,class_code" +clearance_limit_point,858,"{""Point"": 858}",6,"canonical_object_type,chart_label_text,chart_text_style,class_code,clearance_height_m,name_ja" +clip_outline_754,771,"{""LineString"": 730, ""MultiLineString"": 41}",2,"canonical_object_type,class_code" +facility_boundary_outline,566,"{""LineString"": 521, ""MultiLineString"": 45}",4,"canonical_object_type,chart_line_color,chart_line_width,class_code" +depth_zone_739,429,"{""LineString"": 424, ""MultiLineString"": 5}",2,"canonical_object_type,class_code" +route_boundary_point,395,"{""Point"": 395}",3,"canonical_object_type,chart_symbol_code,class_code" +anchorage_point,366,"{""Point"": 366}",4,"canonical_object_type,chart_icon_image,chart_symbol_code,class_code" +route_area,352,"{""Polygon"": 349, ""MultiPolygon"": 3}",3,"canonical_object_type,chart_fill_style,class_code" +anchorage_area,308,"{""Polygon"": 308}",3,"canonical_object_type,chart_fill_style,class_code" +anchorage_outline,297,"{""LineString"": 240, ""MultiLineString"": 57}",4,"canonical_object_type,chart_line_color,chart_line_width,class_code" +navigation_hazard_outline,198,"{""LineString"": 191, ""MultiLineString"": 7}",3,"canonical_object_type,chart_line_width,class_code" +navigation_hazard_area,159,"{""Polygon"": 159}",4,"canonical_object_type,chart_fill_pattern,chart_fill_style,class_code" +depth_zone_748,145,"{""LineString"": 145}",2,"canonical_object_type,class_code" +depth_zone_749,140,"{""LineString"": 140}",2,"canonical_object_type,class_code" +route_axis_line,116,"{""LineString"": 116}",2,"canonical_object_type,class_code" +leading_line_outline,101,"{""LineString"": 101}",2,"canonical_object_type,class_code" +depth_zone_725,95,"{""LineString"": 95}",2,"canonical_object_type,class_code" +pilot_station_point,88,"{""Point"": 88}",3,"canonical_object_type,chart_symbol_code,class_code" +depth_zone_740,51,"{""LineString"": 51}",2,"canonical_object_type,class_code" +hazard_boundary_line,47,"{""LineString"": 47}",2,"canonical_object_type,class_code" +clip_outline_730,27,"{""LineString"": 18, ""MultiLineString"": 9}",2,"canonical_object_type,class_code" +facility_boundary_area_transparent,27,"{""Polygon"": 27}",3,"canonical_object_type,chart_fill_style,class_code" +clip_outline_721,27,"{""LineString"": 24, ""MultiLineString"": 3}",2,"canonical_object_type,class_code" +depth_zone_700,14,"{""LineString"": 14}",2,"canonical_object_type,class_code" +depth_zone_702,10,"{""LineString"": 10}",2,"canonical_object_type,class_code" diff --git a/report/current_pbf_inventory_full_semantic_20260809/字段值分类.csv b/report/current_pbf_inventory_full_semantic_20260809/字段值分类.csv new file mode 100644 index 0000000..5c715dc --- /dev/null +++ b/report/current_pbf_inventory_full_semantic_20260809/字段值分类.csv @@ -0,0 +1,3677 @@ +field,value,feature_count,layers +chart_text_color,#000000,2730192,"{""bathymetry_line"": 2075172, ""depth_contour"": 445051, ""navigation_marks"": 38471, ""place_label_land"": 35388, ""place_label_sea"": 36247, ""seabed_text_point"": 99863}" +chart_text_style,depth_text,2520223,"{""bathymetry_line"": 2075172, ""depth_contour"": 445051}" +canonical_object_type,bathymetry_line,2075172,"{""bathymetry_line"": 2075172}" +class_code,630,1258262,"{""onshore_structure_line"": 1258262}" +canonical_object_type,road,1258262,"{""onshore_structure_line"": 1258262}" +canonical_object_type,baseline_outline,1080780,"{""baseline_outline"": 1080780}" +class_code,100,887065,"{""baseline_outline"": 688410, ""land_area"": 198655}" +canonical_object_type,depth_contour_line,441178,"{""depth_contour"": 441178}" +canonical_object_type,seabed_hole,367217,"{""hole_area"": 367217}" +chart_fill_style,seabed_hole,367217,"{""hole_area"": 367217}" +class_code,130,358545,"{""baseline_area"": 128882, ""baseline_outline"": 229663}" +class_code,141,239851,"{""baseline_area"": 53697, ""depth_contour"": 186154}" +canonical_object_type,land_area,198655,"{""land_area"": 198655}" +chart_fill_style,land_area,198655,"{""land_area"": 198655}" +class_code,120,185447,"{""baseline_area"": 65149, ""baseline_outline"": 120298}" +class_code,142,156922,"{""baseline_area"": 41207, ""depth_contour"": 115715}" +canonical_object_type,tidal_flat,128882,"{""baseline_area"": 128882}" +chart_fill_style,tidal_flat,128882,"{""baseline_area"": 128882}" +chart_label_position_code,c,100063,"{""navigation_marks"": 215, ""seabed_text_point"": 99848}" +class_code,590,99863,"{""seabed_text_point"": 99863}" +canonical_object_type,seabed_material,99863,"{""seabed_text_point"": 99863}" +chart_text_style,seabed_text,99863,"{""seabed_text_point"": 99863}" +class_code,140,93617,"{""depth_contour"": 93617}" +class_code,148,87488,"{""baseline_area"": 87488}" +canonical_object_type,5-10m,87488,"{""baseline_area"": 87488}" +chart_fill_style,depth_zone_5-10m,87488,"{""baseline_area"": 87488}" +class_code,150,83499,"{""hazard_boundary_outline"": 51962, ""baseline_area"": 31537}" +chart_fill_style,coast_structure_area,80811,"{""baseline_area"": 80811}" +class_code,145,74972,"{""baseline_area"": 69421, ""depth_contour_overview"": 5551}" +canonical_object_type,2-5m,69421,"{""baseline_area"": 69421}" +chart_fill_style,depth_zone_2-5m,69421,"{""baseline_area"": 69421}" +canonical_object_type,breakwater,65149,"{""baseline_area"": 65149}" +canonical_object_type,0-2m,53697,"{""baseline_area"": 53697}" +chart_fill_style,depth_zone_0-2m,53697,"{""baseline_area"": 53697}" +class_code,143,53198,"{""depth_contour"": 45681, ""baseline_area"": 7517}" +chart_icon_image,reef_fish,52647,"{""anchor_caution_hazard_point"": 48510, ""navigation_hazard_point"": 4137}" +canonical_object_type,hazard_boundary_outline,51962,"{""hazard_boundary_outline"": 51962}" +class_code,200,44071,"{""baseline_area"": 44071}" +canonical_object_type,10-20m,44071,"{""baseline_area"": 44071}" +chart_fill_style,depth_zone_10-20m,44071,"{""baseline_area"": 44071}" +canonical_object_type,0-5m,41207,"{""baseline_area"": 41207}" +chart_fill_style,depth_zone_0-5m,41207,"{""baseline_area"": 41207}" +chart_text_style,light_label,38520,"{""navigation_marks"": 38520}" +canonical_object_type,sea_place_name,36247,"{""place_label_sea"": 36247}" +chart_text_style,place_name_sea,36247,"{""place_label_sea"": 36247}" +chart_fill_style,land_structure_area,35622,"{""onshore_structure_area"": 35622}" +canonical_object_type,land_place_name,35388,"{""place_label_land"": 35388}" +chart_text_style,place_name_land,35388,"{""place_label_land"": 35388}" +chart_label_position_code,l,34455,"{""navigation_marks"": 34455}" +chart_symbol_code,hazard_mark,34136,"{""anchor_caution_hazard_point"": 31142, ""navigation_hazard_point"": 2994}" +class_code,830,32781,"{""place_label_land"": 32781}" +chart_symbol_code,landmark,32708,"{""onshore_structure_point"": 32708}" +canonical_object_type,shoal_danger_area,31537,"{""baseline_area"": 31537}" +chart_fill_style,shoal_danger_area,31537,"{""baseline_area"": 31537}" +class_code,420,31318,"{""anchor_caution_hazard_point"": 22314, ""anchor_caution_hazard_area"": 4522, ""anchor_caution_hazard_outline"": 4482}" +light_sector_mode,omni,30215,"{""navigation_marks"": 30215}" +class_code,121,30090,"{""baseline_area"": 13216, ""baseline_line"": 16874}" +canonical_object_type,floating_facility_pier,30090,"{""baseline_area"": 13216, ""baseline_line"": 16874}" +class_code,610,26855,"{""onshore_structure_area"": 26855}" +canonical_object_type,building,26855,"{""onshore_structure_area"": 26855}" +canonical_object_type,dangerous_object,26836,"{""anchor_caution_hazard_point"": 22314, ""anchor_caution_hazard_area"": 4522}" +class_code,600,26206,"{""bridge_structure"": 25775, ""clearance_limit_point"": 431}" +canonical_object_type,bridge_water_gate,25775,"{""bridge_structure"": 25775}" +chart_fill_style,bridge_area,25775,"{""bridge_structure"": 25775}" +class_code,123,25497,"{""baseline_line"": 25497}" +canonical_object_type,pier_single_line,25497,"{""baseline_line"": 25497}" +class_code,428,24683,"{""anchor_caution_hazard_point"": 16403, ""anchor_caution_hazard_area"": 4131, ""anchor_caution_hazard_outline"": 4149}" +class_code,122,24679,"{""baseline_outline"": 24679}" +chart_fill_style,fishery_area,22595,"{""fixed_fishing_gear_area"": 22595}" +class_code,910,19025,"{""fixed_fishing_gear_area"": 19025}" +canonical_object_type,demarcated_fishery,19025,"{""fixed_fishing_gear_area"": 19025}" +class_code,160,18833,"{""baseline_area"": 11795, ""baseline_outline"": 7038}" +class_code,260,17027,"{""baseline_area"": 17027}" +canonical_object_type,1000-2000m,17027,"{""baseline_area"": 17027}" +chart_fill_style,depth_zone_1000-2000m,17027,"{""baseline_area"": 17027}" +canonical_object_type,fish_reef,16608,"{""anchor_caution_hazard_point"": 12477, ""anchor_caution_hazard_area"": 4131}" +class_code,220,16472,"{""baseline_area"": 16472}" +canonical_object_type,20-100m,16472,"{""baseline_area"": 16472}" +chart_fill_style,depth_zone_20-100m,16472,"{""baseline_area"": 16472}" +class_code,270,15681,"{""baseline_area"": 15681}" +canonical_object_type,2000-3000m,15681,"{""baseline_area"": 15681}" +chart_fill_style,depth_zone_2000-3000m,15681,"{""baseline_area"": 15681}" +chart_icon_image,light_minor,15310,"{""navigation_marks"": 15310}" +chart_symbol_code,rock_awash,14948,"{""navigation_hazard_point"": 14948}" +chart_icon_image,hazard_cleared,14948,"{""navigation_hazard_point"": 14948}" +shape_class_code,306,14936,"{""navigation_marks"": 14936}" +canonical_object_type,minor_light,14936,"{""navigation_marks"": 14936}" +chart_symbol_code,minor_light,14936,"{""navigation_marks"": 14936}" +class_code,230,14153,"{""baseline_area"": 14153}" +canonical_object_type,100-200m,14153,"{""baseline_area"": 14153}" +chart_fill_style,depth_zone_100-200m,14153,"{""baseline_area"": 14153}" +class_code,850,13939,"{""place_label_sea"": 13939}" +chart_fill_style,river_water,13892,"{""baseline_area"": 13892}" +class_code,250,13824,"{""baseline_area"": 13824}" +canonical_object_type,500-1000m,13824,"{""baseline_area"": 13824}" +chart_fill_style,depth_zone_500-1000m,13824,"{""baseline_area"": 13824}" +class_code,710,12817,"{""seabed_line"": 12817}" +canonical_object_type,subsea_cable_telecom,12817,"{""seabed_line"": 12817}" +chart_symbol_code,fish_reef,12485,"{""anchor_caution_hazard_point"": 12479, ""navigation_hazard_point"": 6}" +class_code,280,12484,"{""baseline_area"": 12484}" +canonical_object_type,3000-4000m,12484,"{""baseline_area"": 12484}" +chart_fill_style,depth_zone_3000-4000m,12484,"{""baseline_area"": 12484}" +class_code,240,12032,"{""baseline_area"": 12032}" +canonical_object_type,200-500m,12032,"{""baseline_area"": 12032}" +chart_fill_style,depth_zone_200-500m,12032,"{""baseline_area"": 12032}" +class_code,820,11975,"{""place_label_sea"": 11975}" +class_code,291,11884,"{""baseline_area"": 11884}" +canonical_object_type,5000-6000m,11884,"{""baseline_area"": 11884}" +chart_fill_style,depth_zone_5000-6000m,11884,"{""baseline_area"": 11884}" +canonical_object_type,river_area,11795,"{""baseline_area"": 11795}" +class_code,290,10829,"{""baseline_area"": 10829}" +canonical_object_type,4000-5000m,10829,"{""baseline_area"": 10829}" +chart_fill_style,depth_zone_4000-5000m,10829,"{""baseline_area"": 10829}" +class_code,650,10818,"{""onshore_structure_point"": 10818}" +canonical_object_type,tower_yagura_windmill,10818,"{""onshore_structure_point"": 10818}" +class_code,404,10366,"{""navigation_hazard_point"": 10366}" +canonical_object_type,sunken_rock,10366,"{""navigation_hazard_point"": 10366}" +class_code,681,9686,"{""onshore_structure_point"": 9686}" +canonical_object_type,mountain_top,9686,"{""onshore_structure_point"": 9686}" +chart_line_width,1,9507,"{""anchor_caution_hazard_outline"": 8743, ""navigation_hazard_outline"": 198, ""facility_boundary_outline"": 566}" +light_color_code,red,9413,"{""navigation_marks"": 9413}" +class_code,125,9367,"{""baseline_line"": 9367}" +canonical_object_type,offshore_berth_single_line,9367,"{""baseline_line"": 9367}" +light_color_code,yellow,8889,"{""navigation_marks"": 8889}" +class_code,620,8765,"{""onshore_structure_area"": 8765}" +canonical_object_type,tank,8765,"{""onshore_structure_area"": 8765}" +canonical_object_type,anchor_caution_hazard_outline,8743,"{""anchor_caution_hazard_outline"": 8743}" +class_code,175,8493,"{""submerged_reef_area"": 3881, ""baseline_outline"": 4612}" +chart_symbol_code,lighthouse,8403,"{""navigation_marks"": 8403}" +light_color_code,green,8388,"{""navigation_marks"": 8388}" +chart_icon_image,lighthouse_harbor,8301,"{""navigation_marks"": 8301}" +class_code,640,8123,"{""onshore_structure_point"": 8123}" +canonical_object_type,chimney,8123,"{""onshore_structure_point"": 8123}" +canonical_object_type,0-10m,7517,"{""baseline_area"": 7517}" +chart_fill_style,depth_zone_0-10m,7517,"{""baseline_area"": 7517}" +chart_label_subtext,Y,7360,"{""navigation_marks"": 7360}" +light_color_code,white,6291,"{""navigation_marks"": 6291}" +chart_icon_image,beacon_light,6129,"{""navigation_marks"": 6129}" +chart_symbol_code,obstruction,6026,"{""anchor_caution_hazard_point"": 4889, ""navigation_hazard_point"": 1137}" +canonical_object_type,overview_depth_contour,5551,"{""depth_contour_overview"": 5551}" +class_code,292,5499,"{""baseline_area"": 5499}" +canonical_object_type,6000-7000m,5499,"{""baseline_area"": 5499}" +chart_fill_style,depth_zone_6000-7000m,5499,"{""baseline_area"": 5499}" +display_code,30600003,5120,"{""navigation_marks"": 5120}" +class_code,860,5030,"{""place_label_sea"": 5030}" +chart_symbol_code,facility_mark,5019,"{""facility_boundary_point"": 5019}" +chart_symbol_code,buoy,4738,"{""navigation_marks"": 4738}" +chart_fill_style,hazard_area,4722,"{""anchor_caution_hazard_area"": 4588, ""navigation_hazard_area"": 134}" +chart_fill_pattern,pattern_fill_rock_hazard,4718,"{""anchor_caution_hazard_area"": 4584, ""navigation_hazard_area"": 134}" +shape_class_code,302,4679,"{""navigation_marks"": 4679}" +canonical_object_type,breakwater_lighthouse,4679,"{""navigation_marks"": 4679}" +chart_label_subtext,R,4669,"{""navigation_marks"": 4669}" +class_code,151,4554,"{""baseline_area"": 4507, ""hazard_boundary_line"": 47}" +canonical_object_type,unsurveyed_area,4554,"{""baseline_area"": 4507, ""hazard_boundary_line"": 47}" +chart_fill_style,unsurveyed_area,4507,"{""baseline_area"": 4507}" +chart_symbol_code,light_beacon,4488,"{""navigation_marks"": 4488}" +class_code,170,4319,"{""baseline_outline"": 4319}" +class_code,425,4175,"{""anchor_caution_hazard_point"": 4175}" +canonical_object_type,seagrass,4175,"{""anchor_caution_hazard_point"": 4175}" +chart_fill_style,fish_reef_area,4156,"{""anchor_caution_hazard_area"": 4131, ""navigation_hazard_area"": 25}" +chart_fill_pattern,pattern_fill_fish_reef,4156,"{""anchor_caution_hazard_area"": 4131, ""navigation_hazard_area"": 25}" +chart_label_subtext,G,3981,"{""navigation_marks"": 3981}" +canonical_object_type,anchor_caution_hazard_point,3926,"{""anchor_caution_hazard_point"": 3926}" +canonical_object_type,submerged_reef,3881,"{""submerged_reef_area"": 3881}" +chart_fill_style,submerged_reef_area,3881,"{""submerged_reef_area"": 3881}" +class_code,800,3873,"{""depth_contour"": 3873}" +canonical_object_type,湖沼等深線,3873,"{""depth_contour"": 3873}" +chart_label_position_code,tl,3865,"{""navigation_marks"": 3850, ""seabed_text_point"": 15}" +display_code,30600002,3755,"{""navigation_marks"": 3755}" +class_code,900,3570,"{""fixed_fishing_gear_area"": 3570}" +canonical_object_type,fixed_fishery,3570,"{""fixed_fishing_gear_area"": 3570}" +class_code,403,3323,"{""navigation_hazard_point"": 3323}" +canonical_object_type,awash_rock,3323,"{""navigation_hazard_point"": 3323}" +class_code,520,3169,"{""facility_boundary_point"": 3169}" +canonical_object_type,fishing_port,3169,"{""facility_boundary_point"": 3169}" +display_code,30600001,3166,"{""navigation_marks"": 3166}" +class_code,840,3128,"{""place_label_sea"": 3128}" +chart_symbol_code,light_buoy,3123,"{""navigation_marks"": 3123}" +chart_icon_image,buoy_light,3123,"{""navigation_marks"": 3123}" +shape_class_code,312,2936,"{""navigation_marks"": 2936}" +canonical_object_type,light_buoy_lattice,2936,"{""navigation_marks"": 2936}" +class_code,661,2914,"{""onshore_structure_point"": 2914}" +canonical_object_type,fishing_cooperative,2914,"{""onshore_structure_point"": 2914}" +shape_class_code,313,2625,"{""navigation_marks"": 2625}" +canonical_object_type,lattice_buoy,2625,"{""navigation_marks"": 2625}" +chart_icon_image,buoy_cone,2625,"{""navigation_marks"": 2625}" +class_code,810,2607,"{""place_label_land"": 2607}" +class_code,293,2540,"{""baseline_area"": 2540}" +canonical_object_type,7000-8000m,2540,"{""baseline_area"": 2540}" +chart_fill_style,depth_zone_7000-8000m,2540,"{""baseline_area"": 2540}" +shape_class_code,320,2501,"{""navigation_marks"": 2501}" +canonical_object_type,bridge_light,2501,"{""navigation_marks"": 2501}" +shape_class_code,301,2491,"{""navigation_marks"": 2491}" +canonical_object_type,harbor_lighthouse,2491,"{""navigation_marks"": 2491}" +class_code,152,2446,"{""baseline_area"": 2446}" +canonical_object_type,removed_structure_remains,2446,"{""baseline_area"": 2446}" +display_code,30200002,2408,"{""navigation_marks"": 2408}" +shape_class_code,310,2362,"{""navigation_marks"": 2362}" +canonical_object_type,beacon,2362,"{""navigation_marks"": 2362}" +chart_symbol_code,beacon,2362,"{""navigation_marks"": 2362}" +class_code,421,2356,"{""anchor_caution_hazard_point"": 2355, ""navigation_hazard_point"": 1}" +canonical_object_type,sand_wave,2356,"{""anchor_caution_hazard_point"": 2355, ""navigation_hazard_point"": 1}" +display_code,30200001,2218,"{""navigation_marks"": 2218}" +class_code,422,2206,"{""anchor_caution_hazard_point"": 2206}" +canonical_object_type,急潮・波紋・激潮,2206,"{""anchor_caution_hazard_point"": 2206}" +display_code,30100004,2136,"{""navigation_marks"": 2136}" +class_code,432,2119,"{""navigation_hazard_point"": 2119}" +canonical_object_type,pontoon_pile_posts,2119,"{""navigation_hazard_point"": 2119}" +display_code,30600000,1905,"{""navigation_marks"": 1905}" +class_code,124,1761,"{""baseline_outline"": 1761}" +display_code,31000000,1746,"{""navigation_marks"": 1746}" +class_code,146,1720,"{""baseline_area"": 1720}" +canonical_object_type,2-10m,1720,"{""baseline_area"": 1720}" +chart_fill_style,depth_zone_2-10m,1720,"{""baseline_area"": 1720}" +class_code,741,1696,"{""depth_zone_741"": 1696}" +canonical_object_type,port_regulation_boundary,1696,"{""depth_zone_741"": 1696}" +class_code,870,1665,"{""place_label_sea"": 1665}" +chart_symbol_code,wreck,1580,"{""anchor_caution_hazard_point"": 1397, ""navigation_hazard_point"": 183}" +class_code,754,1487,"{""clip_outline_754"": 771, ""facility_boundary_area"": 716}" +class_code,732,1455,"{""clearance_limit_line"": 1028, ""clearance_limit_point"": 427}" +chart_fill_style,facility_area,1406,"{""facility_boundary_area"": 1406}" +chart_fill_pattern,pattern_fill_facility_area,1406,"{""facility_boundary_area"": 1406}" +class_code,144,1388,"{""baseline_area"": 1388}" +canonical_object_type,0-20m,1388,"{""baseline_area"": 1388}" +chart_fill_style,depth_zone_0-20m,1388,"{""baseline_area"": 1388}" +shape_class_code,311,1257,"{""navigation_marks"": 1257}" +canonical_object_type,light_beacon,1257,"{""navigation_marks"": 1257}" +class_code,742,1251,"{""route_area"": 335, ""route_outline"": 847, ""route_axis_line"": 69}" +class_code,294,1248,"{""baseline_area"": 1248}" +canonical_object_type,8000-9000m,1248,"{""baseline_area"": 1248}" +chart_fill_style,depth_zone_8000-9000m,1248,"{""baseline_area"": 1248}" +chart_icon_image,buoy_sphere,1248,"{""navigation_marks"": 1248}" +shape_class_code,327,1198,"{""navigation_marks"": 1198}" +canonical_object_type,conical_buoy,1198,"{""navigation_marks"": 1198}" +class_code,402,1178,"{""navigation_hazard_point"": 1178}" +canonical_object_type,干出岩,1178,"{""navigation_hazard_point"": 1178}" +display_code,31235001,1140,"{""navigation_marks"": 1140}" +shape_class_code,300,1131,"{""navigation_marks"": 1131}" +canonical_object_type,coastal_lighthouse_over_15m,1131,"{""navigation_marks"": 1131}" +display_code,31235102,1126,"{""navigation_marks"": 1126}" +class_code,161,1107,"{""baseline_area"": 1107}" +canonical_object_type,lake_area,1107,"{""baseline_area"": 1107}" +class_code,176,1097,"{""baseline_line"": 1097}" +canonical_object_type,submerged_reef_single_line,1097,"{""baseline_line"": 1097}" +chart_label_subtext,W,1074,"{""navigation_marks"": 1074}" +light_sector_mode,sector,1072,"{""navigation_marks"": 1072}" +canonical_object_type,clearance_limit_line,1028,"{""clearance_limit_line"": 1028}" +display_code,32037303,1017,"{""navigation_marks"": 1017}" +class_code,162,990,"{""baseline_area"": 990}" +canonical_object_type,inland_water_area,990,"{""baseline_area"": 990}" +class_code,149,988,"{""baseline_area"": 988}" +canonical_object_type,5-20m,988,"{""baseline_area"": 988}" +chart_fill_style,depth_zone_5-20m,988,"{""baseline_area"": 988}" +display_code,30600004,986,"{""navigation_marks"": 986}" +display_code,31300003,978,"{""navigation_marks"": 978}" +display_code,30000004,966,"{""navigation_marks"": 966}" +canonical_object_type,P航路ククリ,864,"{""route_outline"": 864}" +canonical_object_type,clearance_limit_point,858,"{""clearance_limit_point"": 858}" +chart_text_style,clearance_label,858,"{""clearance_limit_point"": 858}" +chart_icon_image,reef_fish_dangerous,832,"{""anchor_caution_hazard_point"": 830, ""navigation_hazard_point"": 2}" +class_code,409,824,"{""navigation_hazard_point"": 824}" +canonical_object_type,isolated_danger,824,"{""navigation_hazard_point"": 824}" +class_code,415,811,"{""anchor_caution_hazard_point"": 810, ""navigation_hazard_point"": 1}" +canonical_object_type,fully_submerged_wreck_non_dangerous,811,"{""anchor_caution_hazard_point"": 810, ""navigation_hazard_point"": 1}" +display_code,31336300,794,"{""navigation_marks"": 794}" +class_code,171,780,"{""baseline_line"": 780}" +canonical_object_type,removed_structure_single_line,780,"{""baseline_line"": 780}" +canonical_object_type,special_outline_754,771,"{""clip_outline_754"": 771}" +class_code,433,756,"{""navigation_hazard_point"": 756}" +canonical_object_type,mooring_dolphin,756,"{""navigation_hazard_point"": 756}" +class_code,711,744,"{""seabed_line"": 744}" +canonical_object_type,subsea_power_cable,744,"{""seabed_line"": 744}" +shape_class_code,323,738,"{""navigation_marks"": 738}" +canonical_object_type,pillar_buoy,738,"{""navigation_marks"": 738}" +chart_icon_image,buoy_pillar,738,"{""navigation_marks"": 738}" +canonical_object_type,aquaculture_area,716,"{""facility_boundary_area"": 716}" +class_code,434,715,"{""anchor_caution_hazard_point"": 681, ""navigation_hazard_point"": 34}" +canonical_object_type,seabed_installation_outfall_intake,715,"{""anchor_caution_hazard_point"": 681, ""navigation_hazard_point"": 34}" +class_code,712,655,"{""seabed_line"": 655}" +canonical_object_type,subsea_water_pipeline,655,"{""seabed_line"": 655}" +display_code,32700003,639,"{""navigation_marks"": 639}" +class_code,427,637,"{""anchor_caution_hazard_point"": 4, ""anchor_caution_hazard_area"": 36, ""anchor_caution_hazard_outline"": 36, ""navigation_hazard_point"": 254, ""navigation_hazard_area"": 134, ""navigation_hazard_outline"": 173}" +class_code,413,626,"{""anchor_caution_hazard_point"": 561, ""anchor_caution_hazard_outline"": 46, ""navigation_hazard_point"": 19}" +class_code,505,610,"{""facility_boundary_point"": 610}" +canonical_object_type,general_port_regulated_major,610,"{""facility_boundary_point"": 610}" +canonical_object_type,surveyed_wreck,580,"{""anchor_caution_hazard_point"": 561, ""navigation_hazard_point"": 19}" +chart_icon_image,wreck_surveyed,580,"{""anchor_caution_hazard_point"": 561, ""navigation_hazard_point"": 19}" +canonical_object_type,facility_boundary_outline,566,"{""facility_boundary_outline"": 566}" +chart_line_color,"rgba(136,152,139,1)",566,"{""facility_boundary_outline"": 566}" +class_code,295,549,"{""baseline_area"": 549}" +canonical_object_type,over_9000m,549,"{""baseline_area"": 549}" +chart_fill_style,water_area,549,"{""baseline_area"": 549}" +class_code,530,539,"{""facility_boundary_point"": 539}" +canonical_object_type,marina,539,"{""facility_boundary_point"": 539}" +display_code,32037101,516,"{""navigation_marks"": 516}" +display_code,32037002,506,"{""navigation_marks"": 506}" +class_code,880,500,"{""place_label_sea"": 500}" +class_code,510,454,"{""facility_boundary_point"": 454}" +canonical_object_type,小港湾 (避難港、地方港湾),454,"{""facility_boundary_point"": 454}" +display_code,32037204,444,"{""navigation_marks"": 444}" +chart_icon_image,mark_light_yw,436,"{""navigation_marks"": 436}" +class_code,660,436,"{""onshore_structure_point"": 436}" +canonical_object_type,maritime_office,436,"{""onshore_structure_point"": 436}" +class_code,739,429,"{""depth_zone_739"": 429}" +canonical_object_type,shoreline_boundary,429,"{""depth_zone_739"": 429}" +canonical_object_type,obstruction,428,"{""anchor_caution_hazard_point"": 4, ""anchor_caution_hazard_area"": 36, ""navigation_hazard_point"": 254, ""navigation_hazard_area"": 134}" +canonical_object_type,航路 (法律による航路),404,"{""route_area"": 335, ""route_axis_line"": 69}" +chart_label_subtext,Fl R 3s 4M,397,"{""navigation_marks"": 397}" +class_code,720,396,"{""anchorage_area"": 89, ""anchorage_outline"": 96, ""anchorage_point"": 211}" +chart_symbol_code,route_boundary_mark,395,"{""route_boundary_point"": 395}" +display_code,32300003,389,"{""navigation_marks"": 389}" +class_code,719,380,"{""anchorage_area"": 135, ""anchorage_outline"": 135, ""anchorage_point"": 110}" +display_code,31135102,378,"{""navigation_marks"": 378}" +class_code,755,377,"{""facility_boundary_area"": 178, ""facility_boundary_outline"": 199}" +shape_class_code,303,374,"{""navigation_marks"": 374}" +canonical_object_type,sea_berth_light,374,"{""navigation_marks"": 374}" +chart_symbol_code,anchorage_mark,366,"{""anchorage_point"": 366}" +chart_icon_image,anchorage_quarantine,366,"{""anchorage_point"": 366}" +chart_label_subtext,Fl G 3s 4M,365,"{""navigation_marks"": 365}" +display_code,31300002,363,"{""navigation_marks"": 363}" +chart_fill_style,route_area,352,"{""route_area"": 352}" +display_code,31135001,349,"{""navigation_marks"": 349}" +shape_class_code,309,347,"{""navigation_marks"": 347}" +canonical_object_type,directional_light,347,"{""navigation_marks"": 347}" +display_code,31300001,320,"{""navigation_marks"": 320}" +class_code,426,308,"{""anchor_caution_hazard_point"": 248, ""anchor_caution_hazard_area"": 30, ""anchor_caution_hazard_outline"": 30}" +chart_fill_style,anchorage_area,308,"{""anchorage_area"": 308}" +display_code,30300004,301,"{""navigation_marks"": 301}" +canonical_object_type,anchorage_outline,297,"{""anchorage_outline"": 297}" +chart_line_color,"rgba(198,77,187,1)",297,"{""anchorage_outline"": 297}" +chart_line_width,2,297,"{""anchorage_outline"": 297}" +class_code,662,289,"{""onshore_structure_point"": 289}" +canonical_object_type,customs_office,289,"{""onshore_structure_point"": 289}" +shape_class_code,305,288,"{""navigation_marks"": 288}" +canonical_object_type,leading_light,288,"{""navigation_marks"": 288}" +chart_symbol_code,leading_light,288,"{""navigation_marks"": 288}" +canonical_object_type,沈木,278,"{""anchor_caution_hazard_point"": 248, ""anchor_caution_hazard_area"": 30}" +display_code,30900004,275,"{""navigation_marks"": 275}" +class_code,759,262,"{""route_boundary_point"": 262}" +class_code,750,260,"{""facility_boundary_area"": 123, ""facility_boundary_outline"": 137}" +class_code,756,257,"{""facility_boundary_area"": 128, ""facility_boundary_outline"": 129}" +display_code,31235904,253,"{""navigation_marks"": 253}" +canonical_object_type,進路矢印 (法律による),244,"{""route_boundary_point"": 244}" +canonical_object_type,錨泊 (指定)地,234,"{""anchorage_area"": 89, ""anchorage_point"": 145}" +class_code,698,231,"{""onshore_structure_point"": 231}" +canonical_object_type,other_landmark_monument,231,"{""onshore_structure_point"": 231}" +canonical_object_type,anchorage_point,221,"{""anchorage_point"": 221}" +display_code,32700002,210,"{""navigation_marks"": 210}" +class_code,550,203,"{""facility_boundary_point"": 203}" +canonical_object_type,sea_station,203,"{""facility_boundary_point"": 203}" +canonical_object_type,navigation_hazard_outline,198,"{""navigation_hazard_outline"": 198}" +display_code,32700000,194,"{""navigation_marks"": 194}" +light_color_code,amber,192,"{""navigation_marks"": 192}" +class_code,682,181,"{""onshore_structure_point"": 181}" +canonical_object_type,管制信号所,181,"{""onshore_structure_point"": 181}" +canonical_object_type,fishing_net,178,"{""facility_boundary_area"": 178}" +display_code,30100002,169,"{""navigation_marks"": 169}" +display_code,31135804,167,"{""navigation_marks"": 167}" +display_code,31136003,165,"{""navigation_marks"": 165}" +display_code,31000003,160,"{""navigation_marks"": 160}" +chart_label_subtext,Fl(2) G 6s 4M,156,"{""navigation_marks"": 156}" +chart_label_subtext,Mo(A) R 8s 4M,156,"{""navigation_marks"": 156}" +class_code,147,150,"{""baseline_area"": 150}" +canonical_object_type,2-20m,150,"{""baseline_area"": 150}" +chart_fill_style,depth_zone_2-20m,150,"{""baseline_area"": 150}" +display_code,32700001,147,"{""navigation_marks"": 147}" +display_code,31236003,146,"{""navigation_marks"": 146}" +class_code,753,146,"{""facility_boundary_area"": 73, ""facility_boundary_outline"": 73}" +class_code,748,145,"{""depth_zone_748"": 145}" +canonical_object_type,誘導線,145,"{""depth_zone_748"": 145}" +chart_label_subtext,Fl(2) R 6s 4M,142,"{""navigation_marks"": 142}" +class_code,749,140,"{""depth_zone_749"": 140}" +canonical_object_type,誘導線補助線,140,"{""depth_zone_749"": 140}" +canonical_object_type,quarantine_anchorage,135,"{""anchorage_area"": 135}" +shape_class_code,308,133,"{""navigation_marks"": 133}" +display_code,30800000,133,"{""navigation_marks"": 133}" +canonical_object_type,無線局・レーダー局,133,"{""navigation_marks"": 133}" +chart_symbol_code,nav_mark,133,"{""navigation_marks"": 133}" +chart_icon_image,station_radio_radar,133,"{""navigation_marks"": 133}" +class_code,724,132,"{""anchorage_area"": 49, ""anchorage_outline"": 51, ""anchorage_point"": 32}" +chart_label_subtext,Iso W 4s 6M,129,"{""navigation_marks"": 129}" +canonical_object_type,caisson_storage_yard,128,"{""facility_boundary_area"": 128}" +chart_label_subtext,Fl(2) G 6s 5M,127,"{""navigation_marks"": 127}" +shape_class_code,325,127,"{""navigation_marks"": 127}" +canonical_object_type,can_buoy,127,"{""navigation_marks"": 127}" +chart_icon_image,buoy_cylinder,127,"{""navigation_marks"": 127}" +class_code,412,125,"{""anchor_caution_hazard_point"": 6, ""navigation_hazard_point"": 119}" +canonical_object_type,dangerous_fully_submerged_wreck,125,"{""anchor_caution_hazard_point"": 6, ""navigation_hazard_point"": 119}" +chart_icon_image,wreck_submerged_dangerous,125,"{""anchor_caution_hazard_point"": 6, ""navigation_hazard_point"": 119}" +display_code,30000008,124,"{""navigation_marks"": 124}" +canonical_object_type,spoil_ground,123,"{""facility_boundary_area"": 123}" +display_code,32300002,122,"{""navigation_marks"": 122}" +display_code,31000001,116,"{""navigation_marks"": 116}" +display_code,32300000,115,"{""navigation_marks"": 115}" +light_color_code,orange,113,"{""navigation_marks"": 113}" +shape_class_code,315,112,"{""navigation_marks"": 112}" +canonical_object_type,大型灯浮標,112,"{""navigation_marks"": 112}" +class_code,713,108,"{""seabed_line"": 108}" +canonical_object_type,海底輸送管 (油),108,"{""seabed_line"": 108}" +display_code,30500001,107,"{""navigation_marks"": 107}" +chart_icon_image,mark_light_g,107,"{""navigation_marks"": 107}" +class_code,431,107,"{""navigation_hazard_point"": 107}" +canonical_object_type,tower_yagura_survey_platform,107,"{""navigation_hazard_point"": 107}" +chart_label_subtext,Fl(2) R 6s 5M,105,"{""navigation_marks"": 105}" +chart_label_subtext,Mo(A) G 8s 4M,104,"{""navigation_marks"": 104}" +shape_class_code,307,102,"{""navigation_marks"": 102}" +canonical_object_type,航空・飛行場灯台,102,"{""navigation_marks"": 102}" +chart_icon_image,buoy_light_yw,102,"{""navigation_marks"": 102}" +canonical_object_type,P誘導線ククリ,101,"{""leading_line_outline"": 101}" +display_code,32300001,100,"{""navigation_marks"": 100}" +class_code,221,99,"{""baseline_area"": 99}" +canonical_object_type,20-200m,99,"{""baseline_area"": 99}" +chart_fill_style,depth_zone_20-200m,99,"{""baseline_area"": 99}" +chart_label_subtext,Fl G 3s 5M,99,"{""navigation_marks"": 99}" +class_code,725,95,"{""depth_zone_725"": 95}" +canonical_object_type,境界線,95,"{""depth_zone_725"": 95}" +display_code,31000002,94,"{""navigation_marks"": 94}" +display_code,31035102,93,"{""navigation_marks"": 93}" +display_code,30500002,92,"{""navigation_marks"": 92}" +chart_icon_image,mark_light_r,92,"{""navigation_marks"": 92}" +class_code,424,92,"{""anchor_caution_hazard_point"": 92}" +canonical_object_type,渦流,92,"{""anchor_caution_hazard_point"": 92}" +display_code,30100001,91,"{""navigation_marks"": 91}" +class_code,500,88,"{""pilot_station_point"": 88}" +canonical_object_type,パイロットステーション,88,"{""pilot_station_point"": 88}" +chart_symbol_code,pilot_station,88,"{""pilot_station_point"": 88}" +class_code,746,86,"{""facility_boundary_area"": 52, ""leading_line_outline"": 34}" +class_code,747,85,"{""facility_boundary_area"": 51, ""leading_line_outline"": 34}" +class_code,745,84,"{""facility_boundary_area"": 51, ""leading_line_outline"": 33}" +display_code,31035001,83,"{""navigation_marks"": 83}" +display_code,31500004,82,"{""navigation_marks"": 82}" +class_code,429,82,"{""anchor_caution_hazard_point"": 2, ""navigation_hazard_area"": 25, ""navigation_hazard_outline"": 25, ""navigation_hazard_point"": 30}" +class_code,743,81,"{""route_axis_line"": 47, ""route_area"": 17, ""route_outline"": 17}" +chart_label_subtext,Fl G 4s 4M,79,"{""navigation_marks"": 79}" +display_code,31235704,77,"{""navigation_marks"": 77}" +chart_label_subtext,Fl R 3s 12m 5M,76,"{""navigation_marks"": 76}" +light_color_code,mixed,75,"{""navigation_marks"": 75}" +display_code,30700007,74,"{""navigation_marks"": 74}" +display_code,30500003,74,"{""navigation_marks"": 74}" +chart_label_subtext,F Y 5m 4M,74,"{""navigation_marks"": 74}" +chart_label_subtext,Mo(A) W 8s 5M,73,"{""navigation_marks"": 73}" +display_code,30300002,73,"{""navigation_marks"": 73}" +class_code,408,73,"{""navigation_hazard_point"": 73}" +canonical_object_type,サンゴ礁 (暗岩),73,"{""navigation_hazard_point"": 73}" +canonical_object_type,貯木場,73,"{""facility_boundary_area"": 73}" +display_code,30900009,72,"{""navigation_marks"": 72}" +chart_label_subtext,Fl R 4s 4M,71,"{""navigation_marks"": 71}" +display_code,31235504,70,"{""navigation_marks"": 70}" +class_code,760,69,"{""route_boundary_point"": 69}" +canonical_object_type,進路矢印 (指導による),69,"{""route_boundary_point"": 69}" +display_code,30100008,68,"{""navigation_marks"": 68}" +class_code,714,67,"{""seabed_line"": 67}" +canonical_object_type,海底輸送管 (ガス),67,"{""seabed_line"": 67}" +chart_label_subtext,Fl R 3s 5M,66,"{""navigation_marks"": 66}" +chart_label_subtext,Fl Y 3s 7m 5M,66,"{""navigation_marks"": 66}" +class_code,761,64,"{""route_boundary_point"": 64}" +canonical_object_type,水源方向,64,"{""route_boundary_point"": 64}" +canonical_object_type,航路 (その他の推薦航路),64,"{""route_axis_line"": 47, ""route_area"": 17}" +chart_label_subtext,Fl R 3s 10m 5M,63,"{""navigation_marks"": 63}" +chart_label_subtext,Fl G 3s 9m 3M,63,"{""navigation_marks"": 63}" +chart_label_subtext,Fl G 3s 12m 5M,61,"{""navigation_marks"": 61}" +chart_label_subtext,Fl R 3s 8m 5M,60,"{""navigation_marks"": 60}" +display_code,32500000,59,"{""navigation_marks"": 59}" +display_code,31336003,59,"{""navigation_marks"": 59}" +chart_label_subtext,Fl R 3s 9m 3M,57,"{""navigation_marks"": 57}" +chart_label_subtext,Fl R 3s 12m 3M,57,"{""navigation_marks"": 57}" +chart_label_subtext,Fl R 3s 8m 4M,56,"{""navigation_marks"": 56}" +chart_label_subtext,Fl R 3s 9m 4M,55,"{""navigation_marks"": 55}" +chart_label_subtext,Fl G 3s 12m 3M,55,"{""navigation_marks"": 55}" +chart_label_subtext,Mo(U) W 8s 6M,55,"{""navigation_marks"": 55}" +class_code,730,54,"{""clip_outline_730"": 27, ""facility_boundary_area_transparent"": 27}" +chart_label_subtext,Fl G 3s 11m 5M,52,"{""navigation_marks"": 52}" +canonical_object_type,誘導線 (白),52,"{""facility_boundary_area"": 52}" +chart_label_subtext,Fl(2) R 6s 9m 5M,51,"{""navigation_marks"": 51}" +chart_label_subtext,Fl G 3s 8m 5M,51,"{""navigation_marks"": 51}" +display_code,31235404,51,"{""navigation_marks"": 51}" +chart_label_subtext,Fl(2) G 6s 9m 5M,51,"{""navigation_marks"": 51}" +class_code,740,51,"{""depth_zone_740"": 51}" +canonical_object_type,海上交通安全法適用海域境界,51,"{""depth_zone_740"": 51}" +canonical_object_type,誘導線 (赤),51,"{""facility_boundary_area"": 51}" +canonical_object_type,誘導線 (緑),51,"{""facility_boundary_area"": 51}" +display_code,31300004,50,"{""navigation_marks"": 50}" +chart_label_subtext,Fl R 3s 14m 5M,49,"{""navigation_marks"": 49}" +shape_class_code,335,49,"{""navigation_marks"": 49}" +canonical_object_type,V-AIS,49,"{""navigation_marks"": 49}" +chart_symbol_code,vais,49,"{""navigation_marks"": 49}" +chart_label_subtext,V-AIS,49,"{""navigation_marks"": 49}" +chart_icon_image,mark_vais_safe_water,49,"{""navigation_marks"": 49}" +chart_text_color,#c64dbb,49,"{""navigation_marks"": 49}" +canonical_object_type,anchorage_prohibited_area,49,"{""anchorage_area"": 49}" +chart_label_subtext,Fl R 3s 13m 3M,48,"{""navigation_marks"": 48}" +display_code,31300000,47,"{""navigation_marks"": 47}" +chart_label_subtext,Fl G 3s 13m 5M,46,"{""navigation_marks"": 46}" +class_code,721,46,"{""anchorage_area"": 19, ""clip_outline_721"": 27}" +chart_label_subtext,Fl R 3s 11m 5M,45,"{""navigation_marks"": 45}" +class_code,757,45,"{""facility_boundary_area"": 26, ""facility_boundary_outline"": 19}" +chart_label_subtext,Fl R 3s 11m 3M,44,"{""navigation_marks"": 44}" +chart_label_subtext,F Y 3m 4M,44,"{""navigation_marks"": 44}" +class_code,540,44,"{""facility_boundary_point"": 44}" +canonical_object_type,フィッシャリーナ,44,"{""facility_boundary_point"": 44}" +class_code,723,44,"{""anchorage_area"": 16, ""anchorage_outline"": 15, ""anchorage_point"": 13}" +class_code,410,43,"{""navigation_hazard_point"": 43}" +canonical_object_type,wreck_hull_exposed,43,"{""navigation_hazard_point"": 43}" +chart_icon_image,wreck_hull_exposed,43,"{""navigation_hazard_point"": 43}" +chart_label_subtext,Fl G 3s 8m 3M,42,"{""navigation_marks"": 42}" +chart_label_subtext,Fl R 3s 9m 5M,42,"{""navigation_marks"": 42}" +chart_label_subtext,Fl G 3s 9m 5M,42,"{""navigation_marks"": 42}" +display_code,33535900,41,"{""navigation_marks"": 41}" +chart_label_subtext,Fl G 3s 10m 5M,39,"{""navigation_marks"": 39}" +chart_label_subtext,Fl(2) R 6s 13m 5M,39,"{""navigation_marks"": 39}" +chart_label_subtext,Fl G 3s 13m 3M,39,"{""navigation_marks"": 39}" +chart_label_subtext,Fl G 3s 11m 3M,38,"{""navigation_marks"": 38}" +chart_label_subtext,Q(6)+L Fl W 15s 5M,38,"{""navigation_marks"": 38}" +chart_label_subtext,F Y 6m 4M,38,"{""navigation_marks"": 38}" +shape_class_code,321,38,"{""navigation_marks"": 38}" +canonical_object_type,球型浮標,38,"{""navigation_marks"": 38}" +chart_label_subtext,Q(3) W 10s 4M,37,"{""navigation_marks"": 37}" +display_code,30000007,36,"{""navigation_marks"": 36}" +chart_label_subtext,Fl(2) R 6s 4.9m 3M,36,"{""navigation_marks"": 36}" +chart_label_subtext,Mo(U) W 10s 5M,36,"{""navigation_marks"": 36}" +chart_label_subtext,Fl G 3s 8m 4M,36,"{""navigation_marks"": 36}" +chart_label_subtext,Fl(2) R 6s 14m 5M,36,"{""navigation_marks"": 36}" +chart_label_subtext,Fl G 4s 3M,36,"{""navigation_marks"": 36}" +chart_label_subtext,Fl(2) R 6s 8m 5M,35,"{""navigation_marks"": 35}" +chart_label_subtext,Fl G 3s 9m 4M,35,"{""navigation_marks"": 35}" +chart_label_subtext,Fl(2) G 6s 13m 5M,35,"{""navigation_marks"": 35}" +chart_label_subtext,Fl G 3s 10m 3M,34,"{""navigation_marks"": 34}" +chart_label_subtext,Fl R 4s 3M,34,"{""navigation_marks"": 34}" +display_code,31235804,34,"{""navigation_marks"": 34}" +chart_label_subtext,Q(6)+L Fl W 15s 4M,34,"{""navigation_marks"": 34}" +chart_label_subtext,F Y 10m 5M,34,"{""navigation_marks"": 34}" +chart_label_subtext,F Y 18m 5M,34,"{""navigation_marks"": 34}" +chart_label_subtext,Fl Y 4s 4M,34,"{""navigation_marks"": 34}" +chart_label_subtext,Fl(2) Y 6s 26m 5M,34,"{""navigation_marks"": 34}" +chart_label_subtext,Q(3) W 10s 5M,33,"{""navigation_marks"": 33}" +chart_label_subtext,Fl R 4s 13m 5M,33,"{""navigation_marks"": 33}" +chart_label_subtext,Mo(A) G 8s 5M,33,"{""navigation_marks"": 33}" +display_code,30200004,33,"{""navigation_marks"": 33}" +canonical_object_type,魚礁 (危険なもの),33,"{""anchor_caution_hazard_point"": 2, ""navigation_hazard_area"": 25, ""navigation_hazard_point"": 6}" +chart_label_subtext,Fl R 4s 12m 5M,32,"{""navigation_marks"": 32}" +display_code,31135404,32,"{""navigation_marks"": 32}" +display_code,31135504,32,"{""navigation_marks"": 32}" +display_code,31135704,32,"{""navigation_marks"": 32}" +class_code,680,32,"{""onshore_structure_point"": 30, ""onshore_structure_area"": 2}" +canonical_object_type,陸上顕著物 (観覧車等),32,"{""onshore_structure_point"": 30, ""onshore_structure_area"": 2}" +chart_label_subtext,Fl R 3s 13m 5M,32,"{""navigation_marks"": 32}" +chart_label_subtext,Fl G 3s 14m 5M,32,"{""navigation_marks"": 32}" +chart_label_subtext,F Y 13m 5M,32,"{""navigation_marks"": 32}" +display_code,31100004,32,"{""navigation_marks"": 32}" +shape_class_code,334,32,"{""navigation_marks"": 32}" +display_code,33400003,32,"{""navigation_marks"": 32}" +canonical_object_type,ドラム (樽)型灯浮標,32,"{""navigation_marks"": 32}" +chart_label_subtext,Fl Y 4s 5m 4M,32,"{""navigation_marks"": 32}" +chart_label_subtext,Fl Y 4s 4.7m 4M,32,"{""navigation_marks"": 32}" +display_code,32136003,32,"{""navigation_marks"": 32}" +chart_label_subtext,Fl Y 4s 6m 4M,32,"{""navigation_marks"": 32}" +chart_label_subtext,Fl G 3s 3M,31,"{""navigation_marks"": 31}" +display_code,31235604,31,"{""navigation_marks"": 31}" +class_code,405,31,"{""anchor_caution_hazard_point"": 30, ""navigation_hazard_point"": 1}" +canonical_object_type,掃海済みの危険物,31,"{""anchor_caution_hazard_point"": 30, ""navigation_hazard_point"": 1}" +display_code,32500003,31,"{""navigation_marks"": 31}" +chart_label_subtext,Fl R 3s 7m 5M,30,"{""navigation_marks"": 30}" +chart_label_subtext,Fl R 3s 8m 3M,30,"{""navigation_marks"": 30}" +chart_label_subtext,Fl(2) Y 6s 11m 5M,30,"{""navigation_marks"": 30}" +chart_label_subtext,F Y 12m 3M,30,"{""navigation_marks"": 30}" +chart_label_subtext,Fl G 3s 15m 5M,29,"{""navigation_marks"": 29}" +chart_label_subtext,Fl(2) R 6s 11m 5M,29,"{""navigation_marks"": 29}" +chart_label_subtext,Fl(2) G 6s 4.9m 3M,29,"{""navigation_marks"": 29}" +class_code,210,28,"{""baseline_area"": 28}" +canonical_object_type,10-100m,28,"{""baseline_area"": 28}" +chart_fill_style,depth_zone_10-100m,28,"{""baseline_area"": 28}" +display_code,31035000,28,"{""navigation_marks"": 28}" +display_code,31135604,28,"{""navigation_marks"": 28}" +chart_label_subtext,Fl(2) R 6s 12m 5M,28,"{""navigation_marks"": 28}" +display_code,30700004,28,"{""navigation_marks"": 28}" +chart_label_subtext,Fl W 3s 11m 5M,27,"{""navigation_marks"": 27}" +chart_label_subtext,Iso G 6s 12m 4M,27,"{""navigation_marks"": 27}" +chart_label_subtext,Fl R 3s 10m 3M,27,"{""navigation_marks"": 27}" +chart_label_subtext,Mo(B) G 8s 4M,27,"{""navigation_marks"": 27}" +chart_label_subtext,Mo(U) W 8s 5M,27,"{""navigation_marks"": 27}" +display_code,31135904,27,"{""navigation_marks"": 27}" +chart_label_subtext,Fl Y 4s 4m 5M,27,"{""navigation_marks"": 27}" +canonical_object_type,P730ククリ,27,"{""clip_outline_730"": 27}" +canonical_object_type,航空機進入区域,27,"{""facility_boundary_area_transparent"": 27}" +chart_fill_style,facility_transparent_area,27,"{""facility_boundary_area_transparent"": 27}" +canonical_object_type,P721ククリ,27,"{""clip_outline_721"": 27}" +chart_label_subtext,F W,26,"{""navigation_marks"": 26}" +chart_label_subtext,Fl G 4s 9m 3M,26,"{""navigation_marks"": 26}" +chart_label_subtext,Fl Y 4s 3M,26,"{""navigation_marks"": 26}" +canonical_object_type,廃棄物捨て場,26,"{""facility_boundary_area"": 26}" +chart_label_subtext,Fl(2) R 6s 10m 5M,25,"{""navigation_marks"": 25}" +chart_label_subtext,Fl G 4s 13m 5M,25,"{""navigation_marks"": 25}" +display_code,32500001,25,"{""navigation_marks"": 25}" +chart_label_subtext,Fl G 3s 14m 3M,25,"{""navigation_marks"": 25}" +chart_label_subtext,Q W 4M,25,"{""navigation_marks"": 25}" +chart_label_subtext,Fl(2) G 6s 11m 5M,25,"{""navigation_marks"": 25}" +chart_label_subtext,Fl(2) G 6s 10m 3M,24,"{""navigation_marks"": 24}" +chart_label_subtext,Q W 5M,24,"{""navigation_marks"": 24}" +shape_class_code,324,24,"{""navigation_marks"": 24}" +canonical_object_type,円柱型灯浮標,24,"{""navigation_marks"": 24}" +canonical_object_type,p航行危険障害物,24,"{""navigation_hazard_point"": 24}" +chart_label_subtext,Fl R 3s 3M,23,"{""navigation_marks"": 23}" +chart_label_subtext,Fl(2) R 6s 13m 7M,23,"{""navigation_marks"": 23}" +chart_label_subtext,Fl R 3s 14m 3M,22,"{""navigation_marks"": 22}" +chart_label_subtext,Fl(2) R 6s 15m 5M,22,"{""navigation_marks"": 22}" +chart_label_subtext,F Y 16m 5M,22,"{""navigation_marks"": 22}" +light_color_code,violet,21,"{""navigation_marks"": 21}" +chart_label_subtext,Fl(2) W 5s 5M,21,"{""navigation_marks"": 21}" +chart_label_subtext,Fl R 3s 7m 3M,21,"{""navigation_marks"": 21}" +chart_label_subtext,Fl Y 4s,21,"{""navigation_marks"": 21}" +chart_label_subtext,Fl Y 4s 8m 4M,20,"{""navigation_marks"": 20}" +chart_label_subtext,F Y 30m 5M,20,"{""navigation_marks"": 20}" +chart_label_subtext,"Aero Al Fl(2) W,G 4.3s",20,"{""navigation_marks"": 20}" +chart_label_subtext,Fl G 4s 11m 5M,20,"{""navigation_marks"": 20}" +chart_label_subtext,F Y 17m 5M,20,"{""navigation_marks"": 20}" +class_code,414,20,"{""anchor_caution_hazard_point"": 20}" +canonical_object_type,掃海済みの沈船,20,"{""anchor_caution_hazard_point"": 20}" +chart_label_subtext,Mo(U) W 15s 5M,20,"{""navigation_marks"": 20}" +display_code,30200003,20,"{""navigation_marks"": 20}" +chart_label_subtext,F Y 8m 5M,20,"{""navigation_marks"": 20}" +chart_label_subtext,F Y 4.9m 5M,20,"{""navigation_marks"": 20}" +chart_label_subtext,Fl(2) G 6s 8m 5M,19,"{""navigation_marks"": 19}" +chart_label_subtext,Fl W 3s 19m 5M,19,"{""navigation_marks"": 19}" +chart_label_subtext,Iso R 4s 13m 5M,19,"{""navigation_marks"": 19}" +chart_label_subtext,Iso R 6s 13m 4M,19,"{""navigation_marks"": 19}" +chart_label_subtext,Mo(B) R 8s 4M,19,"{""navigation_marks"": 19}" +chart_label_subtext,Iso R 4s 8m 4M,19,"{""navigation_marks"": 19}" +chart_label_subtext,Fl Y 4s 5M,19,"{""navigation_marks"": 19}" +chart_label_subtext,Iso G 6s 12m 5M,19,"{""navigation_marks"": 19}" +chart_label_subtext,Fl(2) Y 6s 23m 5M,19,"{""navigation_marks"": 19}" +canonical_object_type,制限区域,19,"{""anchorage_area"": 19}" +chart_label_subtext,Fl W 3s 13m 7M,18,"{""navigation_marks"": 18}" +chart_label_subtext,Fl R 4s 12m 3M,18,"{""navigation_marks"": 18}" +chart_label_subtext,"Aero Al Fl W,G 4.3s",18,"{""navigation_marks"": 18}" +chart_label_subtext,Iso R 6s 12m 4M,18,"{""navigation_marks"": 18}" +chart_label_subtext,Q(9) W 15s 4M,18,"{""navigation_marks"": 18}" +chart_label_subtext,Fl G 4s 11m 3M,18,"{""navigation_marks"": 18}" +chart_label_subtext,Fl R 4s 9m 5M,18,"{""navigation_marks"": 18}" +chart_label_subtext,Mo(D) R 8s 4M,18,"{""navigation_marks"": 18}" +chart_label_subtext,F Y 5m 5M,18,"{""navigation_marks"": 18}" +chart_label_subtext,Iso G 6s 13m 5M,18,"{""navigation_marks"": 18}" +chart_label_subtext,Iso R 4s 12m 5M,18,"{""navigation_marks"": 18}" +display_code,31536204,18,"{""navigation_marks"": 18}" +chart_label_subtext,Iso G 4s 13m 5M,18,"{""navigation_marks"": 18}" +chart_label_subtext,Fl Y 3s 31m 6M,18,"{""navigation_marks"": 18}" +canonical_object_type,p航路境界等,18,"{""route_boundary_point"": 18}" +chart_label_subtext,Fl W 5s 47m 18M,17,"{""navigation_marks"": 17}" +chart_label_subtext,Iso G 4s 8m 4M,17,"{""navigation_marks"": 17}" +chart_label_subtext,Iso G 6s 14m 5M,17,"{""navigation_marks"": 17}" +chart_label_subtext,Fl G 3s 13m 7M,17,"{""navigation_marks"": 17}" +chart_label_subtext,Fl R 4s 13m 3M,17,"{""navigation_marks"": 17}" +shape_class_code,328,17,"{""navigation_marks"": 17}" +canonical_object_type,円錐型灯浮標,17,"{""navigation_marks"": 17}" +chart_label_subtext,Mo(A) R 8s 5M,17,"{""navigation_marks"": 17}" +chart_label_subtext,Iso G 4s 13m 4M,17,"{""navigation_marks"": 17}" +chart_label_subtext,Fl R 3s 15m 5M,17,"{""navigation_marks"": 17}" +class_code,758,17,"{""facility_boundary_outline"": 9, ""facility_boundary_area"": 8}" +chart_label_subtext,Fl G 3s 7m 3M,16,"{""navigation_marks"": 16}" +chart_label_subtext,Fl G 3s 7m 5M,16,"{""navigation_marks"": 16}" +chart_label_subtext,Fl(2) G 6s 3M,16,"{""navigation_marks"": 16}" +chart_label_subtext,Fl(2) R 6s 12m 3M,16,"{""navigation_marks"": 16}" +chart_label_subtext,Fl(2) G 6s 15m 5M,16,"{""navigation_marks"": 16}" +chart_label_subtext,F Y 9m 3M,16,"{""navigation_marks"": 16}" +chart_label_subtext,Fl R 4s 9m 3M,16,"{""navigation_marks"": 16}" +chart_label_subtext,Fl G 4s 12m 3M,16,"{""navigation_marks"": 16}" +chart_label_subtext,F Y 6m 3M,16,"{""navigation_marks"": 16}" +chart_label_subtext,F W 33m 5M,16,"{""navigation_marks"": 16}" +chart_label_subtext,Mo(U) W 14s 6M,16,"{""navigation_marks"": 16}" +chart_label_subtext,F Y 3.3m 3M,16,"{""navigation_marks"": 16}" +chart_label_subtext,F Y 3.5m 4M,16,"{""navigation_marks"": 16}" +canonical_object_type,航泊禁止区域,16,"{""anchorage_area"": 16}" +chart_label_subtext,Fl W 4s 11m 5M,15,"{""navigation_marks"": 15}" +chart_label_subtext,Fl W 3s 27m 7M,15,"{""navigation_marks"": 15}" +chart_label_subtext,Fl R 3s 18m 7M,15,"{""navigation_marks"": 15}" +chart_label_subtext,Mo(U) R 12s 5M,15,"{""navigation_marks"": 15}" +chart_label_subtext,Fl R 5s 3M,15,"{""navigation_marks"": 15}" +display_code,30500004,15,"{""navigation_marks"": 15}" +chart_label_subtext,Fl R 5s 12m 5M,15,"{""navigation_marks"": 15}" +chart_label_subtext,Fl G 4s 12m 5M,15,"{""navigation_marks"": 15}" +chart_label_subtext,Mo(A) R 8s 11m 3M,15,"{""navigation_marks"": 15}" +chart_label_subtext,Fl(2) G 6s 8m 3M,15,"{""navigation_marks"": 15}" +chart_label_subtext,Fl Y 4s 4.3m 3M,15,"{""navigation_marks"": 15}" +chart_label_subtext,Fl G 5s 3M,14,"{""navigation_marks"": 14}" +chart_label_subtext,Iso R 4s 12m 4M,14,"{""navigation_marks"": 14}" +chart_label_subtext,Fl R 3s 16m 5M,14,"{""navigation_marks"": 14}" +chart_label_subtext,Fl(2) G 6s 13m 7M,14,"{""navigation_marks"": 14}" +chart_label_subtext,Fl R 3s 17m 7M,14,"{""navigation_marks"": 14}" +chart_label_subtext,Fl G 4s 8m 3M,14,"{""navigation_marks"": 14}" +chart_label_subtext,Fl(2) R 6s 14m 3M,14,"{""navigation_marks"": 14}" +chart_label_subtext,Fl R 4s 11m 5M,14,"{""navigation_marks"": 14}" +chart_label_subtext,Mo(A) R 8s 10m 5M,14,"{""navigation_marks"": 14}" +chart_label_subtext,Fl(2) R 6s 8m 4M,14,"{""navigation_marks"": 14}" +chart_label_subtext,F Y 25m 5M,14,"{""navigation_marks"": 14}" +class_code,700,14,"{""depth_zone_700"": 14}" +canonical_object_type,指導線,14,"{""depth_zone_700"": 14}" +chart_label_subtext,Iso G 6s 13m 4M,14,"{""navigation_marks"": 14}" +chart_label_subtext,Fl R 3s 5m 4M,14,"{""navigation_marks"": 14}" +chart_label_subtext,Iso W 4s 8M,14,"{""navigation_marks"": 14}" +chart_label_subtext,F Y 22m 5M,14,"{""navigation_marks"": 14}" +chart_label_subtext,F Y 15m 5M,14,"{""navigation_marks"": 14}" +chart_label_subtext,Iso W 4s 9m 6M,14,"{""navigation_marks"": 14}" +chart_label_subtext,Fl G 5s 13m 5M,13,"{""navigation_marks"": 13}" +chart_label_subtext,Fl G 3s 10m 4M,13,"{""navigation_marks"": 13}" +chart_label_subtext,Iso R 4s 13m 4M,13,"{""navigation_marks"": 13}" +chart_label_subtext,Fl(2) W 5s 4M,13,"{""navigation_marks"": 13}" +chart_label_subtext,F W 42m,13,"{""navigation_marks"": 13}" +chart_label_subtext,Iso G 6s 9m 4M,13,"{""navigation_marks"": 13}" +chart_label_subtext,Fl G 4s 14m 5M,13,"{""navigation_marks"": 13}" +chart_label_subtext,Iso G 6s 11m 4M,13,"{""navigation_marks"": 13}" +chart_label_subtext,Fl G 4s 8m 5M,13,"{""navigation_marks"": 13}" +chart_label_subtext,Iso R 6s 12m 5M,13,"{""navigation_marks"": 13}" +chart_label_subtext,Q(9) W 15s 5M,13,"{""navigation_marks"": 13}" +chart_label_subtext,Fl(2) R 5s 13m 5M,13,"{""navigation_marks"": 13}" +chart_label_subtext,Mo(A) W 8s 6M,13,"{""navigation_marks"": 13}" +chart_label_subtext,Fl W 3s 35m 7M,12,"{""navigation_marks"": 12}" +chart_label_subtext,Fl W 3s 15m 7M,12,"{""navigation_marks"": 12}" +chart_label_subtext,Fl W 3s 32m 7M,12,"{""navigation_marks"": 12}" +chart_label_subtext,Fl W 10s 44m 18M,12,"{""navigation_marks"": 12}" +chart_label_subtext,Fl W 3s 16m 7M,12,"{""navigation_marks"": 12}" +display_code,30100006,12,"{""navigation_marks"": 12}" +chart_label_subtext,Fl R 3s 13m 7M,12,"{""navigation_marks"": 12}" +display_code,31035800,12,"{""navigation_marks"": 12}" +chart_label_subtext,Fl R 3s 10m 4M,12,"{""navigation_marks"": 12}" +chart_label_subtext,Fl G 3s 16m 5M,12,"{""navigation_marks"": 12}" +chart_label_subtext,Fl R 5s 9m 3M,12,"{""navigation_marks"": 12}" +chart_label_subtext,Fl R 3s 16m 3M,12,"{""navigation_marks"": 12}" +chart_label_subtext,F W 10m,12,"{""navigation_marks"": 12}" +chart_label_subtext,Fl(2) G 6s 10m 5M,12,"{""navigation_marks"": 12}" +chart_label_subtext,F R 25m 4M,12,"{""navigation_marks"": 12}" +chart_label_subtext,F G 27m 5M,12,"{""navigation_marks"": 12}" +chart_label_subtext,F R 27m 5M,12,"{""navigation_marks"": 12}" +chart_label_subtext,F W 18m 5M,12,"{""navigation_marks"": 12}" +chart_label_subtext,F Y 21m 5M,12,"{""navigation_marks"": 12}" +chart_label_subtext,Fl(2) G 6s 8m 4M,12,"{""navigation_marks"": 12}" +display_code,32300004,12,"{""navigation_marks"": 12}" +chart_label_subtext,Fl R 4s 13m 7M,12,"{""navigation_marks"": 12}" +chart_label_subtext,Fl(2) R 6s 9m 3M,12,"{""navigation_marks"": 12}" +chart_label_subtext,Iso G 4s 11m 4M,12,"{""navigation_marks"": 12}" +chart_label_subtext,Iso R 6s 13m 5M,12,"{""navigation_marks"": 12}" +chart_label_subtext,F R 26m 5M,12,"{""navigation_marks"": 12}" +chart_label_subtext,Mo(A) G 8s 10m 3M,12,"{""navigation_marks"": 12}" +chart_label_subtext,Iso G 6s 10m 5M,12,"{""navigation_marks"": 12}" +chart_label_subtext,Fl(2) R 6s 7m 5M,12,"{""navigation_marks"": 12}" +chart_label_subtext,Fl(2) G 6s 12m 5M,12,"{""navigation_marks"": 12}" +chart_label_subtext,Iso R 6s 8m 4M,12,"{""navigation_marks"": 12}" +chart_label_subtext,Fl R 3s 15m 7M,12,"{""navigation_marks"": 12}" +chart_label_subtext,"F Fl G 5s 11m F2,Fl.5M",12,"{""navigation_marks"": 12}" +chart_label_subtext,F Y 12m 5M,12,"{""navigation_marks"": 12}" +chart_label_subtext,F Y 23m 5M,12,"{""navigation_marks"": 12}" +chart_label_subtext,F Y 28m 5M,12,"{""navigation_marks"": 12}" +chart_label_subtext,F Y 3.6m 4M,12,"{""navigation_marks"": 12}" +display_code,31536404,12,"{""navigation_marks"": 12}" +chart_label_subtext,F Y 7m 6M,12,"{""navigation_marks"": 12}" +chart_label_subtext,Iso W 6s 19m 5M,11,"{""navigation_marks"": 11}" +chart_label_subtext,Fl W 4s 49m 7M,11,"{""navigation_marks"": 11}" +chart_label_subtext,Fl W 3s 15m 5M,11,"{""navigation_marks"": 11}" +chart_label_subtext,Fl R 3s 13m 4M,11,"{""navigation_marks"": 11}" +chart_label_subtext,Fl W 15s 58m 20M,11,"{""navigation_marks"": 11}" +chart_label_subtext,Fl G 4s 9m 5M,11,"{""navigation_marks"": 11}" +chart_label_subtext,"Al Fl W,R 20s 35m W16,R16M",11,"{""navigation_marks"": 11}" +chart_label_subtext,Q(9) W 15s 4.9m 3M,11,"{""navigation_marks"": 11}" +chart_label_subtext,F W 60m,11,"{""navigation_marks"": 11}" +chart_label_subtext,Fl(2) G 6s 13m 3M,11,"{""navigation_marks"": 11}" +chart_label_subtext,Iso R 6s 8m 5M,11,"{""navigation_marks"": 11}" +chart_label_subtext,Fl(2) W 5s 12m 3M,11,"{""navigation_marks"": 11}" +chart_label_subtext,Fl G 3s 14m 7M,11,"{""navigation_marks"": 11}" +chart_label_subtext,Fl R 4s 14m 7M,11,"{""navigation_marks"": 11}" +class_code,140.0,11,"{""depth_contour"": 11}" +chart_label_subtext,Mo(U) R 10s 6M,11,"{""navigation_marks"": 11}" +chart_label_subtext,F G 26m 4M,11,"{""navigation_marks"": 11}" +chart_label_subtext,Fl(2) R 6s 15m 7M,11,"{""navigation_marks"": 11}" +chart_label_subtext,Fl(2) G 6s 16m 7M,11,"{""navigation_marks"": 11}" +chart_label_subtext,Iso G 4s 11m 5M,11,"{""navigation_marks"": 11}" +chart_label_subtext,Fl G 4s 16m 7M,11,"{""navigation_marks"": 11}" +chart_label_subtext,Fl G 3s 16m 7M,11,"{""navigation_marks"": 11}" +chart_label_subtext,Fl(5) Y 20s 4M,11,"{""navigation_marks"": 11}" +display_code,31100003,11,"{""navigation_marks"": 11}" +chart_label_subtext,Iso W 6s 13m 5M,10,"{""navigation_marks"": 10}" +chart_label_subtext,Fl W 4s 37m 7M,10,"{""navigation_marks"": 10}" +chart_label_subtext,Fl W 3s 14m 7M,10,"{""navigation_marks"": 10}" +chart_label_subtext,Fl W 10s 68m 21M,10,"{""navigation_marks"": 10}" +chart_label_subtext,Fl W 15s 30m 16M,10,"{""navigation_marks"": 10}" +chart_label_subtext,Fl W 15s 64m 21M,10,"{""navigation_marks"": 10}" +chart_label_subtext,Fl W 10s 72m 20M,10,"{""navigation_marks"": 10}" +chart_label_subtext,Fl W 4s 22m 7M,10,"{""navigation_marks"": 10}" +chart_label_subtext,"Al Fl W,R 10s 60m W20,R20M",10,"{""navigation_marks"": 10}" +arc_source_code,08350232,10,"{""navigation_marks"": 10}" +arc_id,arc_code_08350232,10,"{""navigation_marks"": 10}" +chart_label_subtext,Fl W 8s 41m 18M,10,"{""navigation_marks"": 10}" +chart_label_subtext,Fl W 15s 49m 19M,10,"{""navigation_marks"": 10}" +chart_label_subtext,Fl W 8s 50m 19M,10,"{""navigation_marks"": 10}" +chart_label_subtext,Fl W 12s 36m 17M,10,"{""navigation_marks"": 10}" +arc_source_code,04198358,10,"{""navigation_marks"": 10}" +arc_id,arc_y018_178,10,"{""navigation_marks"": 10}" +chart_label_subtext,Fl G 3s 4.9m 3M,10,"{""navigation_marks"": 10}" +chart_label_subtext,Fl(2) R 6s 17m 7M,10,"{""navigation_marks"": 10}" +chart_label_subtext,Fl G 3s 17m 7M,10,"{""navigation_marks"": 10}" +chart_label_subtext,Fl R 4s 10m 3M,10,"{""navigation_marks"": 10}" +chart_label_subtext,F W 24m 5M,10,"{""navigation_marks"": 10}" +display_code,32500002,10,"{""navigation_marks"": 10}" +display_code,31000004,10,"{""navigation_marks"": 10}" +chart_label_subtext,Mo(U) W 12s 30m 10M,10,"{""navigation_marks"": 10}" +chart_label_subtext,"F Fl R 3s 14m F1,Fl.3M",10,"{""navigation_marks"": 10}" +chart_label_subtext,F G 32m 4M,10,"{""navigation_marks"": 10}" +chart_label_subtext,F W 34m 6M,10,"{""navigation_marks"": 10}" +chart_label_subtext,Fl R 3s 6m 5M,10,"{""navigation_marks"": 10}" +chart_label_subtext,Iso G 4s 12m 5M,10,"{""navigation_marks"": 10}" +chart_label_subtext,"F Fl G 3s 13m F2,Fl.5M",10,"{""navigation_marks"": 10}" +chart_label_subtext,Fl G 3s 12m 7M,10,"{""navigation_marks"": 10}" +chart_label_subtext,Fl(2) G 6s 17m 5M,10,"{""navigation_marks"": 10}" +shape_class_code,333,10,"{""navigation_marks"": 10}" +display_code,33300000,10,"{""navigation_marks"": 10}" +canonical_object_type,ドラム (樽)型浮標,10,"{""navigation_marks"": 10}" +chart_label_subtext,Fl(2) W 5s 10m 3M,10,"{""navigation_marks"": 10}" +chart_label_subtext,Iso G 6s 10m 4M,10,"{""navigation_marks"": 10}" +chart_label_subtext,Iso R 4s 11m 5M,10,"{""navigation_marks"": 10}" +chart_label_subtext,Fl R 4s 14m 3M,10,"{""navigation_marks"": 10}" +chart_label_subtext,Fl(2) W 5s 12m 7M,10,"{""navigation_marks"": 10}" +chart_label_subtext,F W 26m 5M,10,"{""navigation_marks"": 10}" +chart_label_subtext,Fl R 3s 6m 3M,10,"{""navigation_marks"": 10}" +chart_label_subtext,F Y 4.9m 4M,10,"{""navigation_marks"": 10}" +chart_label_subtext,Fl(2) G 6s 9m 3M,10,"{""navigation_marks"": 10}" +chart_label_subtext,F R 38m 5M,10,"{""navigation_marks"": 10}" +chart_label_subtext,Oc G 4s 12m 5M,10,"{""navigation_marks"": 10}" +chart_label_subtext,Iso G 4s 12m 4M,10,"{""navigation_marks"": 10}" +chart_label_subtext,Iso G 4s 26m 5M,10,"{""navigation_marks"": 10}" +chart_label_subtext,Fl G 4s 7m 3M,10,"{""navigation_marks"": 10}" +chart_label_subtext,Fl Y 4s 6M,10,"{""navigation_marks"": 10}" +chart_label_subtext,F Y 4.7m 4M,10,"{""navigation_marks"": 10}" +chart_label_subtext,Mo(U) W 12s 6M,10,"{""navigation_marks"": 10}" +class_code,702,10,"{""depth_zone_702"": 10}" +canonical_object_type,分離通航方式,10,"{""depth_zone_702"": 10}" +class_code,890,10,"{""place_label_sea"": 10}" +class_code,406,10,"{""navigation_hazard_point"": 10}" +canonical_object_type,海底火山,10,"{""navigation_hazard_point"": 10}" +chart_label_subtext,Iso W 6s 70m 12M,9,"{""navigation_marks"": 9}" +chart_label_subtext,Iso W 6s 20m 8M,9,"{""navigation_marks"": 9}" +chart_label_subtext,Fl W 4s 12m 5M,9,"{""navigation_marks"": 9}" +chart_label_subtext,Fl W 3s 24m 5M,9,"{""navigation_marks"": 9}" +chart_label_subtext,Iso W 6s 35m 4M,9,"{""navigation_marks"": 9}" +chart_label_subtext,Fl W 3s 17m 7M,9,"{""navigation_marks"": 9}" +chart_label_subtext,Fl W 4s 20m 5M,9,"{""navigation_marks"": 9}" +chart_label_subtext,Fl W 3s 11m 7M,9,"{""navigation_marks"": 9}" +chart_label_subtext,Fl W 4s 17m 5M,9,"{""navigation_marks"": 9}" +chart_label_subtext,Iso W 6s 103m 12M,9,"{""navigation_marks"": 9}" +arc_source_code,0424628604296140,9,"{""navigation_marks"": 9}" +arc_id,arc_y066_106_y116_320,9,"{""navigation_marks"": 9}" +chart_label_subtext,Fl W 3s 14m 5M,9,"{""navigation_marks"": 9}" +chart_label_subtext,Fl W 3s 12m 5M,9,"{""navigation_marks"": 9}" +chart_label_subtext,Fl W 4s 17m 7M,9,"{""navigation_marks"": 9}" +chart_label_subtext,Fl W 4s 18m 5M,9,"{""navigation_marks"": 9}" +chart_label_subtext,Fl W 4s 14m 12M,9,"{""navigation_marks"": 9}" +chart_label_subtext,Iso W 6s 16m 5M,9,"{""navigation_marks"": 9}" +chart_label_subtext,Fl R 3s 17m 5M,9,"{""navigation_marks"": 9}" +chart_label_subtext,Fl G 3s 12m 4M,9,"{""navigation_marks"": 9}" +chart_label_subtext,Fl(2) W 5s 13m 5M,9,"{""navigation_marks"": 9}" +chart_label_subtext,Iso G 4s 13m 3M,9,"{""navigation_marks"": 9}" +chart_label_subtext,Fl(2) W 5s 11m 5M,9,"{""navigation_marks"": 9}" +chart_label_subtext,Mo(U) W 12s 7M,9,"{""navigation_marks"": 9}" +chart_label_subtext,F R 32m 3M,9,"{""navigation_marks"": 9}" +chart_label_subtext,Fl(2) R 6s 8m 3M,9,"{""navigation_marks"": 9}" +chart_label_subtext,Fl(2) W 5s 9m 5M,9,"{""navigation_marks"": 9}" +display_code,32400004,9,"{""navigation_marks"": 9}" +chart_label_subtext,Fl G 4s 13m 3M,9,"{""navigation_marks"": 9}" +chart_label_subtext,Mo(U) R 10s 5M,9,"{""navigation_marks"": 9}" +chart_label_subtext,F W 28m,9,"{""navigation_marks"": 9}" +chart_label_subtext,F Y 7m 5M,9,"{""navigation_marks"": 9}" +chart_label_subtext,F Y 11m 5M,9,"{""navigation_marks"": 9}" +chart_label_subtext,Fl W 10s 87m 24M,8,"{""navigation_marks"": 8}" +chart_label_subtext,Fl W 3s 10m 3M,8,"{""navigation_marks"": 8}" +chart_label_subtext,Iso W 6s 31m 12M,8,"{""navigation_marks"": 8}" +chart_label_subtext,Fl W 3s 12m 3M,8,"{""navigation_marks"": 8}" +chart_label_subtext,Fl W 8s 91m 20M,8,"{""navigation_marks"": 8}" +arc_source_code,04138018,8,"{""navigation_marks"": 8}" +arc_id,arc_y318_198,8,"{""navigation_marks"": 8}" +chart_label_subtext,Fl W 12s 105m 12M,8,"{""navigation_marks"": 8}" +chart_label_subtext,Fl R 3s 7m 4M,8,"{""navigation_marks"": 8}" +chart_label_subtext,"Al W,R 10s 49m W18,R16M",8,"{""navigation_marks"": 8}" +arc_source_code,0406126602079097,8,"{""navigation_marks"": 8}" +arc_id,arc_y241_086_r259_277,8,"{""navigation_marks"": 8}" +chart_label_subtext,Iso G 4s 10m 4M,8,"{""navigation_marks"": 8}" +chart_label_subtext,Fl(3) W 13s 38m 7M,8,"{""navigation_marks"": 8}" +chart_label_subtext,Fl W 15s 74m 21M,8,"{""navigation_marks"": 8}" +arc_source_code,04091357,8,"{""navigation_marks"": 8}" +arc_id,arc_y271_177,8,"{""navigation_marks"": 8}" +chart_label_subtext,Fl W 10s 54m 19M,8,"{""navigation_marks"": 8}" +arc_source_code,04221104,8,"{""navigation_marks"": 8}" +arc_id,arc_y041_284,8,"{""navigation_marks"": 8}" +chart_label_subtext,Mo(U) W 8s 8m 7M,8,"{""navigation_marks"": 8}" +chart_label_subtext,Fl(2) W 10s 99m 12M,8,"{""navigation_marks"": 8}" +arc_source_code,04024258,8,"{""navigation_marks"": 8}" +arc_id,arc_y204_078,8,"{""navigation_marks"": 8}" +chart_label_subtext,Fl G 3s 17m 5M,8,"{""navigation_marks"": 8}" +chart_label_subtext,F Y 3.2m 3M,8,"{""navigation_marks"": 8}" +display_code,32037200,8,"{""navigation_marks"": 8}" +chart_label_subtext,Fl R 3s 4.9m 3M,8,"{""navigation_marks"": 8}" +chart_label_subtext,Fl(2) R 6s 3M,8,"{""navigation_marks"": 8}" +chart_label_subtext,Fl R 3s 15m 3M,8,"{""navigation_marks"": 8}" +chart_label_subtext,Fl(2) G 6s 14m 5M,8,"{""navigation_marks"": 8}" +chart_label_subtext,Fl(2) W 5s 17m 5M,8,"{""navigation_marks"": 8}" +chart_label_subtext,Iso G 4s 24m 3M,8,"{""navigation_marks"": 8}" +chart_label_subtext,Fl(2) G 6s 15m 3M,8,"{""navigation_marks"": 8}" +chart_label_subtext,Iso R 6s 11m 5M,8,"{""navigation_marks"": 8}" +chart_label_subtext,"F Fl G 3s 12m F2,Fl.5M",8,"{""navigation_marks"": 8}" +chart_label_subtext,F R 32m 4M,8,"{""navigation_marks"": 8}" +chart_label_subtext,F W 23m,8,"{""navigation_marks"": 8}" +chart_label_subtext,F W 41m,8,"{""navigation_marks"": 8}" +chart_label_subtext,Fl G 4s 10m 3M,8,"{""navigation_marks"": 8}" +chart_label_subtext,Iso W 4s 5M,8,"{""navigation_marks"": 8}" +chart_label_subtext,Mo(D) G 8s 4M,8,"{""navigation_marks"": 8}" +chart_label_subtext,Fl(2) G 6s 12m 3M,8,"{""navigation_marks"": 8}" +chart_label_subtext,Fl(2) R 6s 16m 5M,8,"{""navigation_marks"": 8}" +chart_label_subtext,F W 12m,8,"{""navigation_marks"": 8}" +chart_label_subtext,Fl(2) W 5s 14m 5M,8,"{""navigation_marks"": 8}" +chart_label_subtext,F W 31m 4M,8,"{""navigation_marks"": 8}" +chart_label_subtext,Fl R 4s 8m 5M,8,"{""navigation_marks"": 8}" +chart_label_subtext,Iso G 4s 15m 5M,8,"{""navigation_marks"": 8}" +chart_label_subtext,F R 31m 3M,8,"{""navigation_marks"": 8}" +chart_label_subtext,Fl(2) G 6s 14m 7M,8,"{""navigation_marks"": 8}" +chart_label_subtext,Fl G 3s 16m 3M,8,"{""navigation_marks"": 8}" +chart_label_subtext,F G 23m 4M,8,"{""navigation_marks"": 8}" +chart_label_subtext,Fl(2) W 5s 10m 5M,8,"{""navigation_marks"": 8}" +chart_label_subtext,F G 5m 4M,8,"{""navigation_marks"": 8}" +chart_label_subtext,F R 5m 4M,8,"{""navigation_marks"": 8}" +chart_label_subtext,Fl R 5s 8m 5M,8,"{""navigation_marks"": 8}" +chart_label_subtext,Mo(A) R 8s 11m 5M,8,"{""navigation_marks"": 8}" +chart_label_subtext,Fl G 3s 15m 3M,8,"{""navigation_marks"": 8}" +chart_label_subtext,Fl R 3s 18m 5M,8,"{""navigation_marks"": 8}" +chart_label_subtext,F G 14m 4M,8,"{""navigation_marks"": 8}" +chart_label_subtext,Iso G 4s 11m 3M,8,"{""navigation_marks"": 8}" +chart_label_subtext,Fl G 5s 8m 3M,8,"{""navigation_marks"": 8}" +chart_label_subtext,Fl(2) R 6s 17m 5M,8,"{""navigation_marks"": 8}" +display_code,32700004,8,"{""navigation_marks"": 8}" +chart_label_subtext,F W 40m 4M,8,"{""navigation_marks"": 8}" +chart_label_subtext,Fl R 3s 16m 7M,8,"{""navigation_marks"": 8}" +chart_label_subtext,Fl(2) R 6s 9m 4M,8,"{""navigation_marks"": 8}" +chart_label_subtext,Fl R 4s 8m 4M,8,"{""navigation_marks"": 8}" +chart_label_subtext,Fl(2) R 6s 13m 3M,8,"{""navigation_marks"": 8}" +chart_label_subtext,"F Fl G 5s 11m F1,Fl.3M",8,"{""navigation_marks"": 8}" +chart_label_subtext,Fl G 4s 7m 4M,8,"{""navigation_marks"": 8}" +chart_label_subtext,Fl R 5s 14m 5M,8,"{""navigation_marks"": 8}" +chart_label_subtext,Fl R 3s 12m 7M,8,"{""navigation_marks"": 8}" +chart_label_subtext,Mo(U) W 12s 5M,8,"{""navigation_marks"": 8}" +chart_label_subtext,Fl(2) R 8s 12m 3M,8,"{""navigation_marks"": 8}" +chart_label_subtext,F G 29m 5M,8,"{""navigation_marks"": 8}" +chart_label_subtext,Fl(2) G 7s 11m 5M,8,"{""navigation_marks"": 8}" +chart_label_subtext,F G 26m 5M,8,"{""navigation_marks"": 8}" +chart_label_subtext,F R 15m 4M,8,"{""navigation_marks"": 8}" +chart_label_subtext,Fl R 5s 12m 7M,8,"{""navigation_marks"": 8}" +chart_label_subtext,F Y 29m 4M,8,"{""navigation_marks"": 8}" +chart_label_subtext,F Y 3.7m 4M,8,"{""navigation_marks"": 8}" +chart_label_subtext,Oc R 4s 12m 4M,8,"{""navigation_marks"": 8}" +chart_label_subtext,F R 42m 5M,8,"{""navigation_marks"": 8}" +chart_label_subtext,F G 42m 5M,8,"{""navigation_marks"": 8}" +chart_label_subtext,F W 42m 5M,8,"{""navigation_marks"": 8}" +chart_label_subtext,F W 27m 5M,8,"{""navigation_marks"": 8}" +chart_label_subtext,F G 25m 4M,8,"{""navigation_marks"": 8}" +chart_label_subtext,Fl Y 4s 3.6m 3M,8,"{""navigation_marks"": 8}" +chart_label_subtext,F W 48m 6M,8,"{""navigation_marks"": 8}" +chart_label_subtext,F G 74m 8M,8,"{""navigation_marks"": 8}" +chart_label_subtext,Mo(U) R 15s 6M,8,"{""navigation_marks"": 8}" +chart_label_subtext,F G 27m 6M,8,"{""navigation_marks"": 8}" +chart_label_subtext,F W 27m 6M,8,"{""navigation_marks"": 8}" +chart_label_subtext,F R 27m 6M,8,"{""navigation_marks"": 8}" +chart_label_subtext,Iso R 4s 26m 5M,8,"{""navigation_marks"": 8}" +chart_label_subtext,F G 33m 4M,8,"{""navigation_marks"": 8}" +chart_label_subtext,F Y 29m 5M,8,"{""navigation_marks"": 8}" +chart_label_subtext,F R 74m 5M,8,"{""navigation_marks"": 8}" +chart_label_subtext,F Y 7m 3M,8,"{""navigation_marks"": 8}" +chart_label_subtext,Iso R 4s 15m 4M,8,"{""navigation_marks"": 8}" +chart_label_subtext,Fl(2) G 6s 15m 7M,8,"{""navigation_marks"": 8}" +chart_label_subtext,"F Fl R 3s 12m F2,Fl.5M",8,"{""navigation_marks"": 8}" +chart_label_subtext,F W 25m 5M,8,"{""navigation_marks"": 8}" +chart_label_subtext,F R 24m 4M,8,"{""navigation_marks"": 8}" +chart_label_subtext,F G 49m 5M,8,"{""navigation_marks"": 8}" +chart_label_subtext,F W 50m 5M,8,"{""navigation_marks"": 8}" +chart_label_subtext,Fl Y 4s 7m 3M,8,"{""navigation_marks"": 8}" +chart_label_subtext,Fl Y 4s 4.2m 3M,8,"{""navigation_marks"": 8}" +chart_label_subtext,F Y 12m 7M,8,"{""navigation_marks"": 8}" +chart_label_subtext,F Y 4.6m 5M,8,"{""navigation_marks"": 8}" +chart_label_subtext,F Y 2.7m 5M,8,"{""navigation_marks"": 8}" +chart_label_subtext,F Y 4.5m 4M,8,"{""navigation_marks"": 8}" +chart_label_subtext,F Y 2.7m 3M,8,"{""navigation_marks"": 8}" +chart_label_subtext,F Y 22m 9M,8,"{""navigation_marks"": 8}" +chart_label_subtext,Fl Y 3s 29m 4M,8,"{""navigation_marks"": 8}" +chart_label_subtext,Fl Y 4s 10m 4M,8,"{""navigation_marks"": 8}" +chart_label_subtext,F Y 4.4m 4M,8,"{""navigation_marks"": 8}" +chart_label_subtext,Fl(2) R 5s 8m 5M,8,"{""navigation_marks"": 8}" +chart_label_subtext,Fl Y 3s 3M,8,"{""navigation_marks"": 8}" +chart_label_subtext,Fl Y 3s 38m 6M,8,"{""navigation_marks"": 8}" +chart_label_subtext,Fl Y 3s 40m 6M,8,"{""navigation_marks"": 8}" +chart_label_subtext,F Y 9m 4M,8,"{""navigation_marks"": 8}" +chart_label_subtext,Fl Y 4s 11m 3M,8,"{""navigation_marks"": 8}" +canonical_object_type,専用用途海域,8,"{""facility_boundary_area"": 8}" +class_code,401,8,"{""navigation_hazard_point"": 8}" +canonical_object_type,水上岩 (露出岩),8,"{""navigation_hazard_point"": 8}" +chart_label_subtext,Oc W 8s 106m 15M,7,"{""navigation_marks"": 7}" +arc_source_code,04027289,7,"{""navigation_marks"": 7}" +arc_id,arc_y207_109,7,"{""navigation_marks"": 7}" +chart_label_subtext,Fl W 3s 22m 5M,7,"{""navigation_marks"": 7}" +chart_label_subtext,Fl W 3s 58m 7M,7,"{""navigation_marks"": 7}" +chart_label_subtext,Fl W 20s 126m 23M,7,"{""navigation_marks"": 7}" +arc_source_code,0423116704125167,7,"{""navigation_marks"": 7}" +arc_id,arc_y051_347_y305_347,7,"{""navigation_marks"": 7}" +chart_label_subtext,Fl W 5s 66m 12M,7,"{""navigation_marks"": 7}" +chart_label_subtext,Fl W 3s 38m 7M,7,"{""navigation_marks"": 7}" +chart_label_subtext,Fl W 4s 24m 7M,7,"{""navigation_marks"": 7}" +chart_label_subtext,Fl W 4s 15m 7M,7,"{""navigation_marks"": 7}" +chart_label_subtext,Fl W 4s 13m 5M,7,"{""navigation_marks"": 7}" +chart_label_subtext,Fl W 10s 56m 20M,7,"{""navigation_marks"": 7}" +chart_label_subtext,Fl W 5s 113m 12M,7,"{""navigation_marks"": 7}" +chart_label_subtext,Fl W 10s 75m 20M,7,"{""navigation_marks"": 7}" +chart_label_subtext,Fl(2) W 15s 56m 19M,7,"{""navigation_marks"": 7}" +arc_source_code,04152017,7,"{""navigation_marks"": 7}" +arc_id,arc_y332_197,7,"{""navigation_marks"": 7}" +chart_label_subtext,Fl W 10s 76m 20M,7,"{""navigation_marks"": 7}" +chart_label_subtext,Fl W 8s 58m 20M,7,"{""navigation_marks"": 7}" +arc_source_code,04016181,7,"{""navigation_marks"": 7}" +arc_id,arc_y196_001,7,"{""navigation_marks"": 7}" +chart_label_subtext,"Al Fl W,R 20s 55m W20,R17M",7,"{""navigation_marks"": 7}" +arc_source_code,08189045,7,"{""navigation_marks"": 7}" +arc_id,arc_code_08189045,7,"{""navigation_marks"": 7}" +arc_source_code,04314107,7,"{""navigation_marks"": 7}" +arc_id,arc_y134_287,7,"{""navigation_marks"": 7}" +chart_label_subtext,"Fl W,R 5s 49m 19M",7,"{""navigation_marks"": 7}" +arc_source_code,0427021502215270,7,"{""navigation_marks"": 7}" +arc_id,arc_y090_035_r035_090,7,"{""navigation_marks"": 7}" +chart_label_subtext,Fl W 10s 65m 21M,7,"{""navigation_marks"": 7}" +arc_source_code,04133030,7,"{""navigation_marks"": 7}" +arc_id,arc_y313_210,7,"{""navigation_marks"": 7}" +chart_label_subtext,Fl W 3s 63m 9M,7,"{""navigation_marks"": 7}" +chart_label_subtext,L Fl W 12s 112m 22M,7,"{""navigation_marks"": 7}" +arc_source_code,04272211,7,"{""navigation_marks"": 7}" +arc_id,arc_y092_031,7,"{""navigation_marks"": 7}" +chart_label_subtext,Mo(B) G 8s 5M,7,"{""navigation_marks"": 7}" +chart_label_subtext,Fl(2) R 6s 12m 4M,7,"{""navigation_marks"": 7}" +chart_label_subtext,Fl(2) G 6s 9m 4M,7,"{""navigation_marks"": 7}" +display_code,32800003,7,"{""navigation_marks"": 7}" +chart_label_subtext,Fl(2) G 6s 17m 7M,7,"{""navigation_marks"": 7}" +chart_label_subtext,Fl(2) R 8s 11m 5M,7,"{""navigation_marks"": 7}" +chart_label_subtext,Fl(2) G 6s 16m 5M,7,"{""navigation_marks"": 7}" +chart_label_subtext,F W 37m,7,"{""navigation_marks"": 7}" +chart_label_subtext,F W 16m 4M,7,"{""navigation_marks"": 7}" +chart_label_subtext,Fl R 5s 8m 3M,7,"{""navigation_marks"": 7}" +chart_label_subtext,F W 22m,7,"{""navigation_marks"": 7}" +chart_label_subtext,F W 27m,7,"{""navigation_marks"": 7}" +chart_label_subtext,Fl(2) R 5s 12m 3M,7,"{""navigation_marks"": 7}" +chart_label_subtext,"F Fl G 3s 14m F2,Fl.5M",7,"{""navigation_marks"": 7}" +chart_label_subtext,F W 17m 5M,7,"{""navigation_marks"": 7}" +chart_label_subtext,Fl R 5s 11m 5M,7,"{""navigation_marks"": 7}" +chart_label_subtext,13m,7,"{""navigation_marks"": 7}" +chart_label_subtext,Fl(2) G 6s 11m 3M,7,"{""navigation_marks"": 7}" +chart_label_subtext,Iso R 6s 16m 5M,7,"{""navigation_marks"": 7}" +chart_label_subtext,Fl G 4s 4.3m 3M,7,"{""navigation_marks"": 7}" +chart_label_subtext,Fl Y 3s 6m 4M,7,"{""navigation_marks"": 7}" +chart_label_subtext,Fl Y 4s 7m 4M,7,"{""navigation_marks"": 7}" +chart_label_subtext,Fl Y 3s 5M,7,"{""navigation_marks"": 7}" +chart_label_subtext,Fl W 15s 145m 25M,6,"{""navigation_marks"": 6}" +chart_label_subtext,"LFl(2) W,R 28s 101m W25,R20M",6,"{""navigation_marks"": 6}" +arc_source_code,0201102104021011,6,"{""navigation_marks"": 6}" +arc_id,arc_r191_201_y201_191,6,"{""navigation_marks"": 6}" +chart_label_subtext,Fl W 5s 18m 5M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Fl W 5s 18m 7M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Iso W 6s 74m 12M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Fl W 3s 16m 5M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Fl(2) W 10s 44m 18M,6,"{""navigation_marks"": 6}" +arc_source_code,04343296,6,"{""navigation_marks"": 6}" +arc_id,arc_y163_116,6,"{""navigation_marks"": 6}" +chart_label_subtext,Fl W 4s 31m 7M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Iso W 6s 23m 12M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Fl W 20s 107m 23M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Fl W 4s 15m 5M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Iso W 6s 11m 5M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Fl W 3s 21m 7M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Fl W 5s 36m 7M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Fl W 3s 77m 12M,6,"{""navigation_marks"": 6}" +chart_label_subtext,"Al Fl W,G 20s 99m W18,G16M",6,"{""navigation_marks"": 6}" +chart_label_subtext,Fl W 4s 12m 7M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Fl(2) W 6s 31m 12M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Fl W 3s 11m 3M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Fl(2) W 6s 14m 5M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Fl W 3s 109m 7M,6,"{""navigation_marks"": 6}" +display_code,30100005,6,"{""navigation_marks"": 6}" +light_color_code,blue,6,"{""navigation_marks"": 6}" +chart_label_subtext,Fl W 3s 37m 5M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Iso W 6s 48m 5M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Fl W 3s 86m 7M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Fl(2) W 20s 140m 21M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Fl W 3s 71m 7M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Iso W 6s 13m 4M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Iso W 6s 31m 5M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Fl W 3s 50m 7M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Fl W 4s 56m 12M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Fl(2) W 7s 40m 12M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Fl(2) W 6s 67m 7M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Fl W 3s 28m 5M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Fl(2) W 6s 45m 7M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Fl(2) W 6s 57m 12M,6,"{""navigation_marks"": 6}" +arc_source_code,04022307,6,"{""navigation_marks"": 6}" +arc_id,arc_y202_127,6,"{""navigation_marks"": 6}" +chart_label_subtext,Fl W 4s 16m 7M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Fl W 5s 17m 5M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Fl W 4s 21m 5M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Fl(4) W 30s 57m 20M,6,"{""navigation_marks"": 6}" +arc_source_code,04116064,6,"{""navigation_marks"": 6}" +arc_id,arc_y296_244,6,"{""navigation_marks"": 6}" +chart_label_subtext,Fl W 3s 10m 5M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Fl W 5s 30m 5M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Fl W 10s 59m 20M,6,"{""navigation_marks"": 6}" +arc_source_code,04251115,6,"{""navigation_marks"": 6}" +arc_id,arc_y071_295,6,"{""navigation_marks"": 6}" +chart_label_subtext,Fl(3) W 20s 46m 18M,6,"{""navigation_marks"": 6}" +arc_source_code,04265214,6,"{""navigation_marks"": 6}" +arc_id,arc_y085_034,6,"{""navigation_marks"": 6}" +chart_label_subtext,Fl W 5s 16m 7M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Fl W 4s 10m 5M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Fl(2) W 20s 174m 21M,6,"{""navigation_marks"": 6}" +arc_source_code,04240170,6,"{""navigation_marks"": 6}" +arc_id,arc_y060_350,6,"{""navigation_marks"": 6}" +chart_label_subtext,Iso W 6s 57m 8M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Fl W 3s 13m 5M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Fl(3) W 13s 45m 12M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Fl W 4s 25m 7M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Fl W 5s 34m 7M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Fl W 10s 188m 20M,6,"{""navigation_marks"": 6}" +arc_source_code,04204043,6,"{""navigation_marks"": 6}" +arc_id,arc_y024_223,6,"{""navigation_marks"": 6}" +chart_label_subtext,Fl(2) W 30s 109m 22M,6,"{""navigation_marks"": 6}" +arc_source_code,04173082,6,"{""navigation_marks"": 6}" +arc_id,arc_y353_262,6,"{""navigation_marks"": 6}" +chart_label_subtext,Iso W 6s 89m 8M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Fl W 5s 54m 19M,6,"{""navigation_marks"": 6}" +arc_source_code,04222063,6,"{""navigation_marks"": 6}" +arc_id,arc_y042_243,6,"{""navigation_marks"": 6}" +chart_label_subtext,Iso W 6s 60m 8M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Fl W 3s 29m 7M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Fl W 3s 33m 7M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Fl W 5s 166m 19M,6,"{""navigation_marks"": 6}" +arc_source_code,04210091,6,"{""navigation_marks"": 6}" +arc_id,arc_y030_271,6,"{""navigation_marks"": 6}" +chart_label_subtext,F R 13m 4M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Iso W 6s 49m 8M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Fl(2) W 6s 98m 7M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Fl W 10s 34m 16M,6,"{""navigation_marks"": 6}" +arc_source_code,04036216,6,"{""navigation_marks"": 6}" +arc_id,arc_y216_036,6,"{""navigation_marks"": 6}" +chart_label_subtext,Fl(3) W 12s 15m 5M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Fl W 10s 98m 23M,6,"{""navigation_marks"": 6}" +arc_source_code,04295180,6,"{""navigation_marks"": 6}" +arc_id,arc_y115_000,6,"{""navigation_marks"": 6}" +arc_source_code,04132318,6,"{""navigation_marks"": 6}" +arc_id,arc_y312_138,6,"{""navigation_marks"": 6}" +chart_label_subtext,Fl W 10s 32m 16M,6,"{""navigation_marks"": 6}" +arc_source_code,04232050,6,"{""navigation_marks"": 6}" +arc_id,arc_y052_230,6,"{""navigation_marks"": 6}" +chart_label_subtext,Fl W 5s 82m 23M,6,"{""navigation_marks"": 6}" +arc_source_code,04025273,6,"{""navigation_marks"": 6}" +arc_id,arc_y205_093,6,"{""navigation_marks"": 6}" +chart_label_subtext,Fl(2) W 8s 18m 7M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Iso R 4s 11m 4M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Fl W 4s 38m 12M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Fl(2) W 10s 21m 12M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Fl W 10s 274m 23M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Fl R 3s 20m 7M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Fl W 15s 36m 17M,6,"{""navigation_marks"": 6}" +arc_source_code,04180008,6,"{""navigation_marks"": 6}" +arc_id,arc_y000_188,6,"{""navigation_marks"": 6}" +chart_label_subtext,Fl W 15s 73m 22M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Fl W 8s 56m 20M,6,"{""navigation_marks"": 6}" +arc_source_code,04180060,6,"{""navigation_marks"": 6}" +arc_id,arc_y000_240,6,"{""navigation_marks"": 6}" +chart_label_subtext,Fl W 5s 63m 19M,6,"{""navigation_marks"": 6}" +arc_source_code,04160329,6,"{""navigation_marks"": 6}" +arc_id,arc_y340_149,6,"{""navigation_marks"": 6}" +chart_label_subtext,Fl W 10s 61m 20M,6,"{""navigation_marks"": 6}" +arc_source_code,04358167,6,"{""navigation_marks"": 6}" +arc_id,arc_y178_347,6,"{""navigation_marks"": 6}" +chart_label_subtext,Iso W 6s 65m 8M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Fl(4) W 30s 40m 17M,6,"{""navigation_marks"": 6}" +arc_source_code,04077286,6,"{""navigation_marks"": 6}" +arc_id,arc_y257_106,6,"{""navigation_marks"": 6}" +chart_label_subtext,Fl W 10s 80m 23M,6,"{""navigation_marks"": 6}" +arc_source_code,04099318,6,"{""navigation_marks"": 6}" +arc_id,arc_y279_138,6,"{""navigation_marks"": 6}" +chart_label_subtext,"F Fl R 5s 14m F4,Fl.7M",6,"{""navigation_marks"": 6}" +chart_label_subtext,Fl W 15s 142m 21M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Fl W 10s 112m 12M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Fl(2) W 20s 102m 12M,6,"{""navigation_marks"": 6}" +arc_source_code,04106344,6,"{""navigation_marks"": 6}" +arc_id,arc_y286_164,6,"{""navigation_marks"": 6}" +display_code,31035100,6,"{""navigation_marks"": 6}" +chart_label_subtext,F R 14m 3M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Q W 4.9m 3M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Fl(2) R 7s 12m 5M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Fl G 5s 13m 3M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Fl G 3s 6m 5M,6,"{""navigation_marks"": 6}" +chart_label_subtext,F W 31m 5M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Fl R 3s 19m 7M,6,"{""navigation_marks"": 6}" +chart_label_subtext,F R 21m 7M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Mo(A) G 8s 14m 5M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Iso G 6s 14m 4M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Fl R 3s 12m 4M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Fl G 3s 15m 4M,6,"{""navigation_marks"": 6}" +chart_label_subtext,"F Fl R 5s 11m F2,Fl.5M",6,"{""navigation_marks"": 6}" +chart_label_subtext,F W 15m,6,"{""navigation_marks"": 6}" +chart_label_subtext,Fl R 4s 10m 5M,6,"{""navigation_marks"": 6}" +chart_label_subtext,F R 30m 4M,6,"{""navigation_marks"": 6}" +chart_label_subtext,F G 30m 4M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Iso R 4s 30m 3M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Mo(U) R 10s 3M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Fl G 4s 14m 7M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Mo(A) W 8s 4M,6,"{""navigation_marks"": 6}" +chart_label_subtext,F G 31m 3M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Iso R 4s 9m 4M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Fl G 4s 10m 5M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Fl(2) W 5s 19m 7M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Fl G 3s 11m 7M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Mo(A) G 8s 12m 3M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Mo(D) R 8s 15m 3M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Fl(2) R 6s 10m 3M,6,"{""navigation_marks"": 6}" +chart_label_subtext,F G 21m 3M,6,"{""navigation_marks"": 6}" +chart_label_subtext,F R 21m 3M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Iso G 6s 11m 5M,6,"{""navigation_marks"": 6}" +display_code,32800002,6,"{""navigation_marks"": 6}" +chart_label_subtext,Mo(A) R 8s 10m 3M,6,"{""navigation_marks"": 6}" +chart_label_subtext,F R 8m 3M,6,"{""navigation_marks"": 6}" +chart_label_subtext,F W 14m 4M,6,"{""navigation_marks"": 6}" +chart_label_subtext,F R 14m 4M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Fl(2) R 8s 13m 5M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Mo(A) R 8s 12m 5M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Fl R 4s 7m 5M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Fl G 5s 8m 5M,6,"{""navigation_marks"": 6}" +chart_label_subtext,"F Fl R 6s 12m F2,Fl.5M",6,"{""navigation_marks"": 6}" +chart_label_subtext,Iso R 4s 9m 5M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Fl R 5s 14m 7M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Fl G 3s 15m 7M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Fl R 3s 14m 7M,6,"{""navigation_marks"": 6}" +chart_label_subtext,F G 15m 4M,6,"{""navigation_marks"": 6}" +chart_label_subtext,F R 26m 3M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Mo(U) W 8s 8m 10M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Iso R 6s 14m 5M,6,"{""navigation_marks"": 6}" +chart_label_subtext,"Aero Al Fl(2) W,G 10s",6,"{""navigation_marks"": 6}" +chart_label_subtext,Iso R 6s 9m 5M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Mo(U) W 8s 9m 6M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Mo(U) W 8s 8m 6M,6,"{""navigation_marks"": 6}" +chart_label_subtext,F R 29m 5M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Fl(2) G 6s 7m 3M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Fl(5) Y 20s 5M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Fl R 3s 19m 5M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Fl(2) G 6s 14m 3M,6,"{""navigation_marks"": 6}" +chart_label_subtext,F G 29m 7M,6,"{""navigation_marks"": 6}" +chart_label_subtext,F W 32m 7M,6,"{""navigation_marks"": 6}" +chart_label_subtext,F R 29m 7M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Mo(A) G 8s 13m 5M,6,"{""navigation_marks"": 6}" +chart_label_subtext,F W 63m,6,"{""navigation_marks"": 6}" +chart_label_subtext,Mo(C) G 13s 15m 7M,6,"{""navigation_marks"": 6}" +chart_label_subtext,F G 18m 4M,6,"{""navigation_marks"": 6}" +chart_label_subtext,F R 24m 8M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Fl R 5s 13m 3M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Fl R 5s 4M,6,"{""navigation_marks"": 6}" +chart_label_subtext,F G 38m 5M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Fl R 4s 14m 5M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Mo(A) G 8s 12m 5M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Fl G 4s 13m 7M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Iso R 6s 10m 5M,6,"{""navigation_marks"": 6}" +display_code,31236004,6,"{""navigation_marks"": 6}" +chart_label_subtext,Mo(U) W 12s 4.5m 5M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Iso G 4s 24m 5M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Iso R 4s 24m 5M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Mo(U) W 10s 29m 10M,6,"{""navigation_marks"": 6}" +chart_label_subtext,"F Fl R 6s 11m F2,Fl.5M",6,"{""navigation_marks"": 6}" +chart_label_subtext,F G 46m 6M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Fl R 3s 6M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Fl(2) G 6s 6M,6,"{""navigation_marks"": 6}" +chart_label_subtext,F W 77m 8M,6,"{""navigation_marks"": 6}" +chart_label_subtext,F R 76m 7M,6,"{""navigation_marks"": 6}" +chart_label_subtext,F W 40m,6,"{""navigation_marks"": 6}" +chart_label_subtext,F W 53m,6,"{""navigation_marks"": 6}" +chart_label_subtext,F G 35m 4M,6,"{""navigation_marks"": 6}" +chart_label_subtext,F R 35m 4M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Fl G 3s 5m 4M,6,"{""navigation_marks"": 6}" +chart_label_subtext,"Aero Al Fl W,G 10s",6,"{""navigation_marks"": 6}" +chart_label_subtext,Iso G 4s 36m 6M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Fl G 3s 20m 5M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Iso R 4s 15m 5M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Fl(3) G 12s 12m 7M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Oc(2) R 6s 12m 4M,6,"{""navigation_marks"": 6}" +chart_label_subtext,F G 11m 10M,6,"{""navigation_marks"": 6}" +chart_label_subtext,F R 50m 5M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Fl R 5s 12m 3M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Fl(2) W 5s 16m 5M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Mo(C) G 10s 4M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Mo(U) W 8s 8m 5M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Fl G 4s 5M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Fl R 4s 5M,6,"{""navigation_marks"": 6}" +chart_label_subtext,F G 39m 6M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Fl Y 3s 7m 6M,6,"{""navigation_marks"": 6}" +arc_source_code,04230050,6,"{""navigation_marks"": 6}" +arc_id,arc_y050_230,6,"{""navigation_marks"": 6}" +chart_label_subtext,F G 55m 9M,6,"{""navigation_marks"": 6}" +chart_label_subtext,F W 58m 10M,6,"{""navigation_marks"": 6}" +chart_label_subtext,"F Fl G 6s 12m F1,Fl.3M",6,"{""navigation_marks"": 6}" +chart_label_subtext,F W 11m,6,"{""navigation_marks"": 6}" +chart_label_subtext,Iso W 4s 21m 5M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Fl(2) Y 6s 14m 5M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Iso G 4s 14m 5M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Iso G 4s 8m 5M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Mo(U) W 15s 7m 5M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Iso G 4s 19m 5M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Iso R 4s 19m 5M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Mo(U) W 10s 6M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Fl R 3s 4.5m 4M,6,"{""navigation_marks"": 6}" +chart_label_subtext,Mo(U) W 8s 7M,6,"{""navigation_marks"": 6}" +chart_label_subtext,W 28m,6,"{""navigation_marks"": 6}" +chart_label_subtext,Fl R 4s 15m 5M,6,"{""navigation_marks"": 6}" +chart_label_subtext,"F Fl R 4s 13m F2,Fl.5M",6,"{""navigation_marks"": 6}" +display_code,32435001,6,"{""navigation_marks"": 6}" +display_code,32435102,6,"{""navigation_marks"": 6}" +chart_label_subtext,Fl W 5s 75m 22M,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl W 12s 42m 18M,5,"{""navigation_marks"": 5}" +chart_label_subtext,"Al Fl W,R 20s 43m 18M",5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl W 5s 194m 19M,5,"{""navigation_marks"": 5}" +arc_source_code,04269146,5,"{""navigation_marks"": 5}" +arc_id,arc_y089_326,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl W 12s 115m 21M,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl W 13s 90m 26M,5,"{""navigation_marks"": 5}" +arc_source_code,042352850429530504320170,5,"{""navigation_marks"": 5}" +arc_id,arc_y055_105_y115_125_y140_350,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl W 15s 119m 21M,5,"{""navigation_marks"": 5}" +arc_source_code,04215162,5,"{""navigation_marks"": 5}" +arc_id,arc_y035_342,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl W 12s 72m 21M,5,"{""navigation_marks"": 5}" +arc_source_code,04223137,5,"{""navigation_marks"": 5}" +arc_id,arc_y043_317,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl W 20s 120m 27M,5,"{""navigation_marks"": 5}" +arc_source_code,04207038,5,"{""navigation_marks"": 5}" +arc_id,arc_y027_218,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl W 10s 117m 21M,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl W 10s 103m 21M,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl W 5s 40m 17M,5,"{""navigation_marks"": 5}" +arc_source_code,04097050,5,"{""navigation_marks"": 5}" +arc_id,arc_y277_230,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl W 10s 53m 17M,5,"{""navigation_marks"": 5}" +arc_source_code,04203099,5,"{""navigation_marks"": 5}" +arc_id,arc_y023_279,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl(3) W 18s 86m 24M,5,"{""navigation_marks"": 5}" +arc_source_code,04205045,5,"{""navigation_marks"": 5}" +arc_id,arc_y025_225,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl W 5s 84m 23M,5,"{""navigation_marks"": 5}" +arc_source_code,04021253,5,"{""navigation_marks"": 5}" +arc_id,arc_y201_073,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl W 10s 106m 24M,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl W 15s 140m 21M,5,"{""navigation_marks"": 5}" +arc_source_code,04323233,5,"{""navigation_marks"": 5}" +arc_id,arc_y143_053,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl W 6s 102m 12M,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl(2) W 6s 41m 5M,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl W 6s 64m 21M,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl W 15s 146m 23M,5,"{""navigation_marks"": 5}" +arc_source_code,04271115,5,"{""navigation_marks"": 5}" +arc_id,arc_y091_295,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl W 3s 103m 7M,5,"{""navigation_marks"": 5}" +chart_label_subtext,"Al Fl W,G 16s 158m G22,W22M",5,"{""navigation_marks"": 5}" +arc_source_code,05177027,5,"{""navigation_marks"": 5}" +arc_id,arc_code_05177027,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl W 15s 60m 20M,5,"{""navigation_marks"": 5}" +arc_source_code,04079335,5,"{""navigation_marks"": 5}" +arc_id,arc_y259_155,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl(3) W 13s 55m 12M,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl(4) W 30s 64m 20M,5,"{""navigation_marks"": 5}" +arc_source_code,04030275,5,"{""navigation_marks"": 5}" +arc_id,arc_y210_095,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl(2) R 6s 14m 7M,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl W 3s 48m 7M,5,"{""navigation_marks"": 5}" +arc_source_code,04162032,5,"{""navigation_marks"": 5}" +arc_id,arc_y342_212,5,"{""navigation_marks"": 5}" +chart_label_subtext,"Al Fl(2) W,G 10s 239m W20,G21M",5,"{""navigation_marks"": 5}" +arc_source_code,04125351,5,"{""navigation_marks"": 5}" +arc_id,arc_y305_171,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl(3) W 18s 64m 12M,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl W 5s 41m 18M,5,"{""navigation_marks"": 5}" +chart_label_subtext,"Al Fl W,R 30s 253m W17,R17M",5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl(2) W 20s 51m 19M,5,"{""navigation_marks"": 5}" +arc_source_code,04033249,5,"{""navigation_marks"": 5}" +arc_id,arc_y213_069,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl W 15s 79m 19M,5,"{""navigation_marks"": 5}" +arc_source_code,04121318,5,"{""navigation_marks"": 5}" +arc_id,arc_y301_138,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl G 4s 14m 4M,5,"{""navigation_marks"": 5}" +chart_label_subtext,F G 10m 4M,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl W 10s 27m 15M,5,"{""navigation_marks"": 5}" +arc_source_code,04326162,5,"{""navigation_marks"": 5}" +arc_id,arc_y146_342,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl W 8s 84m 21M,5,"{""navigation_marks"": 5}" +arc_source_code,04274157,5,"{""navigation_marks"": 5}" +arc_id,arc_y094_337,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl W 15s 72m 22M,5,"{""navigation_marks"": 5}" +arc_source_code,04002244,5,"{""navigation_marks"": 5}" +arc_id,arc_y182_064,5,"{""navigation_marks"": 5}" +arc_source_code,04242150,5,"{""navigation_marks"": 5}" +arc_id,arc_y062_330,5,"{""navigation_marks"": 5}" +arc_source_code,04068298,5,"{""navigation_marks"": 5}" +arc_id,arc_y248_118,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl W 5s 45m 18M,5,"{""navigation_marks"": 5}" +arc_source_code,04352232,5,"{""navigation_marks"": 5}" +arc_id,arc_y172_052,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl(2) W 10s 75m 12M,5,"{""navigation_marks"": 5}" +chart_label_subtext,"F Fl W 15s 39m F10,Fl.17M",5,"{""navigation_marks"": 5}" +arc_source_code,04098000,5,"{""navigation_marks"": 5}" +arc_id,arc_y278_180,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl(2) W 6s 63m 7M,5,"{""navigation_marks"": 5}" +chart_label_subtext,"Al Fl W,R 14s 68m W16,R16M",5,"{""navigation_marks"": 5}" +arc_source_code,08057336,5,"{""navigation_marks"": 5}" +arc_id,arc_code_08057336,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl(2) W 20s 106m 21M,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl W 15s 256m 23M,5,"{""navigation_marks"": 5}" +arc_source_code,04198097,5,"{""navigation_marks"": 5}" +arc_id,arc_y018_277,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl(2) W 20s 93m 21M,5,"{""navigation_marks"": 5}" +arc_source_code,04187142,5,"{""navigation_marks"": 5}" +arc_id,arc_y007_322,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl W 15s 90m 22M,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl W 15s 93m 21M,5,"{""navigation_marks"": 5}" +arc_source_code,04060257,5,"{""navigation_marks"": 5}" +arc_id,arc_y240_077,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl W 8s 126m 12M,5,"{""navigation_marks"": 5}" +arc_source_code,04190057,5,"{""navigation_marks"": 5}" +arc_id,arc_y010_237,5,"{""navigation_marks"": 5}" +chart_label_subtext,"Al Fl W,G 10s 101m W19,G19M",5,"{""navigation_marks"": 5}" +arc_source_code,04199019,5,"{""navigation_marks"": 5}" +arc_id,arc_y019_199,5,"{""navigation_marks"": 5}" +chart_label_subtext,"Al Fl W,G 12s 34m W16,G15M",5,"{""navigation_marks"": 5}" +arc_source_code,07357229,5,"{""navigation_marks"": 5}" +arc_id,arc_code_07357229,5,"{""navigation_marks"": 5}" +arc_source_code,04054226,5,"{""navigation_marks"": 5}" +arc_id,arc_y234_046,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl W 8s 197m 23M,5,"{""navigation_marks"": 5}" +arc_source_code,04172080,5,"{""navigation_marks"": 5}" +arc_id,arc_y352_260,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl W 6s 69m 20M,5,"{""navigation_marks"": 5}" +chart_label_subtext,Iso W 6s 38m 8M,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl W 10s 60m 12M,5,"{""navigation_marks"": 5}" +arc_source_code,04040253,5,"{""navigation_marks"": 5}" +arc_id,arc_y220_073,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl W 6s 125m 19M,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl(2) W 8s 13m 5M,5,"{""navigation_marks"": 5}" +chart_label_subtext,"Al Fl(2+1) W,R 20s 63m W21,R21M",5,"{""navigation_marks"": 5}" +arc_source_code,08024245,5,"{""navigation_marks"": 5}" +arc_id,arc_code_08024245,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl(2) W 7s 63m 12M,5,"{""navigation_marks"": 5}" +chart_label_subtext,Iso R 4s 14m 4M,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl W 12s 125m 24M,5,"{""navigation_marks"": 5}" +arc_source_code,04306184,5,"{""navigation_marks"": 5}" +arc_id,arc_y126_004,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl W 5s 41m 7M,5,"{""navigation_marks"": 5}" +chart_label_subtext,"Al Fl W,R 20s 158m W20,R16M",5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl W 15s 51m 21M,5,"{""navigation_marks"": 5}" +arc_source_code,04118329,5,"{""navigation_marks"": 5}" +arc_id,arc_y298_149,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl(3) W 30s 61m 20M,5,"{""navigation_marks"": 5}" +arc_source_code,04201091,5,"{""navigation_marks"": 5}" +arc_id,arc_y021_271,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl W 15s 258m 23M,5,"{""navigation_marks"": 5}" +arc_source_code,04081293,5,"{""navigation_marks"": 5}" +arc_id,arc_y261_113,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl W 12s 83m 23M,5,"{""navigation_marks"": 5}" +arc_source_code,04115052,5,"{""navigation_marks"": 5}" +arc_id,arc_y295_232,5,"{""navigation_marks"": 5}" +chart_label_subtext,"Al Fl(2+1) W,R 20s 135m W17,R17M",5,"{""navigation_marks"": 5}" +arc_source_code,08034279,5,"{""navigation_marks"": 5}" +arc_id,arc_code_08034279,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl W 3s 25m 5M,5,"{""navigation_marks"": 5}" +arc_source_code,04311219,5,"{""navigation_marks"": 5}" +arc_id,arc_y131_039,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl W 8s 68m 21M,5,"{""navigation_marks"": 5}" +arc_source_code,04052305,5,"{""navigation_marks"": 5}" +arc_id,arc_y232_125,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl W 5s 10m 5M,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl W 10s 57m 20M,5,"{""navigation_marks"": 5}" +arc_source_code,04073309,5,"{""navigation_marks"": 5}" +arc_id,arc_y253_129,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl W 10s 155m 26M,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl W 15s 284m 23M,5,"{""navigation_marks"": 5}" +arc_source_code,04070314,5,"{""navigation_marks"": 5}" +arc_id,arc_y250_134,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl W 10s 84m 20M,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl W 3s 64m 21M,5,"{""navigation_marks"": 5}" +arc_source_code,04209116,5,"{""navigation_marks"": 5}" +arc_id,arc_y029_296,5,"{""navigation_marks"": 5}" +chart_label_subtext,Iso W 8s 92m 12M,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl W 8s 96m 23M,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl W 10s 133m 20M,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl W 10s 144m 23M,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl(3) W 20s 148m 22M,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl W 10s 129m 19M,5,"{""navigation_marks"": 5}" +arc_source_code,04018258,5,"{""navigation_marks"": 5}" +arc_id,arc_y198_078,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl W 8s 26m 15M,5,"{""navigation_marks"": 5}" +arc_source_code,04263083,5,"{""navigation_marks"": 5}" +arc_id,arc_y083_263,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl W 8s 75m 20M,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl(3) W 12s 128m 21M,5,"{""navigation_marks"": 5}" +arc_source_code,04301172,5,"{""navigation_marks"": 5}" +arc_id,arc_y121_352,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl W 5s 52m 19M,5,"{""navigation_marks"": 5}" +arc_source_code,04331151,5,"{""navigation_marks"": 5}" +arc_id,arc_y151_331,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl W 8s 95m 20M,5,"{""navigation_marks"": 5}" +arc_source_code,04313145,5,"{""navigation_marks"": 5}" +arc_id,arc_y133_325,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl W 10s 122m 20M,5,"{""navigation_marks"": 5}" +arc_source_code,04060319,5,"{""navigation_marks"": 5}" +arc_id,arc_y240_139,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl W 15s 131m 21M,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl(2) W 9s 47m 12M,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl(2) W 20s 47m 18M,5,"{""navigation_marks"": 5}" +arc_source_code,04109033,5,"{""navigation_marks"": 5}" +arc_id,arc_y289_213,5,"{""navigation_marks"": 5}" +arc_source_code,04278130,5,"{""navigation_marks"": 5}" +arc_id,arc_y098_310,5,"{""navigation_marks"": 5}" +chart_label_subtext,Oc R 8s 12m 4M,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl W 12s 149m 21M,5,"{""navigation_marks"": 5}" +arc_source_code,04185055,5,"{""navigation_marks"": 5}" +arc_id,arc_y005_235,5,"{""navigation_marks"": 5}" +chart_label_subtext,Iso G 6s 15m 4M,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl W 8s 219m 20M,5,"{""navigation_marks"": 5}" +arc_source_code,04014213,5,"{""navigation_marks"": 5}" +arc_id,arc_y194_033,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl W 12s 28m 15M,5,"{""navigation_marks"": 5}" +arc_source_code,04350210,5,"{""navigation_marks"": 5}" +arc_id,arc_y170_030,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl W 10s 43m 18M,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl W 15s 66m 21M,5,"{""navigation_marks"": 5}" +arc_source_code,04092292,5,"{""navigation_marks"": 5}" +arc_id,arc_y272_112,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl W 8s 32m 16M,5,"{""navigation_marks"": 5}" +arc_source_code,04155005,5,"{""navigation_marks"": 5}" +arc_id,arc_y335_185,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl(3) W 30s 114m 23M,5,"{""navigation_marks"": 5}" +arc_source_code,04140341,5,"{""navigation_marks"": 5}" +arc_id,arc_y320_161,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl W 15s 35m 16M,5,"{""navigation_marks"": 5}" +arc_source_code,04093033,5,"{""navigation_marks"": 5}" +arc_id,arc_y273_213,5,"{""navigation_marks"": 5}" +chart_label_subtext,"Al Fl W,R 30s 46m W18,R17M",5,"{""navigation_marks"": 5}" +arc_source_code,0419907902043079,5,"{""navigation_marks"": 5}" +arc_id,arc_y019_259_r223_259,5,"{""navigation_marks"": 5}" +chart_label_subtext,Iso W 6s 48m 18M,5,"{""navigation_marks"": 5}" +arc_source_code,04095312,5,"{""navigation_marks"": 5}" +arc_id,arc_y275_132,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl W 10s 33m 16M,5,"{""navigation_marks"": 5}" +arc_source_code,04334203,5,"{""navigation_marks"": 5}" +arc_id,arc_y154_023,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl W 15s 37m 17M,5,"{""navigation_marks"": 5}" +arc_source_code,04270080,5,"{""navigation_marks"": 5}" +arc_id,arc_y090_260,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl W 6s 31m 16M,5,"{""navigation_marks"": 5}" +arc_source_code,04021213,5,"{""navigation_marks"": 5}" +arc_id,arc_y201_033,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl W 10s 41m 18M,5,"{""navigation_marks"": 5}" +arc_source_code,04314201,5,"{""navigation_marks"": 5}" +arc_id,arc_y134_021,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl R 4s 7m 3M,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl W 6s 42m 18M,5,"{""navigation_marks"": 5}" +arc_source_code,04079310,5,"{""navigation_marks"": 5}" +arc_id,arc_y259_130,5,"{""navigation_marks"": 5}" +arc_source_code,04020243,5,"{""navigation_marks"": 5}" +arc_id,arc_y200_063,5,"{""navigation_marks"": 5}" +arc_source_code,04035209,5,"{""navigation_marks"": 5}" +arc_id,arc_y215_029,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl(3) W 13s 16m 7M,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl W 5s 116m 19M,5,"{""navigation_marks"": 5}" +arc_source_code,04346177,5,"{""navigation_marks"": 5}" +arc_id,arc_y166_357,5,"{""navigation_marks"": 5}" +chart_label_subtext,"Al Fl W,R 16s 60m W20,R18M",5,"{""navigation_marks"": 5}" +arc_source_code,08241098,5,"{""navigation_marks"": 5}" +arc_id,arc_code_08241098,5,"{""navigation_marks"": 5}" +chart_label_subtext,Iso W 6s 13m 8M,5,"{""navigation_marks"": 5}" +display_code,30000006,5,"{""navigation_marks"": 5}" +chart_label_subtext,"Al Fl R,G 20s 63m R16,G16M",5,"{""navigation_marks"": 5}" +chart_label_subtext,"Al Fl W,G 30s 72m W21,G17M",5,"{""navigation_marks"": 5}" +arc_source_code,07207029,5,"{""navigation_marks"": 5}" +arc_id,arc_code_07207029,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl(2) W 16s 51m 19M,5,"{""navigation_marks"": 5}" +chart_label_subtext,Iso R 4s 14m 8M,5,"{""navigation_marks"": 5}" +chart_label_subtext,"Fl W,R 12s 121m 20M",5,"{""navigation_marks"": 5}" +arc_source_code,042900770207709004090189,5,"{""navigation_marks"": 5}" +arc_id,arc_y110_257_r257_270_y270_009,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl W 10s 82m 20M,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl W 10s 107m 23M,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl W 12s 67m 20M,5,"{""navigation_marks"": 5}" +arc_source_code,04190085,5,"{""navigation_marks"": 5}" +arc_id,arc_y010_265,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl(3) W 30s 103m 19M,5,"{""navigation_marks"": 5}" +arc_source_code,04016291,5,"{""navigation_marks"": 5}" +arc_id,arc_y196_111,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl W 8s 101m 20M,5,"{""navigation_marks"": 5}" +arc_source_code,04205097,5,"{""navigation_marks"": 5}" +arc_id,arc_y025_277,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl W 6s 66m 19M,5,"{""navigation_marks"": 5}" +arc_source_code,04070270,5,"{""navigation_marks"": 5}" +arc_id,arc_y250_090,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl W 15s 57m 20M,5,"{""navigation_marks"": 5}" +arc_source_code,04010293,5,"{""navigation_marks"": 5}" +arc_id,arc_y190_113,5,"{""navigation_marks"": 5}" +arc_source_code,04018198,5,"{""navigation_marks"": 5}" +arc_id,arc_y198_018,5,"{""navigation_marks"": 5}" +chart_label_subtext,Iso W 6s 40m 12M,5,"{""navigation_marks"": 5}" +chart_label_subtext,"Al Fl W,R 30s 45m W18,R18M",5,"{""navigation_marks"": 5}" +arc_source_code,02002252,5,"{""navigation_marks"": 5}" +arc_id,arc_r182_072,5,"{""navigation_marks"": 5}" +chart_label_subtext,"Al Fl(2+1) W,G 30s 41m W17,G17M",5,"{""navigation_marks"": 5}" +arc_source_code,07207075,5,"{""navigation_marks"": 5}" +arc_id,arc_code_07207075,5,"{""navigation_marks"": 5}" +chart_label_subtext,"Fl W,R 15s 36m 17M",5,"{""navigation_marks"": 5}" +arc_source_code,0425408002080101,5,"{""navigation_marks"": 5}" +arc_id,arc_y074_260_r260_281,5,"{""navigation_marks"": 5}" +arc_source_code,04297254,5,"{""navigation_marks"": 5}" +arc_id,arc_y117_074,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl W 10s 96m 24M,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl W 12s 54m 12M,5,"{""navigation_marks"": 5}" +arc_source_code,04318146,5,"{""navigation_marks"": 5}" +arc_id,arc_y138_326,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl(2) W 20s 71m 22M,5,"{""navigation_marks"": 5}" +arc_source_code,04229073,5,"{""navigation_marks"": 5}" +arc_id,arc_y049_253,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl(3) G 13s 7m 8M,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl(2) W 20s 50m 12M,5,"{""navigation_marks"": 5}" +arc_source_code,04279098,5,"{""navigation_marks"": 5}" +arc_id,arc_y099_278,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl W 15s 52m 19M,5,"{""navigation_marks"": 5}" +arc_source_code,04169065,5,"{""navigation_marks"": 5}" +arc_id,arc_y349_245,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl(2) W 8s 27m 12M,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl W 10s 211m 20M,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl W 15s 76m 21M,5,"{""navigation_marks"": 5}" +arc_source_code,04105020,5,"{""navigation_marks"": 5}" +arc_id,arc_y285_200,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl(3) W 13s 18m 12M,5,"{""navigation_marks"": 5}" +arc_source_code,04108347,5,"{""navigation_marks"": 5}" +arc_id,arc_y288_167,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl(2) W 30s 131m 24M,5,"{""navigation_marks"": 5}" +chart_label_subtext,Iso W 6s 44m 17M,5,"{""navigation_marks"": 5}" +arc_source_code,04156335,5,"{""navigation_marks"": 5}" +arc_id,arc_y336_155,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl W 10s 40m 17M,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl W 8s 41m 17M,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl W 5s 42m 18M,5,"{""navigation_marks"": 5}" +arc_source_code,04006315,5,"{""navigation_marks"": 5}" +arc_id,arc_y186_135,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl(4) W 30s 51m 19M,5,"{""navigation_marks"": 5}" +arc_source_code,04182090,5,"{""navigation_marks"": 5}" +arc_id,arc_y002_270,5,"{""navigation_marks"": 5}" +chart_label_subtext,"Al Fl W,R 16s 46m W18,R16M",5,"{""navigation_marks"": 5}" +arc_source_code,08068287,5,"{""navigation_marks"": 5}" +arc_id,arc_code_08068287,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl W 12s 37m 17M,5,"{""navigation_marks"": 5}" +arc_source_code,04255075,5,"{""navigation_marks"": 5}" +arc_id,arc_y075_255,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl W 10s 47m 18M,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl W 8s 58m 19M,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl W 5s 143m 19M,5,"{""navigation_marks"": 5}" +arc_source_code,04082332,5,"{""navigation_marks"": 5}" +arc_id,arc_y262_152,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl W 10s 114m 20M,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl R 3s 14m 5M,5,"{""navigation_marks"": 5}" +chart_label_subtext,"Al W,R 10s 48m 19M",5,"{""navigation_marks"": 5}" +arc_source_code,08208134,5,"{""navigation_marks"": 5}" +arc_id,arc_code_08208134,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl W 10s 91m 20M,5,"{""navigation_marks"": 5}" +arc_source_code,04307120,5,"{""navigation_marks"": 5}" +arc_id,arc_y127_300,5,"{""navigation_marks"": 5}" +arc_source_code,04168018,5,"{""navigation_marks"": 5}" +arc_id,arc_y348_198,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl W 4s 70m 12M,5,"{""navigation_marks"": 5}" +arc_source_code,04135320,5,"{""navigation_marks"": 5}" +arc_id,arc_y315_140,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl(2) W 15s 38m 17M,5,"{""navigation_marks"": 5}" +arc_source_code,04197017,5,"{""navigation_marks"": 5}" +arc_id,arc_y017_197,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl W 15s 75m 22M,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl(3) W 20s 58m 20M,5,"{""navigation_marks"": 5}" +arc_source_code,04222055,5,"{""navigation_marks"": 5}" +arc_id,arc_y042_235,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl W 8s 57m 19M,5,"{""navigation_marks"": 5}" +arc_source_code,04097335,5,"{""navigation_marks"": 5}" +arc_id,arc_y277_155,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl W 15s 51m 19M,5,"{""navigation_marks"": 5}" +arc_source_code,04300156,5,"{""navigation_marks"": 5}" +arc_id,arc_y120_336,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl W 10s 87m 20M,5,"{""navigation_marks"": 5}" +chart_label_subtext,"Fl W,R 8s 48m 19M",5,"{""navigation_marks"": 5}" +arc_source_code,0420704802048070,5,"{""navigation_marks"": 5}" +arc_id,arc_y027_228_r228_250,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl R 3s 26m 5M,5,"{""navigation_marks"": 5}" +arc_source_code,02257145,5,"{""navigation_marks"": 5}" +arc_id,arc_r077_325,5,"{""navigation_marks"": 5}" +chart_label_subtext,"Oc W,R 8s 31m 13M",5,"{""navigation_marks"": 5}" +arc_source_code,042572820429532304010148022172570228229502323010,5,"{""navigation_marks"": 5}" +arc_id,arc_y077_102_y115_143_y190_328_r037_077_r102_115_r143_190,5,"{""navigation_marks"": 5}" +chart_label_subtext,Iso W 6s 71m 22M,5,"{""navigation_marks"": 5}" +arc_source_code,04105013,5,"{""navigation_marks"": 5}" +arc_id,arc_y285_193,5,"{""navigation_marks"": 5}" +chart_label_subtext,Q(9) W 15s 5m 3M,5,"{""navigation_marks"": 5}" +chart_label_subtext,Iso R 4s 24m 3M,5,"{""navigation_marks"": 5}" +chart_label_subtext,Iso G 4s 15m 4M,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl R 3s 11m 4M,5,"{""navigation_marks"": 5}" +chart_label_subtext,F Y 13m 12M,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl R 4s 17m 7M,5,"{""navigation_marks"": 5}" +shape_class_code,318,5,"{""navigation_marks"": 5}" +display_code,31800004,5,"{""navigation_marks"": 5}" +canonical_object_type,タワー型灯標識,5,"{""navigation_marks"": 5}" +chart_label_subtext,F W 30m 5M,5,"{""navigation_marks"": 5}" +chart_label_subtext,Iso W 4s 7M,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl(3) R 12s 13m 5M,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl(2) W 5s 7m 5M,5,"{""navigation_marks"": 5}" +chart_label_subtext,15m,5,"{""navigation_marks"": 5}" +chart_label_subtext,F W 77m 5M,5,"{""navigation_marks"": 5}" +chart_label_subtext,F G 31m 4M,5,"{""navigation_marks"": 5}" +chart_label_subtext,Mo (U) W 8s 4.4m 6M,5,"{""navigation_marks"": 5}" +chart_label_subtext,F G 31m 11M,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl(2) R 6s 10m 7M,5,"{""navigation_marks"": 5}" +chart_label_subtext,F Y 26m 5M,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl Y 4s 26m 4M,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl G 3s 5m 5M,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl G 3s 14m 4M,5,"{""navigation_marks"": 5}" +chart_label_subtext,Fl W 8s 84m 12M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Fl(2) W 10s 22m 12M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Fl W 3s 135m 12M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Fl W 3s 119m 5M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Fl W 3s 22m 3M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Fl W 3s 31m 7M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Fl W 4s 66m 7M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Iso W 6s 102m 8M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Fl W 3s 28m 12M,4,"{""navigation_marks"": 4}" +arc_source_code,04140012,4,"{""navigation_marks"": 4}" +arc_id,arc_y320_192,4,"{""navigation_marks"": 4}" +chart_label_subtext,Iso W 6s 141m 5M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Fl(4) W 14s 118m 7M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Fl(2) W 6s 43m 5M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Fl W 3s 23m 5M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Fl(4) W 15s 84m 12M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Iso W 6s 65m 12M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Fl(3) W 12s 32m 5M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Iso W 6s 129m 8M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Fl W 3s 67m 5M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Fl(2) W 10s 157m 7M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Fl W 5s 41m 12M,4,"{""navigation_marks"": 4}" +arc_source_code,04216098,4,"{""navigation_marks"": 4}" +arc_id,arc_y036_278,4,"{""navigation_marks"": 4}" +chart_label_subtext,Fl W 5s 28m 7M,4,"{""navigation_marks"": 4}" +chart_label_subtext,"Iso W,R 6s 21m 14M",4,"{""navigation_marks"": 4}" +arc_source_code,042310350405610002035056,4,"{""navigation_marks"": 4}" +arc_id,arc_y051_215_y236_280_r215_236,4,"{""navigation_marks"": 4}" +chart_label_subtext,Iso W 6s 46m 12M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Fl W 5s 66m 5M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Fl W 3s 51m 7M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Iso W 6s 75m 8M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Fl W 5s 50m 12M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Fl(2) W 7s 43m 7M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Fl W 5s 94m 7M,4,"{""navigation_marks"": 4}" +chart_label_subtext,"F Fl W 5s 13m F2,Fl.5M",4,"{""navigation_marks"": 4}" +chart_label_subtext,Iso W 6s 28m 12M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Fl W 4s 7m 5M,4,"{""navigation_marks"": 4}" +arc_source_code,04326164,4,"{""navigation_marks"": 4}" +arc_id,arc_y146_344,4,"{""navigation_marks"": 4}" +chart_label_subtext,Fl(2) W 7s 29m 5M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Iso W 6s 43m 8M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Fl W 5s 46m 12M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Mo(U) W 10s 30m 14M,4,"{""navigation_marks"": 4}" +chart_label_subtext,"Al W,R 10s 37m 11M",4,"{""navigation_marks"": 4}" +arc_source_code,02317310,4,"{""navigation_marks"": 4}" +arc_id,arc_r137_130,4,"{""navigation_marks"": 4}" +chart_label_subtext,Iso W 4s 25m 12M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Fl(2) W 6s 46m 12M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Fl W 3s 42m 5M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Fl(2) W 10s 87m 7M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Fl(3) W 12s 32m 12M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Fl W 3s 56m 5M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Fl W 4s 19m 8M,4,"{""navigation_marks"": 4}" +chart_label_subtext,F W 70m,4,"{""navigation_marks"": 4}" +display_code,31035704,4,"{""navigation_marks"": 4}" +chart_label_subtext,Fl G 3s 13m 4M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Fl(2) W 5s 4.9m 3M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Mo(U) W 10s 22m 10M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Mo(U) W 8s 7m 4M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Mo(U) W 15s 6M,4,"{""navigation_marks"": 4}" +chart_label_subtext,F W 20m,4,"{""navigation_marks"": 4}" +chart_label_subtext,Iso G 6s 16m 4M,4,"{""navigation_marks"": 4}" +chart_label_subtext,F W 11m 5M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Fl R 3s 14m 4M,4,"{""navigation_marks"": 4}" +chart_label_subtext,F G 10m 8M,4,"{""navigation_marks"": 4}" +chart_label_subtext,F G 17m 8M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Fl R 5s 15m 3M,4,"{""navigation_marks"": 4}" +chart_label_subtext,F W 17m,4,"{""navigation_marks"": 4}" +chart_label_subtext,Fl(2) W 5s 30m 11M,4,"{""navigation_marks"": 4}" +chart_label_subtext,F W 18m,4,"{""navigation_marks"": 4}" +chart_label_subtext,Mo(U) W 8s 3M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Fl(2) Y 6s 5M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Fl(2) R 6s 15m 3M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Q W 9m 5M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Fl(2) W 5s 20m 5M,4,"{""navigation_marks"": 4}" +chart_fill_pattern,pattern_fill_foul_ground,4,"{""anchor_caution_hazard_area"": 4}" +chart_label_subtext,Fl G 5s 11m 3M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Fl(2) W 5s 8m 5M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Fl(2) R 6s 15m 4M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Fl R 3s 17m 4M,4,"{""navigation_marks"": 4}" +chart_label_subtext,"F Fl G 3s 9m F2,Fl5M",4,"{""navigation_marks"": 4}" +chart_label_subtext,Fl(2) R 6s 11m 4M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Fl(2) W 5s 8m 3M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Q(3) W 10s 6m 3M,4,"{""navigation_marks"": 4}" +chart_label_subtext,F Y 24m 12M,4,"{""navigation_marks"": 4}" +chart_label_subtext,F W 45m,4,"{""navigation_marks"": 4}" +chart_label_subtext,F W 15m 4M,4,"{""navigation_marks"": 4}" +chart_label_subtext,"F Fl R 3s 13m F2,Fl.5M",4,"{""navigation_marks"": 4}" +chart_label_subtext,Q(6)+L Fl W 15s 15m 5M,4,"{""navigation_marks"": 4}" +chart_label_subtext,"F Fl G 3s 10m F2,Fl5M",4,"{""navigation_marks"": 4}" +chart_label_subtext,Iso G 4s 30m 4M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Fl(2) R 6s 7m 3M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Mo(U) W 10s 8m 5M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Fl R 4s 11m 3M,4,"{""navigation_marks"": 4}" +chart_label_subtext,F G 17m 4M,4,"{""navigation_marks"": 4}" +chart_label_subtext,F W 19m 5M,4,"{""navigation_marks"": 4}" +chart_label_subtext,F R 17m 3M,4,"{""navigation_marks"": 4}" +chart_label_subtext,"F Fl R 5s 13m F2,Fl.5M",4,"{""navigation_marks"": 4}" +chart_label_subtext,Fl(2) R 6s 16m 3M,4,"{""navigation_marks"": 4}" +chart_label_subtext,F W 16m 5M,4,"{""navigation_marks"": 4}" +chart_label_subtext,F G 30m 5M,4,"{""navigation_marks"": 4}" +chart_label_subtext,F W 32m 5M,4,"{""navigation_marks"": 4}" +chart_label_subtext,F R 33m 5M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Fl G 4s 17m 7M,4,"{""navigation_marks"": 4}" +display_code,32037000,4,"{""navigation_marks"": 4}" +display_code,32037100,4,"{""navigation_marks"": 4}" +chart_label_subtext,Q W 13m 5M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Fl G 5s 14m 4M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Fl R 4s 12m 4M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Mo(A) G 8s 10m 5M,4,"{""navigation_marks"": 4}" +chart_label_subtext,F W 6m 6M,4,"{""navigation_marks"": 4}" +chart_label_subtext,F G 19m 4M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Fl G 5s 12m 3M,4,"{""navigation_marks"": 4}" +chart_label_subtext,F W 27m 7M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Fl(2) R 7s 13m 5M,4,"{""navigation_marks"": 4}" +display_code,32800001,4,"{""navigation_marks"": 4}" +chart_label_subtext,Mo(U) W 8s 7m 3M,4,"{""navigation_marks"": 4}" +chart_label_subtext,"F Fl R 5s 14m F2,Fl.5M",4,"{""navigation_marks"": 4}" +chart_label_subtext,Fl(2) R 6s 11m 3M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Fl R 5s 9m 4M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Fl G 3s 18m 7M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Fl G 4s 7m 5M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Mo(U) W 8s 36m 11M,4,"{""navigation_marks"": 4}" +chart_label_subtext,"Aero Al Fl(2) W,G 5s",4,"{""navigation_marks"": 4}" +chart_label_subtext,Fl R 5s 10m 5M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Fl(2) G 6s 11m 7M,4,"{""navigation_marks"": 4}" +chart_label_subtext,"F Fl R 5s 16m F2,Fl.5M",4,"{""navigation_marks"": 4}" +chart_label_subtext,F W 95m,4,"{""navigation_marks"": 4}" +chart_label_subtext,F W 26m,4,"{""navigation_marks"": 4}" +chart_label_subtext,Fl(2) G 6s 10m 4M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Fl R 5s 10m 3M,4,"{""navigation_marks"": 4}" +chart_label_subtext,F Y 26m 12M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Ra,4,"{""navigation_marks"": 4}" +chart_label_subtext,F G 64m 8M,4,"{""navigation_marks"": 4}" +chart_label_subtext,"Aero Al Fl(2) W,G 6s",4,"{""navigation_marks"": 4}" +chart_label_subtext,Mo(U) W 8s 10m 5M,4,"{""navigation_marks"": 4}" +chart_label_subtext,F G 25m 6M,4,"{""navigation_marks"": 4}" +chart_label_subtext,F W 25m 6M,4,"{""navigation_marks"": 4}" +chart_label_subtext,F R 25m 5M,4,"{""navigation_marks"": 4}" +display_code,30600006,4,"{""navigation_marks"": 4}" +chart_label_subtext,"R,G",4,"{""navigation_marks"": 4}" +chart_label_subtext,F G 8m 4M,4,"{""navigation_marks"": 4}" +chart_label_subtext,F W 8m 5M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Mo(U) R 8s 3M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Mo(U) W 8s 7m 6M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Mo(U) W 13s 3M,4,"{""navigation_marks"": 4}" +display_code,32136000,4,"{""navigation_marks"": 4}" +chart_label_subtext,Mo(U) W 12s 4M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Mo(U) W 15s 7M,4,"{""navigation_marks"": 4}" +chart_label_subtext,17m,4,"{""navigation_marks"": 4}" +chart_label_subtext,Fl G 5s 9m 5M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Iso G 6s 8m 4M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Iso R 8s 8m 4M,4,"{""navigation_marks"": 4}" +chart_label_subtext,"F Fl G 6s 14m F2,Fl.5M",4,"{""navigation_marks"": 4}" +chart_label_subtext,F R 36m 6M,4,"{""navigation_marks"": 4}" +chart_label_subtext,"F Fl G 6s 15m F2,Fl.5M",4,"{""navigation_marks"": 4}" +chart_label_subtext,"F Fl R 4s 15m F2,Fl.5M",4,"{""navigation_marks"": 4}" +chart_label_subtext,Iso R 6s 17m 8M,4,"{""navigation_marks"": 4}" +chart_label_subtext,F Y 7m 4M,4,"{""navigation_marks"": 4}" +chart_label_subtext,F Y 10m 4M,4,"{""navigation_marks"": 4}" +chart_label_subtext,F Y 14m 4M,4,"{""navigation_marks"": 4}" +chart_label_subtext,F Y 18m 4M,4,"{""navigation_marks"": 4}" +chart_label_subtext,F Y 22m 4M,4,"{""navigation_marks"": 4}" +chart_label_subtext,F Y 25m 4M,4,"{""navigation_marks"": 4}" +chart_label_subtext,F G 38m 8M,4,"{""navigation_marks"": 4}" +chart_label_subtext,F W 38m 8M,4,"{""navigation_marks"": 4}" +chart_label_subtext,F R 38m 8M,4,"{""navigation_marks"": 4}" +chart_label_subtext,F G 23m 8M,4,"{""navigation_marks"": 4}" +chart_label_subtext,F W 24m 8M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Mo(U) W 8s 6m 4M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Iso G 4s 16m 5M,4,"{""navigation_marks"": 4}" +chart_label_subtext,F W 43m 5M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Mo(A) R 8s 13m 3M,4,"{""navigation_marks"": 4}" +chart_label_subtext,F W 36m,4,"{""navigation_marks"": 4}" +chart_label_subtext,Oc G 4s 12m 4M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Iso G 4s 49m 6M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Iso W 4s 52m 5M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Iso R 4s 49m 5M,4,"{""navigation_marks"": 4}" +chart_label_subtext,F G 24m 5M,4,"{""navigation_marks"": 4}" +chart_label_subtext,F R 24m 5M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Q(3) W 10s 10m 5M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Oc G 4s 14m 4M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Mo(A) G 8s 11m 5M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Mo(U) W 8s 4.4m 5M,4,"{""navigation_marks"": 4}" +chart_label_subtext,F G 26m 3M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Fl G 3s 24m 4M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Fl R 3s 24m 4M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Iso W 4s 59m 5M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Fl(2) R 6s 11m 7M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Mo(A) R 8s 15m 5M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Fl G 4s 11m 7M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Iso G 4s 27m 3M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Iso R 4s 27m 3M,4,"{""navigation_marks"": 4}" +chart_label_subtext,F W 55m,4,"{""navigation_marks"": 4}" +chart_label_subtext,F R 46m 5M,4,"{""navigation_marks"": 4}" +chart_label_subtext,F G 39m 4M,4,"{""navigation_marks"": 4}" +chart_label_subtext,F W 39m 4M,4,"{""navigation_marks"": 4}" +chart_label_subtext,F R 39m 3M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Iso G 6s 18m 8M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Fl(2) R 6s 16m 7M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Fl(2) R 6s 6M,4,"{""navigation_marks"": 4}" +chart_label_subtext,F G 55m 6M,4,"{""navigation_marks"": 4}" +chart_label_subtext,F R 62m 5M,4,"{""navigation_marks"": 4}" +chart_label_subtext,F G 77m 8M,4,"{""navigation_marks"": 4}" +chart_label_subtext,F W 77m,4,"{""navigation_marks"": 4}" +chart_label_subtext,Fl(2) W 5s 15m 3M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Fl G 5s 12m 5M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Iso G 4s 42m 5M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Iso W 4s 43m 5M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Iso R 4s 41m 4M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Iso G 6s 8m 5M,4,"{""navigation_marks"": 4}" +chart_label_subtext,F W 37m 8M,4,"{""navigation_marks"": 4}" +chart_label_subtext,F G 57m 4M,4,"{""navigation_marks"": 4}" +chart_label_subtext,F W 59m 4M,4,"{""navigation_marks"": 4}" +chart_label_subtext,F R 57m 4M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Iso W 4s 36m 6M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Iso R 4s 36m 5M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Iso G 4s 40m 4M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Iso W 4s 41m 4M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Iso R 4s 40m 4M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Iso R 6s 49m 5M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Iso G 6s 49m 5M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Fl(2) G 6s 20m 7M,4,"{""navigation_marks"": 4}" +chart_label_subtext,F W 91m,4,"{""navigation_marks"": 4}" +chart_label_subtext,Fl(3) R 12s 12m 5M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Fl(2) W 5s 9m 3M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Mo(D) R 8s 10m 3M,4,"{""navigation_marks"": 4}" +chart_label_subtext,F R 33m 4M,4,"{""navigation_marks"": 4}" +chart_label_subtext,F Y 31m 5M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Iso G 6s 9m 5M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Fl(2) G 6s 7m 5M,4,"{""navigation_marks"": 4}" +chart_label_subtext,"F Fl G 6s 13m F2,Fl.5M",4,"{""navigation_marks"": 4}" +chart_label_subtext,Iso G 6s 17m 5M,4,"{""navigation_marks"": 4}" +chart_label_subtext,F G 44m 4M,4,"{""navigation_marks"": 4}" +chart_label_subtext,F W 47m 4M,4,"{""navigation_marks"": 4}" +chart_label_subtext,F R 46m 4M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Iso R 6s 15m 5M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Fl R 4s 12m 7M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Fl R 4s 9m 4M,4,"{""navigation_marks"": 4}" +chart_label_subtext,25m,4,"{""navigation_marks"": 4}" +chart_label_subtext,F G 40m 5M,4,"{""navigation_marks"": 4}" +chart_label_subtext,F W 41m 5M,4,"{""navigation_marks"": 4}" +chart_label_subtext,F R 41m 5M,4,"{""navigation_marks"": 4}" +chart_label_subtext,F G 47m 3M,4,"{""navigation_marks"": 4}" +chart_label_subtext,F R 50m 3M,4,"{""navigation_marks"": 4}" +chart_label_subtext,F G 73m 5M,4,"{""navigation_marks"": 4}" +chart_label_subtext,F R 80m 5M,4,"{""navigation_marks"": 4}" +chart_label_subtext,F G 80m 5M,4,"{""navigation_marks"": 4}" +chart_label_subtext,F Y 11m 3M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Fl(2) G 6s 5m 3M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Fl G 3s 5m 3M,4,"{""navigation_marks"": 4}" +chart_label_subtext,F W 61m,4,"{""navigation_marks"": 4}" +chart_label_subtext,"F Fl G 4s 13m F2,Fl.5M",4,"{""navigation_marks"": 4}" +chart_label_subtext,Fl(2) R 6s 19m 5M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Iso G 6s 15m 5M,4,"{""navigation_marks"": 4}" +chart_label_subtext,F W 48m,4,"{""navigation_marks"": 4}" +chart_label_subtext,"F Fl G 5s 12m F2,Fl.5M",4,"{""navigation_marks"": 4}" +chart_label_subtext,F R,4,"{""navigation_marks"": 4}" +chart_label_subtext,F G,4,"{""navigation_marks"": 4}" +chart_label_subtext,F W 30m 4M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Mo(U) W 8s 12m 5M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Mo(U) W 8s 7m 5M,4,"{""navigation_marks"": 4}" +display_code,31335800,4,"{""navigation_marks"": 4}" +chart_label_subtext,F W 83m 8M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Fl R 3s 5m 3M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Fl(2) G 7s 16m 5M,4,"{""navigation_marks"": 4}" +chart_label_subtext,F W 23m 5M,4,"{""navigation_marks"": 4}" +chart_label_subtext,F R 22m 4M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Mo(U) W 10s 8M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Fl Y 4s 4.2m 4M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Iso G 4s 18m 5M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Iso R 4s 11m 3M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Mo(U) W 8s 9m 5M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Mo(N) Y 6s 6M,4,"{""navigation_marks"": 4}" +chart_label_subtext,F W 41m 6M,4,"{""navigation_marks"": 4}" +chart_label_subtext,F R 39m 6M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Iso W 4s 32m 6M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Iso R 4s 31m 6M,4,"{""navigation_marks"": 4}" +chart_label_subtext,F G 33m 6M,4,"{""navigation_marks"": 4}" +chart_label_subtext,F R 33m 6M,4,"{""navigation_marks"": 4}" +chart_label_subtext,F G 17m 5M,4,"{""navigation_marks"": 4}" +chart_label_subtext,F R 17m 4M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Iso W 4s 27m 6M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Fl Y 4s 4.5m 3M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Mo(A) W 8s 7m 6M,4,"{""navigation_marks"": 4}" +chart_label_subtext,F Y 5M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Iso G 4s 30m 6M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Iso W 4s 30m 7M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Iso R 4s 30m 6M,4,"{""navigation_marks"": 4}" +chart_label_subtext,F Y 20m 5M,4,"{""navigation_marks"": 4}" +chart_label_subtext,F Y 14m 5M,4,"{""navigation_marks"": 4}" +chart_label_subtext,"F Fl G 5s 13m F2,Fl.5M",4,"{""navigation_marks"": 4}" +chart_label_subtext,Iso R 4s 22m 5M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Fl Y,4,"{""navigation_marks"": 4}" +chart_label_subtext,F W 28m 5M,4,"{""navigation_marks"": 4}" +chart_label_subtext,F R 26m 4M,4,"{""navigation_marks"": 4}" +chart_label_subtext,F G 34m 7M,4,"{""navigation_marks"": 4}" +chart_label_subtext,F W 35m 11M,4,"{""navigation_marks"": 4}" +chart_label_subtext,F R 34m 7M,4,"{""navigation_marks"": 4}" +chart_label_subtext,F G 47m 8M,4,"{""navigation_marks"": 4}" +chart_label_subtext,F W 47m 8M,4,"{""navigation_marks"": 4}" +chart_label_subtext,F R 47m 8M,4,"{""navigation_marks"": 4}" +chart_label_subtext,F R 55m 9M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Fl Y 4s 5m 5M,4,"{""navigation_marks"": 4}" +chart_label_subtext,F G 21m 5M,4,"{""navigation_marks"": 4}" +chart_label_subtext,F W 21m 5M,4,"{""navigation_marks"": 4}" +chart_label_subtext,F R 21m 5M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Iso G 4s 33m 5M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Iso W 4s 31m 5M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Iso R 4s 33m 5M,4,"{""navigation_marks"": 4}" +chart_label_subtext,F W 16m 6M,4,"{""navigation_marks"": 4}" +chart_label_subtext,F Y 12m 11M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Mo(C) R 10s 4M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Iso G 4s 9m 4M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Fl G 4s 5m 3M,4,"{""navigation_marks"": 4}" +chart_label_subtext,F R 14m 7M,4,"{""navigation_marks"": 4}" +chart_label_subtext,"F Fl G 3s 14m F1,Fl.3M",4,"{""navigation_marks"": 4}" +chart_label_subtext,Mo(D) G 8s 5M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Iso W 4s 8m 6M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Iso R 6s 11m 4M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Iso W 4s 21m 4M,4,"{""navigation_marks"": 4}" +chart_label_subtext,F R 35m 5M,4,"{""navigation_marks"": 4}" +chart_label_subtext,F G 34m 5M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Fl Y 4s 19m 4M,4,"{""navigation_marks"": 4}" +shape_class_code,316,4,"{""navigation_marks"": 4}" +canonical_object_type,大型灯標,4,"{""navigation_marks"": 4}" +chart_label_subtext,Fl Y 4s 8m 6M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Fl Y 4s 7m 6M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Iso G 4s 12m 8M,4,"{""navigation_marks"": 4}" +display_code,33535100,4,"{""navigation_marks"": 4}" +chart_label_subtext,Iso W 6s 53m 5M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Iso G 6s 51m 5M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Iso R 6s 51m 5M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Iso R 6s 14m 4M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Mo(U) W 8s 2M,4,"{""navigation_marks"": 4}" +chart_label_subtext,F G 42m 10M,4,"{""navigation_marks"": 4}" +chart_label_subtext,"Al Fl W,G 4.3s",4,"{""navigation_marks"": 4}" +chart_label_subtext,Fl G 3s 54m 9M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Iso W 4s 58m 8M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Fl R 3s 54m 6M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Mo(U) W 8s 30m 10M,4,"{""navigation_marks"": 4}" +chart_label_subtext,F G 11m 4M,4,"{""navigation_marks"": 4}" +chart_label_subtext,F W 12m 4M,4,"{""navigation_marks"": 4}" +chart_label_subtext,F R 11m 4M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Fl G 3s 59m 9M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Iso W 4s 62m 9M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Fl R 3s 59m 7M,4,"{""navigation_marks"": 4}" +chart_label_subtext,F G 36m 6M,4,"{""navigation_marks"": 4}" +chart_label_subtext,"F Fl G 6s 13m F2,Fl5M",4,"{""navigation_marks"": 4}" +chart_label_subtext,Iso W 4s 53m 9M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Iso G 4s 53m 9M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Iso R 4s 53m 7M,4,"{""navigation_marks"": 4}" +chart_label_subtext,F Y 24m 4M,4,"{""navigation_marks"": 4}" +chart_label_subtext,F Y 32m 4M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Mo(U) R 15s 5M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Fl Y 4s 25m 4M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Fl Y 4s 27m 4M,4,"{""navigation_marks"": 4}" +chart_label_subtext,F G 31m 6M,4,"{""navigation_marks"": 4}" +chart_label_subtext,F W 31m 6M,4,"{""navigation_marks"": 4}" +chart_label_subtext,F R 31m 6M,4,"{""navigation_marks"": 4}" +chart_label_subtext,F G 24m 4M,4,"{""navigation_marks"": 4}" +chart_label_subtext,F W 25m 4M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Mo(U) R 8s 7M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Iso R 6s 10m 4M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Mo(U) W 12s 9M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Mo(U) R 10s 7M,4,"{""navigation_marks"": 4}" +chart_label_subtext,W 9m,4,"{""navigation_marks"": 4}" +chart_label_subtext,F Y 36m 6M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Iso G 4s 63m 7M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Iso W 4s 65m 6M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Iso R 4s 62m 5M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Fl(2) G 6s 17m 3M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Fl(2) R 6s 17m 3M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Iso G 4s 27m 2M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Iso W 4s 28m 2M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Iso R 4s 27m 2M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Iso R 4s 13m 3M,4,"{""navigation_marks"": 4}" +chart_label_subtext,"F Fl G 4s 14m Fl 7,F 4M",4,"{""navigation_marks"": 4}" +chart_label_subtext,F R 19m 6M,4,"{""navigation_marks"": 4}" +chart_label_subtext,F R 24m 6M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Fl G 4s 15m 7M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Fl G 4s 15m 5M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Q(3) W 10s 11m 7M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Mo(U) R 8s 5M,4,"{""navigation_marks"": 4}" +chart_label_subtext,"Aero Al Fl(2+1) W,G 10s",4,"{""navigation_marks"": 4}" +chart_label_subtext,F G 21m 6M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Fl R 3s 8m 5M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Fl R 5s 11m 4M,4,"{""navigation_marks"": 4}" +chart_label_subtext,F Y 4.2m 5M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Iso G 4s 5m 4M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Iso W 4s 6m 6M,4,"{""navigation_marks"": 4}" +chart_label_subtext,Iso R 4s 6m 4M,4,"{""navigation_marks"": 4}" +chart_label_subtext,F Y 6m 5M,4,"{""navigation_marks"": 4}" +chart_label_subtext,"F Fl R 3s 13m F1,Fl.3M",4,"{""navigation_marks"": 4}" +chart_label_subtext,"Dir F W,R,G 65m W13,R10,G10M",4,"{""navigation_marks"": 4}" +chart_label_subtext,Fl W 6s 24m 12M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 10s 62m 12M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 4s 47m 12M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 4s 21m 12M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(2) W 6s 54m 12M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Oc W 4s 108m 12M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Iso W 8s 15m 8M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 10s 10m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 8s 97m 12M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 5s 78m 5M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 4s 43m 5M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 4s 21m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 3s 27m 12M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 5s 17m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 4s 51m 12M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(2) W 6s 25m 12M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 12s 11M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 6s 71m 12M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Iso W 6s 53m 8M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(2) W 6s 25m 5M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 3s 26m 5M,3,"{""navigation_marks"": 3}" +chart_label_subtext,"Fl(2) W,R 6s 41m 12M",3,"{""navigation_marks"": 3}" +arc_source_code,0426524202242265,3,"{""navigation_marks"": 3}" +arc_id,arc_y085_062_r062_085,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 6s 11M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 3s 83m 12M,3,"{""navigation_marks"": 3}" +arc_source_code,04301175,3,"{""navigation_marks"": 3}" +arc_id,arc_y121_355,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 3s 34m 5M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(2) W 7s 71m 12M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 4s 23m 12M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(2) W 7s 20m 12M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 4s 51m 11M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(2) W 6s 68m 11M,3,"{""navigation_marks"": 3}" +chart_label_subtext,"Fl W,R 4s 36m 11M",3,"{""navigation_marks"": 3}" +arc_source_code,04063251042640410204106302251264,3,"{""navigation_marks"": 3}" +arc_id,arc_y243_071_y084_221_r221_243_r071_084,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 3s 20m 12M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 4s 114m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Oc(2) W 12s 107m 12M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Iso W 6s 22m 5M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 4s 38m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(2) G 6s 21m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 5s 11m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 3s 44m 12M,3,"{""navigation_marks"": 3}" +arc_source_code,04107043,3,"{""navigation_marks"": 3}" +arc_id,arc_y287_223,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(2) W 10s 54m 12M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(2) W 7s 22m 12M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Iso W 6s 27m 12M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Iso W 6s 14m 5M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Iso W 6s 12m 5M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(2) W 6s 61m 12M,3,"{""navigation_marks"": 3}" +arc_source_code,04261114,3,"{""navigation_marks"": 3}" +arc_id,arc_y081_294,3,"{""navigation_marks"": 3}" +chart_label_subtext,Iso W 6s 45m 8M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Oc G 4s 6m 4M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Oc G 4s 7m 4M,3,"{""navigation_marks"": 3}" +chart_label_subtext,"F Fl G 3s 7m Fl 5,F 2M",3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 3s 29m 5M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 3s 29m 12M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 4s 76m 12M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 5s 15m 3M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 4s 70m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Oc W 4s 10m 5M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 3s 54m 5M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 4s 16m 5M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 3s 40m 5M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 5s 26m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 3s 22m 12M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 10s 72m 12M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 5s 189m 12M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 3s 18m 5M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 15s 23m 14M,3,"{""navigation_marks"": 3}" +arc_source_code,04051314,3,"{""navigation_marks"": 3}" +arc_id,arc_y231_134,3,"{""navigation_marks"": 3}" +chart_label_subtext,Iso W 6s 23m 5M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 3s 26m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 4s 48m 12M,3,"{""navigation_marks"": 3}" +arc_source_code,04195021,3,"{""navigation_marks"": 3}" +arc_id,arc_y015_201,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 5s 144m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Iso W 8s 115m 8M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(2) W 6s 14m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Iso W 6s 101m 12M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 5s 46m 3M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 4s 25m 5M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 4s 11m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,"Al Fl(2) G,W 6s 7m 5M",3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 4s 49m 5M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(2) W 6s 9m 5M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Iso W 8s 12m 5M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(2) W 6s 69m 5M,3,"{""navigation_marks"": 3}" +chart_label_subtext,"Iso W,R 6s 18m 8M",3,"{""navigation_marks"": 3}" +arc_source_code,0408626602266086,3,"{""navigation_marks"": 3}" +arc_id,arc_y266_086_r086_266,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 5s 26m 5M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 8s 208m 12M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(2) W 7s 76m 12M,3,"{""navigation_marks"": 3}" +chart_label_subtext,L Fl W 10s 114m 5M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Iso W 8s 15m 5M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 5s 32m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 6s 56m 12M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 5s 21m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 3s 80m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 3s 36m 3M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 4s 11m 3M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Iso W 10s 12m 5M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Iso W 6s 30m 5M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Iso W 10s 26m 5M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 4s 9m 5M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 3s 16m 3M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Iso W 6s 41m 5M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 3s 27m 5M,3,"{""navigation_marks"": 3}" +chart_label_subtext,"F Fl G 6s 11m F4,Fl.7M",3,"{""navigation_marks"": 3}" +chart_label_subtext,Iso W 6s 83m 8M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Iso W 6s 24m 5M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 5s 70m 12M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(2) W 7s 85m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,F W 122m 13M,3,"{""navigation_marks"": 3}" +arc_source_code,04045135,3,"{""navigation_marks"": 3}" +arc_id,arc_y225_315,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 5s 175m 12M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 5s 54m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(4) W 15s 91m 12M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 3s 83m 5M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 3s 28m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 3s 50m 12M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Iso W 6s 87m 5M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 6s 76m 12M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Oc W 4s 13m 5M,3,"{""navigation_marks"": 3}" +chart_label_subtext,F R 10m 3M,3,"{""navigation_marks"": 3}" +arc_source_code,0206408002180297,3,"{""navigation_marks"": 3}" +arc_id,arc_r244_260_r000_117,3,"{""navigation_marks"": 3}" +arc_source_code,0105306901192310,3,"{""navigation_marks"": 3}" +arc_id,arc_g233_249_g012_130,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 3s 39m 12M,3,"{""navigation_marks"": 3}" +arc_source_code,04336243,3,"{""navigation_marks"": 3}" +arc_id,arc_y156_063,3,"{""navigation_marks"": 3}" +arc_source_code,04178066,3,"{""navigation_marks"": 3}" +arc_id,arc_y358_246,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 4s 19m 5M,3,"{""navigation_marks"": 3}" +chart_label_subtext,"Fl(2) W,R 5s 20m 5M",3,"{""navigation_marks"": 3}" +arc_source_code,0423222602226232,3,"{""navigation_marks"": 3}" +arc_id,arc_y052_046_r046_052,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 3s 20m 5M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(2) W 6s 25m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 4s 46m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(3) W 13s 21m 5M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(2) W 10s 43m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 4s 86m 12M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 5s 149m 12M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 4s 147m 12M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(2) W 14s 92m 12M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 4s 65m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Oc(2) W 12s 26m 5M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 4s 26m 7M,3,"{""navigation_marks"": 3}" +arc_source_code,04109316,3,"{""navigation_marks"": 3}" +arc_id,arc_y289_136,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(2) W 6s 12m 3M,3,"{""navigation_marks"": 3}" +chart_label_subtext,"Fl W,R 3s 10m 3M",3,"{""navigation_marks"": 3}" +arc_source_code,0413935602106139,3,"{""navigation_marks"": 3}" +arc_id,arc_y319_176_r286_319,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(2) W 6s 40m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 4s 33m 7M,3,"{""navigation_marks"": 3}" +arc_source_code,04297154,3,"{""navigation_marks"": 3}" +arc_id,arc_y117_334,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 3s 19m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(2) W 8s 21m 12M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 6s 51m 12M,3,"{""navigation_marks"": 3}" +chart_label_subtext,"Oc W,R 8s 27m 14M",3,"{""navigation_marks"": 3}" +arc_source_code,040951040203509502104170,3,"{""navigation_marks"": 3}" +arc_id,arc_y275_284_r215_275_r284_350,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 3s 18m 3M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Oc(2) W 12s 40m 5M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Iso W 6s 70m 8M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Iso W 6s 10m 5M,3,"{""navigation_marks"": 3}" +arc_source_code,04029268,3,"{""navigation_marks"": 3}" +arc_id,arc_y209_088,3,"{""navigation_marks"": 3}" +arc_source_code,04245092,3,"{""navigation_marks"": 3}" +arc_id,arc_y065_272,3,"{""navigation_marks"": 3}" +arc_source_code,04031330,3,"{""navigation_marks"": 3}" +arc_id,arc_y211_150,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 5s 23m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Iso W 8s 17m 8M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 4s 82m 12M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(2) W 6s 56m 12M,3,"{""navigation_marks"": 3}" +arc_source_code,04028287,3,"{""navigation_marks"": 3}" +arc_id,arc_y208_107,3,"{""navigation_marks"": 3}" +chart_label_subtext,"Oc W,R 8s 22m 12M",3,"{""navigation_marks"": 3}" +arc_source_code,0411609202092116,3,"{""navigation_marks"": 3}" +arc_id,arc_y296_272_r272_296,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 3s 104m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(2) W 6s 8m 5M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(2) R 8s 15m 5M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Iso W 6s 128m 12M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(3) W 13s 50m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 3s 52m 3M,3,"{""navigation_marks"": 3}" +chart_label_subtext,F Fl(2) R 10s 15m F2.Fl.5M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 4s 37m 12M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Iso W 6s 87m 12M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 4s 66m 5M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 3s 47m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(3) W 12s 23m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Iso W 8s 24m 5M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 3s 21m 5M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(2) W 7s 193m 12M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 4s 27m 5M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 3s 17m 5M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(4) W 15s 39m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 3s 86m 5M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Iso W 6s 34m 12M,3,"{""navigation_marks"": 3}" +chart_label_subtext,"Iso W,R 6s 15m 12M",3,"{""navigation_marks"": 3}" +arc_source_code,0427410502250274,3,"{""navigation_marks"": 3}" +arc_id,arc_y094_285_r070_094,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(2) W 6s 15m 5M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 4s 13m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Iso W 6s 73m 8M,3,"{""navigation_marks"": 3}" +arc_source_code,04094000,3,"{""navigation_marks"": 3}" +arc_id,arc_y274_180,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 3s 80m 5M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 5s 38m 5M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 4s 73m 5M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 5s 13m 5M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 3s 90m 12M,3,"{""navigation_marks"": 3}" +chart_label_subtext,"Fl W,R 2s 68m 7M",3,"{""navigation_marks"": 3}" +arc_source_code,0418112902129181,3,"{""navigation_marks"": 3}" +arc_id,arc_y001_309_r309_001,3,"{""navigation_marks"": 3}" +chart_label_subtext,"Al Fl W,R 10s 47m W18,R14M",3,"{""navigation_marks"": 3}" +chart_label_subtext,Oc W 4s 22m 8M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(2) W 8s 36m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(2) W 8s 103m 12M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 4s 20m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Oc(2) W 8s 64m 12M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(3) W 13s 16m 5M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 3s 61m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 4s 29m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 5s 107m 12M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Iso W 6s 30m 8M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Oc W 4s 15m 5M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(3) W 14s 38m 5M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 5s 13m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Oc R 4s 10m 4M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(2) W 8s 107m 5M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(4) W 16s 33m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 7s 142m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 5s 93m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Iso W 8s 108m 5M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(2) W 6s 65m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 4s 59m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 4s 8m 5M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Iso W 6s 66m 12M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(2) W 6s 47m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Oc W 8s 63m 8M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(2) W 7s 12m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(3) W 13s 53m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Oc(2) W 12s 13m 8M,3,"{""navigation_marks"": 3}" +chart_label_subtext,"Al Fl W,R 16s 58m W20,R18M",3,"{""navigation_marks"": 3}" +arc_source_code,08007250,3,"{""navigation_marks"": 3}" +arc_id,arc_code_08007250,3,"{""navigation_marks"": 3}" +chart_label_subtext,Iso W 6s 59m 8M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(2) W 6s 70m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Oc W 8s 73m 12M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Oc(2) W 6s 11m 4M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 4s 92m 5M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(3) W 15s 28m 12M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 4s 61m 12M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 5s 80m 12M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl R 3s 38m 5M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 3s 105m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 5s 46m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(3) W 12s 62m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Oc(2) W 6s 35m 12M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(2) W 6s 58m 12M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 4s 33m 5M,3,"{""navigation_marks"": 3}" +chart_label_subtext,"Iso W,R 6s 18m 12M",3,"{""navigation_marks"": 3}" +arc_source_code,041201250413031202125130,3,"{""navigation_marks"": 3}" +arc_id,arc_y300_305_y310_132_r305_310,3,"{""navigation_marks"": 3}" +arc_source_code,04020236,3,"{""navigation_marks"": 3}" +arc_id,arc_y200_056,3,"{""navigation_marks"": 3}" +chart_label_subtext,Oc W 8s 27m 4M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(2) W 7s 28m 5M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Iso W 8s 45m 8M,3,"{""navigation_marks"": 3}" +arc_source_code,04053279,3,"{""navigation_marks"": 3}" +arc_id,arc_y233_099,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(2) W 7s 21m 5M,3,"{""navigation_marks"": 3}" +chart_label_subtext,"Fl(3) W,R 13s 45m 12M",3,"{""navigation_marks"": 3}" +arc_source_code,041702050421505102205215,3,"{""navigation_marks"": 3}" +arc_id,arc_y350_025_y035_231_r025_035,3,"{""navigation_marks"": 3}" +chart_label_subtext,Oc(2) W 6s 31m 8M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Iso W 6s 35m 8M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Iso W 6s 17m 8M,3,"{""navigation_marks"": 3}" +arc_source_code,04237100,3,"{""navigation_marks"": 3}" +arc_id,arc_y057_280,3,"{""navigation_marks"": 3}" +arc_source_code,04356186,3,"{""navigation_marks"": 3}" +arc_id,arc_y176_006,3,"{""navigation_marks"": 3}" +chart_label_subtext,"AL FL(2) R,G 6s 64m 7M",3,"{""navigation_marks"": 3}" +chart_label_subtext,"Al Fl G,W 12s 40m 7M",3,"{""navigation_marks"": 3}" +arc_source_code,04325262,3,"{""navigation_marks"": 3}" +arc_id,arc_y145_082,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(2) W 8s 44m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 4s 40m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 5s 58m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(2) W 10s 51m 12M,3,"{""navigation_marks"": 3}" +chart_label_subtext,"Fl W,R 4s 46m 7M",3,"{""navigation_marks"": 3}" +arc_source_code,0408402102021084,3,"{""navigation_marks"": 3}" +arc_id,arc_y264_201_r201_264,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 5s 82m 5M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Iso W 6s 93m 12M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(3) W 13s 30m 12M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 4s 122m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Iso W 8s 69m 12M,3,"{""navigation_marks"": 3}" +arc_source_code,04204099,3,"{""navigation_marks"": 3}" +arc_id,arc_y024_279,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(3) W 13s 54m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(2) W 6s 67m 12M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(2) W 7s 34m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Oc W 4s 10m 8M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Iso W 6s 15m 8M,3,"{""navigation_marks"": 3}" +chart_label_subtext,"Al R,G 16s 29m G11,R11M",3,"{""navigation_marks"": 3}" +arc_source_code,06191091,3,"{""navigation_marks"": 3}" +arc_id,arc_code_06191091,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 3s 59m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 5s 33m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,"F Fl W 3s 13m F4,Fl.7M",3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(2) W 7s 67m 12M,3,"{""navigation_marks"": 3}" +arc_source_code,04259113,3,"{""navigation_marks"": 3}" +arc_id,arc_y079_293,3,"{""navigation_marks"": 3}" +display_code,30100009,3,"{""navigation_marks"": 3}" +chart_label_subtext,"Fl W,R,G 10s 16m 12M",3,"{""navigation_marks"": 3}" +arc_source_code,040522800208109201052073,3,"{""navigation_marks"": 3}" +arc_id,arc_y232_100_r261_272_g232_253,3,"{""navigation_marks"": 3}" +chart_label_subtext,Iso W 6s 25m 8M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(2) W 7s 22m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 5s 37m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(2) W 6s 24m 5M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(2) W 20s 78m 12M,3,"{""navigation_marks"": 3}" +arc_source_code,04323171,3,"{""navigation_marks"": 3}" +arc_id,arc_y143_351,3,"{""navigation_marks"": 3}" +chart_label_subtext,Iso W 6s 34m 8M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 4s 71m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Iso W 6s 74m 8M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Iso W 8s 75m 8M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(2) W 6s 53m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 4s 76m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(3) W 14s 24m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(2) W 10s 74m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Iso W 6s 71m 8M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(4) W 15s 38m 12M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Iso W 6s 15m 5M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(2) W 8s 88m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 4s 46m 12M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 4s 19m 3M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 3s 56m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 3s 99m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(2) W 8s 60m 12M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(2) W 8s 59m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 5s 118m 12M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Oc W 4s 28m 8M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 3s 50m 5M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(2) W 7s 59m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Oc(2) W 8s 22m 5M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(2) W 6s 124m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 4s 52m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 3s 78m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,"F Fl(2) G 7s 17m F4,Fl.7M",3,"{""navigation_marks"": 3}" +chart_label_subtext,"Al Fl R,G 10s 54m G18,R17M",3,"{""navigation_marks"": 3}" +chart_label_subtext,Oc W 8s 81m 12M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Iso W 6s 29m 5M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(2) W 8s 56m 5M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 4s 94m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Iso W 4s 38m 8M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 4s 14m 5M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Iso W 6s 26m 12M,3,"{""navigation_marks"": 3}" +arc_source_code,04093340,3,"{""navigation_marks"": 3}" +arc_id,arc_y273_160,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(3) W 13s 10m 5M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl R 4s 23m 5M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(2) W 10s 160m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(3) R 12s 9m 5M,3,"{""navigation_marks"": 3}" +display_code,30100003,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(2) W 10s 33m 12M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 5s 59m 5M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 3s 244m 12M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Iso W 6s 60m 12M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(2) W 6s 24m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 5s 53m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,"Iso W,R 6s 56m 5M",3,"{""navigation_marks"": 3}" +arc_source_code,0200103104031001,3,"{""navigation_marks"": 3}" +arc_id,arc_r181_211_y211_181,3,"{""navigation_marks"": 3}" +chart_label_subtext,Iso G 8s 13m 4M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(2) W 8s 21m 5M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(2) W 6s 20m 5M,3,"{""navigation_marks"": 3}" +chart_label_subtext,"F Fl(2) R 6s 12m F1,Fl.3M",3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(3) W 13s 54m 12M,3,"{""navigation_marks"": 3}" +arc_source_code,04035283,3,"{""navigation_marks"": 3}" +arc_id,arc_y215_103,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(2) W 9s 39m 12M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 5s 53m 5M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(2) R 6s 21m 5M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Iso W 6s 43m 5M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 5s 15m 5M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 4s 129m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(2) W 6s 60m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Oc W 4s 5m 4M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Oc W 4s 47m 5M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Iso W 6s 45m 5M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(2) W 7s 84m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 5s 18m 12M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(2) W 6s 22m 12M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 3s 10m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Iso W 8s 16m 12M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 5s 68m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Iso W 6s 56m 4M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Iso W 8s 10m 4M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 5s 66m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 3s 49m 7M,3,"{""navigation_marks"": 3}" +arc_source_code,04275131,3,"{""navigation_marks"": 3}" +arc_id,arc_y095_311,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 3s 20m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(2) W 7s 60m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Oc(3) W 13s 14m 5M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Iso R 6s 6m 5M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(2) W 7s 39m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 4s 55m 7M,3,"{""navigation_marks"": 3}" +arc_source_code,04156008,3,"{""navigation_marks"": 3}" +arc_id,arc_y336_188,3,"{""navigation_marks"": 3}" +chart_label_subtext,Iso W 6s 26m 5M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Iso W 8s 91m 5M,3,"{""navigation_marks"": 3}" +arc_source_code,04285147,3,"{""navigation_marks"": 3}" +arc_id,arc_y105_327,3,"{""navigation_marks"": 3}" +chart_label_subtext,Iso W 6s 28m 8M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(2) W 7s 70m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Iso W 8s 36m 12M,3,"{""navigation_marks"": 3}" +arc_source_code,04266162,3,"{""navigation_marks"": 3}" +arc_id,arc_y086_342,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(2) W 11s 109m 12M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Iso W 6s 25m 12M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(2) R 7s 13m 3M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Iso W 6s 145m 8M,3,"{""navigation_marks"": 3}" +arc_source_code,04048213,3,"{""navigation_marks"": 3}" +arc_id,arc_y228_033,3,"{""navigation_marks"": 3}" +chart_label_subtext,Oc(2) W 6s 56m 12M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Iso G 6s 19m 5M,3,"{""navigation_marks"": 3}" +arc_source_code,04177071,3,"{""navigation_marks"": 3}" +arc_id,arc_y357_251,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 4s 10m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl G 4s 6m 3M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(2) W 6s 32m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(2) W 20s 21m 14M,3,"{""navigation_marks"": 3}" +arc_source_code,04175017,3,"{""navigation_marks"": 3}" +arc_id,arc_y355_197,3,"{""navigation_marks"": 3}" +chart_label_subtext,Iso W 6s 17m 12M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Iso W 6s 16m 12M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 3s 7m 3M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Iso W 6s 54m 12M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(2) W 7s 10m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Oc R 5s 10m 4M,3,"{""navigation_marks"": 3}" +arc_source_code,04180062,3,"{""navigation_marks"": 3}" +arc_id,arc_y000_242,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 8s 20m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(3) W 17s 28m 12M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Iso W 6s 44m 12M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Iso G 4s 19m 8M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Mo(U) W 8s 20m 4M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 5s 24m 12M,3,"{""navigation_marks"": 3}" +arc_source_code,04022202,3,"{""navigation_marks"": 3}" +arc_id,arc_y202_022,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 5s 21m 5M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 3s 18m 12M,3,"{""navigation_marks"": 3}" +chart_label_subtext,"Fl W,R 4s 49m 12M",3,"{""navigation_marks"": 3}" +arc_source_code,0225529904299089,3,"{""navigation_marks"": 3}" +arc_id,arc_r075_119_y119_269,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 4s 18m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(2) W 7s 68m 7M,3,"{""navigation_marks"": 3}" +display_code,30100007,3,"{""navigation_marks"": 3}" +chart_label_subtext,"Al W,G 10s 20m W6,G5M",3,"{""navigation_marks"": 3}" +arc_source_code,01180035,3,"{""navigation_marks"": 3}" +arc_id,arc_g000_215,3,"{""navigation_marks"": 3}" +chart_label_subtext,Mo(N) R 8s 12m 9M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Mo(U) R 10s 10m 6M,3,"{""navigation_marks"": 3}" +chart_label_subtext,"Fl W,R 5s 20m 13M",3,"{""navigation_marks"": 3}" +arc_source_code,0222231004310222,3,"{""navigation_marks"": 3}" +arc_id,arc_r042_130_y130_042,3,"{""navigation_marks"": 3}" +chart_label_subtext,Iso W 8s 21m 5M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(2) W 8s 27m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 4s 5m 3M,3,"{""navigation_marks"": 3}" +chart_label_subtext,"F Fl W 3s 11m F4,Fl.7M",3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(3) W 13s 26m 12M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 3s 53m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(3) W 18s 36m 12M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 5s 22m 7M,3,"{""navigation_marks"": 3}" +arc_source_code,04166358,3,"{""navigation_marks"": 3}" +arc_id,arc_y346_178,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 7s 42m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(2) W 7s 36m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Iso W 6s 36m 8M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Iso W 6s 48m 12M,3,"{""navigation_marks"": 3}" +arc_source_code,04213013,3,"{""navigation_marks"": 3}" +arc_id,arc_y033_193,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(3) W 25s 42m 12M,3,"{""navigation_marks"": 3}" +arc_source_code,04194029,3,"{""navigation_marks"": 3}" +arc_id,arc_y014_209,3,"{""navigation_marks"": 3}" +arc_source_code,04271113,3,"{""navigation_marks"": 3}" +arc_id,arc_y091_293,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 5s 29m 12M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 3s 24m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(2) W 7s 137m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,"Oc(2) W,R 12s 23m 14M",3,"{""navigation_marks"": 3}" +arc_source_code,0424122702227241,3,"{""navigation_marks"": 3}" +arc_id,arc_y061_047_r047_061,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 4s 22m 12M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 3s 36m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,"Al Fl(2) R,G 20s 63m R17,G18M",3,"{""navigation_marks"": 3}" +arc_source_code,06172050,3,"{""navigation_marks"": 3}" +arc_id,arc_code_06172050,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 5s 68m 12M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 20s 17m 13M,3,"{""navigation_marks"": 3}" +arc_source_code,04043223,3,"{""navigation_marks"": 3}" +arc_id,arc_y223_043,3,"{""navigation_marks"": 3}" +chart_label_subtext,Iso W 6s 24m 12M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 5s 34m 5M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 10s 37m 5M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 4s 51m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 3s 34m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(2) W 6s 50m 12M,3,"{""navigation_marks"": 3}" +arc_source_code,04160006,3,"{""navigation_marks"": 3}" +arc_id,arc_y340_186,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 4s 95m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(2) W 7s 48m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 3s 58m 5M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 5s 36m 5M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 4s 55m 12M,3,"{""navigation_marks"": 3}" +arc_source_code,04004246,3,"{""navigation_marks"": 3}" +arc_id,arc_y184_066,3,"{""navigation_marks"": 3}" +chart_label_subtext,Iso W 6s 71m 12M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(2) W 7s 98m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(2) W 10s 79m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(4) W 15s 71m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 5s 124m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 15s 112m 12M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 4s 48m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(3) W 13s 39m 5M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 3s 19m 3M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 4s 33m 3M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 6s 47m 5M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 7.5s 19m 13M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 5s 26m 12M,3,"{""navigation_marks"": 3}" +arc_source_code,04124324,3,"{""navigation_marks"": 3}" +arc_id,arc_y304_144,3,"{""navigation_marks"": 3}" +chart_label_subtext,Iso W 8s 45m 12M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Iso W 4s 29m 12M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Oc W 8s 54m 12M,3,"{""navigation_marks"": 3}" +arc_source_code,04199343,3,"{""navigation_marks"": 3}" +arc_id,arc_y019_163,3,"{""navigation_marks"": 3}" +chart_label_subtext,L Fl W 7s 20m 9M,3,"{""navigation_marks"": 3}" +arc_source_code,04254169,3,"{""navigation_marks"": 3}" +arc_id,arc_y074_349,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(2) W 6s 14m 12M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 6s 33m 9M,3,"{""navigation_marks"": 3}" +chart_label_subtext,"Iso W,R 6s 23m 14M",3,"{""navigation_marks"": 3}" +arc_source_code,0410533902339015,3,"{""navigation_marks"": 3}" +arc_id,arc_y285_159_r159_195,3,"{""navigation_marks"": 3}" +chart_label_subtext,"Fl W,R 5s 22m 8M",3,"{""navigation_marks"": 3}" +arc_source_code,04035221042430270202703502221243,3,"{""navigation_marks"": 3}" +arc_id,arc_y215_041_y063_207_r207_215_r041_063,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 3s 53m 5M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 7.5s 22m 9M,3,"{""navigation_marks"": 3}" +arc_source_code,04104012,3,"{""navigation_marks"": 3}" +arc_id,arc_y284_192,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 6s 29m 9M,3,"{""navigation_marks"": 3}" +arc_source_code,04185095,3,"{""navigation_marks"": 3}" +arc_id,arc_y005_275,3,"{""navigation_marks"": 3}" +chart_label_subtext,L Fl W 6s 68m 9M,3,"{""navigation_marks"": 3}" +arc_source_code,04257132,3,"{""navigation_marks"": 3}" +arc_id,arc_y077_312,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl W 6s 45m 8M,3,"{""navigation_marks"": 3}" +chart_label_subtext,F Y 17m 8M,3,"{""navigation_marks"": 3}" +chart_label_subtext,F W 94m,3,"{""navigation_marks"": 3}" +chart_label_subtext,F W 34m 8M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Mo(A) G 8s 14m 3M,3,"{""navigation_marks"": 3}" +chart_label_subtext,F G 16m 4M,3,"{""navigation_marks"": 3}" +chart_label_subtext,F R 16m 4M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Mo(A) R 9s 9m 3M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Iso R 6s 7m 5M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl R 3s 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,F W 65m 9M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl G 5s 18m 6M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(2) G 8s 11m 4M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(2) G 6s 15m 4M,3,"{""navigation_marks"": 3}" +chart_label_subtext,F G 38m 10M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Mo(A) G 8s 22m 5M,3,"{""navigation_marks"": 3}" +chart_label_subtext,"Dir F W,R,G 9m W6,R6,G6M",3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(2) W 10s 11m 5M,3,"{""navigation_marks"": 3}" +chart_label_subtext,"F Fl R 4s 15m F1,Fl.3M",3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(2) R 7s 18m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,"Dir F W,R,G 18m W14,R11,G12M",3,"{""navigation_marks"": 3}" +chart_label_subtext,Mo (U) W 15s 7m 5M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl R 4s 14m 4M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Mo(D) G 13s 13m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl R 4s 20m 5M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Oc R 8s 15m 8M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Oc W 8s 26m 12M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(2) W 5s 15m 5M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Mo(A) W 8s 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Oc R 4s 9m 4M,3,"{""navigation_marks"": 3}" +chart_label_subtext,"F Fl G 7s 13m F2,Fl.5M",3,"{""navigation_marks"": 3}" +chart_label_subtext,"F Fl R 7s 13m F2,Fl.5M",3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl (2) G 6s 18m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(2) R 6s 20m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl R 4s 6m 3M,3,"{""navigation_marks"": 3}" +chart_label_subtext,F R 28m 6M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Iso G 6s 19m 8M,3,"{""navigation_marks"": 3}" +chart_label_subtext,F G 24m 11M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Iso R 4s 25m 3M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Oc G 8s 12m 4M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Mo(A) W 8s 10m 6M,3,"{""navigation_marks"": 3}" +chart_label_subtext,"F Fl G 5s 9m F2,Fl.5M",3,"{""navigation_marks"": 3}" +chart_label_subtext,"Dir F W,R,G 13m W12,R11,G12M",3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(2) G 5s 12m 3M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Iso R 4s 12m 8M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(2) G 6s 16m 3M,3,"{""navigation_marks"": 3}" +chart_label_subtext,"F Fl G 4s 17m F1,Fl.5M",3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(2) R 7s 16m 8M,3,"{""navigation_marks"": 3}" +chart_label_subtext,F G 49m 10M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(3) R 13s 18m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Mo(U) W 15s 19m 10M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl G 5s 15m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,F G 29m 6M,3,"{""navigation_marks"": 3}" +chart_label_subtext,38m,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(2) R 5s 19m 7M,3,"{""navigation_marks"": 3}" +chart_label_subtext,"Dir F W,R,G 12m W9,R7,G8M",3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(2) G 7s 19m 4M,3,"{""navigation_marks"": 3}" +chart_label_subtext,4.3m,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl(2) R 6s 16m 4M,3,"{""navigation_marks"": 3}" +chart_label_subtext,"Dir F W,R,G 13m W6,R5,G5M",3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl G 4s 14m 8M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Mo(U) W 15s 3M,3,"{""navigation_marks"": 3}" +display_code,32436004,3,"{""navigation_marks"": 3}" +chart_label_subtext,Mo (U) W 15s 3M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Fl R 3s 16m 4M,3,"{""navigation_marks"": 3}" +chart_label_subtext,Q (6) + L Fl W 15s 4M,3,"{""navigation_marks"": 3}" +chart_label_subtext,F G 24m 9M,3,"{""navigation_marks"": 3}" +chart_label_subtext,"F Fl(2) R 8s 8m F2,Fl5M",3,"{""navigation_marks"": 3}" +chart_label_subtext,Iso R 4s 14m 5M,3,"{""navigation_marks"": 3}" +chart_label_subtext,"F Fl G 6s 14m F1,Fl.3M",3,"{""navigation_marks"": 3}" +chart_label_subtext,"Dir F W,R,G 5m W3,R2,G2M",3,"{""navigation_marks"": 3}" +display_code,31035804,2,"{""navigation_marks"": 2}" +display_code,31035504,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(2) G 8s 17m 7M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(B) R 8s 4.9m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F G 15m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Q(3) W 10s 4.9m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(2) G 7s 12m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(2) R 6s 14m 4M,2,"{""navigation_marks"": 2}" +display_code,31035700,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl R 3s 4.9m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl R 4s 4.9m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Q(6)+L Fl W 15s 4.9m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F G 27m 2M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F R 27m 2M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl R 5s 4.9m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl G 3s 23m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl R 3s 22m 7M,2,"{""navigation_marks"": 2}" +chart_label_subtext,R 5m,2,"{""navigation_marks"": 2}" +display_code,32037203,2,"{""navigation_marks"": 2}" +chart_label_subtext,Q(3) W 10s 4.9m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl G 3s 16m 4M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(2) W 5s 4.9m 5M,2,"{""navigation_marks"": 2}" +display_code,31100002,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(U) W 12s 14m 10M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(U) W 12s 34m 10M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(U) W 8s 15m 10M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(U) W 8s 14m 10M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Q(3) W 10s 7m 7M,2,"{""navigation_marks"": 2}" +shape_class_code,314,2,"{""navigation_marks"": 2}" +display_code,31436204,2,"{""navigation_marks"": 2}" +canonical_object_type,大型浮標,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(U) W 15s 12m 10M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(A) G 8s 4.9m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(B) G 8s 4.9m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Q(6)+L Fl W 15s 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(U) W 15s 41m 10M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Q W 12m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F G 15m 8M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F G 20m 8M,2,"{""navigation_marks"": 2}" +chart_label_subtext,"Dir F W,R,G 21m W13,R10,G11M",2,"{""navigation_marks"": 2}" +chart_label_subtext,"Dir F W,R,G 10m 2M",2,"{""navigation_marks"": 2}" +chart_label_subtext,F Y 29m 12M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F Y 22m 12M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F R 17m 7M,2,"{""navigation_marks"": 2}" +chart_label_subtext,"Dir F W,R,G 32m W13,R7,G7M",2,"{""navigation_marks"": 2}" +display_code,31135800,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(2) 8M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F W 105m,2,"{""navigation_marks"": 2}" +chart_label_subtext,Q(6)+L Fl W 15s 8m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Iso G 8s 10m 4M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F Y 22m 8M,2,"{""navigation_marks"": 2}" +chart_label_subtext,"F Fl G 3s 14m F2,Fl5M",2,"{""navigation_marks"": 2}" +chart_label_subtext,F W 101m,2,"{""navigation_marks"": 2}" +chart_label_subtext,23m,2,"{""navigation_marks"": 2}" +chart_label_subtext,67m,2,"{""navigation_marks"": 2}" +chart_label_subtext,73m,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl R 6s 8m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl G 3s 22m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Iso G 4s 18m 4M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl Y 5s 4M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Iso W 4s 32m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(U) W 8s 4.99m 6M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl G 4s 18m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F W 111m,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl G 3s 19m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Q(6)+LFl W 15s 23m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,"F Fl G 3s 11m F2,Fl5M",2,"{""navigation_marks"": 2}" +chart_label_subtext,F Y 59m 12M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F Y 67m 12M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Q(6)+L Fl W 15s 6m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Q(3) W 10s 10m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Iso R 8s 10m 4M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F W 99m,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(2) W 5s 22m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Q W 7m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F Y 19m 12M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(A) G 8s 8m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F W 25m,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(B) R 8s 9m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Q W 14m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(2) G 6s 7m 4M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(2) R 6s 7m 4M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Q(9) W 15s 10m 4M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F G 36m 4M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F W 36m 6M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F R 36m 4M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Iso G 4s 17m 4M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Iso W 4s 18m 6M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Iso R 4s 17m 3M,2,"{""navigation_marks"": 2}" +shape_class_code,322,2,"{""navigation_marks"": 2}" +display_code,32236003,2,"{""navigation_marks"": 2}" +canonical_object_type,球型灯浮標,2,"{""navigation_marks"": 2}" +chart_label_subtext,"F Fl R 4s 13m F5,Fl.8M",2,"{""navigation_marks"": 2}" +chart_label_subtext,Q W 11m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,"F Fl R 5s 11m F1,Fl.3M",2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(U) W 10s 25m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Q(3) W 10s 8m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(A) R 8s 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F Y 67m 13M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F Y 81m 13M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(2) W 5s 16m 7M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(2) W 5s 19m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(A) G 8s 18m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F G 68m 6M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F W 68m 6M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F R 68m 6M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(2) Y 5s 6m 6M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(2) Y 5s 7m 6M,2,"{""navigation_marks"": 2}" +chart_label_subtext,"F Fl(2) R 10s 11m F2,Fl.5M",2,"{""navigation_marks"": 2}" +chart_label_subtext,F G 21m 4M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F W 20m 7M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F R 20m 4M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl G 6s 16m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F W 88m,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(2) G 8s 11m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,"F Fl R 5s 13m F1,Fl.3M",2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(A) G 8s 15m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,"F Fl R 6s 16m F2,Fl.5M",2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(2) R 6s 18m 9M,2,"{""navigation_marks"": 2}" +chart_label_subtext,"Dir F W,R,G 10m W7,R4,G4M",2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(B) Y 8s 9m 6M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(A) G 8s 9m 6M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F W 80m,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(2) W 5s 7m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(A) G 10s 9m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl R 5s 19m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl G 4s 18m 7M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(2) R 7s 14m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(A) G 8s 15m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,"F Fl(2) G 6s 10m F1,Fl.3M",2,"{""navigation_marks"": 2}" +chart_label_subtext,F W 47m,2,"{""navigation_marks"": 2}" +chart_label_subtext,Q W 14m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,"F Fl(2) R 10s 10m F2,Fl.5M",2,"{""navigation_marks"": 2}" +chart_label_subtext,F W 19m 4M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F R 19m 4M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F W 39m,2,"{""navigation_marks"": 2}" +chart_label_subtext,F W 21m 4M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F W 16m,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(2) R 6s 18m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(A) R 9s 7m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,"F Fl R 4s 11m F4,Fl7M",2,"{""navigation_marks"": 2}" +chart_label_subtext,F W 14m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F R 18m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(B) R 8s 16m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(C) R 10s 10m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(2) G 8s 12m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F G 14m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F W 15m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F G 8m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F W 9m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F G 16m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F W 17m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F R 16m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl R 6s 12m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl R 5s 16m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(2) G 6s 12m 7M,2,"{""navigation_marks"": 2}" +display_code,31035404,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl R 4s 11m 7M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F G 40m 4M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F R 40m 4M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F W 44m 4M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F G 43m 4M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F R 43m 4M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl R 6s 11m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl G 5s 14m 7M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl R 5s 13m 7M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(U) W 8s 30m 11M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(U) W 8s 42m 11M,2,"{""navigation_marks"": 2}" +chart_label_subtext,"F Fl R 6s 14m F1,Fl3M",2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(2) R 7s 16m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(U) W 12s 39m 10M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo (U) W 8s 10M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl G 4s 13m 8M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl R 4s 8m 6M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl W 3s 18m 7M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F W 34m,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl G 3s 7m 4M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl R 6s 11m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(2) G 8s 10m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Iso G 8s 11m 4M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F Y 27m 13M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F Y 35m 13M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F Y 20m 12M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F Y 26m 13M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F Y 42m 13M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F Y 20m 13M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F Y 30m 13M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F Y 40m 14M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F Y 79m 14M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F G 18m 10M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F G 32m 10M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F Y 21m 13M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F G 9m 10M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F G 14m 10M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F G 25m 10M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F G 31m 10M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(2) R 6s 7M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Iso W 4s 45m 7M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F G 40m 6M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F W 43m 6M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F R 40m 6M,2,"{""navigation_marks"": 2}" +chart_label_subtext,"Aero Al Fl W,G 6s",2,"{""navigation_marks"": 2}" +chart_label_subtext,Iso G 6s 12m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(2) R 8s 12m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F R 64m 8M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(2) G 8s 13m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(2) R 8s 11m 7M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(U) W 10s 14m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(2) R 8s 13m 7M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(2) R 6s 15m 6M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(U) W 10s 35m 10M,2,"{""navigation_marks"": 2}" +chart_label_subtext,"Dir F W,R,G 28m W10,G7,R7M",2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(2) G 8s 16m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F Fl G 4s 11m F4.Fl.7M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F W 9m,2,"{""navigation_marks"": 2}" +chart_label_subtext,F Y 3.4m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F Y 4.5m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,"F Fl G 5s 8m F2,Fl.5M",2,"{""navigation_marks"": 2}" +chart_label_subtext,F R 13m 7M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F R 19m 7M,2,"{""navigation_marks"": 2}" +chart_label_subtext,"Dir F W,R,G 5m W9,G6,R6M",2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl W 4s 12m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl W 3s 15m 12M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(A) R 8s 12m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Iso R 8s 7m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl R 5s 7m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Iso R 8s 8m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(2) W 5s 5m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,"F Fl R 4s 10m F1,Fl3M",2,"{""navigation_marks"": 2}" +chart_label_subtext,Iso G 8s 9m 4M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F W 125m,2,"{""navigation_marks"": 2}" +chart_label_subtext,"F Fl(2) G 10s 13m F2,Fl5M",2,"{""navigation_marks"": 2}" +chart_label_subtext,F Y 11m 11M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F G 67m 10M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F G 6m 8M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F W 115m,2,"{""navigation_marks"": 2}" +chart_label_subtext,"Aero Al Fl W,G",2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(2) R 7s 13m 7M,2,"{""navigation_marks"": 2}" +chart_label_subtext,"F Fl R 6s 9m F2,Fl.5M",2,"{""navigation_marks"": 2}" +chart_label_subtext,Iso G 4s 16m 8M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(2) R 6s 13m 4M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(U) W 8s 10M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(U) W 8s 12m 10M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F W 21m,2,"{""navigation_marks"": 2}" +chart_label_subtext,F R 6m 4M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F R 10m 4M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F Y 17m 7M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F Y 19m 7M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F R 9m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(U) W 13s 27m 6M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl G 3s 18m 4M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(U) R 12s 9m 4M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(U) W 12s 31m 10M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(U) W 12s 25m 10M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(U) W 8s 9m 10M,2,"{""navigation_marks"": 2}" +chart_label_subtext,"DirF W,R,G 15m W3,G1,R1M",2,"{""navigation_marks"": 2}" +chart_label_subtext,F W 64m,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(2) W 5s 21m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl G 4s 17m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F R 15m 6M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F R 20m 6M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F Fl R 6s 12m F2.Fl5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Oc G 4s 13m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(U) W 15s 33m 10M,2,"{""navigation_marks"": 2}" +chart_label_subtext,12m,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(U) W 8s 10m 10M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F W 66m,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(2) R 7s 11m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(2) W 5s 18m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,"F Fl(2) R 6s 13m F2,Fl.5M",2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(U) W 12s 18m 10M,2,"{""navigation_marks"": 2}" +chart_label_subtext,"F Fl R 3s 11m F2,Fl.5M",2,"{""navigation_marks"": 2}" +chart_label_subtext,F R 42m 6M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(A) R 8s 14m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,"F Fl R 4s 12m F1,Fl.3M",2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(U) W 10s 19m 10M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F W 26m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F G 25m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F R 25m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(2) R 8s 9m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(U) W 8s 22m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(U) W 10s 11m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,"F Fl R 3s 8m F2,Fl5M",2,"{""navigation_marks"": 2}" +chart_label_subtext,Iso G 6s 17m 8M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl G 3s 6m 3M,2,"{""navigation_marks"": 2}" +arc_source_code,02300210,2,"{""navigation_marks"": 2}" +arc_id,arc_r120_030,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(U) W 12s 10m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Iso W 4s 40m 8M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Iso W 4s 39m 8M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Iso G 4s 39m 8M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Iso G 4s 38m 8M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Iso R 4s 39m 8M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Iso R 4s 38m 8M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(U) W 15s 14m 10M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(D) G 8s 12m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(A) G 8s 8m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Q W 8m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,"F Fl R 3s 10m Fl,5 F,2M",2,"{""navigation_marks"": 2}" +chart_label_subtext,Q(9) W 15s 15m 7M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(3) G 12s 10m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(D) G 8s 13m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,"F Fl G 4s 8m F2,Fl5M",2,"{""navigation_marks"": 2}" +chart_label_subtext,F W 104m,2,"{""navigation_marks"": 2}" +chart_label_subtext,"F Fl G 4s 12m F2,Fl5M",2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(2) W 5s 6m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F W 24m,2,"{""navigation_marks"": 2}" +chart_label_subtext,F R 27m 8M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Q(6)+L Fl W 15s 14m 5M,2,"{""navigation_marks"": 2}" +display_code,31335604,2,"{""navigation_marks"": 2}" +chart_label_subtext,Iso R 4s 9m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(2) R 7s 14m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(N) Y 8s 11m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(D) Y 8s 11m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,"F Fl G 4s 8m F 2,Fl 5M",2,"{""navigation_marks"": 2}" +chart_label_subtext,F W 51m,2,"{""navigation_marks"": 2}" +chart_label_subtext,F W 65m,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl R 3s 8.m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(U) W 15s 14m 9M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Iso G 4s 20m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Iso R 4s 23m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,"Dir F W,R,G 11m W5,R3,G3M",2,"{""navigation_marks"": 2}" +chart_label_subtext,"F Fl R 5s 10m F2,Fl.5M",2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(A) R 9s 10m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,"F Fl G 4s 8m F2,Fl.5M",2,"{""navigation_marks"": 2}" +chart_label_subtext,"F Fl G 3s 17m F4,Fl.7M",2,"{""navigation_marks"": 2}" +chart_label_subtext,Oc G 5s 12m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F W 14m,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(U) W 15s 33m 9M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Oc W 5s 39m 8M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Oc W 5s 46m 8M,2,"{""navigation_marks"": 2}" +arc_source_code,04102142,2,"{""navigation_marks"": 2}" +arc_id,arc_y282_322,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl R 3s 10m 7M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(D) R 8s 14m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl G 3s 6M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F W 58m 8M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F W 59m 8M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F R 75m 7M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F W 78m 8M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(2) R 6s 19m 7M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(2) G 6s 18m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl G 5s 14m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,"F Fl R 3s 16m F2,Fl.5M",2,"{""navigation_marks"": 2}" +chart_label_subtext,F W 50m,2,"{""navigation_marks"": 2}" +chart_label_subtext,F W 46m,2,"{""navigation_marks"": 2}" +chart_label_subtext,F W 100m,2,"{""navigation_marks"": 2}" +chart_label_subtext,F W 62m,2,"{""navigation_marks"": 2}" +chart_label_subtext,F W 32m,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(A) R 8s 2M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F W 19m,2,"{""navigation_marks"": 2}" +chart_label_subtext,Q W 8m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Q(9) W 15s 10m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F G 38m 9M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F R 36m 8M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F G 37m 9M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F R 37m 8M,2,"{""navigation_marks"": 2}" +chart_label_subtext,"F Fl R 4s 9m F2,Fl.5M",2,"{""navigation_marks"": 2}" +chart_label_subtext,Q(3) W 10s 11m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F W 24m 4M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F R 23m 4M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(2) W 5s 15m 12M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(3) G 12s 13m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(3) R 12s 13m 7M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F R 7m 6M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F R 10m 6M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F W 8m,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(2) R 3s 10m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(U) W 8s 19m 4M,2,"{""navigation_marks"": 2}" +chart_label_subtext,"F Fl R 5s 10m F2,Fl.4M",2,"{""navigation_marks"": 2}" +chart_label_subtext,Iso G 4s 7m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F R 14m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F R 17m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(D) G 8s 10m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Iso R 6s 13m 8M,2,"{""navigation_marks"": 2}" +chart_label_subtext,"F Fl(2) G 7s 12m F2,Fl.5M",2,"{""navigation_marks"": 2}" +display_code,31035600,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(U) W 10s 28m 10M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F R 22m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(A) G 9s 8m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl R 5s 11m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(2) G 5s 13m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Iso R 6s 9m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(2) W 5s 15m 7M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl R 6s 7m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(A) R 8s 10m 7M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Iso R 6s 12m 8M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Oc R 4s 11m 4M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl G 4s 13m 4M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F W 30m,2,"{""navigation_marks"": 2}" +chart_label_subtext,"F Fl(2) R 8s 8m F2,Fl.5M",2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl G 5s 12m 7M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(U) W 14s 35m 10M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F G 34m 11M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F G 56m 11M,2,"{""navigation_marks"": 2}" +chart_label_subtext,22m,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(D) R 10s 14m 7M,2,"{""navigation_marks"": 2}" +arc_source_code,02048301,2,"{""navigation_marks"": 2}" +arc_id,arc_r228_121,2,"{""navigation_marks"": 2}" +chart_label_subtext,F G 41m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F G 41m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F R 43m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F R 44m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl G 4s 12m 4M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Iso R 4s 7m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(D) Y 8s 5m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Oc G 4s 10m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Oc R 8s 16m 8M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(2) W 5s 11m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Oc G 4s 11m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl G 5s 7m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Oc R 5s 11m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(A) R 8s 8m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(A) R 8s 14m 7M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Iso R 6s 15m 4M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl R 6s 13m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl R 3s 20m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F R 94m 4M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F R 106m 4M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F G 21m 9M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F G 27m 9M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Q(6)+LFl W 15s 8m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(2) W 10s 9m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl G 5s 10m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,"F Fl G 5s 12m F1,Fl.3M",2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl R 5s 18m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(2) G 6s 14m 4M,2,"{""navigation_marks"": 2}" +chart_label_subtext,"F Fl R 4s 17m F2,Fl.5M",2,"{""navigation_marks"": 2}" +chart_label_subtext,F R 30m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F R 47m 6M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(2) G 7s 9m 4M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Q(3) W 10s 9m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F G 19m 10M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F W 35m,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(B) G 8s 5m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F G 29m 4M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F W 29m 4M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F R 29m 4M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F R 31m 4M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F Fl G 3s 13m F4 Fl7M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(2) W 5s 17m 7M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F Fl R 3s 15m F2 Fl5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Aero Fl(4) W 2s,2,"{""navigation_marks"": 2}" +chart_label_subtext,"F Fl(2) R 6s 15m F1,Fl.3M",2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl R 5s 17m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,"F Fl R 3s 12m F1,Fl.3M",2,"{""navigation_marks"": 2}" +chart_label_subtext,"F Fl(2) R 10s 11m F1,Fl.3M",2,"{""navigation_marks"": 2}" +chart_label_subtext,F W 71m,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl Y 4s 12m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl R 4s 17m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F G 14m 8M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(3) R 13s 10m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl R 4s 20m 7M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl G 3s 17m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl G 3s 20m 4M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl R 3s 7.m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Oc R 8s 14m 4M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl G 4s 10m 4M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(U) W 8s 4.4m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(2) G 6s 13m 4M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl G 4s 12m 7M,2,"{""navigation_marks"": 2}" +chart_label_subtext,"Dir F W,R,G 17m W8,G6,R6M",2,"{""navigation_marks"": 2}" +chart_label_subtext,Oc G 4s 11m 4M,2,"{""navigation_marks"": 2}" +chart_label_subtext,"F Fl(2) G 10s 13m F2,Fl.5M",2,"{""navigation_marks"": 2}" +chart_label_subtext,"F Fl G 6s 12m F2,Fl.5M",2,"{""navigation_marks"": 2}" +chart_label_subtext,Q(3) W 10s 19m 7M,2,"{""navigation_marks"": 2}" +chart_label_subtext,"Dir Iso W,R,G 4s 10m W5,R4,G4M",2,"{""navigation_marks"": 2}" +chart_label_subtext,Q(6)+L Fl W 15s 14m 7M,2,"{""navigation_marks"": 2}" +display_code,33535000,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(A) W 8s 10M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(2) G 8s 13m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(2) R 7s 19m 4M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Oc G 8s 13m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Iso R 4s 10m 4M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(U) W 15s 27m 10M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(U) W 10s 36m 11M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(2) W 5s 12m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Q(6)+LFl W 15s 15m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl R 4s 19m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo (U) W 8s 4.5m 6M,2,"{""navigation_marks"": 2}" +chart_label_subtext,"F Fl(2) R 8s 13m F2,Fl.5M",2,"{""navigation_marks"": 2}" +chart_label_subtext,Aero Fl W 1s,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(A) G 8s 7m 4M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl G 3s 20m 7M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl G 5s 16m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl G 4s 5m 4M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Oc R 8s 18m 4M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Oc G 8s 19m 4M,2,"{""navigation_marks"": 2}" +chart_label_subtext,"F Fl R 3s 13m F4,Fl.7M",2,"{""navigation_marks"": 2}" +chart_label_subtext,"F Fl G 3s 12m F4,Fl.7M",2,"{""navigation_marks"": 2}" +arc_source_code,04327228,2,"{""navigation_marks"": 2}" +arc_id,arc_y147_048,2,"{""navigation_marks"": 2}" +arc_source_code,04159010,2,"{""navigation_marks"": 2}" +arc_id,arc_y339_190,2,"{""navigation_marks"": 2}" +chart_label_subtext,"Dir F W,R,G 22m W7,G7,R7M",2,"{""navigation_marks"": 2}" +chart_label_subtext,Iso W 4s 9m 8M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(U) W 10s 11m 6M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl Y 3s 7m 8M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Iso G 4s 26m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Iso R 4s 26m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Iso G 4s 32m 6M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Iso G 4s 31m 6M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Iso G 4s 30m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl Y 3s 5m 4M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl Y 3s 7m 4M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Q(9) W 15s 9m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(5) Y 20s 8m 4M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl R 3s 11m 7M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl Y 4s 4m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl Y 4s 4.1m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(2) R 7s 16m 7M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(U) W 8s 22m 10M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(U) W 8s 6m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Iso W 4s 7m 6M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(U) W 15s 13m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl R 4s 5.m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F Y 19m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Q(6)+LFl W 15s 9m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(U) W 8s 19m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo (U) W 8s 4.8m 6M,2,"{""navigation_marks"": 2}" +display_code,31335700,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(A) R 8s 7m 4M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Aero Fl (4) W 2s,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(2) G 7s 21m 7M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(2) R 7s 21m 7M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl G 3s 19m 7M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F Fl G 3s 9m F2 Fl5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl G 5s 9m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Iso R 4s 22m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Iso G 4s 22m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(U) W 8s 11m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(5) Y 20s 9m 4M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F Y 5m 6M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F G 28m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F R 28m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(3) R 13s 16m 7M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(3) G 13s 11m 4M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Iso R 6s 18m 8M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(A) R 8s 9m 4M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F R 30m 6M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F Y 20m 14M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F Y 8m 10M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F G 31m 7M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F G 35m 7M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F W 89m,2,"{""navigation_marks"": 2}" +chart_label_subtext,"Dir F W,R,G 25m W14,R11,G11M",2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo (U) W 8s 6M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Oc G 5s 15m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(3) G 12s 10m 7M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(3) R 12s 6m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F G 11m 8M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F G 16m 8M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F W 33m,2,"{""navigation_marks"": 2}" +display_code,33536000,2,"{""navigation_marks"": 2}" +chart_label_subtext,Oc G 8s 12m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,"F Fl G 4s 14m F2,Fl.5M",2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(2) G 7s 17m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,"F Fl(2) G 10s 12m F2,Fl.5M",2,"{""navigation_marks"": 2}" +chart_label_subtext,"F Fl(2) R 6s 11m F 2,Fl 5M",2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl G 5s 8m 4M,2,"{""navigation_marks"": 2}" +chart_label_subtext,"F Fl R 6s 15m F1,Fl.3M",2,"{""navigation_marks"": 2}" +chart_label_subtext,Q(6) L Fl W 15s 7m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F G 21m 10M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Oc G 8s 16m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,"F Fl G 4s 12m F4,Fl.7M",2,"{""navigation_marks"": 2}" +chart_label_subtext,"F Fl R 6s 13m F1,Fl.3M",2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(U) W 8s 4.8m 6M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(2) G 5s 12m 7M,2,"{""navigation_marks"": 2}" +chart_label_subtext,"F Fl G 3s 10m F2,Fl.5M",2,"{""navigation_marks"": 2}" +chart_label_subtext,Oc(2) G 6s 18m 8M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Iso W 4s 12m 9M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Iso W 4s 15m 9M,2,"{""navigation_marks"": 2}" +chart_label_subtext,"Dir F W,R,G 42m W13,G11,R10M",2,"{""navigation_marks"": 2}" +chart_label_subtext,F R 24m 7M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Oc(2) G 6s 20m 8M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Iso R 6s 15m 8M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(U) W 14s 38m 13M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F R 31m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(U) W 8s 8M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Iso R 4s 27m 4M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Iso G 4s 27m 4M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Iso W 4s 24m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Iso W 4s 27m 5M,2,"{""navigation_marks"": 2}" +display_code,32135903,2,"{""navigation_marks"": 2}" +chart_label_subtext,Oc(2) G 6s 10m 8M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo (U) W 10s 10m 4M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Oc R 4s 14m 4M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl G 5s 14m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(2) W 5s 4.5m 4M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F R 53m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Iso R 6s 58m 4M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F R 47m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Iso R 8s 42m 4M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Iso R 4s 40m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Iso R 4s 41m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F G 48m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Iso G 6s 58m 6M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F G 53m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Iso G 8s 42m 6M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Iso G 4s 40m 6M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Iso G 4s 41m 6M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F G 37m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Iso W 6s 59m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Iso W 8s 44m 6M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Iso W 4s 41m 6M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Iso W 4s 42m 6M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl Y 4s 20m 4M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Iso G 8s 12m 4M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Oc G 8s 9m 4M,2,"{""navigation_marks"": 2}" +chart_label_subtext,"F Fl(2) R 8s 15m F4,Fl7M",2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(D) R 8s 5M,2,"{""navigation_marks"": 2}" +display_code,31639904,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl W 10s 25m 15M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl R 5s 10m 4M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl R 5s 13m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(U) W 8s 9m 4M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Iso R 4s 23m 4M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Iso R 4s 26m 4M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Iso G 4s 23m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Iso W 4s 23m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Iso W 4s 26m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(2) R 8s 8m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Oc G 4s 15m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F R 43m 8M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Iso R 4s 60m 8M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(C) G 10s 10m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(D) R 8s 10m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Q W 6M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl R 5s 12m 4M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(D) R 8s 9m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Oc G 4s 17m 4M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Oc R 4s 14m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F W 29m,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(2) G 6s 6m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(2) R 8s 8m 4M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(2) R 5s 7m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Iso R 4s 8m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl G 5s 13m 4M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(5) Y 20s 14m 4M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl (2) G 5s 12m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(2) R 5s 15m 7M,2,"{""navigation_marks"": 2}" +chart_label_subtext,"Dir F W,R,G 20m W10,R9,G9M",2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(2) R 7s 10m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(2) G 7s 14m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(2) R 6s 20m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(2) R 6s 6m 7M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Oc G 8s 11m 4M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl R 4s 11m 4M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(C) G 13s 10m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(A) G 8s 9m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Q W 10m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Q(3) W 10s 10m 7M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Q(9) W 15s 13m 7M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Q(6)+L Fl W 15s 10m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Q(6)+L Fl W 15s 11m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Q(3) W 10s 15m 6M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(2) R 5s 11m 7M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(2) G 5s 15m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Oc(2) G 6s 12m 4M,2,"{""navigation_marks"": 2}" +chart_label_subtext,"F Fl R 6s 12m F1,Fl.3M",2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl Y 4s 3.9m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Oc R 4s 13m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(3) R 12s 14m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl G 5s 17m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F W 31m,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(2) G 5s 12m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(2) G 7s 13m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F W 106m,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(2) R 7s 15m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,"F Fl G 5s 16m F2,Fl.5M",2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(2) W 5s 10m 7M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl R 4s 18m 7M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(U) W 8s 28m 10M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Iso G 4s 17m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl R 4s 19m 7M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(2) G 7s 12m 7M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(U) W 14s 30m 10M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F G 23m 10M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F G 29m 10M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(2) R 5s 18m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(2) R 5s 13m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Iso G 8s 18m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(3) G 13s 18m 7M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Iso G 6s 16m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,"Dir F W,R,G 64m W14,R11,G12M",2,"{""navigation_marks"": 2}" +chart_label_subtext,"Dir F W,R,G 32m W14,R10,G11M",2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl R 6s 24m 7M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(2) G 7s 12m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,"F Fl(2) G 7s 15m F4,Fl.7M",2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl (5) Y 20s 6M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(2) G 8s 14m 7M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Oc G 8s 14m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo (U) W 15s 4M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(2) R 5s 16m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Iso R 6s 16m 8M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Iso W 4s 19m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Iso G 4s 22m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F G 21m 12M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F G 27m 12M,2,"{""navigation_marks"": 2}" +display_code,32500004,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(A) R 8s 9m 7M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(B) R 8s 9m 7M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(C) R 10s 9m 7M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(2) G 8s 10m 4M,2,"{""navigation_marks"": 2}" +chart_label_subtext,14m,2,"{""navigation_marks"": 2}" +chart_label_subtext,18m,2,"{""navigation_marks"": 2}" +chart_label_subtext,F Y 21m 11M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F Y 26m 11M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Iso G 4s 23m 8M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Iso G 4s 10m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Iso R 4s 23m 8M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Iso G 6s 13m 8M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl G 3s 6m 4M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Iso R 4s 13m 8M,2,"{""navigation_marks"": 2}" +display_code,31335400,2,"{""navigation_marks"": 2}" +display_code,31335600,2,"{""navigation_marks"": 2}" +chart_label_subtext,Q(9) W 15s 11m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl R 4s 16m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(2) G 7s 11m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl G 4s 15m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(U) W 15s 31m 9M,2,"{""navigation_marks"": 2}" +chart_label_subtext,"F Fl G 5s 14m F2,Fl.5M",2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(2) R 5s 21m 7M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(2) G 7s 19m 5M,2,"{""navigation_marks"": 2}" +arc_source_code,01293219,2,"{""navigation_marks"": 2}" +arc_id,arc_g113_039,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(2) G 5s 10m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F G 26m 6M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F R 26m 6M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Q(6)+L Fl W 15s 8m 7M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(2) R 6s 18m 7M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(U) W 8s 9M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(U) W 15s 34m 10M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(U) W 10s 37m 11M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(U) R 10s 6M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Iso G 4s 14m 8M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(D) Y 8s 7m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(K) Y 12s 7m 7M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(D) R 8s 12m 7M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl G 3s 9m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(A) W 8s 9m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F R 29m 6M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F G 16m 12M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F G 38m 12M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(U) W 8s 29m 9M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(U) W 10s 29m 8M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl G 4s 9m 4M,2,"{""navigation_marks"": 2}" +chart_label_subtext,31m,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl G 5s 7m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,"F Fl G 5s 10m F2,Fl.5M",2,"{""navigation_marks"": 2}" +chart_label_subtext,"F Fl R 5s 9m F4,Fl.7M",2,"{""navigation_marks"": 2}" +chart_label_subtext,"F Fl R 6s 10m F2,Fl.5M",2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl G 3s 22m 6M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Iso G 4s 17m 8M,2,"{""navigation_marks"": 2}" +chart_label_subtext,"F Fl G 5s 13m F1,Fl.3M",2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(2) G 5s 14m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(2) R 5s 5m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl R 5s 15m 5M,2,"{""navigation_marks"": 2}" +display_code,31600004,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(2) W 30s 28m 15M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl G 3s 4.5m 4M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(U) W 15s 11m 11M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(2) G 6s 4.7m 4M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl R 4s 4.7m 4M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(2) R 7s 10m 7M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(U) W 12s 25m 12M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(U) W 10s 34m 10M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(U) W 8s 34m 12M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(U) W 10s 10m 12M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(U) W 15s 10m 12M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F G 15m 10M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F G 7m 8M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F G 12m 8M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl R 3s 17m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,"F Fl G 4s 11m F1,Fl.3M",2,"{""navigation_marks"": 2}" +chart_label_subtext,"F Fl(2) G 6s 12m F2,Fl5M",2,"{""navigation_marks"": 2}" +chart_label_subtext,"F Fl(2) R 6s 13m F2,Fl5M",2,"{""navigation_marks"": 2}" +chart_label_subtext,"F Fl W 5s 12m F2,Fl.5M",2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(2) G 6s 11m 4M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl R 4s 13m 8M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(2) R 9s 14m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(2) G 9s 14m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,"F Fl R 4s 10m F2,Fl.5M",2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(2) R 5s 11m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(U) W 10s 10m 10M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(3) G 12s 11m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,"F Fl R 5s 12m F2,Fl.5M",2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl R 6s 18m 7M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(U) W 10s 9m 10M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F G 25m 11M,2,"{""navigation_marks"": 2}" +chart_label_subtext,"Dir F WRG & Iso RG W,R,G 4s 17m 13M",2,"{""navigation_marks"": 2}" +chart_label_subtext,"Dir F W,R,G 5m W9,R8,G8M",2,"{""navigation_marks"": 2}" +chart_label_subtext,"F Fl R 4s 15m F 4,Fl 7M",2,"{""navigation_marks"": 2}" +chart_label_subtext,"F Fl G 4s 15m F 4,Fl 7M",2,"{""navigation_marks"": 2}" +chart_label_subtext,5.3m,2,"{""navigation_marks"": 2}" +chart_label_subtext,16m,2,"{""navigation_marks"": 2}" +chart_label_subtext,19m,2,"{""navigation_marks"": 2}" +chart_label_subtext,"F Fl G 6s 10m F1,Fl.3M",2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(2) R 8s 14m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(2) R 7s 19m 7M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl G 5s 15m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(3) G 13s 16m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(2) G 8s 16m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(U) W 10s 29m 11M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl R 5s 7m 4M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(U) W 8s 16m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(U) W 8s 12m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,"F Fl R 4s 15m Fl 7,F 4M",2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl R 6s 13m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F R 35m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F R 17m 6M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F R 22m 6M,2,"{""navigation_marks"": 2}" +chart_label_subtext,"Aero Al Fl W,G 3s",2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(2) R 6s 12m 7M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl R 4s 7m 4M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(3) R 12s 11m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(2) G 6s 4.5m 4M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl R 4s 13m 4M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl R 5s 18m 7M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl G 5s 17m 4M,2,"{""navigation_marks"": 2}" +chart_label_subtext,"Dir Oc W,R,G 8s 11m W7,R6,G6M",2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(2) G 9s 16m 7M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Iso G 6s 17m 7M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F Y 55m 14M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F Y 68m 14M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Iso R 8s 15m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(3) G 12s 12m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(U) W 8s 25m 10M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl Y 3s 6m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F R 15m 2M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F R 20m 2M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl R 4s 14m 8M,2,"{""navigation_marks"": 2}" +chart_label_subtext,"Dir F W,R,G 13m W7,R6,G6M",2,"{""navigation_marks"": 2}" +chart_label_subtext,Oc R 5s 12m 4M,2,"{""navigation_marks"": 2}" +chart_label_subtext,"Dir F W,R,G 8m 1M",2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(B) R 8s 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,"Aero Al Fl W,G 2s",2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl R 4s 16m 7M,2,"{""navigation_marks"": 2}" +chart_label_subtext,"F Fl(2) G 7s 17m F2,Fl5M",2,"{""navigation_marks"": 2}" +chart_label_subtext,"F Fl G 5s 7m F2,Fl.5M",2,"{""navigation_marks"": 2}" +chart_label_subtext,F R 20m 7M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(2) G 8s 7m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl (2) G 6s 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl (2) R 6s 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(2) G 8s 7m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl Y 3s 13m 7M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(U) W 14s 32m 12M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(2) R 9s 18m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(2) G 6s 17m 6M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(2) G 9s 15m 4M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl R 3s 15m 4M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl G 6s 10m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F W 32m 6M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F R 66m 7M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F R 108m 7M,2,"{""navigation_marks"": 2}" +chart_label_subtext,"Dir F W,R,G 28m W14,R10,G11M",2,"{""navigation_marks"": 2}" +chart_label_subtext,F W 6m,2,"{""navigation_marks"": 2}" +display_code,31200004,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl G 6s 8m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Q W 12m 7M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Mo(U) W 10s 30m 10M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F G 28m 9M,2,"{""navigation_marks"": 2}" +chart_label_subtext,6.5m,2,"{""navigation_marks"": 2}" +chart_label_subtext,11m,2,"{""navigation_marks"": 2}" +display_code,31335704,2,"{""navigation_marks"": 2}" +chart_label_subtext,F G 47m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,"Dir F W,R,G 16m W13,R10,G11M",2,"{""navigation_marks"": 2}" +chart_label_subtext,F W 57m,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(2) G 5s 7m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(2) G 5s 19m 7M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Iso G 4s 6m 4M,2,"{""navigation_marks"": 2}" +chart_label_subtext,"F Fl R 5s 8m F 2,Fl 5M",2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl (2) R 6s 13m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,"Dir F W,R,G 53m W14,R13,G13M",2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl R 4s 6.7m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Iso R 4s 10m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl R 5s 7m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,"F Fl G 4s 7m F1,Fl.3M",2,"{""navigation_marks"": 2}" +chart_label_subtext,"F Fl(2) R 8s 10m F1,Fl.3M",2,"{""navigation_marks"": 2}" +chart_label_subtext,F Fl R 5s 8m F 2 Fl 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,F Fl G 5s 7m F2 Fl5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Iso G 6s 6m 4M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(2) R 6s 23m 7M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(2) R 8s 9m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Oc G 8s 10m 8M,2,"{""navigation_marks"": 2}" +chart_label_subtext,"Dir F W,R,G 40m W13,R9,G10M",2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(2) R 5s 10m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Iso G 6s 14m 3M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Fl(2) R 5s 14m 4M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Oc R 6s 19m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,"F Fl G 5s 10m F1,Fl.3M",2,"{""navigation_marks"": 2}" +chart_label_subtext,Oc R 4s 13m 4M,2,"{""navigation_marks"": 2}" +arc_source_code,02113325,2,"{""navigation_marks"": 2}" +arc_id,arc_r293_145,2,"{""navigation_marks"": 2}" +chart_label_subtext,"F Fl R 6s 14m F2,Fl.5M",2,"{""navigation_marks"": 2}" +chart_label_subtext,"F Fl R 6s 15m F4,Fl.7M",2,"{""navigation_marks"": 2}" +chart_label_subtext,Oc R 4s 16m 5M,2,"{""navigation_marks"": 2}" +chart_label_subtext,Oc G 4s 12m 9M,2,"{""navigation_marks"": 2}" +chart_label_subtext,"F Fl G 3s 15m F4,Fl.7M",2,"{""navigation_marks"": 2}" +chart_label_subtext,Oc G 4s 13m 4M,2,"{""navigation_marks"": 2}" +class_code,430,1,"{""navigation_hazard_point"": 1}" +canonical_object_type,石油開発台,1,"{""navigation_hazard_point"": 1}" +class_code,411,1,"{""navigation_hazard_point"": 1}" +canonical_object_type,マスト露出沈船,1,"{""navigation_hazard_point"": 1}" +chart_label_subtext,Oc W 10s 46m 17M,1,"{""navigation_marks"": 1}" +arc_source_code,04221052,1,"{""navigation_marks"": 1}" +arc_id,arc_y041_232,1,"{""navigation_marks"": 1}" diff --git a/report/current_pbf_inventory_full_semantic_20260809/字段分类.csv b/report/current_pbf_inventory_full_semantic_20260809/字段分类.csv new file mode 100644 index 0000000..aa99f20 --- /dev/null +++ b/report/current_pbf_inventory_full_semantic_20260809/字段分类.csv @@ -0,0 +1,25 @@ +field,feature_value_count,layer_count,layers,used_by_current_style +canonical_object_type,6685117,53,"{""baseline_area"": 701625, ""baseline_outline"": 1080780, ""hole_area"": 367217, ""land_area"": 198655, ""bathymetry_line"": 2075172, ""depth_contour"": 445051, ""navigation_marks"": 38520, ""bridge_structure"": 25775, ""hazard_boundary_outline"": 51962, ""place_label_land"": 35388, ""place_label_sea"": 36247, ""submerged_reef_area"": 3881, ""depth_contour_overview"": 5551, ""anchor_caution_hazard_point"": 49907, ""baseline_line"": 53615, ""onshore_structure_line"": 1258262, ""onshore_structure_point"": 32708, ""depth_zone_739"": 429, ""fixed_fishing_gear_area"": 22595, ""anchor_caution_hazard_area"": 8719, ""anchor_caution_hazard_outline"": 8743, ""onshore_structure_area"": 35622, ""route_area"": 352, ""route_outline"": 864, ""clearance_limit_line"": 1028, ""hazard_boundary_line"": 47, ""route_boundary_point"": 395, ""depth_zone_740"": 51, ""route_axis_line"": 116, ""depth_zone_700"": 14, ""depth_zone_725"": 95, ""depth_zone_702"": 10, ""seabed_line"": 14391, ""anchorage_area"": 308, ""anchorage_outline"": 297, ""anchorage_point"": 366, ""navigation_hazard_point"": 19268, ""facility_boundary_point"": 5019, ""seabed_text_point"": 99863, ""clearance_limit_point"": 858, ""clip_outline_754"": 771, ""depth_zone_741"": 1696, ""facility_boundary_area"": 1406, ""navigation_hazard_area"": 159, ""navigation_hazard_outline"": 198, ""facility_boundary_outline"": 566, ""clip_outline_730"": 27, ""facility_boundary_area_transparent"": 27, ""depth_zone_748"": 145, ""depth_zone_749"": 140, ""leading_line_outline"": 101, ""pilot_station_point"": 88, ""clip_outline_721"": 27}",yes +class_code,4204208,50,"{""baseline_area"": 701625, ""baseline_outline"": 1080780, ""land_area"": 198655, ""depth_contour"": 445051, ""bridge_structure"": 25775, ""hazard_boundary_outline"": 51962, ""place_label_land"": 35388, ""place_label_sea"": 36247, ""submerged_reef_area"": 3881, ""depth_contour_overview"": 5551, ""anchor_caution_hazard_point"": 49907, ""baseline_line"": 53615, ""onshore_structure_line"": 1258262, ""onshore_structure_point"": 32708, ""depth_zone_739"": 429, ""fixed_fishing_gear_area"": 22595, ""anchor_caution_hazard_area"": 8719, ""anchor_caution_hazard_outline"": 8743, ""onshore_structure_area"": 35622, ""route_area"": 352, ""route_outline"": 864, ""clearance_limit_line"": 1028, ""hazard_boundary_line"": 47, ""route_boundary_point"": 395, ""depth_zone_740"": 51, ""route_axis_line"": 116, ""depth_zone_700"": 14, ""depth_zone_725"": 95, ""depth_zone_702"": 10, ""seabed_line"": 14391, ""anchorage_area"": 308, ""anchorage_outline"": 297, ""anchorage_point"": 366, ""navigation_hazard_point"": 19268, ""facility_boundary_point"": 5019, ""seabed_text_point"": 99863, ""clearance_limit_point"": 858, ""clip_outline_754"": 771, ""depth_zone_741"": 1696, ""facility_boundary_area"": 1406, ""navigation_hazard_area"": 159, ""navigation_hazard_outline"": 198, ""facility_boundary_outline"": 566, ""clip_outline_730"": 27, ""facility_boundary_area_transparent"": 27, ""depth_zone_748"": 145, ""depth_zone_749"": 140, ""leading_line_outline"": 101, ""pilot_station_point"": 88, ""clip_outline_721"": 27}",yes +chart_text_style,2731099,7,"{""bathymetry_line"": 2075172, ""depth_contour"": 445051, ""navigation_marks"": 38520, ""place_label_land"": 35388, ""place_label_sea"": 36247, ""seabed_text_point"": 99863, ""clearance_limit_point"": 858}",yes +chart_text_color,2730241,6,"{""bathymetry_line"": 2075172, ""depth_contour"": 445051, ""navigation_marks"": 38520, ""place_label_land"": 35388, ""place_label_sea"": 36247, ""seabed_text_point"": 99863}",yes +chart_label_text,2715240,8,"{""bathymetry_line"": 2075172, ""depth_contour"": 445051, ""navigation_marks"": 17642, ""place_label_land"": 35388, ""place_label_sea"": 36247, ""facility_boundary_point"": 5019, ""seabed_text_point"": 99863, ""clearance_limit_point"": 858}",yes +depth_value_m,2075172,1,"{""bathymetry_line"": 2075172}",yes +chart_fill_style,1366341,13,"{""baseline_area"": 701625, ""hole_area"": 367217, ""land_area"": 198655, ""bridge_structure"": 25775, ""submerged_reef_area"": 3881, ""fixed_fishing_gear_area"": 22595, ""anchor_caution_hazard_area"": 8719, ""onshore_structure_area"": 35622, ""route_area"": 352, ""anchorage_area"": 308, ""facility_boundary_area"": 1406, ""navigation_hazard_area"": 159, ""facility_boundary_area_transparent"": 27}",yes +least_depth_m,450602,2,"{""depth_contour"": 445051, ""depth_contour_overview"": 5551}",no +chart_symbol_code,146271,8,"{""navigation_marks"": 38520, ""anchor_caution_hazard_point"": 49907, ""onshore_structure_point"": 32708, ""route_boundary_point"": 395, ""anchorage_point"": 366, ""navigation_hazard_point"": 19268, ""facility_boundary_point"": 5019, ""pilot_station_point"": 88}",yes +chart_label_position_code,138383,2,"{""navigation_marks"": 38520, ""seabed_text_point"": 99863}",yes +name_ja,122837,4,"{""navigation_marks"": 17611, ""facility_boundary_point"": 5019, ""seabed_text_point"": 99863, ""clearance_limit_point"": 344}",yes +chart_icon_image,108061,4,"{""navigation_marks"": 38520, ""anchor_caution_hazard_point"": 49907, ""anchorage_point"": 366, ""navigation_hazard_point"": 19268}",yes +place_name_en,48100,2,"{""place_label_land"": 29131, ""place_label_sea"": 18969}",yes +shape_class_code,38520,1,"{""navigation_marks"": 38520}",yes +display_code,38520,1,"{""navigation_marks"": 38520}",yes +chart_label_subtext,33495,1,"{""navigation_marks"": 33495}",yes +light_color_code,33388,1,"{""navigation_marks"": 33388}",yes +light_sector_mode,31287,1,"{""navigation_marks"": 31287}",no +chart_fill_pattern,10284,3,"{""anchor_caution_hazard_area"": 8719, ""facility_boundary_area"": 1406, ""navigation_hazard_area"": 159}",yes +chart_line_width,9804,4,"{""anchor_caution_hazard_outline"": 8743, ""anchorage_outline"": 297, ""navigation_hazard_outline"": 198, ""facility_boundary_outline"": 566}",yes +arc_source_code,1072,1,"{""navigation_marks"": 1072}",no +arc_id,1072,1,"{""navigation_marks"": 1072}",yes +chart_line_color,863,2,"{""anchorage_outline"": 297, ""facility_boundary_outline"": 566}",yes +clearance_height_m,858,1,"{""clearance_limit_point"": 858}",no diff --git a/report/current_pbf_inventory_full_semantic_20260809/当前PBF数据分类报告.md b/report/current_pbf_inventory_full_semantic_20260809/当前PBF数据分类报告.md new file mode 100644 index 0000000..aaa714f --- /dev/null +++ b/report/current_pbf_inventory_full_semantic_20260809/当前PBF数据分类报告.md @@ -0,0 +1,124 @@ +# 当前统一 Full PBF 数据分类报告 + +- PBF 根目录:`/home/wwwroot/pbf-delivery-full-semantic-unified-20260808` +- 瓦片数:`65148` +- feature 总数:`6685117` +- 图层数:`53` +- 属性字段数:`24` + +## 按 zoom 的瓦片数量 + +| zoom | 瓦片数 | +|---|---:| +| z0 | 1 | +| z10 | 3156 | +| z11 | 12279 | +| z12 | 48556 | +| z5 | 10 | +| z6 | 27 | +| z7 | 76 | +| z8 | 230 | +| z9 | 813 | + +## 图层分类 + +| 图层 | feature 数 | 几何类型 | 字段数 | +|---|---:|---|---:| +| `bathymetry_line` | 2075172 | `{"LineString": 1866386, "MultiLineString": 208786}` | 5 | +| `onshore_structure_line` | 1258262 | `{"LineString": 1256228, "MultiLineString": 2034}` | 2 | +| `baseline_outline` | 1080780 | `{"LineString": 1074484, "MultiLineString": 6296}` | 2 | +| `baseline_area` | 701625 | `{"Polygon": 602066, "MultiPolygon": 99559}` | 3 | +| `depth_contour` | 445051 | `{"LineString": 437566, "MultiLineString": 7485}` | 6 | +| `hole_area` | 367217 | `{"Polygon": 361754, "MultiPolygon": 5463}` | 2 | +| `land_area` | 198655 | `{"Polygon": 193114, "MultiPolygon": 5541}` | 3 | +| `seabed_text_point` | 99863 | `{"Point": 99863}` | 7 | +| `baseline_line` | 53615 | `{"LineString": 53612, "MultiLineString": 3}` | 2 | +| `hazard_boundary_outline` | 51962 | `{"LineString": 51743, "MultiLineString": 219}` | 2 | +| `anchor_caution_hazard_point` | 49907 | `{"Point": 49907}` | 4 | +| `navigation_marks` | 38520 | `{"Point": 38520}` | 15 | +| `place_label_sea` | 36247 | `{"Point": 36247}` | 6 | +| `onshore_structure_area` | 35622 | `{"Polygon": 35580, "MultiPolygon": 42}` | 3 | +| `place_label_land` | 35388 | `{"Point": 35388}` | 6 | +| `onshore_structure_point` | 32708 | `{"Point": 32708}` | 3 | +| `bridge_structure` | 25775 | `{"Polygon": 25708, "MultiPolygon": 67}` | 3 | +| `fixed_fishing_gear_area` | 22595 | `{"Polygon": 22325, "MultiPolygon": 270}` | 3 | +| `navigation_hazard_point` | 19268 | `{"Point": 19268}` | 4 | +| `seabed_line` | 14391 | `{"LineString": 14271, "MultiLineString": 120}` | 2 | +| `anchor_caution_hazard_outline` | 8743 | `{"LineString": 8465, "MultiLineString": 278}` | 3 | +| `anchor_caution_hazard_area` | 8719 | `{"Polygon": 8703, "MultiPolygon": 16}` | 4 | +| `depth_contour_overview` | 5551 | `{"LineString": 5497, "MultiLineString": 54}` | 3 | +| `facility_boundary_point` | 5019 | `{"Point": 5019}` | 5 | +| `submerged_reef_area` | 3881 | `{"Polygon": 3780, "MultiPolygon": 101}` | 3 | +| `depth_zone_741` | 1696 | `{"LineString": 1665, "MultiLineString": 31}` | 2 | +| `facility_boundary_area` | 1406 | `{"Polygon": 1406}` | 4 | +| `clearance_limit_line` | 1028 | `{"LineString": 1028}` | 2 | +| `route_outline` | 864 | `{"LineString": 755, "MultiLineString": 109}` | 2 | +| `clearance_limit_point` | 858 | `{"Point": 858}` | 6 | +| `clip_outline_754` | 771 | `{"LineString": 730, "MultiLineString": 41}` | 2 | +| `facility_boundary_outline` | 566 | `{"LineString": 521, "MultiLineString": 45}` | 4 | +| `depth_zone_739` | 429 | `{"LineString": 424, "MultiLineString": 5}` | 2 | +| `route_boundary_point` | 395 | `{"Point": 395}` | 3 | +| `anchorage_point` | 366 | `{"Point": 366}` | 4 | +| `route_area` | 352 | `{"Polygon": 349, "MultiPolygon": 3}` | 3 | +| `anchorage_area` | 308 | `{"Polygon": 308}` | 3 | +| `anchorage_outline` | 297 | `{"LineString": 240, "MultiLineString": 57}` | 4 | +| `navigation_hazard_outline` | 198 | `{"LineString": 191, "MultiLineString": 7}` | 3 | +| `navigation_hazard_area` | 159 | `{"Polygon": 159}` | 4 | +| `depth_zone_748` | 145 | `{"LineString": 145}` | 2 | +| `depth_zone_749` | 140 | `{"LineString": 140}` | 2 | +| `route_axis_line` | 116 | `{"LineString": 116}` | 2 | +| `leading_line_outline` | 101 | `{"LineString": 101}` | 2 | +| `depth_zone_725` | 95 | `{"LineString": 95}` | 2 | +| `pilot_station_point` | 88 | `{"Point": 88}` | 3 | +| `depth_zone_740` | 51 | `{"LineString": 51}` | 2 | +| `hazard_boundary_line` | 47 | `{"LineString": 47}` | 2 | +| `clip_outline_730` | 27 | `{"LineString": 18, "MultiLineString": 9}` | 2 | +| `facility_boundary_area_transparent` | 27 | `{"Polygon": 27}` | 3 | +| `clip_outline_721` | 27 | `{"LineString": 24, "MultiLineString": 3}` | 2 | +| `depth_zone_700` | 14 | `{"LineString": 14}` | 2 | +| `depth_zone_702` | 10 | `{"LineString": 10}` | 2 | + +## 取舍说明 + +- `geometry`、图层名、`canonical_object_type`、分类/显示码、`chart_*`、`arc_id`/`arc_source_code` 是渲染、对象审计或灯弧追溯的核心数据,不能在未做专项审计前删除。 +- 只被点击详情或外部业务使用、但不被当前 style 读取的字段,属于可选保留项;应先确认 pickup、审计和后续重建是否依赖。 +- 仅存在于 PBF、当前 style 不读取且不参与对象身份/分类/追溯的字段,才是候选删除项;具体字段和数量见 `字段分类.csv`。 +- 所有细分值见 `字段值分类.csv`,不要仅依据当前出现次数为 0 的 style 分支删除上游分类能力。 + +## 明细文件 + +- `图层分类.csv`:每个 source-layer 的 feature、几何和字段分布。 +- `字段分类.csv`:每个属性字段的出现量、所在图层和当前 style 是否读取。 +- `字段值分类.csv`:分类码、显示码、对象类型、图片、纹理和灯弧等字段的逐值统计。 + +## 当前 style 未直接引用的 PBF 图层 + +以下 `16` 个图层在当前统一 style 中没有对应的 `source-layer`,合计 `7962` 个瓦片 feature。这里的数量是瓦片内 feature 数,不等于去重后的原始对象数。 + +| 图层 | feature 数 | 初步取舍建议 | +|---|---:|---| +| `depth_contour_overview` | 5551 | 可选;保留给概览/深度分析,纯当前渲染可暂不输出 | +| `route_outline` | 864 | 规划数据,建议保留,不影响当前海图渲染 | +| `route_boundary_point` | 395 | 规划数据,建议保留 | +| `route_area` | 352 | 规划数据,建议保留 | +| `depth_zone_748` | 145 | 深度/边界细节,可选 | +| `depth_zone_749` | 140 | 深度/边界细节,可选 | +| `route_axis_line` | 116 | 规划数据,建议保留 | +| `leading_line_outline` | 101 | 导引线细节,需确认视觉需求后再删 | +| `depth_zone_725` | 95 | 深度/边界细节,可选 | +| `depth_zone_740` | 51 | 深度/边界细节,可选 | +| `hazard_boundary_line` | 47 | 危险界线细节,建议先保留并补 style | +| `clip_outline_730` | 27 | 线型裁剪/边界细节,可选 | +| `facility_boundary_area_transparent` | 27 | 透明设施区域,当前渲染可暂不输出 | +| `clip_outline_721` | 27 | 线型裁剪/边界细节,可选 | +| `depth_zone_700` | 14 | 深度/边界细节,可选 | +| `depth_zone_702` | 10 | 深度/边界细节,可选 | + +## 字段取舍初步结论 + +- 当前 style 直接读取的字段包括:`canonical_object_type`、`class_code`、`display_code`、`shape_class_code`、`chart_symbol_code`、`chart_icon_image`、`chart_fill_style`、`chart_fill_pattern`、`chart_line_width`、`chart_line_color`、文字字段、`light_color_code` 和 `arc_id`。这些字段删除会直接影响当前渲染或分类选择。 +- `arc_source_code` 当前不被 style 读取,但它是灯弧反向追溯原始 `明弧/分孤` 的唯一短字段,不能删除。 +- `light_sector_mode` 当前 style 不读取,但可用于快速区分 `sector=1072` 与 `omni=30215`,建议保留。 +- `least_depth_m` 当前 style 不读取,但用于深度/航行分析;如果还要支持规划或点击详情,建议保留。 +- `clearance_height_m` 当前 style 不读取,但用于限高对象的业务详情和审计,建议保留。 +- 当前 PBF 不是“混入大量完全无关属性”的状态,只有 `24` 个属性字段;真正的压缩空间主要在未被当前 style 引用的图层和重复的 zoom 展开,而不是随意删除审计字段。 diff --git a/report/full_aoi_visual_audit_2026-04-18_r1/hakata_10nm_full_z10/compare_diff.png b/report/full_aoi_visual_audit_2026-04-18_r1/hakata_10nm_full_z10/compare_diff.png new file mode 100644 index 0000000..2fac78a Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r1/hakata_10nm_full_z10/compare_diff.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r1/hakata_10nm_full_z10/compare_full.png b/report/full_aoi_visual_audit_2026-04-18_r1/hakata_10nm_full_z10/compare_full.png new file mode 100644 index 0000000..4c7927c Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r1/hakata_10nm_full_z10/compare_full.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r1/hakata_10nm_full_z10/compare_left.png b/report/full_aoi_visual_audit_2026-04-18_r1/hakata_10nm_full_z10/compare_left.png new file mode 100644 index 0000000..466517c Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r1/hakata_10nm_full_z10/compare_left.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r1/hakata_10nm_full_z10/compare_right.png b/report/full_aoi_visual_audit_2026-04-18_r1/hakata_10nm_full_z10/compare_right.png new file mode 100644 index 0000000..369f990 Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r1/hakata_10nm_full_z10/compare_right.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r1/hakata_10nm_full_z12/compare_diff.png b/report/full_aoi_visual_audit_2026-04-18_r1/hakata_10nm_full_z12/compare_diff.png new file mode 100644 index 0000000..255729d Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r1/hakata_10nm_full_z12/compare_diff.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r1/hakata_10nm_full_z12/compare_full.png b/report/full_aoi_visual_audit_2026-04-18_r1/hakata_10nm_full_z12/compare_full.png new file mode 100644 index 0000000..288ce7a Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r1/hakata_10nm_full_z12/compare_full.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r1/hakata_10nm_full_z12/compare_left.png b/report/full_aoi_visual_audit_2026-04-18_r1/hakata_10nm_full_z12/compare_left.png new file mode 100644 index 0000000..a7be227 Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r1/hakata_10nm_full_z12/compare_left.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r1/hakata_10nm_full_z12/compare_right.png b/report/full_aoi_visual_audit_2026-04-18_r1/hakata_10nm_full_z12/compare_right.png new file mode 100644 index 0000000..83aacea Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r1/hakata_10nm_full_z12/compare_right.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r1/hakata_10nm_semantic_z10/compare_diff.png b/report/full_aoi_visual_audit_2026-04-18_r1/hakata_10nm_semantic_z10/compare_diff.png new file mode 100644 index 0000000..a4b0d0f Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r1/hakata_10nm_semantic_z10/compare_diff.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r1/hakata_10nm_semantic_z10/compare_full.png b/report/full_aoi_visual_audit_2026-04-18_r1/hakata_10nm_semantic_z10/compare_full.png new file mode 100644 index 0000000..7413ae8 Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r1/hakata_10nm_semantic_z10/compare_full.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r1/hakata_10nm_semantic_z10/compare_left.png b/report/full_aoi_visual_audit_2026-04-18_r1/hakata_10nm_semantic_z10/compare_left.png new file mode 100644 index 0000000..5eedcf4 Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r1/hakata_10nm_semantic_z10/compare_left.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r1/hakata_10nm_semantic_z10/compare_right.png b/report/full_aoi_visual_audit_2026-04-18_r1/hakata_10nm_semantic_z10/compare_right.png new file mode 100644 index 0000000..6cec146 Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r1/hakata_10nm_semantic_z10/compare_right.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r1/hakata_10nm_semantic_z12/compare_diff.png b/report/full_aoi_visual_audit_2026-04-18_r1/hakata_10nm_semantic_z12/compare_diff.png new file mode 100644 index 0000000..943c628 Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r1/hakata_10nm_semantic_z12/compare_diff.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r1/hakata_10nm_semantic_z12/compare_full.png b/report/full_aoi_visual_audit_2026-04-18_r1/hakata_10nm_semantic_z12/compare_full.png new file mode 100644 index 0000000..50de9c2 Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r1/hakata_10nm_semantic_z12/compare_full.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r1/hakata_10nm_semantic_z12/compare_left.png b/report/full_aoi_visual_audit_2026-04-18_r1/hakata_10nm_semantic_z12/compare_left.png new file mode 100644 index 0000000..b43e232 Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r1/hakata_10nm_semantic_z12/compare_left.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r1/hakata_10nm_semantic_z12/compare_right.png b/report/full_aoi_visual_audit_2026-04-18_r1/hakata_10nm_semantic_z12/compare_right.png new file mode 100644 index 0000000..e897ecd Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r1/hakata_10nm_semantic_z12/compare_right.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r1/karatsu_5nm_full_z10/compare_diff.png b/report/full_aoi_visual_audit_2026-04-18_r1/karatsu_5nm_full_z10/compare_diff.png new file mode 100644 index 0000000..4322b14 Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r1/karatsu_5nm_full_z10/compare_diff.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r1/karatsu_5nm_full_z10/compare_full.png b/report/full_aoi_visual_audit_2026-04-18_r1/karatsu_5nm_full_z10/compare_full.png new file mode 100644 index 0000000..4e45fff Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r1/karatsu_5nm_full_z10/compare_full.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r1/karatsu_5nm_full_z10/compare_left.png b/report/full_aoi_visual_audit_2026-04-18_r1/karatsu_5nm_full_z10/compare_left.png new file mode 100644 index 0000000..2641eca Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r1/karatsu_5nm_full_z10/compare_left.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r1/karatsu_5nm_full_z10/compare_right.png b/report/full_aoi_visual_audit_2026-04-18_r1/karatsu_5nm_full_z10/compare_right.png new file mode 100644 index 0000000..82c9c01 Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r1/karatsu_5nm_full_z10/compare_right.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r1/karatsu_5nm_full_z12/compare_diff.png b/report/full_aoi_visual_audit_2026-04-18_r1/karatsu_5nm_full_z12/compare_diff.png new file mode 100644 index 0000000..53d847c Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r1/karatsu_5nm_full_z12/compare_diff.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r1/karatsu_5nm_full_z12/compare_full.png b/report/full_aoi_visual_audit_2026-04-18_r1/karatsu_5nm_full_z12/compare_full.png new file mode 100644 index 0000000..279b38e Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r1/karatsu_5nm_full_z12/compare_full.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r1/karatsu_5nm_full_z12/compare_left.png b/report/full_aoi_visual_audit_2026-04-18_r1/karatsu_5nm_full_z12/compare_left.png new file mode 100644 index 0000000..f3df6a0 Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r1/karatsu_5nm_full_z12/compare_left.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r1/karatsu_5nm_full_z12/compare_right.png b/report/full_aoi_visual_audit_2026-04-18_r1/karatsu_5nm_full_z12/compare_right.png new file mode 100644 index 0000000..06fc0ee Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r1/karatsu_5nm_full_z12/compare_right.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r1/karatsu_5nm_semantic_z10/compare_diff.png b/report/full_aoi_visual_audit_2026-04-18_r1/karatsu_5nm_semantic_z10/compare_diff.png new file mode 100644 index 0000000..2e10ddd Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r1/karatsu_5nm_semantic_z10/compare_diff.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r1/karatsu_5nm_semantic_z10/compare_full.png b/report/full_aoi_visual_audit_2026-04-18_r1/karatsu_5nm_semantic_z10/compare_full.png new file mode 100644 index 0000000..0627970 Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r1/karatsu_5nm_semantic_z10/compare_full.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r1/karatsu_5nm_semantic_z10/compare_left.png b/report/full_aoi_visual_audit_2026-04-18_r1/karatsu_5nm_semantic_z10/compare_left.png new file mode 100644 index 0000000..a02cb24 Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r1/karatsu_5nm_semantic_z10/compare_left.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r1/karatsu_5nm_semantic_z10/compare_right.png b/report/full_aoi_visual_audit_2026-04-18_r1/karatsu_5nm_semantic_z10/compare_right.png new file mode 100644 index 0000000..9dceb36 Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r1/karatsu_5nm_semantic_z10/compare_right.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r1/karatsu_5nm_semantic_z12/compare_diff.png b/report/full_aoi_visual_audit_2026-04-18_r1/karatsu_5nm_semantic_z12/compare_diff.png new file mode 100644 index 0000000..e1499a1 Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r1/karatsu_5nm_semantic_z12/compare_diff.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r1/karatsu_5nm_semantic_z12/compare_full.png b/report/full_aoi_visual_audit_2026-04-18_r1/karatsu_5nm_semantic_z12/compare_full.png new file mode 100644 index 0000000..21adfdb Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r1/karatsu_5nm_semantic_z12/compare_full.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r1/karatsu_5nm_semantic_z12/compare_left.png b/report/full_aoi_visual_audit_2026-04-18_r1/karatsu_5nm_semantic_z12/compare_left.png new file mode 100644 index 0000000..a402eff Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r1/karatsu_5nm_semantic_z12/compare_left.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r1/karatsu_5nm_semantic_z12/compare_right.png b/report/full_aoi_visual_audit_2026-04-18_r1/karatsu_5nm_semantic_z12/compare_right.png new file mode 100644 index 0000000..152c08b Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r1/karatsu_5nm_semantic_z12/compare_right.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r1/okinawa_10nm_full_z10/compare_diff.png b/report/full_aoi_visual_audit_2026-04-18_r1/okinawa_10nm_full_z10/compare_diff.png new file mode 100644 index 0000000..617eef8 Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r1/okinawa_10nm_full_z10/compare_diff.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r1/okinawa_10nm_full_z10/compare_full.png b/report/full_aoi_visual_audit_2026-04-18_r1/okinawa_10nm_full_z10/compare_full.png new file mode 100644 index 0000000..e8bf168 Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r1/okinawa_10nm_full_z10/compare_full.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r1/okinawa_10nm_full_z10/compare_left.png b/report/full_aoi_visual_audit_2026-04-18_r1/okinawa_10nm_full_z10/compare_left.png new file mode 100644 index 0000000..6243f24 Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r1/okinawa_10nm_full_z10/compare_left.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r1/okinawa_10nm_full_z10/compare_right.png b/report/full_aoi_visual_audit_2026-04-18_r1/okinawa_10nm_full_z10/compare_right.png new file mode 100644 index 0000000..fee6b39 Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r1/okinawa_10nm_full_z10/compare_right.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r1/okinawa_10nm_full_z12/compare_diff.png b/report/full_aoi_visual_audit_2026-04-18_r1/okinawa_10nm_full_z12/compare_diff.png new file mode 100644 index 0000000..1846548 Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r1/okinawa_10nm_full_z12/compare_diff.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r1/okinawa_10nm_full_z12/compare_full.png b/report/full_aoi_visual_audit_2026-04-18_r1/okinawa_10nm_full_z12/compare_full.png new file mode 100644 index 0000000..b534f36 Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r1/okinawa_10nm_full_z12/compare_full.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r1/okinawa_10nm_full_z12/compare_left.png b/report/full_aoi_visual_audit_2026-04-18_r1/okinawa_10nm_full_z12/compare_left.png new file mode 100644 index 0000000..95f1b99 Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r1/okinawa_10nm_full_z12/compare_left.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r1/okinawa_10nm_full_z12/compare_right.png b/report/full_aoi_visual_audit_2026-04-18_r1/okinawa_10nm_full_z12/compare_right.png new file mode 100644 index 0000000..ae260e4 Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r1/okinawa_10nm_full_z12/compare_right.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r1/okinawa_10nm_semantic_z10/compare_diff.png b/report/full_aoi_visual_audit_2026-04-18_r1/okinawa_10nm_semantic_z10/compare_diff.png new file mode 100644 index 0000000..f27de4f Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r1/okinawa_10nm_semantic_z10/compare_diff.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r1/okinawa_10nm_semantic_z10/compare_full.png b/report/full_aoi_visual_audit_2026-04-18_r1/okinawa_10nm_semantic_z10/compare_full.png new file mode 100644 index 0000000..0dfcac5 Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r1/okinawa_10nm_semantic_z10/compare_full.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r1/okinawa_10nm_semantic_z10/compare_left.png b/report/full_aoi_visual_audit_2026-04-18_r1/okinawa_10nm_semantic_z10/compare_left.png new file mode 100644 index 0000000..c24ff99 Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r1/okinawa_10nm_semantic_z10/compare_left.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r1/okinawa_10nm_semantic_z10/compare_right.png b/report/full_aoi_visual_audit_2026-04-18_r1/okinawa_10nm_semantic_z10/compare_right.png new file mode 100644 index 0000000..f8fdf21 Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r1/okinawa_10nm_semantic_z10/compare_right.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r1/okinawa_10nm_semantic_z12/compare_diff.png b/report/full_aoi_visual_audit_2026-04-18_r1/okinawa_10nm_semantic_z12/compare_diff.png new file mode 100644 index 0000000..6e7c90d Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r1/okinawa_10nm_semantic_z12/compare_diff.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r1/okinawa_10nm_semantic_z12/compare_full.png b/report/full_aoi_visual_audit_2026-04-18_r1/okinawa_10nm_semantic_z12/compare_full.png new file mode 100644 index 0000000..65274da Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r1/okinawa_10nm_semantic_z12/compare_full.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r1/okinawa_10nm_semantic_z12/compare_left.png b/report/full_aoi_visual_audit_2026-04-18_r1/okinawa_10nm_semantic_z12/compare_left.png new file mode 100644 index 0000000..85b5409 Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r1/okinawa_10nm_semantic_z12/compare_left.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r1/okinawa_10nm_semantic_z12/compare_right.png b/report/full_aoi_visual_audit_2026-04-18_r1/okinawa_10nm_semantic_z12/compare_right.png new file mode 100644 index 0000000..443b84f Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r1/okinawa_10nm_semantic_z12/compare_right.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r1/osaka_bay_10nm_full_z10/compare_diff.png b/report/full_aoi_visual_audit_2026-04-18_r1/osaka_bay_10nm_full_z10/compare_diff.png new file mode 100644 index 0000000..3433219 Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r1/osaka_bay_10nm_full_z10/compare_diff.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r1/osaka_bay_10nm_full_z10/compare_full.png b/report/full_aoi_visual_audit_2026-04-18_r1/osaka_bay_10nm_full_z10/compare_full.png new file mode 100644 index 0000000..2fc9972 Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r1/osaka_bay_10nm_full_z10/compare_full.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r1/osaka_bay_10nm_full_z10/compare_left.png b/report/full_aoi_visual_audit_2026-04-18_r1/osaka_bay_10nm_full_z10/compare_left.png new file mode 100644 index 0000000..5e48964 Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r1/osaka_bay_10nm_full_z10/compare_left.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r1/osaka_bay_10nm_full_z10/compare_right.png b/report/full_aoi_visual_audit_2026-04-18_r1/osaka_bay_10nm_full_z10/compare_right.png new file mode 100644 index 0000000..768f4e1 Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r1/osaka_bay_10nm_full_z10/compare_right.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r1/osaka_bay_10nm_full_z12/compare_diff.png b/report/full_aoi_visual_audit_2026-04-18_r1/osaka_bay_10nm_full_z12/compare_diff.png new file mode 100644 index 0000000..f2f8e57 Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r1/osaka_bay_10nm_full_z12/compare_diff.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r1/osaka_bay_10nm_full_z12/compare_full.png b/report/full_aoi_visual_audit_2026-04-18_r1/osaka_bay_10nm_full_z12/compare_full.png new file mode 100644 index 0000000..d6f45f9 Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r1/osaka_bay_10nm_full_z12/compare_full.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r1/osaka_bay_10nm_full_z12/compare_left.png b/report/full_aoi_visual_audit_2026-04-18_r1/osaka_bay_10nm_full_z12/compare_left.png new file mode 100644 index 0000000..a9c0cf4 Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r1/osaka_bay_10nm_full_z12/compare_left.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r1/osaka_bay_10nm_full_z12/compare_right.png b/report/full_aoi_visual_audit_2026-04-18_r1/osaka_bay_10nm_full_z12/compare_right.png new file mode 100644 index 0000000..b18e670 Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r1/osaka_bay_10nm_full_z12/compare_right.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r1/osaka_bay_10nm_semantic_z10/compare_diff.png b/report/full_aoi_visual_audit_2026-04-18_r1/osaka_bay_10nm_semantic_z10/compare_diff.png new file mode 100644 index 0000000..c37814c Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r1/osaka_bay_10nm_semantic_z10/compare_diff.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r1/osaka_bay_10nm_semantic_z10/compare_full.png b/report/full_aoi_visual_audit_2026-04-18_r1/osaka_bay_10nm_semantic_z10/compare_full.png new file mode 100644 index 0000000..befc011 Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r1/osaka_bay_10nm_semantic_z10/compare_full.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r1/osaka_bay_10nm_semantic_z10/compare_left.png b/report/full_aoi_visual_audit_2026-04-18_r1/osaka_bay_10nm_semantic_z10/compare_left.png new file mode 100644 index 0000000..9482953 Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r1/osaka_bay_10nm_semantic_z10/compare_left.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r1/osaka_bay_10nm_semantic_z10/compare_right.png b/report/full_aoi_visual_audit_2026-04-18_r1/osaka_bay_10nm_semantic_z10/compare_right.png new file mode 100644 index 0000000..9aaf0c1 Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r1/osaka_bay_10nm_semantic_z10/compare_right.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r1/osaka_bay_10nm_semantic_z12/compare_diff.png b/report/full_aoi_visual_audit_2026-04-18_r1/osaka_bay_10nm_semantic_z12/compare_diff.png new file mode 100644 index 0000000..ce54468 Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r1/osaka_bay_10nm_semantic_z12/compare_diff.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r1/osaka_bay_10nm_semantic_z12/compare_full.png b/report/full_aoi_visual_audit_2026-04-18_r1/osaka_bay_10nm_semantic_z12/compare_full.png new file mode 100644 index 0000000..c6e2e1a Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r1/osaka_bay_10nm_semantic_z12/compare_full.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r1/osaka_bay_10nm_semantic_z12/compare_left.png b/report/full_aoi_visual_audit_2026-04-18_r1/osaka_bay_10nm_semantic_z12/compare_left.png new file mode 100644 index 0000000..8ce5090 Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r1/osaka_bay_10nm_semantic_z12/compare_left.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r1/osaka_bay_10nm_semantic_z12/compare_right.png b/report/full_aoi_visual_audit_2026-04-18_r1/osaka_bay_10nm_semantic_z12/compare_right.png new file mode 100644 index 0000000..0129bd2 Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r1/osaka_bay_10nm_semantic_z12/compare_right.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r1/tokyo_bay_10nm_full_z10/compare_diff.png b/report/full_aoi_visual_audit_2026-04-18_r1/tokyo_bay_10nm_full_z10/compare_diff.png new file mode 100644 index 0000000..2b758db Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r1/tokyo_bay_10nm_full_z10/compare_diff.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r1/tokyo_bay_10nm_full_z10/compare_full.png b/report/full_aoi_visual_audit_2026-04-18_r1/tokyo_bay_10nm_full_z10/compare_full.png new file mode 100644 index 0000000..27e0dad Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r1/tokyo_bay_10nm_full_z10/compare_full.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r1/tokyo_bay_10nm_full_z10/compare_left.png b/report/full_aoi_visual_audit_2026-04-18_r1/tokyo_bay_10nm_full_z10/compare_left.png new file mode 100644 index 0000000..a10973f Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r1/tokyo_bay_10nm_full_z10/compare_left.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r1/tokyo_bay_10nm_full_z10/compare_right.png b/report/full_aoi_visual_audit_2026-04-18_r1/tokyo_bay_10nm_full_z10/compare_right.png new file mode 100644 index 0000000..4a8fcec Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r1/tokyo_bay_10nm_full_z10/compare_right.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r1/tokyo_bay_10nm_full_z12/compare_diff.png b/report/full_aoi_visual_audit_2026-04-18_r1/tokyo_bay_10nm_full_z12/compare_diff.png new file mode 100644 index 0000000..52a5f1c Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r1/tokyo_bay_10nm_full_z12/compare_diff.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r1/tokyo_bay_10nm_full_z12/compare_full.png b/report/full_aoi_visual_audit_2026-04-18_r1/tokyo_bay_10nm_full_z12/compare_full.png new file mode 100644 index 0000000..2c91897 Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r1/tokyo_bay_10nm_full_z12/compare_full.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r1/tokyo_bay_10nm_full_z12/compare_left.png b/report/full_aoi_visual_audit_2026-04-18_r1/tokyo_bay_10nm_full_z12/compare_left.png new file mode 100644 index 0000000..1cc66d0 Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r1/tokyo_bay_10nm_full_z12/compare_left.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r1/tokyo_bay_10nm_full_z12/compare_right.png b/report/full_aoi_visual_audit_2026-04-18_r1/tokyo_bay_10nm_full_z12/compare_right.png new file mode 100644 index 0000000..7c8f787 Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r1/tokyo_bay_10nm_full_z12/compare_right.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r1/tokyo_bay_10nm_semantic_z10/compare_diff.png b/report/full_aoi_visual_audit_2026-04-18_r1/tokyo_bay_10nm_semantic_z10/compare_diff.png new file mode 100644 index 0000000..f4dc0cd Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r1/tokyo_bay_10nm_semantic_z10/compare_diff.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r1/tokyo_bay_10nm_semantic_z10/compare_full.png b/report/full_aoi_visual_audit_2026-04-18_r1/tokyo_bay_10nm_semantic_z10/compare_full.png new file mode 100644 index 0000000..0b4bc0b Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r1/tokyo_bay_10nm_semantic_z10/compare_full.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r1/tokyo_bay_10nm_semantic_z10/compare_left.png b/report/full_aoi_visual_audit_2026-04-18_r1/tokyo_bay_10nm_semantic_z10/compare_left.png new file mode 100644 index 0000000..1289e6a Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r1/tokyo_bay_10nm_semantic_z10/compare_left.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r1/tokyo_bay_10nm_semantic_z10/compare_right.png b/report/full_aoi_visual_audit_2026-04-18_r1/tokyo_bay_10nm_semantic_z10/compare_right.png new file mode 100644 index 0000000..0729f49 Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r1/tokyo_bay_10nm_semantic_z10/compare_right.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r1/tokyo_bay_10nm_semantic_z12/compare_diff.png b/report/full_aoi_visual_audit_2026-04-18_r1/tokyo_bay_10nm_semantic_z12/compare_diff.png new file mode 100644 index 0000000..db16fb2 Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r1/tokyo_bay_10nm_semantic_z12/compare_diff.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r1/tokyo_bay_10nm_semantic_z12/compare_full.png b/report/full_aoi_visual_audit_2026-04-18_r1/tokyo_bay_10nm_semantic_z12/compare_full.png new file mode 100644 index 0000000..d5428fd Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r1/tokyo_bay_10nm_semantic_z12/compare_full.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r1/tokyo_bay_10nm_semantic_z12/compare_left.png b/report/full_aoi_visual_audit_2026-04-18_r1/tokyo_bay_10nm_semantic_z12/compare_left.png new file mode 100644 index 0000000..68efe17 Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r1/tokyo_bay_10nm_semantic_z12/compare_left.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r1/tokyo_bay_10nm_semantic_z12/compare_right.png b/report/full_aoi_visual_audit_2026-04-18_r1/tokyo_bay_10nm_semantic_z12/compare_right.png new file mode 100644 index 0000000..6481b83 Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r1/tokyo_bay_10nm_semantic_z12/compare_right.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r2_subset/full_aoi_visual_audit.json b/report/full_aoi_visual_audit_2026-04-18_r2_subset/full_aoi_visual_audit.json new file mode 100644 index 0000000..427946d --- /dev/null +++ b/report/full_aoi_visual_audit_2026-04-18_r2_subset/full_aoi_visual_audit.json @@ -0,0 +1,141 @@ +{ + "compare_url": "http://192.168.200.184/newpec/navsea-compare-full-audit.html", + "cases": [ + { + "id": "okinawa_10nm_full_z12", + "label": "冲绳 10 海里", + "variant": "full", + "zoom": 12, + "center": [ + 127.67, + 26.21 + ], + "radius_nm": 10, + "compare_url": "http://192.168.200.184/newpec/navsea-compare-full-audit.html?variant=full&audit=1¢er=127.67%2C26.21&zoom=12", + "changed_pixels": 314441, + "total_pixels": 364800, + "changed_ratio": 0.861954, + "mean_abs_rgb": [ + 40.364, + 41.3728, + 55.3433 + ], + "rms_rgb": [ + 67.4457, + 66.8189, + 83.1026 + ], + "diff_bbox": [ + 0, + 0, + 640, + 513 + ], + "left_image": "/root/sourceserver/pbf/report/full_aoi_visual_audit_2026-04-18_r2_subset/okinawa_10nm_full_z12/compare_left.png", + "right_image": "/root/sourceserver/pbf/report/full_aoi_visual_audit_2026-04-18_r2_subset/okinawa_10nm_full_z12/compare_right.png", + "diff_image": "/root/sourceserver/pbf/report/full_aoi_visual_audit_2026-04-18_r2_subset/okinawa_10nm_full_z12/compare_diff.png" + }, + { + "id": "karatsu_5nm_full_z12", + "label": "唐津 5 海里", + "variant": "full", + "zoom": 12, + "center": [ + 129.9697, + 33.4425 + ], + "radius_nm": 5, + "compare_url": "http://192.168.200.184/newpec/navsea-compare-full-audit.html?variant=full&audit=1¢er=129.9697%2C33.4425&zoom=12", + "changed_pixels": 313370, + "total_pixels": 364800, + "changed_ratio": 0.859019, + "mean_abs_rgb": [ + 32.3437, + 33.343, + 50.9629 + ], + "rms_rgb": [ + 53.1788, + 51.4738, + 72.437 + ], + "diff_bbox": [ + 0, + 0, + 640, + 513 + ], + "left_image": "/root/sourceserver/pbf/report/full_aoi_visual_audit_2026-04-18_r2_subset/karatsu_5nm_full_z12/compare_left.png", + "right_image": "/root/sourceserver/pbf/report/full_aoi_visual_audit_2026-04-18_r2_subset/karatsu_5nm_full_z12/compare_right.png", + "diff_image": "/root/sourceserver/pbf/report/full_aoi_visual_audit_2026-04-18_r2_subset/karatsu_5nm_full_z12/compare_diff.png" + }, + { + "id": "okinawa_10nm_semantic_z12", + "label": "冲绳 10 海里", + "variant": "semantic", + "zoom": 12, + "center": [ + 127.67, + 26.21 + ], + "radius_nm": 10, + "compare_url": "http://192.168.200.184/newpec/navsea-compare-full-audit.html?variant=semantic&audit=1¢er=127.67%2C26.21&zoom=12", + "changed_pixels": 310142, + "total_pixels": 364800, + "changed_ratio": 0.85017, + "mean_abs_rgb": [ + 40.3146, + 41.3705, + 55.2069 + ], + "rms_rgb": [ + 67.4717, + 66.8981, + 83.0146 + ], + "diff_bbox": [ + 0, + 0, + 640, + 513 + ], + "left_image": "/root/sourceserver/pbf/report/full_aoi_visual_audit_2026-04-18_r2_subset/okinawa_10nm_semantic_z12/compare_left.png", + "right_image": "/root/sourceserver/pbf/report/full_aoi_visual_audit_2026-04-18_r2_subset/okinawa_10nm_semantic_z12/compare_right.png", + "diff_image": "/root/sourceserver/pbf/report/full_aoi_visual_audit_2026-04-18_r2_subset/okinawa_10nm_semantic_z12/compare_diff.png" + }, + { + "id": "karatsu_5nm_semantic_z12", + "label": "唐津 5 海里", + "variant": "semantic", + "zoom": 12, + "center": [ + 129.9697, + 33.4425 + ], + "radius_nm": 5, + "compare_url": "http://192.168.200.184/newpec/navsea-compare-full-audit.html?variant=semantic&audit=1¢er=129.9697%2C33.4425&zoom=12", + "changed_pixels": 309066, + "total_pixels": 364800, + "changed_ratio": 0.84722, + "mean_abs_rgb": [ + 32.2724, + 33.2816, + 50.6811 + ], + "rms_rgb": [ + 53.1591, + 51.4758, + 72.1846 + ], + "diff_bbox": [ + 0, + 0, + 640, + 513 + ], + "left_image": "/root/sourceserver/pbf/report/full_aoi_visual_audit_2026-04-18_r2_subset/karatsu_5nm_semantic_z12/compare_left.png", + "right_image": "/root/sourceserver/pbf/report/full_aoi_visual_audit_2026-04-18_r2_subset/karatsu_5nm_semantic_z12/compare_right.png", + "diff_image": "/root/sourceserver/pbf/report/full_aoi_visual_audit_2026-04-18_r2_subset/karatsu_5nm_semantic_z12/compare_diff.png" + } + ] +} diff --git a/report/full_aoi_visual_audit_2026-04-18_r2_subset/full_aoi_visual_audit.md b/report/full_aoi_visual_audit_2026-04-18_r2_subset/full_aoi_visual_audit.md new file mode 100644 index 0000000..b3125c0 --- /dev/null +++ b/report/full_aoi_visual_audit_2026-04-18_r2_subset/full_aoi_visual_audit.md @@ -0,0 +1,49 @@ +# 全国 AOI 截图对比审计 + +## 总览 + +- compare page: `http://192.168.200.184/newpec/navsea-compare-full-audit.html` +- cases: `4` + +## 差异排序 + +### 冲绳 10 海里 · full · z12 + +- changed ratio: `0.861954` +- changed pixels: `314441` / `364800` +- mean abs rgb: `[40.364, 41.3728, 55.3433]` +- compare url: `http://192.168.200.184/newpec/navsea-compare-full-audit.html?variant=full&audit=1¢er=127.67%2C26.21&zoom=12` +- left image: `/root/sourceserver/pbf/report/full_aoi_visual_audit_2026-04-18_r2_subset/okinawa_10nm_full_z12/compare_left.png` +- right image: `/root/sourceserver/pbf/report/full_aoi_visual_audit_2026-04-18_r2_subset/okinawa_10nm_full_z12/compare_right.png` +- diff image: `/root/sourceserver/pbf/report/full_aoi_visual_audit_2026-04-18_r2_subset/okinawa_10nm_full_z12/compare_diff.png` + +### 唐津 5 海里 · full · z12 + +- changed ratio: `0.859019` +- changed pixels: `313370` / `364800` +- mean abs rgb: `[32.3437, 33.343, 50.9629]` +- compare url: `http://192.168.200.184/newpec/navsea-compare-full-audit.html?variant=full&audit=1¢er=129.9697%2C33.4425&zoom=12` +- left image: `/root/sourceserver/pbf/report/full_aoi_visual_audit_2026-04-18_r2_subset/karatsu_5nm_full_z12/compare_left.png` +- right image: `/root/sourceserver/pbf/report/full_aoi_visual_audit_2026-04-18_r2_subset/karatsu_5nm_full_z12/compare_right.png` +- diff image: `/root/sourceserver/pbf/report/full_aoi_visual_audit_2026-04-18_r2_subset/karatsu_5nm_full_z12/compare_diff.png` + +### 冲绳 10 海里 · semantic · z12 + +- changed ratio: `0.85017` +- changed pixels: `310142` / `364800` +- mean abs rgb: `[40.3146, 41.3705, 55.2069]` +- compare url: `http://192.168.200.184/newpec/navsea-compare-full-audit.html?variant=semantic&audit=1¢er=127.67%2C26.21&zoom=12` +- left image: `/root/sourceserver/pbf/report/full_aoi_visual_audit_2026-04-18_r2_subset/okinawa_10nm_semantic_z12/compare_left.png` +- right image: `/root/sourceserver/pbf/report/full_aoi_visual_audit_2026-04-18_r2_subset/okinawa_10nm_semantic_z12/compare_right.png` +- diff image: `/root/sourceserver/pbf/report/full_aoi_visual_audit_2026-04-18_r2_subset/okinawa_10nm_semantic_z12/compare_diff.png` + +### 唐津 5 海里 · semantic · z12 + +- changed ratio: `0.84722` +- changed pixels: `309066` / `364800` +- mean abs rgb: `[32.2724, 33.2816, 50.6811]` +- compare url: `http://192.168.200.184/newpec/navsea-compare-full-audit.html?variant=semantic&audit=1¢er=129.9697%2C33.4425&zoom=12` +- left image: `/root/sourceserver/pbf/report/full_aoi_visual_audit_2026-04-18_r2_subset/karatsu_5nm_semantic_z12/compare_left.png` +- right image: `/root/sourceserver/pbf/report/full_aoi_visual_audit_2026-04-18_r2_subset/karatsu_5nm_semantic_z12/compare_right.png` +- diff image: `/root/sourceserver/pbf/report/full_aoi_visual_audit_2026-04-18_r2_subset/karatsu_5nm_semantic_z12/compare_diff.png` + diff --git a/report/full_aoi_visual_audit_2026-04-18_r2_subset/karatsu_5nm_full_z12/compare_diff.png b/report/full_aoi_visual_audit_2026-04-18_r2_subset/karatsu_5nm_full_z12/compare_diff.png new file mode 100644 index 0000000..740bf26 Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r2_subset/karatsu_5nm_full_z12/compare_diff.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r2_subset/karatsu_5nm_full_z12/compare_full.png b/report/full_aoi_visual_audit_2026-04-18_r2_subset/karatsu_5nm_full_z12/compare_full.png new file mode 100644 index 0000000..4109098 Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r2_subset/karatsu_5nm_full_z12/compare_full.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r2_subset/karatsu_5nm_full_z12/compare_left.png b/report/full_aoi_visual_audit_2026-04-18_r2_subset/karatsu_5nm_full_z12/compare_left.png new file mode 100644 index 0000000..f3df6a0 Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r2_subset/karatsu_5nm_full_z12/compare_left.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r2_subset/karatsu_5nm_full_z12/compare_right.png b/report/full_aoi_visual_audit_2026-04-18_r2_subset/karatsu_5nm_full_z12/compare_right.png new file mode 100644 index 0000000..6aa2838 Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r2_subset/karatsu_5nm_full_z12/compare_right.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r2_subset/karatsu_5nm_semantic_z12/compare_diff.png b/report/full_aoi_visual_audit_2026-04-18_r2_subset/karatsu_5nm_semantic_z12/compare_diff.png new file mode 100644 index 0000000..72f5af9 Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r2_subset/karatsu_5nm_semantic_z12/compare_diff.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r2_subset/karatsu_5nm_semantic_z12/compare_full.png b/report/full_aoi_visual_audit_2026-04-18_r2_subset/karatsu_5nm_semantic_z12/compare_full.png new file mode 100644 index 0000000..0219425 Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r2_subset/karatsu_5nm_semantic_z12/compare_full.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r2_subset/karatsu_5nm_semantic_z12/compare_left.png b/report/full_aoi_visual_audit_2026-04-18_r2_subset/karatsu_5nm_semantic_z12/compare_left.png new file mode 100644 index 0000000..a402eff Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r2_subset/karatsu_5nm_semantic_z12/compare_left.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r2_subset/karatsu_5nm_semantic_z12/compare_right.png b/report/full_aoi_visual_audit_2026-04-18_r2_subset/karatsu_5nm_semantic_z12/compare_right.png new file mode 100644 index 0000000..9fa4e20 Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r2_subset/karatsu_5nm_semantic_z12/compare_right.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r2_subset/okinawa_10nm_full_z12/compare_diff.png b/report/full_aoi_visual_audit_2026-04-18_r2_subset/okinawa_10nm_full_z12/compare_diff.png new file mode 100644 index 0000000..1846548 Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r2_subset/okinawa_10nm_full_z12/compare_diff.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r2_subset/okinawa_10nm_full_z12/compare_full.png b/report/full_aoi_visual_audit_2026-04-18_r2_subset/okinawa_10nm_full_z12/compare_full.png new file mode 100644 index 0000000..b534f36 Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r2_subset/okinawa_10nm_full_z12/compare_full.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r2_subset/okinawa_10nm_full_z12/compare_left.png b/report/full_aoi_visual_audit_2026-04-18_r2_subset/okinawa_10nm_full_z12/compare_left.png new file mode 100644 index 0000000..95f1b99 Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r2_subset/okinawa_10nm_full_z12/compare_left.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r2_subset/okinawa_10nm_full_z12/compare_right.png b/report/full_aoi_visual_audit_2026-04-18_r2_subset/okinawa_10nm_full_z12/compare_right.png new file mode 100644 index 0000000..ae260e4 Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r2_subset/okinawa_10nm_full_z12/compare_right.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r2_subset/okinawa_10nm_semantic_z12/compare_diff.png b/report/full_aoi_visual_audit_2026-04-18_r2_subset/okinawa_10nm_semantic_z12/compare_diff.png new file mode 100644 index 0000000..6e7c90d Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r2_subset/okinawa_10nm_semantic_z12/compare_diff.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r2_subset/okinawa_10nm_semantic_z12/compare_full.png b/report/full_aoi_visual_audit_2026-04-18_r2_subset/okinawa_10nm_semantic_z12/compare_full.png new file mode 100644 index 0000000..65274da Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r2_subset/okinawa_10nm_semantic_z12/compare_full.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r2_subset/okinawa_10nm_semantic_z12/compare_left.png b/report/full_aoi_visual_audit_2026-04-18_r2_subset/okinawa_10nm_semantic_z12/compare_left.png new file mode 100644 index 0000000..85b5409 Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r2_subset/okinawa_10nm_semantic_z12/compare_left.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r2_subset/okinawa_10nm_semantic_z12/compare_right.png b/report/full_aoi_visual_audit_2026-04-18_r2_subset/okinawa_10nm_semantic_z12/compare_right.png new file mode 100644 index 0000000..443b84f Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r2_subset/okinawa_10nm_semantic_z12/compare_right.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r3_after_hotspotfix/hakata_10nm_full_z10/compare_diff.png b/report/full_aoi_visual_audit_2026-04-18_r3_after_hotspotfix/hakata_10nm_full_z10/compare_diff.png new file mode 100644 index 0000000..2fac78a Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r3_after_hotspotfix/hakata_10nm_full_z10/compare_diff.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r3_after_hotspotfix/hakata_10nm_full_z10/compare_full.png b/report/full_aoi_visual_audit_2026-04-18_r3_after_hotspotfix/hakata_10nm_full_z10/compare_full.png new file mode 100644 index 0000000..4c7927c Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r3_after_hotspotfix/hakata_10nm_full_z10/compare_full.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r3_after_hotspotfix/hakata_10nm_full_z10/compare_left.png b/report/full_aoi_visual_audit_2026-04-18_r3_after_hotspotfix/hakata_10nm_full_z10/compare_left.png new file mode 100644 index 0000000..466517c Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r3_after_hotspotfix/hakata_10nm_full_z10/compare_left.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r3_after_hotspotfix/hakata_10nm_full_z10/compare_right.png b/report/full_aoi_visual_audit_2026-04-18_r3_after_hotspotfix/hakata_10nm_full_z10/compare_right.png new file mode 100644 index 0000000..369f990 Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r3_after_hotspotfix/hakata_10nm_full_z10/compare_right.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r3_after_hotspotfix/hakata_10nm_full_z12/compare_diff.png b/report/full_aoi_visual_audit_2026-04-18_r3_after_hotspotfix/hakata_10nm_full_z12/compare_diff.png new file mode 100644 index 0000000..255729d Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r3_after_hotspotfix/hakata_10nm_full_z12/compare_diff.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r3_after_hotspotfix/hakata_10nm_full_z12/compare_full.png b/report/full_aoi_visual_audit_2026-04-18_r3_after_hotspotfix/hakata_10nm_full_z12/compare_full.png new file mode 100644 index 0000000..288ce7a Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r3_after_hotspotfix/hakata_10nm_full_z12/compare_full.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r3_after_hotspotfix/hakata_10nm_full_z12/compare_left.png b/report/full_aoi_visual_audit_2026-04-18_r3_after_hotspotfix/hakata_10nm_full_z12/compare_left.png new file mode 100644 index 0000000..a7be227 Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r3_after_hotspotfix/hakata_10nm_full_z12/compare_left.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r3_after_hotspotfix/hakata_10nm_full_z12/compare_right.png b/report/full_aoi_visual_audit_2026-04-18_r3_after_hotspotfix/hakata_10nm_full_z12/compare_right.png new file mode 100644 index 0000000..83aacea Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r3_after_hotspotfix/hakata_10nm_full_z12/compare_right.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r3_after_hotspotfix/osaka_bay_10nm_full_z10/compare_diff.png b/report/full_aoi_visual_audit_2026-04-18_r3_after_hotspotfix/osaka_bay_10nm_full_z10/compare_diff.png new file mode 100644 index 0000000..3433219 Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r3_after_hotspotfix/osaka_bay_10nm_full_z10/compare_diff.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r3_after_hotspotfix/osaka_bay_10nm_full_z10/compare_full.png b/report/full_aoi_visual_audit_2026-04-18_r3_after_hotspotfix/osaka_bay_10nm_full_z10/compare_full.png new file mode 100644 index 0000000..2fc9972 Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r3_after_hotspotfix/osaka_bay_10nm_full_z10/compare_full.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r3_after_hotspotfix/osaka_bay_10nm_full_z10/compare_left.png b/report/full_aoi_visual_audit_2026-04-18_r3_after_hotspotfix/osaka_bay_10nm_full_z10/compare_left.png new file mode 100644 index 0000000..5e48964 Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r3_after_hotspotfix/osaka_bay_10nm_full_z10/compare_left.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r3_after_hotspotfix/osaka_bay_10nm_full_z10/compare_right.png b/report/full_aoi_visual_audit_2026-04-18_r3_after_hotspotfix/osaka_bay_10nm_full_z10/compare_right.png new file mode 100644 index 0000000..768f4e1 Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r3_after_hotspotfix/osaka_bay_10nm_full_z10/compare_right.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r3_after_hotspotfix/tokyo_bay_10nm_full_z10/compare_diff.png b/report/full_aoi_visual_audit_2026-04-18_r3_after_hotspotfix/tokyo_bay_10nm_full_z10/compare_diff.png new file mode 100644 index 0000000..2b758db Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r3_after_hotspotfix/tokyo_bay_10nm_full_z10/compare_diff.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r3_after_hotspotfix/tokyo_bay_10nm_full_z10/compare_full.png b/report/full_aoi_visual_audit_2026-04-18_r3_after_hotspotfix/tokyo_bay_10nm_full_z10/compare_full.png new file mode 100644 index 0000000..27e0dad Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r3_after_hotspotfix/tokyo_bay_10nm_full_z10/compare_full.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r3_after_hotspotfix/tokyo_bay_10nm_full_z10/compare_left.png b/report/full_aoi_visual_audit_2026-04-18_r3_after_hotspotfix/tokyo_bay_10nm_full_z10/compare_left.png new file mode 100644 index 0000000..a10973f Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r3_after_hotspotfix/tokyo_bay_10nm_full_z10/compare_left.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r3_after_hotspotfix/tokyo_bay_10nm_full_z10/compare_right.png b/report/full_aoi_visual_audit_2026-04-18_r3_after_hotspotfix/tokyo_bay_10nm_full_z10/compare_right.png new file mode 100644 index 0000000..4a8fcec Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r3_after_hotspotfix/tokyo_bay_10nm_full_z10/compare_right.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r3_after_hotspotfix/tokyo_bay_10nm_full_z12/compare_diff.png b/report/full_aoi_visual_audit_2026-04-18_r3_after_hotspotfix/tokyo_bay_10nm_full_z12/compare_diff.png new file mode 100644 index 0000000..54b6a2a Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r3_after_hotspotfix/tokyo_bay_10nm_full_z12/compare_diff.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r3_after_hotspotfix/tokyo_bay_10nm_full_z12/compare_full.png b/report/full_aoi_visual_audit_2026-04-18_r3_after_hotspotfix/tokyo_bay_10nm_full_z12/compare_full.png new file mode 100644 index 0000000..7478073 Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r3_after_hotspotfix/tokyo_bay_10nm_full_z12/compare_full.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r3_after_hotspotfix/tokyo_bay_10nm_full_z12/compare_left.png b/report/full_aoi_visual_audit_2026-04-18_r3_after_hotspotfix/tokyo_bay_10nm_full_z12/compare_left.png new file mode 100644 index 0000000..1cc66d0 Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r3_after_hotspotfix/tokyo_bay_10nm_full_z12/compare_left.png differ diff --git a/report/full_aoi_visual_audit_2026-04-18_r3_after_hotspotfix/tokyo_bay_10nm_full_z12/compare_right.png b/report/full_aoi_visual_audit_2026-04-18_r3_after_hotspotfix/tokyo_bay_10nm_full_z12/compare_right.png new file mode 100644 index 0000000..68d6058 Binary files /dev/null and b/report/full_aoi_visual_audit_2026-04-18_r3_after_hotspotfix/tokyo_bay_10nm_full_z12/compare_right.png differ diff --git a/report/full_rebuild_final_aoi_visual_2026-04-18/full_aoi_visual_audit.json b/report/full_rebuild_final_aoi_visual_2026-04-18/full_aoi_visual_audit.json new file mode 100644 index 0000000..a8d66e1 --- /dev/null +++ b/report/full_rebuild_final_aoi_visual_2026-04-18/full_aoi_visual_audit.json @@ -0,0 +1,345 @@ +{ + "compare_url": "http://192.168.200.184/newpec/navsea-compare-full-audit.html?deliveryTileUrl=http%3A%2F%2F192.168.200.184%2Fpbf-delivery-full-20260418-rebuild%2F%7Bz%7D%2F%7Bx%7D%2F%7By%7D.pbf", + "cases": [ + { + "id": "okinawa_10nm_full_z12", + "label": "冲绳 10 海里", + "variant": "full", + "zoom": 12, + "center": [ + 127.67, + 26.21 + ], + "radius_nm": 10, + "compare_url": "http://192.168.200.184/newpec/navsea-compare-full-audit.html?deliveryTileUrl=http%3A%2F%2F192.168.200.184%2Fpbf-delivery-full-20260418-rebuild%2F%7Bz%7D%2F%7Bx%7D%2F%7By%7D.pbf&variant=full&audit=1¢er=127.67%2C26.21&zoom=12", + "changed_pixels": 287023, + "total_pixels": 364800, + "changed_ratio": 0.786796, + "mean_abs_rgb": [ + 35.1585, + 37.5397, + 57.2935 + ], + "rms_rgb": [ + 57.9845, + 59.3178, + 80.8839 + ], + "diff_bbox": [ + 0, + 0, + 640, + 513 + ], + "left_image": "/root/sourceserver/pbf/report/full_rebuild_final_aoi_visual_2026-04-18/okinawa_10nm_full_z12/compare_left.png", + "right_image": "/root/sourceserver/pbf/report/full_rebuild_final_aoi_visual_2026-04-18/okinawa_10nm_full_z12/compare_right.png", + "diff_image": "/root/sourceserver/pbf/report/full_rebuild_final_aoi_visual_2026-04-18/okinawa_10nm_full_z12/compare_diff.png" + }, + { + "id": "karatsu_5nm_full_z12", + "label": "唐津 5 海里", + "variant": "full", + "zoom": 12, + "center": [ + 129.9697, + 33.4425 + ], + "radius_nm": 5, + "compare_url": "http://192.168.200.184/newpec/navsea-compare-full-audit.html?deliveryTileUrl=http%3A%2F%2F192.168.200.184%2Fpbf-delivery-full-20260418-rebuild%2F%7Bz%7D%2F%7Bx%7D%2F%7By%7D.pbf&variant=full&audit=1¢er=129.9697%2C33.4425&zoom=12", + "changed_pixels": 276549, + "total_pixels": 364800, + "changed_ratio": 0.758084, + "mean_abs_rgb": [ + 28.6382, + 29.7417, + 58.0898 + ], + "rms_rgb": [ + 48.1874, + 47.0516, + 75.807 + ], + "diff_bbox": [ + 0, + 0, + 640, + 513 + ], + "left_image": "/root/sourceserver/pbf/report/full_rebuild_final_aoi_visual_2026-04-18/karatsu_5nm_full_z12/compare_left.png", + "right_image": "/root/sourceserver/pbf/report/full_rebuild_final_aoi_visual_2026-04-18/karatsu_5nm_full_z12/compare_right.png", + "diff_image": "/root/sourceserver/pbf/report/full_rebuild_final_aoi_visual_2026-04-18/karatsu_5nm_full_z12/compare_diff.png" + }, + { + "id": "karatsu_5nm_full_z10", + "label": "唐津 5 海里", + "variant": "full", + "zoom": 10, + "center": [ + 129.9697, + 33.4425 + ], + "radius_nm": 5, + "compare_url": "http://192.168.200.184/newpec/navsea-compare-full-audit.html?deliveryTileUrl=http%3A%2F%2F192.168.200.184%2Fpbf-delivery-full-20260418-rebuild%2F%7Bz%7D%2F%7Bx%7D%2F%7By%7D.pbf&variant=full&audit=1¢er=129.9697%2C33.4425&zoom=10", + "changed_pixels": 266607, + "total_pixels": 364800, + "changed_ratio": 0.730831, + "mean_abs_rgb": [ + 25.273, + 24.6223, + 50.8473 + ], + "rms_rgb": [ + 43.6073, + 39.8917, + 68.7701 + ], + "diff_bbox": [ + 0, + 0, + 640, + 513 + ], + "left_image": "/root/sourceserver/pbf/report/full_rebuild_final_aoi_visual_2026-04-18/karatsu_5nm_full_z10/compare_left.png", + "right_image": "/root/sourceserver/pbf/report/full_rebuild_final_aoi_visual_2026-04-18/karatsu_5nm_full_z10/compare_right.png", + "diff_image": "/root/sourceserver/pbf/report/full_rebuild_final_aoi_visual_2026-04-18/karatsu_5nm_full_z10/compare_diff.png" + }, + { + "id": "hakata_10nm_full_z10", + "label": "博多港中心 10 海里", + "variant": "full", + "zoom": 10, + "center": [ + 130.335, + 33.6385 + ], + "radius_nm": 10, + "compare_url": "http://192.168.200.184/newpec/navsea-compare-full-audit.html?deliveryTileUrl=http%3A%2F%2F192.168.200.184%2Fpbf-delivery-full-20260418-rebuild%2F%7Bz%7D%2F%7Bx%7D%2F%7By%7D.pbf&variant=full&audit=1¢er=130.335%2C33.6385&zoom=10", + "changed_pixels": 231925, + "total_pixels": 364800, + "changed_ratio": 0.635759, + "mean_abs_rgb": [ + 22.5559, + 21.9295, + 43.7789 + ], + "rms_rgb": [ + 43.1121, + 39.1691, + 64.4358 + ], + "diff_bbox": [ + 0, + 0, + 640, + 513 + ], + "left_image": "/root/sourceserver/pbf/report/full_rebuild_final_aoi_visual_2026-04-18/hakata_10nm_full_z10/compare_left.png", + "right_image": "/root/sourceserver/pbf/report/full_rebuild_final_aoi_visual_2026-04-18/hakata_10nm_full_z10/compare_right.png", + "diff_image": "/root/sourceserver/pbf/report/full_rebuild_final_aoi_visual_2026-04-18/hakata_10nm_full_z10/compare_diff.png" + }, + { + "id": "tokyo_bay_10nm_full_z10", + "label": "东京湾 10 海里", + "variant": "full", + "zoom": 10, + "center": [ + 139.85, + 35.42 + ], + "radius_nm": 10, + "compare_url": "http://192.168.200.184/newpec/navsea-compare-full-audit.html?deliveryTileUrl=http%3A%2F%2F192.168.200.184%2Fpbf-delivery-full-20260418-rebuild%2F%7Bz%7D%2F%7Bx%7D%2F%7By%7D.pbf&variant=full&audit=1¢er=139.85%2C35.42&zoom=10", + "changed_pixels": 207463, + "total_pixels": 364800, + "changed_ratio": 0.568703, + "mean_abs_rgb": [ + 21.4607, + 21.7907, + 37.6344 + ], + "rms_rgb": [ + 43.8212, + 42.3602, + 60.7507 + ], + "diff_bbox": [ + 0, + 0, + 640, + 513 + ], + "left_image": "/root/sourceserver/pbf/report/full_rebuild_final_aoi_visual_2026-04-18/tokyo_bay_10nm_full_z10/compare_left.png", + "right_image": "/root/sourceserver/pbf/report/full_rebuild_final_aoi_visual_2026-04-18/tokyo_bay_10nm_full_z10/compare_right.png", + "diff_image": "/root/sourceserver/pbf/report/full_rebuild_final_aoi_visual_2026-04-18/tokyo_bay_10nm_full_z10/compare_diff.png" + }, + { + "id": "hakata_10nm_full_z12", + "label": "博多港中心 10 海里", + "variant": "full", + "zoom": 12, + "center": [ + 130.335, + 33.6385 + ], + "radius_nm": 10, + "compare_url": "http://192.168.200.184/newpec/navsea-compare-full-audit.html?deliveryTileUrl=http%3A%2F%2F192.168.200.184%2Fpbf-delivery-full-20260418-rebuild%2F%7Bz%7D%2F%7Bx%7D%2F%7By%7D.pbf&variant=full&audit=1¢er=130.335%2C33.6385&zoom=12", + "changed_pixels": 193524, + "total_pixels": 364800, + "changed_ratio": 0.530493, + "mean_abs_rgb": [ + 20.6559, + 21.4811, + 26.4453 + ], + "rms_rgb": [ + 45.2133, + 45.546, + 50.3232 + ], + "diff_bbox": [ + 0, + 0, + 640, + 513 + ], + "left_image": "/root/sourceserver/pbf/report/full_rebuild_final_aoi_visual_2026-04-18/hakata_10nm_full_z12/compare_left.png", + "right_image": "/root/sourceserver/pbf/report/full_rebuild_final_aoi_visual_2026-04-18/hakata_10nm_full_z12/compare_right.png", + "diff_image": "/root/sourceserver/pbf/report/full_rebuild_final_aoi_visual_2026-04-18/hakata_10nm_full_z12/compare_diff.png" + }, + { + "id": "osaka_bay_10nm_full_z10", + "label": "大阪 10 海里", + "variant": "full", + "zoom": 10, + "center": [ + 135.35, + 34.61 + ], + "radius_nm": 10, + "compare_url": "http://192.168.200.184/newpec/navsea-compare-full-audit.html?deliveryTileUrl=http%3A%2F%2F192.168.200.184%2Fpbf-delivery-full-20260418-rebuild%2F%7Bz%7D%2F%7Bx%7D%2F%7By%7D.pbf&variant=full&audit=1¢er=135.35%2C34.61&zoom=10", + "changed_pixels": 193286, + "total_pixels": 364800, + "changed_ratio": 0.529841, + "mean_abs_rgb": [ + 21.0117, + 20.5875, + 35.3247 + ], + "rms_rgb": [ + 44.302, + 41.2291, + 58.6249 + ], + "diff_bbox": [ + 0, + 0, + 640, + 513 + ], + "left_image": "/root/sourceserver/pbf/report/full_rebuild_final_aoi_visual_2026-04-18/osaka_bay_10nm_full_z10/compare_left.png", + "right_image": "/root/sourceserver/pbf/report/full_rebuild_final_aoi_visual_2026-04-18/osaka_bay_10nm_full_z10/compare_right.png", + "diff_image": "/root/sourceserver/pbf/report/full_rebuild_final_aoi_visual_2026-04-18/osaka_bay_10nm_full_z10/compare_diff.png" + }, + { + "id": "okinawa_10nm_full_z10", + "label": "冲绳 10 海里", + "variant": "full", + "zoom": 10, + "center": [ + 127.67, + 26.21 + ], + "radius_nm": 10, + "compare_url": "http://192.168.200.184/newpec/navsea-compare-full-audit.html?deliveryTileUrl=http%3A%2F%2F192.168.200.184%2Fpbf-delivery-full-20260418-rebuild%2F%7Bz%7D%2F%7Bx%7D%2F%7By%7D.pbf&variant=full&audit=1¢er=127.67%2C26.21&zoom=10", + "changed_pixels": 191231, + "total_pixels": 364800, + "changed_ratio": 0.524208, + "mean_abs_rgb": [ + 19.777, + 18.707, + 25.9519 + ], + "rms_rgb": [ + 43.2785, + 39.7909, + 51.1304 + ], + "diff_bbox": [ + 0, + 0, + 640, + 513 + ], + "left_image": "/root/sourceserver/pbf/report/full_rebuild_final_aoi_visual_2026-04-18/okinawa_10nm_full_z10/compare_left.png", + "right_image": "/root/sourceserver/pbf/report/full_rebuild_final_aoi_visual_2026-04-18/okinawa_10nm_full_z10/compare_right.png", + "diff_image": "/root/sourceserver/pbf/report/full_rebuild_final_aoi_visual_2026-04-18/okinawa_10nm_full_z10/compare_diff.png" + }, + { + "id": "tokyo_bay_10nm_full_z12", + "label": "东京湾 10 海里", + "variant": "full", + "zoom": 12, + "center": [ + 139.85, + 35.42 + ], + "radius_nm": 10, + "compare_url": "http://192.168.200.184/newpec/navsea-compare-full-audit.html?deliveryTileUrl=http%3A%2F%2F192.168.200.184%2Fpbf-delivery-full-20260418-rebuild%2F%7Bz%7D%2F%7Bx%7D%2F%7By%7D.pbf&variant=full&audit=1¢er=139.85%2C35.42&zoom=12", + "changed_pixels": 143603, + "total_pixels": 364800, + "changed_ratio": 0.393649, + "mean_abs_rgb": [ + 12.666, + 15.7185, + 13.8524 + ], + "rms_rgb": [ + 38.073, + 40.5294, + 36.2432 + ], + "diff_bbox": [ + 0, + 0, + 640, + 513 + ], + "left_image": "/root/sourceserver/pbf/report/full_rebuild_final_aoi_visual_2026-04-18/tokyo_bay_10nm_full_z12/compare_left.png", + "right_image": "/root/sourceserver/pbf/report/full_rebuild_final_aoi_visual_2026-04-18/tokyo_bay_10nm_full_z12/compare_right.png", + "diff_image": "/root/sourceserver/pbf/report/full_rebuild_final_aoi_visual_2026-04-18/tokyo_bay_10nm_full_z12/compare_diff.png" + }, + { + "id": "osaka_bay_10nm_full_z12", + "label": "大阪 10 海里", + "variant": "full", + "zoom": 12, + "center": [ + 135.35, + 34.61 + ], + "radius_nm": 10, + "compare_url": "http://192.168.200.184/newpec/navsea-compare-full-audit.html?deliveryTileUrl=http%3A%2F%2F192.168.200.184%2Fpbf-delivery-full-20260418-rebuild%2F%7Bz%7D%2F%7Bx%7D%2F%7By%7D.pbf&variant=full&audit=1¢er=135.35%2C34.61&zoom=12", + "changed_pixels": 113506, + "total_pixels": 364800, + "changed_ratio": 0.311146, + "mean_abs_rgb": [ + 13.0452, + 13.3281, + 14.289 + ], + "rms_rgb": [ + 39.5806, + 38.5987, + 39.5741 + ], + "diff_bbox": [ + 0, + 0, + 640, + 513 + ], + "left_image": "/root/sourceserver/pbf/report/full_rebuild_final_aoi_visual_2026-04-18/osaka_bay_10nm_full_z12/compare_left.png", + "right_image": "/root/sourceserver/pbf/report/full_rebuild_final_aoi_visual_2026-04-18/osaka_bay_10nm_full_z12/compare_right.png", + "diff_image": "/root/sourceserver/pbf/report/full_rebuild_final_aoi_visual_2026-04-18/osaka_bay_10nm_full_z12/compare_diff.png" + } + ] +} diff --git a/report/full_rebuild_final_aoi_visual_2026-04-18/full_aoi_visual_audit.md b/report/full_rebuild_final_aoi_visual_2026-04-18/full_aoi_visual_audit.md new file mode 100644 index 0000000..823aeb0 --- /dev/null +++ b/report/full_rebuild_final_aoi_visual_2026-04-18/full_aoi_visual_audit.md @@ -0,0 +1,109 @@ +# 全国 AOI 截图对比审计 + +## 总览 + +- compare page: `http://192.168.200.184/newpec/navsea-compare-full-audit.html?deliveryTileUrl=http%3A%2F%2F192.168.200.184%2Fpbf-delivery-full-20260418-rebuild%2F%7Bz%7D%2F%7Bx%7D%2F%7By%7D.pbf` +- cases: `10` + +## 差异排序 + +### 冲绳 10 海里 · full · z12 + +- changed ratio: `0.786796` +- changed pixels: `287023` / `364800` +- mean abs rgb: `[35.1585, 37.5397, 57.2935]` +- compare url: `http://192.168.200.184/newpec/navsea-compare-full-audit.html?deliveryTileUrl=http%3A%2F%2F192.168.200.184%2Fpbf-delivery-full-20260418-rebuild%2F%7Bz%7D%2F%7Bx%7D%2F%7By%7D.pbf&variant=full&audit=1¢er=127.67%2C26.21&zoom=12` +- left image: `/root/sourceserver/pbf/report/full_rebuild_final_aoi_visual_2026-04-18/okinawa_10nm_full_z12/compare_left.png` +- right image: `/root/sourceserver/pbf/report/full_rebuild_final_aoi_visual_2026-04-18/okinawa_10nm_full_z12/compare_right.png` +- diff image: `/root/sourceserver/pbf/report/full_rebuild_final_aoi_visual_2026-04-18/okinawa_10nm_full_z12/compare_diff.png` + +### 唐津 5 海里 · full · z12 + +- changed ratio: `0.758084` +- changed pixels: `276549` / `364800` +- mean abs rgb: `[28.6382, 29.7417, 58.0898]` +- compare url: `http://192.168.200.184/newpec/navsea-compare-full-audit.html?deliveryTileUrl=http%3A%2F%2F192.168.200.184%2Fpbf-delivery-full-20260418-rebuild%2F%7Bz%7D%2F%7Bx%7D%2F%7By%7D.pbf&variant=full&audit=1¢er=129.9697%2C33.4425&zoom=12` +- left image: `/root/sourceserver/pbf/report/full_rebuild_final_aoi_visual_2026-04-18/karatsu_5nm_full_z12/compare_left.png` +- right image: `/root/sourceserver/pbf/report/full_rebuild_final_aoi_visual_2026-04-18/karatsu_5nm_full_z12/compare_right.png` +- diff image: `/root/sourceserver/pbf/report/full_rebuild_final_aoi_visual_2026-04-18/karatsu_5nm_full_z12/compare_diff.png` + +### 唐津 5 海里 · full · z10 + +- changed ratio: `0.730831` +- changed pixels: `266607` / `364800` +- mean abs rgb: `[25.273, 24.6223, 50.8473]` +- compare url: `http://192.168.200.184/newpec/navsea-compare-full-audit.html?deliveryTileUrl=http%3A%2F%2F192.168.200.184%2Fpbf-delivery-full-20260418-rebuild%2F%7Bz%7D%2F%7Bx%7D%2F%7By%7D.pbf&variant=full&audit=1¢er=129.9697%2C33.4425&zoom=10` +- left image: `/root/sourceserver/pbf/report/full_rebuild_final_aoi_visual_2026-04-18/karatsu_5nm_full_z10/compare_left.png` +- right image: `/root/sourceserver/pbf/report/full_rebuild_final_aoi_visual_2026-04-18/karatsu_5nm_full_z10/compare_right.png` +- diff image: `/root/sourceserver/pbf/report/full_rebuild_final_aoi_visual_2026-04-18/karatsu_5nm_full_z10/compare_diff.png` + +### 博多港中心 10 海里 · full · z10 + +- changed ratio: `0.635759` +- changed pixels: `231925` / `364800` +- mean abs rgb: `[22.5559, 21.9295, 43.7789]` +- compare url: `http://192.168.200.184/newpec/navsea-compare-full-audit.html?deliveryTileUrl=http%3A%2F%2F192.168.200.184%2Fpbf-delivery-full-20260418-rebuild%2F%7Bz%7D%2F%7Bx%7D%2F%7By%7D.pbf&variant=full&audit=1¢er=130.335%2C33.6385&zoom=10` +- left image: `/root/sourceserver/pbf/report/full_rebuild_final_aoi_visual_2026-04-18/hakata_10nm_full_z10/compare_left.png` +- right image: `/root/sourceserver/pbf/report/full_rebuild_final_aoi_visual_2026-04-18/hakata_10nm_full_z10/compare_right.png` +- diff image: `/root/sourceserver/pbf/report/full_rebuild_final_aoi_visual_2026-04-18/hakata_10nm_full_z10/compare_diff.png` + +### 东京湾 10 海里 · full · z10 + +- changed ratio: `0.568703` +- changed pixels: `207463` / `364800` +- mean abs rgb: `[21.4607, 21.7907, 37.6344]` +- compare url: `http://192.168.200.184/newpec/navsea-compare-full-audit.html?deliveryTileUrl=http%3A%2F%2F192.168.200.184%2Fpbf-delivery-full-20260418-rebuild%2F%7Bz%7D%2F%7Bx%7D%2F%7By%7D.pbf&variant=full&audit=1¢er=139.85%2C35.42&zoom=10` +- left image: `/root/sourceserver/pbf/report/full_rebuild_final_aoi_visual_2026-04-18/tokyo_bay_10nm_full_z10/compare_left.png` +- right image: `/root/sourceserver/pbf/report/full_rebuild_final_aoi_visual_2026-04-18/tokyo_bay_10nm_full_z10/compare_right.png` +- diff image: `/root/sourceserver/pbf/report/full_rebuild_final_aoi_visual_2026-04-18/tokyo_bay_10nm_full_z10/compare_diff.png` + +### 博多港中心 10 海里 · full · z12 + +- changed ratio: `0.530493` +- changed pixels: `193524` / `364800` +- mean abs rgb: `[20.6559, 21.4811, 26.4453]` +- compare url: `http://192.168.200.184/newpec/navsea-compare-full-audit.html?deliveryTileUrl=http%3A%2F%2F192.168.200.184%2Fpbf-delivery-full-20260418-rebuild%2F%7Bz%7D%2F%7Bx%7D%2F%7By%7D.pbf&variant=full&audit=1¢er=130.335%2C33.6385&zoom=12` +- left image: `/root/sourceserver/pbf/report/full_rebuild_final_aoi_visual_2026-04-18/hakata_10nm_full_z12/compare_left.png` +- right image: `/root/sourceserver/pbf/report/full_rebuild_final_aoi_visual_2026-04-18/hakata_10nm_full_z12/compare_right.png` +- diff image: `/root/sourceserver/pbf/report/full_rebuild_final_aoi_visual_2026-04-18/hakata_10nm_full_z12/compare_diff.png` + +### 大阪 10 海里 · full · z10 + +- changed ratio: `0.529841` +- changed pixels: `193286` / `364800` +- mean abs rgb: `[21.0117, 20.5875, 35.3247]` +- compare url: `http://192.168.200.184/newpec/navsea-compare-full-audit.html?deliveryTileUrl=http%3A%2F%2F192.168.200.184%2Fpbf-delivery-full-20260418-rebuild%2F%7Bz%7D%2F%7Bx%7D%2F%7By%7D.pbf&variant=full&audit=1¢er=135.35%2C34.61&zoom=10` +- left image: `/root/sourceserver/pbf/report/full_rebuild_final_aoi_visual_2026-04-18/osaka_bay_10nm_full_z10/compare_left.png` +- right image: `/root/sourceserver/pbf/report/full_rebuild_final_aoi_visual_2026-04-18/osaka_bay_10nm_full_z10/compare_right.png` +- diff image: `/root/sourceserver/pbf/report/full_rebuild_final_aoi_visual_2026-04-18/osaka_bay_10nm_full_z10/compare_diff.png` + +### 冲绳 10 海里 · full · z10 + +- changed ratio: `0.524208` +- changed pixels: `191231` / `364800` +- mean abs rgb: `[19.777, 18.707, 25.9519]` +- compare url: `http://192.168.200.184/newpec/navsea-compare-full-audit.html?deliveryTileUrl=http%3A%2F%2F192.168.200.184%2Fpbf-delivery-full-20260418-rebuild%2F%7Bz%7D%2F%7Bx%7D%2F%7By%7D.pbf&variant=full&audit=1¢er=127.67%2C26.21&zoom=10` +- left image: `/root/sourceserver/pbf/report/full_rebuild_final_aoi_visual_2026-04-18/okinawa_10nm_full_z10/compare_left.png` +- right image: `/root/sourceserver/pbf/report/full_rebuild_final_aoi_visual_2026-04-18/okinawa_10nm_full_z10/compare_right.png` +- diff image: `/root/sourceserver/pbf/report/full_rebuild_final_aoi_visual_2026-04-18/okinawa_10nm_full_z10/compare_diff.png` + +### 东京湾 10 海里 · full · z12 + +- changed ratio: `0.393649` +- changed pixels: `143603` / `364800` +- mean abs rgb: `[12.666, 15.7185, 13.8524]` +- compare url: `http://192.168.200.184/newpec/navsea-compare-full-audit.html?deliveryTileUrl=http%3A%2F%2F192.168.200.184%2Fpbf-delivery-full-20260418-rebuild%2F%7Bz%7D%2F%7Bx%7D%2F%7By%7D.pbf&variant=full&audit=1¢er=139.85%2C35.42&zoom=12` +- left image: `/root/sourceserver/pbf/report/full_rebuild_final_aoi_visual_2026-04-18/tokyo_bay_10nm_full_z12/compare_left.png` +- right image: `/root/sourceserver/pbf/report/full_rebuild_final_aoi_visual_2026-04-18/tokyo_bay_10nm_full_z12/compare_right.png` +- diff image: `/root/sourceserver/pbf/report/full_rebuild_final_aoi_visual_2026-04-18/tokyo_bay_10nm_full_z12/compare_diff.png` + +### 大阪 10 海里 · full · z12 + +- changed ratio: `0.311146` +- changed pixels: `113506` / `364800` +- mean abs rgb: `[13.0452, 13.3281, 14.289]` +- compare url: `http://192.168.200.184/newpec/navsea-compare-full-audit.html?deliveryTileUrl=http%3A%2F%2F192.168.200.184%2Fpbf-delivery-full-20260418-rebuild%2F%7Bz%7D%2F%7Bx%7D%2F%7By%7D.pbf&variant=full&audit=1¢er=135.35%2C34.61&zoom=12` +- left image: `/root/sourceserver/pbf/report/full_rebuild_final_aoi_visual_2026-04-18/osaka_bay_10nm_full_z12/compare_left.png` +- right image: `/root/sourceserver/pbf/report/full_rebuild_final_aoi_visual_2026-04-18/osaka_bay_10nm_full_z12/compare_right.png` +- diff image: `/root/sourceserver/pbf/report/full_rebuild_final_aoi_visual_2026-04-18/osaka_bay_10nm_full_z12/compare_diff.png` + diff --git a/report/full_rebuild_final_aoi_visual_2026-04-18/hakata_10nm_full_z10/compare_diff.png b/report/full_rebuild_final_aoi_visual_2026-04-18/hakata_10nm_full_z10/compare_diff.png new file mode 100644 index 0000000..e61766f Binary files /dev/null and b/report/full_rebuild_final_aoi_visual_2026-04-18/hakata_10nm_full_z10/compare_diff.png differ diff --git a/report/full_rebuild_final_aoi_visual_2026-04-18/hakata_10nm_full_z10/compare_full.png b/report/full_rebuild_final_aoi_visual_2026-04-18/hakata_10nm_full_z10/compare_full.png new file mode 100644 index 0000000..57037d9 Binary files /dev/null and b/report/full_rebuild_final_aoi_visual_2026-04-18/hakata_10nm_full_z10/compare_full.png differ diff --git a/report/full_rebuild_final_aoi_visual_2026-04-18/hakata_10nm_full_z10/compare_left.png b/report/full_rebuild_final_aoi_visual_2026-04-18/hakata_10nm_full_z10/compare_left.png new file mode 100644 index 0000000..c0dd7a5 Binary files /dev/null and b/report/full_rebuild_final_aoi_visual_2026-04-18/hakata_10nm_full_z10/compare_left.png differ diff --git a/report/full_rebuild_final_aoi_visual_2026-04-18/hakata_10nm_full_z10/compare_right.png b/report/full_rebuild_final_aoi_visual_2026-04-18/hakata_10nm_full_z10/compare_right.png new file mode 100644 index 0000000..ab7b007 Binary files /dev/null and b/report/full_rebuild_final_aoi_visual_2026-04-18/hakata_10nm_full_z10/compare_right.png differ diff --git a/report/full_rebuild_final_aoi_visual_2026-04-18/hakata_10nm_full_z12/compare_diff.png b/report/full_rebuild_final_aoi_visual_2026-04-18/hakata_10nm_full_z12/compare_diff.png new file mode 100644 index 0000000..86a6d4b Binary files /dev/null and b/report/full_rebuild_final_aoi_visual_2026-04-18/hakata_10nm_full_z12/compare_diff.png differ diff --git a/report/full_rebuild_final_aoi_visual_2026-04-18/hakata_10nm_full_z12/compare_full.png b/report/full_rebuild_final_aoi_visual_2026-04-18/hakata_10nm_full_z12/compare_full.png new file mode 100644 index 0000000..4da2216 Binary files /dev/null and b/report/full_rebuild_final_aoi_visual_2026-04-18/hakata_10nm_full_z12/compare_full.png differ diff --git a/report/full_rebuild_final_aoi_visual_2026-04-18/hakata_10nm_full_z12/compare_left.png b/report/full_rebuild_final_aoi_visual_2026-04-18/hakata_10nm_full_z12/compare_left.png new file mode 100644 index 0000000..a615a4e Binary files /dev/null and b/report/full_rebuild_final_aoi_visual_2026-04-18/hakata_10nm_full_z12/compare_left.png differ diff --git a/report/full_rebuild_final_aoi_visual_2026-04-18/hakata_10nm_full_z12/compare_right.png b/report/full_rebuild_final_aoi_visual_2026-04-18/hakata_10nm_full_z12/compare_right.png new file mode 100644 index 0000000..e854379 Binary files /dev/null and b/report/full_rebuild_final_aoi_visual_2026-04-18/hakata_10nm_full_z12/compare_right.png differ diff --git a/report/full_rebuild_final_aoi_visual_2026-04-18/karatsu_5nm_full_z10/compare_diff.png b/report/full_rebuild_final_aoi_visual_2026-04-18/karatsu_5nm_full_z10/compare_diff.png new file mode 100644 index 0000000..d8599d8 Binary files /dev/null and b/report/full_rebuild_final_aoi_visual_2026-04-18/karatsu_5nm_full_z10/compare_diff.png differ diff --git a/report/full_rebuild_final_aoi_visual_2026-04-18/karatsu_5nm_full_z10/compare_full.png b/report/full_rebuild_final_aoi_visual_2026-04-18/karatsu_5nm_full_z10/compare_full.png new file mode 100644 index 0000000..641754d Binary files /dev/null and b/report/full_rebuild_final_aoi_visual_2026-04-18/karatsu_5nm_full_z10/compare_full.png differ diff --git a/report/full_rebuild_final_aoi_visual_2026-04-18/karatsu_5nm_full_z10/compare_left.png b/report/full_rebuild_final_aoi_visual_2026-04-18/karatsu_5nm_full_z10/compare_left.png new file mode 100644 index 0000000..2b8777a Binary files /dev/null and b/report/full_rebuild_final_aoi_visual_2026-04-18/karatsu_5nm_full_z10/compare_left.png differ diff --git a/report/full_rebuild_final_aoi_visual_2026-04-18/karatsu_5nm_full_z10/compare_right.png b/report/full_rebuild_final_aoi_visual_2026-04-18/karatsu_5nm_full_z10/compare_right.png new file mode 100644 index 0000000..0a9a49d Binary files /dev/null and b/report/full_rebuild_final_aoi_visual_2026-04-18/karatsu_5nm_full_z10/compare_right.png differ diff --git a/report/full_rebuild_final_aoi_visual_2026-04-18/karatsu_5nm_full_z12/compare_diff.png b/report/full_rebuild_final_aoi_visual_2026-04-18/karatsu_5nm_full_z12/compare_diff.png new file mode 100644 index 0000000..850dcac Binary files /dev/null and b/report/full_rebuild_final_aoi_visual_2026-04-18/karatsu_5nm_full_z12/compare_diff.png differ diff --git a/report/full_rebuild_final_aoi_visual_2026-04-18/karatsu_5nm_full_z12/compare_full.png b/report/full_rebuild_final_aoi_visual_2026-04-18/karatsu_5nm_full_z12/compare_full.png new file mode 100644 index 0000000..43f4f12 Binary files /dev/null and b/report/full_rebuild_final_aoi_visual_2026-04-18/karatsu_5nm_full_z12/compare_full.png differ diff --git a/report/full_rebuild_final_aoi_visual_2026-04-18/karatsu_5nm_full_z12/compare_left.png b/report/full_rebuild_final_aoi_visual_2026-04-18/karatsu_5nm_full_z12/compare_left.png new file mode 100644 index 0000000..fc5c60f Binary files /dev/null and b/report/full_rebuild_final_aoi_visual_2026-04-18/karatsu_5nm_full_z12/compare_left.png differ diff --git a/report/full_rebuild_final_aoi_visual_2026-04-18/karatsu_5nm_full_z12/compare_right.png b/report/full_rebuild_final_aoi_visual_2026-04-18/karatsu_5nm_full_z12/compare_right.png new file mode 100644 index 0000000..968d5af Binary files /dev/null and b/report/full_rebuild_final_aoi_visual_2026-04-18/karatsu_5nm_full_z12/compare_right.png differ diff --git a/report/full_rebuild_final_aoi_visual_2026-04-18/okinawa_10nm_full_z10/compare_diff.png b/report/full_rebuild_final_aoi_visual_2026-04-18/okinawa_10nm_full_z10/compare_diff.png new file mode 100644 index 0000000..5c03435 Binary files /dev/null and b/report/full_rebuild_final_aoi_visual_2026-04-18/okinawa_10nm_full_z10/compare_diff.png differ diff --git a/report/full_rebuild_final_aoi_visual_2026-04-18/okinawa_10nm_full_z10/compare_full.png b/report/full_rebuild_final_aoi_visual_2026-04-18/okinawa_10nm_full_z10/compare_full.png new file mode 100644 index 0000000..f818fe2 Binary files /dev/null and b/report/full_rebuild_final_aoi_visual_2026-04-18/okinawa_10nm_full_z10/compare_full.png differ diff --git a/report/full_rebuild_final_aoi_visual_2026-04-18/okinawa_10nm_full_z10/compare_left.png b/report/full_rebuild_final_aoi_visual_2026-04-18/okinawa_10nm_full_z10/compare_left.png new file mode 100644 index 0000000..1f7a167 Binary files /dev/null and b/report/full_rebuild_final_aoi_visual_2026-04-18/okinawa_10nm_full_z10/compare_left.png differ diff --git a/report/full_rebuild_final_aoi_visual_2026-04-18/okinawa_10nm_full_z10/compare_right.png b/report/full_rebuild_final_aoi_visual_2026-04-18/okinawa_10nm_full_z10/compare_right.png new file mode 100644 index 0000000..9996e71 Binary files /dev/null and b/report/full_rebuild_final_aoi_visual_2026-04-18/okinawa_10nm_full_z10/compare_right.png differ diff --git a/report/full_rebuild_final_aoi_visual_2026-04-18/okinawa_10nm_full_z12/compare_diff.png b/report/full_rebuild_final_aoi_visual_2026-04-18/okinawa_10nm_full_z12/compare_diff.png new file mode 100644 index 0000000..56b5bc7 Binary files /dev/null and b/report/full_rebuild_final_aoi_visual_2026-04-18/okinawa_10nm_full_z12/compare_diff.png differ diff --git a/report/full_rebuild_final_aoi_visual_2026-04-18/okinawa_10nm_full_z12/compare_full.png b/report/full_rebuild_final_aoi_visual_2026-04-18/okinawa_10nm_full_z12/compare_full.png new file mode 100644 index 0000000..8b063e8 Binary files /dev/null and b/report/full_rebuild_final_aoi_visual_2026-04-18/okinawa_10nm_full_z12/compare_full.png differ diff --git a/report/full_rebuild_final_aoi_visual_2026-04-18/okinawa_10nm_full_z12/compare_left.png b/report/full_rebuild_final_aoi_visual_2026-04-18/okinawa_10nm_full_z12/compare_left.png new file mode 100644 index 0000000..9c087f7 Binary files /dev/null and b/report/full_rebuild_final_aoi_visual_2026-04-18/okinawa_10nm_full_z12/compare_left.png differ diff --git a/report/full_rebuild_final_aoi_visual_2026-04-18/okinawa_10nm_full_z12/compare_right.png b/report/full_rebuild_final_aoi_visual_2026-04-18/okinawa_10nm_full_z12/compare_right.png new file mode 100644 index 0000000..6b3221d Binary files /dev/null and b/report/full_rebuild_final_aoi_visual_2026-04-18/okinawa_10nm_full_z12/compare_right.png differ diff --git a/report/full_rebuild_final_aoi_visual_2026-04-18/osaka_bay_10nm_full_z10/compare_diff.png b/report/full_rebuild_final_aoi_visual_2026-04-18/osaka_bay_10nm_full_z10/compare_diff.png new file mode 100644 index 0000000..624c214 Binary files /dev/null and b/report/full_rebuild_final_aoi_visual_2026-04-18/osaka_bay_10nm_full_z10/compare_diff.png differ diff --git a/report/full_rebuild_final_aoi_visual_2026-04-18/osaka_bay_10nm_full_z10/compare_full.png b/report/full_rebuild_final_aoi_visual_2026-04-18/osaka_bay_10nm_full_z10/compare_full.png new file mode 100644 index 0000000..784008d Binary files /dev/null and b/report/full_rebuild_final_aoi_visual_2026-04-18/osaka_bay_10nm_full_z10/compare_full.png differ diff --git a/report/full_rebuild_final_aoi_visual_2026-04-18/osaka_bay_10nm_full_z10/compare_left.png b/report/full_rebuild_final_aoi_visual_2026-04-18/osaka_bay_10nm_full_z10/compare_left.png new file mode 100644 index 0000000..d415ca1 Binary files /dev/null and b/report/full_rebuild_final_aoi_visual_2026-04-18/osaka_bay_10nm_full_z10/compare_left.png differ diff --git a/report/full_rebuild_final_aoi_visual_2026-04-18/osaka_bay_10nm_full_z10/compare_right.png b/report/full_rebuild_final_aoi_visual_2026-04-18/osaka_bay_10nm_full_z10/compare_right.png new file mode 100644 index 0000000..2402034 Binary files /dev/null and b/report/full_rebuild_final_aoi_visual_2026-04-18/osaka_bay_10nm_full_z10/compare_right.png differ diff --git a/report/full_rebuild_final_aoi_visual_2026-04-18/osaka_bay_10nm_full_z12/compare_diff.png b/report/full_rebuild_final_aoi_visual_2026-04-18/osaka_bay_10nm_full_z12/compare_diff.png new file mode 100644 index 0000000..c1edd7e Binary files /dev/null and b/report/full_rebuild_final_aoi_visual_2026-04-18/osaka_bay_10nm_full_z12/compare_diff.png differ diff --git a/report/full_rebuild_final_aoi_visual_2026-04-18/osaka_bay_10nm_full_z12/compare_full.png b/report/full_rebuild_final_aoi_visual_2026-04-18/osaka_bay_10nm_full_z12/compare_full.png new file mode 100644 index 0000000..82ca4ec Binary files /dev/null and b/report/full_rebuild_final_aoi_visual_2026-04-18/osaka_bay_10nm_full_z12/compare_full.png differ diff --git a/report/full_rebuild_final_aoi_visual_2026-04-18/osaka_bay_10nm_full_z12/compare_left.png b/report/full_rebuild_final_aoi_visual_2026-04-18/osaka_bay_10nm_full_z12/compare_left.png new file mode 100644 index 0000000..4f4d152 Binary files /dev/null and b/report/full_rebuild_final_aoi_visual_2026-04-18/osaka_bay_10nm_full_z12/compare_left.png differ diff --git a/report/full_rebuild_final_aoi_visual_2026-04-18/osaka_bay_10nm_full_z12/compare_right.png b/report/full_rebuild_final_aoi_visual_2026-04-18/osaka_bay_10nm_full_z12/compare_right.png new file mode 100644 index 0000000..5314743 Binary files /dev/null and b/report/full_rebuild_final_aoi_visual_2026-04-18/osaka_bay_10nm_full_z12/compare_right.png differ diff --git a/report/full_rebuild_final_aoi_visual_2026-04-18/tokyo_bay_10nm_full_z10/compare_diff.png b/report/full_rebuild_final_aoi_visual_2026-04-18/tokyo_bay_10nm_full_z10/compare_diff.png new file mode 100644 index 0000000..f42fef5 Binary files /dev/null and b/report/full_rebuild_final_aoi_visual_2026-04-18/tokyo_bay_10nm_full_z10/compare_diff.png differ diff --git a/report/full_rebuild_final_aoi_visual_2026-04-18/tokyo_bay_10nm_full_z10/compare_full.png b/report/full_rebuild_final_aoi_visual_2026-04-18/tokyo_bay_10nm_full_z10/compare_full.png new file mode 100644 index 0000000..c783020 Binary files /dev/null and b/report/full_rebuild_final_aoi_visual_2026-04-18/tokyo_bay_10nm_full_z10/compare_full.png differ diff --git a/report/full_rebuild_final_aoi_visual_2026-04-18/tokyo_bay_10nm_full_z10/compare_left.png b/report/full_rebuild_final_aoi_visual_2026-04-18/tokyo_bay_10nm_full_z10/compare_left.png new file mode 100644 index 0000000..0979712 Binary files /dev/null and b/report/full_rebuild_final_aoi_visual_2026-04-18/tokyo_bay_10nm_full_z10/compare_left.png differ diff --git a/report/full_rebuild_final_aoi_visual_2026-04-18/tokyo_bay_10nm_full_z10/compare_right.png b/report/full_rebuild_final_aoi_visual_2026-04-18/tokyo_bay_10nm_full_z10/compare_right.png new file mode 100644 index 0000000..10aa182 Binary files /dev/null and b/report/full_rebuild_final_aoi_visual_2026-04-18/tokyo_bay_10nm_full_z10/compare_right.png differ diff --git a/report/full_rebuild_final_aoi_visual_2026-04-18/tokyo_bay_10nm_full_z12/compare_diff.png b/report/full_rebuild_final_aoi_visual_2026-04-18/tokyo_bay_10nm_full_z12/compare_diff.png new file mode 100644 index 0000000..1947fce Binary files /dev/null and b/report/full_rebuild_final_aoi_visual_2026-04-18/tokyo_bay_10nm_full_z12/compare_diff.png differ diff --git a/report/full_rebuild_final_aoi_visual_2026-04-18/tokyo_bay_10nm_full_z12/compare_full.png b/report/full_rebuild_final_aoi_visual_2026-04-18/tokyo_bay_10nm_full_z12/compare_full.png new file mode 100644 index 0000000..d876f16 Binary files /dev/null and b/report/full_rebuild_final_aoi_visual_2026-04-18/tokyo_bay_10nm_full_z12/compare_full.png differ diff --git a/report/full_rebuild_final_aoi_visual_2026-04-18/tokyo_bay_10nm_full_z12/compare_left.png b/report/full_rebuild_final_aoi_visual_2026-04-18/tokyo_bay_10nm_full_z12/compare_left.png new file mode 100644 index 0000000..0f222ec Binary files /dev/null and b/report/full_rebuild_final_aoi_visual_2026-04-18/tokyo_bay_10nm_full_z12/compare_left.png differ diff --git a/report/full_rebuild_final_aoi_visual_2026-04-18/tokyo_bay_10nm_full_z12/compare_right.png b/report/full_rebuild_final_aoi_visual_2026-04-18/tokyo_bay_10nm_full_z12/compare_right.png new file mode 100644 index 0000000..f1780e0 Binary files /dev/null and b/report/full_rebuild_final_aoi_visual_2026-04-18/tokyo_bay_10nm_full_z12/compare_right.png differ diff --git a/report/full_rebuild_final_geometry_2026-04-18/geometry_native_audit.json b/report/full_rebuild_final_geometry_2026-04-18/geometry_native_audit.json new file mode 100644 index 0000000..622fb8c --- /dev/null +++ b/report/full_rebuild_final_geometry_2026-04-18/geometry_native_audit.json @@ -0,0 +1,522 @@ +{ + "label": "full-rebuild-final-20260418", + "target_root": "/home/wwwroot/pbf-delivery-full-20260418-rebuild", + "source_root": "/home/wwwroot/newpec/exported_auto/tile.mapple-on.jp__newpec-mvt-20260106__z___x___y_.pbf/tiles", + "tile_count": 48556, + "outside_extent_tiles": 48556, + "source_extent_mismatch_tiles": 0, + "fixable_from_source_tiles": 0, + "repaired_tiles": 0, + "zoom_summary": { + "12": { + "tile_count": 48556, + "outside_extent_tiles": 48556, + "source_extent_mismatch_tiles": 0, + "extent_counts": { + "1048576": 48556 + } + } + }, + "sample_tiles": [ + { + "tile": "12/3436/1715.pbf", + "extent_values": [ + 1048576 + ], + "source_extent": 1048576, + "outside_extent": true, + "max_overflow": 20480, + "fixable_from_source": false + }, + { + "tile": "12/3436/1716.pbf", + "extent_values": [ + 1048576 + ], + "source_extent": 1048576, + "outside_extent": true, + "max_overflow": 20480, + "fixable_from_source": false + }, + { + "tile": "12/3436/1717.pbf", + "extent_values": [ + 1048576 + ], + "source_extent": 1048576, + "outside_extent": true, + "max_overflow": 20480, + "fixable_from_source": false + }, + { + "tile": "12/3436/1718.pbf", + "extent_values": [ + 1048576 + ], + "source_extent": 1048576, + "outside_extent": true, + "max_overflow": 20480, + "fixable_from_source": false + }, + { + "tile": "12/3436/1719.pbf", + "extent_values": [ + 1048576 + ], + "source_extent": 1048576, + "outside_extent": true, + "max_overflow": 20480, + "fixable_from_source": false + }, + { + "tile": "12/3436/1720.pbf", + "extent_values": [ + 1048576 + ], + "source_extent": 1048576, + "outside_extent": true, + "max_overflow": 20480, + "fixable_from_source": false + }, + { + "tile": "12/3436/1721.pbf", + "extent_values": [ + 1048576 + ], + "source_extent": 1048576, + "outside_extent": true, + "max_overflow": 20480, + "fixable_from_source": false + }, + { + "tile": "12/3436/1722.pbf", + "extent_values": [ + 1048576 + ], + "source_extent": 1048576, + "outside_extent": true, + "max_overflow": 20480, + "fixable_from_source": false + }, + { + "tile": "12/3436/1723.pbf", + "extent_values": [ + 1048576 + ], + "source_extent": 1048576, + "outside_extent": true, + "max_overflow": 20480, + "fixable_from_source": false + }, + { + "tile": "12/3436/1724.pbf", + "extent_values": [ + 1048576 + ], + "source_extent": 1048576, + "outside_extent": true, + "max_overflow": 20480, + "fixable_from_source": false + }, + { + "tile": "12/3436/1725.pbf", + "extent_values": [ + 1048576 + ], + "source_extent": 1048576, + "outside_extent": true, + "max_overflow": 20480, + "fixable_from_source": false + }, + { + "tile": "12/3436/1726.pbf", + "extent_values": [ + 1048576 + ], + "source_extent": 1048576, + "outside_extent": true, + "max_overflow": 20480, + "fixable_from_source": false + }, + { + "tile": "12/3436/1727.pbf", + "extent_values": [ + 1048576 + ], + "source_extent": 1048576, + "outside_extent": true, + "max_overflow": 20480, + "fixable_from_source": false + }, + { + "tile": "12/3436/1728.pbf", + "extent_values": [ + 1048576 + ], + "source_extent": 1048576, + "outside_extent": true, + "max_overflow": 20480, + "fixable_from_source": false + }, + { + "tile": "12/3436/1729.pbf", + "extent_values": [ + 1048576 + ], + "source_extent": 1048576, + "outside_extent": true, + "max_overflow": 20480, + "fixable_from_source": false + }, + { + "tile": "12/3436/1730.pbf", + "extent_values": [ + 1048576 + ], + "source_extent": 1048576, + "outside_extent": true, + "max_overflow": 20480, + "fixable_from_source": false + }, + { + "tile": "12/3436/1731.pbf", + "extent_values": [ + 1048576 + ], + "source_extent": 1048576, + "outside_extent": true, + "max_overflow": 20480, + "fixable_from_source": false + }, + { + "tile": "12/3436/1732.pbf", + "extent_values": [ + 1048576 + ], + "source_extent": 1048576, + "outside_extent": true, + "max_overflow": 20480, + "fixable_from_source": false + }, + { + "tile": "12/3436/1733.pbf", + "extent_values": [ + 1048576 + ], + "source_extent": 1048576, + "outside_extent": true, + "max_overflow": 20480, + "fixable_from_source": false + }, + { + "tile": "12/3436/1734.pbf", + "extent_values": [ + 1048576 + ], + "source_extent": 1048576, + "outside_extent": true, + "max_overflow": 20480, + "fixable_from_source": false + }, + { + "tile": "12/3436/1735.pbf", + "extent_values": [ + 1048576 + ], + "source_extent": 1048576, + "outside_extent": true, + "max_overflow": 20480, + "fixable_from_source": false + }, + { + "tile": "12/3436/1736.pbf", + "extent_values": [ + 1048576 + ], + "source_extent": 1048576, + "outside_extent": true, + "max_overflow": 20480, + "fixable_from_source": false + }, + { + "tile": "12/3436/1737.pbf", + "extent_values": [ + 1048576 + ], + "source_extent": 1048576, + "outside_extent": true, + "max_overflow": 20480, + "fixable_from_source": false + }, + { + "tile": "12/3436/1738.pbf", + "extent_values": [ + 1048576 + ], + "source_extent": 1048576, + "outside_extent": true, + "max_overflow": 20480, + "fixable_from_source": false + }, + { + "tile": "12/3436/1739.pbf", + "extent_values": [ + 1048576 + ], + "source_extent": 1048576, + "outside_extent": true, + "max_overflow": 20480, + "fixable_from_source": false + }, + { + "tile": "12/3436/1740.pbf", + "extent_values": [ + 1048576 + ], + "source_extent": 1048576, + "outside_extent": true, + "max_overflow": 20480, + "fixable_from_source": false + }, + { + "tile": "12/3436/1741.pbf", + "extent_values": [ + 1048576 + ], + "source_extent": 1048576, + "outside_extent": true, + "max_overflow": 20480, + "fixable_from_source": false + }, + { + "tile": "12/3436/1742.pbf", + "extent_values": [ + 1048576 + ], + "source_extent": 1048576, + "outside_extent": true, + "max_overflow": 20480, + "fixable_from_source": false + }, + { + "tile": "12/3436/1743.pbf", + "extent_values": [ + 1048576 + ], + "source_extent": 1048576, + "outside_extent": true, + "max_overflow": 20480, + "fixable_from_source": false + }, + { + "tile": "12/3436/1744.pbf", + "extent_values": [ + 1048576 + ], + "source_extent": 1048576, + "outside_extent": true, + "max_overflow": 20480, + "fixable_from_source": false + }, + { + "tile": "12/3436/1745.pbf", + "extent_values": [ + 1048576 + ], + "source_extent": 1048576, + "outside_extent": true, + "max_overflow": 20480, + "fixable_from_source": false + }, + { + "tile": "12/3436/1746.pbf", + "extent_values": [ + 1048576 + ], + "source_extent": 1048576, + "outside_extent": true, + "max_overflow": 20480, + "fixable_from_source": false + }, + { + "tile": "12/3436/1747.pbf", + "extent_values": [ + 1048576 + ], + "source_extent": 1048576, + "outside_extent": true, + "max_overflow": 20480, + "fixable_from_source": false + }, + { + "tile": "12/3436/1748.pbf", + "extent_values": [ + 1048576 + ], + "source_extent": 1048576, + "outside_extent": true, + "max_overflow": 20480, + "fixable_from_source": false + }, + { + "tile": "12/3436/1749.pbf", + "extent_values": [ + 1048576 + ], + "source_extent": 1048576, + "outside_extent": true, + "max_overflow": 20480, + "fixable_from_source": false + }, + { + "tile": "12/3436/1750.pbf", + "extent_values": [ + 1048576 + ], + "source_extent": 1048576, + "outside_extent": true, + "max_overflow": 20480, + "fixable_from_source": false + }, + { + "tile": "12/3436/1751.pbf", + "extent_values": [ + 1048576 + ], + "source_extent": 1048576, + "outside_extent": true, + "max_overflow": 20480, + "fixable_from_source": false + }, + { + "tile": "12/3436/1752.pbf", + "extent_values": [ + 1048576 + ], + "source_extent": 1048576, + "outside_extent": true, + "max_overflow": 20480, + "fixable_from_source": false + }, + { + "tile": "12/3436/1753.pbf", + "extent_values": [ + 1048576 + ], + "source_extent": 1048576, + "outside_extent": true, + "max_overflow": 20480, + "fixable_from_source": false + }, + { + "tile": "12/3436/1754.pbf", + "extent_values": [ + 1048576 + ], + "source_extent": 1048576, + "outside_extent": true, + "max_overflow": 20480, + "fixable_from_source": false + }, + { + "tile": "12/3436/1755.pbf", + "extent_values": [ + 1048576 + ], + "source_extent": 1048576, + "outside_extent": true, + "max_overflow": 20480, + "fixable_from_source": false + }, + { + "tile": "12/3436/1756.pbf", + "extent_values": [ + 1048576 + ], + "source_extent": 1048576, + "outside_extent": true, + "max_overflow": 20480, + "fixable_from_source": false + }, + { + "tile": "12/3436/1757.pbf", + "extent_values": [ + 1048576 + ], + "source_extent": 1048576, + "outside_extent": true, + "max_overflow": 20480, + "fixable_from_source": false + }, + { + "tile": "12/3436/1758.pbf", + "extent_values": [ + 1048576 + ], + "source_extent": 1048576, + "outside_extent": true, + "max_overflow": 20480, + "fixable_from_source": false + }, + { + "tile": "12/3436/1759.pbf", + "extent_values": [ + 1048576 + ], + "source_extent": 1048576, + "outside_extent": true, + "max_overflow": 20480, + "fixable_from_source": false + }, + { + "tile": "12/3436/1760.pbf", + "extent_values": [ + 1048576 + ], + "source_extent": 1048576, + "outside_extent": true, + "max_overflow": 20480, + "fixable_from_source": false + }, + { + "tile": "12/3436/1761.pbf", + "extent_values": [ + 1048576 + ], + "source_extent": 1048576, + "outside_extent": true, + "max_overflow": 20480, + "fixable_from_source": false + }, + { + "tile": "12/3436/1762.pbf", + "extent_values": [ + 1048576 + ], + "source_extent": 1048576, + "outside_extent": true, + "max_overflow": 20480, + "fixable_from_source": false + }, + { + "tile": "12/3436/1763.pbf", + "extent_values": [ + 1048576 + ], + "source_extent": 1048576, + "outside_extent": true, + "max_overflow": 20480, + "fixable_from_source": false + }, + { + "tile": "12/3436/1764.pbf", + "extent_values": [ + 1048576 + ], + "source_extent": 1048576, + "outside_extent": true, + "max_overflow": 20480, + "fixable_from_source": false + } + ] +} diff --git a/report/full_rebuild_final_geometry_2026-04-18/geometry_native_audit.md b/report/full_rebuild_final_geometry_2026-04-18/geometry_native_audit.md new file mode 100644 index 0000000..c2bd57b --- /dev/null +++ b/report/full_rebuild_final_geometry_2026-04-18/geometry_native_audit.md @@ -0,0 +1,426 @@ +# full-rebuild-final-20260418 几何 / Extent / Native 风险审计 + +## 范围 + +- target root: `/home/wwwroot/pbf-delivery-full-20260418-rebuild` +- source root: `/home/wwwroot/newpec/exported_auto/tile.mapple-on.jp__newpec-mvt-20260106__z___x___y_.pbf/tiles` +- tiles: `48556` +- repaired tiles: `0` + +## 总体结论 + +- 坐标超当前 extent 的瓦片数:`48556` +- 与源瓦片 extent 不一致的瓦片数:`0` +- 可直接按源 extent 修复的瓦片数:`0` + +## Zoom 汇总 + +### z12 + +- tiles: `48556` +- outside extent: `48556` +- source mismatch: `0` +- extent counts: `{1048576: 48556}` + +## 代表问题样本 + +### `12/3436/1715.pbf` + +- extent values: `[1048576]` +- source extent: `1048576` +- outside extent: `True` +- max overflow: `20480` +- fixable from source: `False` + +### `12/3436/1716.pbf` + +- extent values: `[1048576]` +- source extent: `1048576` +- outside extent: `True` +- max overflow: `20480` +- fixable from source: `False` + +### `12/3436/1717.pbf` + +- extent values: `[1048576]` +- source extent: `1048576` +- outside extent: `True` +- max overflow: `20480` +- fixable from source: `False` + +### `12/3436/1718.pbf` + +- extent values: `[1048576]` +- source extent: `1048576` +- outside extent: `True` +- max overflow: `20480` +- fixable from source: `False` + +### `12/3436/1719.pbf` + +- extent values: `[1048576]` +- source extent: `1048576` +- outside extent: `True` +- max overflow: `20480` +- fixable from source: `False` + +### `12/3436/1720.pbf` + +- extent values: `[1048576]` +- source extent: `1048576` +- outside extent: `True` +- max overflow: `20480` +- fixable from source: `False` + +### `12/3436/1721.pbf` + +- extent values: `[1048576]` +- source extent: `1048576` +- outside extent: `True` +- max overflow: `20480` +- fixable from source: `False` + +### `12/3436/1722.pbf` + +- extent values: `[1048576]` +- source extent: `1048576` +- outside extent: `True` +- max overflow: `20480` +- fixable from source: `False` + +### `12/3436/1723.pbf` + +- extent values: `[1048576]` +- source extent: `1048576` +- outside extent: `True` +- max overflow: `20480` +- fixable from source: `False` + +### `12/3436/1724.pbf` + +- extent values: `[1048576]` +- source extent: `1048576` +- outside extent: `True` +- max overflow: `20480` +- fixable from source: `False` + +### `12/3436/1725.pbf` + +- extent values: `[1048576]` +- source extent: `1048576` +- outside extent: `True` +- max overflow: `20480` +- fixable from source: `False` + +### `12/3436/1726.pbf` + +- extent values: `[1048576]` +- source extent: `1048576` +- outside extent: `True` +- max overflow: `20480` +- fixable from source: `False` + +### `12/3436/1727.pbf` + +- extent values: `[1048576]` +- source extent: `1048576` +- outside extent: `True` +- max overflow: `20480` +- fixable from source: `False` + +### `12/3436/1728.pbf` + +- extent values: `[1048576]` +- source extent: `1048576` +- outside extent: `True` +- max overflow: `20480` +- fixable from source: `False` + +### `12/3436/1729.pbf` + +- extent values: `[1048576]` +- source extent: `1048576` +- outside extent: `True` +- max overflow: `20480` +- fixable from source: `False` + +### `12/3436/1730.pbf` + +- extent values: `[1048576]` +- source extent: `1048576` +- outside extent: `True` +- max overflow: `20480` +- fixable from source: `False` + +### `12/3436/1731.pbf` + +- extent values: `[1048576]` +- source extent: `1048576` +- outside extent: `True` +- max overflow: `20480` +- fixable from source: `False` + +### `12/3436/1732.pbf` + +- extent values: `[1048576]` +- source extent: `1048576` +- outside extent: `True` +- max overflow: `20480` +- fixable from source: `False` + +### `12/3436/1733.pbf` + +- extent values: `[1048576]` +- source extent: `1048576` +- outside extent: `True` +- max overflow: `20480` +- fixable from source: `False` + +### `12/3436/1734.pbf` + +- extent values: `[1048576]` +- source extent: `1048576` +- outside extent: `True` +- max overflow: `20480` +- fixable from source: `False` + +### `12/3436/1735.pbf` + +- extent values: `[1048576]` +- source extent: `1048576` +- outside extent: `True` +- max overflow: `20480` +- fixable from source: `False` + +### `12/3436/1736.pbf` + +- extent values: `[1048576]` +- source extent: `1048576` +- outside extent: `True` +- max overflow: `20480` +- fixable from source: `False` + +### `12/3436/1737.pbf` + +- extent values: `[1048576]` +- source extent: `1048576` +- outside extent: `True` +- max overflow: `20480` +- fixable from source: `False` + +### `12/3436/1738.pbf` + +- extent values: `[1048576]` +- source extent: `1048576` +- outside extent: `True` +- max overflow: `20480` +- fixable from source: `False` + +### `12/3436/1739.pbf` + +- extent values: `[1048576]` +- source extent: `1048576` +- outside extent: `True` +- max overflow: `20480` +- fixable from source: `False` + +### `12/3436/1740.pbf` + +- extent values: `[1048576]` +- source extent: `1048576` +- outside extent: `True` +- max overflow: `20480` +- fixable from source: `False` + +### `12/3436/1741.pbf` + +- extent values: `[1048576]` +- source extent: `1048576` +- outside extent: `True` +- max overflow: `20480` +- fixable from source: `False` + +### `12/3436/1742.pbf` + +- extent values: `[1048576]` +- source extent: `1048576` +- outside extent: `True` +- max overflow: `20480` +- fixable from source: `False` + +### `12/3436/1743.pbf` + +- extent values: `[1048576]` +- source extent: `1048576` +- outside extent: `True` +- max overflow: `20480` +- fixable from source: `False` + +### `12/3436/1744.pbf` + +- extent values: `[1048576]` +- source extent: `1048576` +- outside extent: `True` +- max overflow: `20480` +- fixable from source: `False` + +### `12/3436/1745.pbf` + +- extent values: `[1048576]` +- source extent: `1048576` +- outside extent: `True` +- max overflow: `20480` +- fixable from source: `False` + +### `12/3436/1746.pbf` + +- extent values: `[1048576]` +- source extent: `1048576` +- outside extent: `True` +- max overflow: `20480` +- fixable from source: `False` + +### `12/3436/1747.pbf` + +- extent values: `[1048576]` +- source extent: `1048576` +- outside extent: `True` +- max overflow: `20480` +- fixable from source: `False` + +### `12/3436/1748.pbf` + +- extent values: `[1048576]` +- source extent: `1048576` +- outside extent: `True` +- max overflow: `20480` +- fixable from source: `False` + +### `12/3436/1749.pbf` + +- extent values: `[1048576]` +- source extent: `1048576` +- outside extent: `True` +- max overflow: `20480` +- fixable from source: `False` + +### `12/3436/1750.pbf` + +- extent values: `[1048576]` +- source extent: `1048576` +- outside extent: `True` +- max overflow: `20480` +- fixable from source: `False` + +### `12/3436/1751.pbf` + +- extent values: `[1048576]` +- source extent: `1048576` +- outside extent: `True` +- max overflow: `20480` +- fixable from source: `False` + +### `12/3436/1752.pbf` + +- extent values: `[1048576]` +- source extent: `1048576` +- outside extent: `True` +- max overflow: `20480` +- fixable from source: `False` + +### `12/3436/1753.pbf` + +- extent values: `[1048576]` +- source extent: `1048576` +- outside extent: `True` +- max overflow: `20480` +- fixable from source: `False` + +### `12/3436/1754.pbf` + +- extent values: `[1048576]` +- source extent: `1048576` +- outside extent: `True` +- max overflow: `20480` +- fixable from source: `False` + +### `12/3436/1755.pbf` + +- extent values: `[1048576]` +- source extent: `1048576` +- outside extent: `True` +- max overflow: `20480` +- fixable from source: `False` + +### `12/3436/1756.pbf` + +- extent values: `[1048576]` +- source extent: `1048576` +- outside extent: `True` +- max overflow: `20480` +- fixable from source: `False` + +### `12/3436/1757.pbf` + +- extent values: `[1048576]` +- source extent: `1048576` +- outside extent: `True` +- max overflow: `20480` +- fixable from source: `False` + +### `12/3436/1758.pbf` + +- extent values: `[1048576]` +- source extent: `1048576` +- outside extent: `True` +- max overflow: `20480` +- fixable from source: `False` + +### `12/3436/1759.pbf` + +- extent values: `[1048576]` +- source extent: `1048576` +- outside extent: `True` +- max overflow: `20480` +- fixable from source: `False` + +### `12/3436/1760.pbf` + +- extent values: `[1048576]` +- source extent: `1048576` +- outside extent: `True` +- max overflow: `20480` +- fixable from source: `False` + +### `12/3436/1761.pbf` + +- extent values: `[1048576]` +- source extent: `1048576` +- outside extent: `True` +- max overflow: `20480` +- fixable from source: `False` + +### `12/3436/1762.pbf` + +- extent values: `[1048576]` +- source extent: `1048576` +- outside extent: `True` +- max overflow: `20480` +- fixable from source: `False` + +### `12/3436/1763.pbf` + +- extent values: `[1048576]` +- source extent: `1048576` +- outside extent: `True` +- max overflow: `20480` +- fixable from source: `False` + +### `12/3436/1764.pbf` + +- extent values: `[1048576]` +- source extent: `1048576` +- outside extent: `True` +- max overflow: `20480` +- fixable from source: `False` + diff --git a/report/full_rebuild_staging_hakata_karatsu_z12_2026-04-18/hakata_10nm_full_z12/compare_diff.png b/report/full_rebuild_staging_hakata_karatsu_z12_2026-04-18/hakata_10nm_full_z12/compare_diff.png new file mode 100644 index 0000000..6cd32cf Binary files /dev/null and b/report/full_rebuild_staging_hakata_karatsu_z12_2026-04-18/hakata_10nm_full_z12/compare_diff.png differ diff --git a/report/full_rebuild_staging_hakata_karatsu_z12_2026-04-18/hakata_10nm_full_z12/compare_full.png b/report/full_rebuild_staging_hakata_karatsu_z12_2026-04-18/hakata_10nm_full_z12/compare_full.png new file mode 100644 index 0000000..3db5240 Binary files /dev/null and b/report/full_rebuild_staging_hakata_karatsu_z12_2026-04-18/hakata_10nm_full_z12/compare_full.png differ diff --git a/report/full_rebuild_staging_hakata_karatsu_z12_2026-04-18/hakata_10nm_full_z12/compare_left.png b/report/full_rebuild_staging_hakata_karatsu_z12_2026-04-18/hakata_10nm_full_z12/compare_left.png new file mode 100644 index 0000000..a615a4e Binary files /dev/null and b/report/full_rebuild_staging_hakata_karatsu_z12_2026-04-18/hakata_10nm_full_z12/compare_left.png differ diff --git a/report/full_rebuild_staging_hakata_karatsu_z12_2026-04-18/hakata_10nm_full_z12/compare_right.png b/report/full_rebuild_staging_hakata_karatsu_z12_2026-04-18/hakata_10nm_full_z12/compare_right.png new file mode 100644 index 0000000..a00c10d Binary files /dev/null and b/report/full_rebuild_staging_hakata_karatsu_z12_2026-04-18/hakata_10nm_full_z12/compare_right.png differ diff --git a/report/full_rebuild_staging_hakata_karatsu_z12_2026-04-18/karatsu_5nm_full_z12/compare_diff.png b/report/full_rebuild_staging_hakata_karatsu_z12_2026-04-18/karatsu_5nm_full_z12/compare_diff.png new file mode 100644 index 0000000..d3dcdb7 Binary files /dev/null and b/report/full_rebuild_staging_hakata_karatsu_z12_2026-04-18/karatsu_5nm_full_z12/compare_diff.png differ diff --git a/report/full_rebuild_staging_hakata_karatsu_z12_2026-04-18/karatsu_5nm_full_z12/compare_full.png b/report/full_rebuild_staging_hakata_karatsu_z12_2026-04-18/karatsu_5nm_full_z12/compare_full.png new file mode 100644 index 0000000..960a835 Binary files /dev/null and b/report/full_rebuild_staging_hakata_karatsu_z12_2026-04-18/karatsu_5nm_full_z12/compare_full.png differ diff --git a/report/full_rebuild_staging_hakata_karatsu_z12_2026-04-18/karatsu_5nm_full_z12/compare_left.png b/report/full_rebuild_staging_hakata_karatsu_z12_2026-04-18/karatsu_5nm_full_z12/compare_left.png new file mode 100644 index 0000000..fc5c60f Binary files /dev/null and b/report/full_rebuild_staging_hakata_karatsu_z12_2026-04-18/karatsu_5nm_full_z12/compare_left.png differ diff --git a/report/full_rebuild_staging_hakata_karatsu_z12_2026-04-18/karatsu_5nm_full_z12/compare_right.png b/report/full_rebuild_staging_hakata_karatsu_z12_2026-04-18/karatsu_5nm_full_z12/compare_right.png new file mode 100644 index 0000000..7156817 Binary files /dev/null and b/report/full_rebuild_staging_hakata_karatsu_z12_2026-04-18/karatsu_5nm_full_z12/compare_right.png differ diff --git a/report/full_rebuild_staging_okinawa_z12_2026-04-18/okinawa_10nm_full_z12/compare_diff.png b/report/full_rebuild_staging_okinawa_z12_2026-04-18/okinawa_10nm_full_z12/compare_diff.png new file mode 100644 index 0000000..6c644f0 Binary files /dev/null and b/report/full_rebuild_staging_okinawa_z12_2026-04-18/okinawa_10nm_full_z12/compare_diff.png differ diff --git a/report/full_rebuild_staging_okinawa_z12_2026-04-18/okinawa_10nm_full_z12/compare_full.png b/report/full_rebuild_staging_okinawa_z12_2026-04-18/okinawa_10nm_full_z12/compare_full.png new file mode 100644 index 0000000..5aa7672 Binary files /dev/null and b/report/full_rebuild_staging_okinawa_z12_2026-04-18/okinawa_10nm_full_z12/compare_full.png differ diff --git a/report/full_rebuild_staging_okinawa_z12_2026-04-18/okinawa_10nm_full_z12/compare_left.png b/report/full_rebuild_staging_okinawa_z12_2026-04-18/okinawa_10nm_full_z12/compare_left.png new file mode 100644 index 0000000..9c087f7 Binary files /dev/null and b/report/full_rebuild_staging_okinawa_z12_2026-04-18/okinawa_10nm_full_z12/compare_left.png differ diff --git a/report/full_rebuild_staging_okinawa_z12_2026-04-18/okinawa_10nm_full_z12/compare_right.png b/report/full_rebuild_staging_okinawa_z12_2026-04-18/okinawa_10nm_full_z12/compare_right.png new file mode 100644 index 0000000..d771d62 Binary files /dev/null and b/report/full_rebuild_staging_okinawa_z12_2026-04-18/okinawa_10nm_full_z12/compare_right.png differ diff --git a/report/full_rebuild_staging_okinawa_z12_r2_2026-04-18/okinawa_10nm_full_z12/compare_diff.png b/report/full_rebuild_staging_okinawa_z12_r2_2026-04-18/okinawa_10nm_full_z12/compare_diff.png new file mode 100644 index 0000000..6c644f0 Binary files /dev/null and b/report/full_rebuild_staging_okinawa_z12_r2_2026-04-18/okinawa_10nm_full_z12/compare_diff.png differ diff --git a/report/full_rebuild_staging_okinawa_z12_r2_2026-04-18/okinawa_10nm_full_z12/compare_full.png b/report/full_rebuild_staging_okinawa_z12_r2_2026-04-18/okinawa_10nm_full_z12/compare_full.png new file mode 100644 index 0000000..5aa7672 Binary files /dev/null and b/report/full_rebuild_staging_okinawa_z12_r2_2026-04-18/okinawa_10nm_full_z12/compare_full.png differ diff --git a/report/full_rebuild_staging_okinawa_z12_r2_2026-04-18/okinawa_10nm_full_z12/compare_left.png b/report/full_rebuild_staging_okinawa_z12_r2_2026-04-18/okinawa_10nm_full_z12/compare_left.png new file mode 100644 index 0000000..9c087f7 Binary files /dev/null and b/report/full_rebuild_staging_okinawa_z12_r2_2026-04-18/okinawa_10nm_full_z12/compare_left.png differ diff --git a/report/full_rebuild_staging_okinawa_z12_r2_2026-04-18/okinawa_10nm_full_z12/compare_right.png b/report/full_rebuild_staging_okinawa_z12_r2_2026-04-18/okinawa_10nm_full_z12/compare_right.png new file mode 100644 index 0000000..d771d62 Binary files /dev/null and b/report/full_rebuild_staging_okinawa_z12_r2_2026-04-18/okinawa_10nm_full_z12/compare_right.png differ diff --git a/report/full_rebuild_z11_partial_shift_audit_2026-04-18.json b/report/full_rebuild_z11_partial_shift_audit_2026-04-18.json new file mode 100644 index 0000000..5305888 --- /dev/null +++ b/report/full_rebuild_z11_partial_shift_audit_2026-04-18.json @@ -0,0 +1,8 @@ +{ + "target_root": "/home/wwwroot/pbf-delivery-full-20260418-rebuild.parts/z11", + "source_root": "/home/wwwroot/newpec/exported_auto/tile.mapple-on.jp__newpec-mvt-20260106__z___x___y_.pbf/tiles", + "zoom_filter": [], + "tiles_checked": 1702, + "suspicious_tile_count": 0, + "samples": [] +} diff --git a/report/full_rebuild_z12_partial_geometry_2026-04-18/geometry_native_audit.json b/report/full_rebuild_z12_partial_geometry_2026-04-18/geometry_native_audit.json new file mode 100644 index 0000000..89e5f56 --- /dev/null +++ b/report/full_rebuild_z12_partial_geometry_2026-04-18/geometry_native_audit.json @@ -0,0 +1,72 @@ +{ + "label": "full-rebuild-z12-partial", + "target_root": "/home/wwwroot/pbf-delivery-full-20260418-rebuild.parts/z12", + "source_root": "/home/wwwroot/newpec/exported_auto/tile.mapple-on.jp__newpec-mvt-20260106__z___x___y_.pbf/tiles", + "tile_count": 4544, + "outside_extent_tiles": 4544, + "source_extent_mismatch_tiles": 0, + "fixable_from_source_tiles": 0, + "repaired_tiles": 0, + "zoom_summary": { + "12": { + "tile_count": 4544, + "outside_extent_tiles": 4544, + "source_extent_mismatch_tiles": 0, + "extent_counts": { + "1048576": 4544 + } + } + }, + "sample_tiles": [ + { + "tile": "12/3436/1715.pbf", + "extent_values": [ + 1048576 + ], + "source_extent": 1048576, + "outside_extent": true, + "max_overflow": 20480, + "fixable_from_source": false + }, + { + "tile": "12/3436/1716.pbf", + "extent_values": [ + 1048576 + ], + "source_extent": 1048576, + "outside_extent": true, + "max_overflow": 20480, + "fixable_from_source": false + }, + { + "tile": "12/3436/1717.pbf", + "extent_values": [ + 1048576 + ], + "source_extent": 1048576, + "outside_extent": true, + "max_overflow": 20480, + "fixable_from_source": false + }, + { + "tile": "12/3436/1718.pbf", + "extent_values": [ + 1048576 + ], + "source_extent": 1048576, + "outside_extent": true, + "max_overflow": 20480, + "fixable_from_source": false + }, + { + "tile": "12/3436/1719.pbf", + "extent_values": [ + 1048576 + ], + "source_extent": 1048576, + "outside_extent": true, + "max_overflow": 20480, + "fixable_from_source": false + } + ] +} diff --git a/report/full_rebuild_z12_partial_geometry_2026-04-18/geometry_native_audit.md b/report/full_rebuild_z12_partial_geometry_2026-04-18/geometry_native_audit.md new file mode 100644 index 0000000..23723dd --- /dev/null +++ b/report/full_rebuild_z12_partial_geometry_2026-04-18/geometry_native_audit.md @@ -0,0 +1,66 @@ +# full-rebuild-z12-partial 几何 / Extent / Native 风险审计 + +## 范围 + +- target root: `/home/wwwroot/pbf-delivery-full-20260418-rebuild.parts/z12` +- source root: `/home/wwwroot/newpec/exported_auto/tile.mapple-on.jp__newpec-mvt-20260106__z___x___y_.pbf/tiles` +- tiles: `4544` +- repaired tiles: `0` + +## 总体结论 + +- 坐标超当前 extent 的瓦片数:`4544` +- 与源瓦片 extent 不一致的瓦片数:`0` +- 可直接按源 extent 修复的瓦片数:`0` + +## Zoom 汇总 + +### z12 + +- tiles: `4544` +- outside extent: `4544` +- source mismatch: `0` +- extent counts: `{1048576: 4544}` + +## 代表问题样本 + +### `12/3436/1715.pbf` + +- extent values: `[1048576]` +- source extent: `1048576` +- outside extent: `True` +- max overflow: `20480` +- fixable from source: `False` + +### `12/3436/1716.pbf` + +- extent values: `[1048576]` +- source extent: `1048576` +- outside extent: `True` +- max overflow: `20480` +- fixable from source: `False` + +### `12/3436/1717.pbf` + +- extent values: `[1048576]` +- source extent: `1048576` +- outside extent: `True` +- max overflow: `20480` +- fixable from source: `False` + +### `12/3436/1718.pbf` + +- extent values: `[1048576]` +- source extent: `1048576` +- outside extent: `True` +- max overflow: `20480` +- fixable from source: `False` + +### `12/3436/1719.pbf` + +- extent values: `[1048576]` +- source extent: `1048576` +- outside extent: `True` +- max overflow: `20480` +- fixable from source: `False` + diff --git a/report/full_rebuild_z12_partial_shift_audit_2026-04-18.json b/report/full_rebuild_z12_partial_shift_audit_2026-04-18.json new file mode 100644 index 0000000..ec5fcf3 --- /dev/null +++ b/report/full_rebuild_z12_partial_shift_audit_2026-04-18.json @@ -0,0 +1,8 @@ +{ + "target_root": "/home/wwwroot/pbf-delivery-full-20260418-rebuild.parts/z12", + "source_root": "/home/wwwroot/newpec/exported_auto/tile.mapple-on.jp__newpec-mvt-20260106__z___x___y_.pbf/tiles", + "zoom_filter": [], + "tiles_checked": 2991, + "suspicious_tile_count": 0, + "samples": [] +} diff --git a/report/karatsu_hotspot_verify_2026-04-18/karatsu_5nm_full_z12/compare_diff.png b/report/karatsu_hotspot_verify_2026-04-18/karatsu_5nm_full_z12/compare_diff.png new file mode 100644 index 0000000..d6d2471 Binary files /dev/null and b/report/karatsu_hotspot_verify_2026-04-18/karatsu_5nm_full_z12/compare_diff.png differ diff --git a/report/karatsu_hotspot_verify_2026-04-18/karatsu_5nm_full_z12/compare_full.png b/report/karatsu_hotspot_verify_2026-04-18/karatsu_5nm_full_z12/compare_full.png new file mode 100644 index 0000000..85ee08e Binary files /dev/null and b/report/karatsu_hotspot_verify_2026-04-18/karatsu_5nm_full_z12/compare_full.png differ diff --git a/report/karatsu_hotspot_verify_2026-04-18/karatsu_5nm_full_z12/compare_left.png b/report/karatsu_hotspot_verify_2026-04-18/karatsu_5nm_full_z12/compare_left.png new file mode 100644 index 0000000..f3df6a0 Binary files /dev/null and b/report/karatsu_hotspot_verify_2026-04-18/karatsu_5nm_full_z12/compare_left.png differ diff --git a/report/karatsu_hotspot_verify_2026-04-18/karatsu_5nm_full_z12/compare_right.png b/report/karatsu_hotspot_verify_2026-04-18/karatsu_5nm_full_z12/compare_right.png new file mode 100644 index 0000000..0f89d3f Binary files /dev/null and b/report/karatsu_hotspot_verify_2026-04-18/karatsu_5nm_full_z12/compare_right.png differ diff --git a/report/karatsu_hotspot_verify_2026-04-18/karatsu_5nm_semantic_z12/compare_diff.png b/report/karatsu_hotspot_verify_2026-04-18/karatsu_5nm_semantic_z12/compare_diff.png new file mode 100644 index 0000000..13f6f7a Binary files /dev/null and b/report/karatsu_hotspot_verify_2026-04-18/karatsu_5nm_semantic_z12/compare_diff.png differ diff --git a/report/karatsu_hotspot_verify_2026-04-18/karatsu_5nm_semantic_z12/compare_full.png b/report/karatsu_hotspot_verify_2026-04-18/karatsu_5nm_semantic_z12/compare_full.png new file mode 100644 index 0000000..a9ea7ba Binary files /dev/null and b/report/karatsu_hotspot_verify_2026-04-18/karatsu_5nm_semantic_z12/compare_full.png differ diff --git a/report/karatsu_hotspot_verify_2026-04-18/karatsu_5nm_semantic_z12/compare_left.png b/report/karatsu_hotspot_verify_2026-04-18/karatsu_5nm_semantic_z12/compare_left.png new file mode 100644 index 0000000..a402eff Binary files /dev/null and b/report/karatsu_hotspot_verify_2026-04-18/karatsu_5nm_semantic_z12/compare_left.png differ diff --git a/report/karatsu_hotspot_verify_2026-04-18/karatsu_5nm_semantic_z12/compare_right.png b/report/karatsu_hotspot_verify_2026-04-18/karatsu_5nm_semantic_z12/compare_right.png new file mode 100644 index 0000000..7cbd7fe Binary files /dev/null and b/report/karatsu_hotspot_verify_2026-04-18/karatsu_5nm_semantic_z12/compare_right.png differ diff --git a/report/kyushu_semantic_icon_v1_2026-08-06/visual/hakata_kyushu_icon_v1_semantic_z10/compare_diff.png b/report/kyushu_semantic_icon_v1_2026-08-06/visual/hakata_kyushu_icon_v1_semantic_z10/compare_diff.png new file mode 100644 index 0000000..3b4af66 Binary files /dev/null and b/report/kyushu_semantic_icon_v1_2026-08-06/visual/hakata_kyushu_icon_v1_semantic_z10/compare_diff.png differ diff --git a/report/kyushu_semantic_icon_v1_2026-08-06/visual/hakata_kyushu_icon_v1_semantic_z10/compare_full.png b/report/kyushu_semantic_icon_v1_2026-08-06/visual/hakata_kyushu_icon_v1_semantic_z10/compare_full.png new file mode 100644 index 0000000..3ea79ee Binary files /dev/null and b/report/kyushu_semantic_icon_v1_2026-08-06/visual/hakata_kyushu_icon_v1_semantic_z10/compare_full.png differ diff --git a/report/kyushu_semantic_icon_v1_2026-08-06/visual/hakata_kyushu_icon_v1_semantic_z10/compare_left.png b/report/kyushu_semantic_icon_v1_2026-08-06/visual/hakata_kyushu_icon_v1_semantic_z10/compare_left.png new file mode 100644 index 0000000..853e4e7 Binary files /dev/null and b/report/kyushu_semantic_icon_v1_2026-08-06/visual/hakata_kyushu_icon_v1_semantic_z10/compare_left.png differ diff --git a/report/kyushu_semantic_icon_v1_2026-08-06/visual/hakata_kyushu_icon_v1_semantic_z10/compare_right.png b/report/kyushu_semantic_icon_v1_2026-08-06/visual/hakata_kyushu_icon_v1_semantic_z10/compare_right.png new file mode 100644 index 0000000..790a886 Binary files /dev/null and b/report/kyushu_semantic_icon_v1_2026-08-06/visual/hakata_kyushu_icon_v1_semantic_z10/compare_right.png differ diff --git a/report/kyushu_semantic_icon_v1_2026-08-06/visual/hakata_kyushu_icon_v1_semantic_z12/compare_diff.png b/report/kyushu_semantic_icon_v1_2026-08-06/visual/hakata_kyushu_icon_v1_semantic_z12/compare_diff.png new file mode 100644 index 0000000..231977b Binary files /dev/null and b/report/kyushu_semantic_icon_v1_2026-08-06/visual/hakata_kyushu_icon_v1_semantic_z12/compare_diff.png differ diff --git a/report/kyushu_semantic_icon_v1_2026-08-06/visual/hakata_kyushu_icon_v1_semantic_z12/compare_full.png b/report/kyushu_semantic_icon_v1_2026-08-06/visual/hakata_kyushu_icon_v1_semantic_z12/compare_full.png new file mode 100644 index 0000000..4303861 Binary files /dev/null and b/report/kyushu_semantic_icon_v1_2026-08-06/visual/hakata_kyushu_icon_v1_semantic_z12/compare_full.png differ diff --git a/report/kyushu_semantic_icon_v1_2026-08-06/visual/hakata_kyushu_icon_v1_semantic_z12/compare_left.png b/report/kyushu_semantic_icon_v1_2026-08-06/visual/hakata_kyushu_icon_v1_semantic_z12/compare_left.png new file mode 100644 index 0000000..7a6783c Binary files /dev/null and b/report/kyushu_semantic_icon_v1_2026-08-06/visual/hakata_kyushu_icon_v1_semantic_z12/compare_left.png differ diff --git a/report/kyushu_semantic_icon_v1_2026-08-06/visual/hakata_kyushu_icon_v1_semantic_z12/compare_right.png b/report/kyushu_semantic_icon_v1_2026-08-06/visual/hakata_kyushu_icon_v1_semantic_z12/compare_right.png new file mode 100644 index 0000000..4860205 Binary files /dev/null and b/report/kyushu_semantic_icon_v1_2026-08-06/visual/hakata_kyushu_icon_v1_semantic_z12/compare_right.png differ diff --git a/report/kyushu_semantic_icon_v1_2026-08-06/visual/karatsu_kyushu_icon_v1_semantic_z10/compare_diff.png b/report/kyushu_semantic_icon_v1_2026-08-06/visual/karatsu_kyushu_icon_v1_semantic_z10/compare_diff.png new file mode 100644 index 0000000..579991a Binary files /dev/null and b/report/kyushu_semantic_icon_v1_2026-08-06/visual/karatsu_kyushu_icon_v1_semantic_z10/compare_diff.png differ diff --git a/report/kyushu_semantic_icon_v1_2026-08-06/visual/karatsu_kyushu_icon_v1_semantic_z10/compare_full.png b/report/kyushu_semantic_icon_v1_2026-08-06/visual/karatsu_kyushu_icon_v1_semantic_z10/compare_full.png new file mode 100644 index 0000000..3f630e9 Binary files /dev/null and b/report/kyushu_semantic_icon_v1_2026-08-06/visual/karatsu_kyushu_icon_v1_semantic_z10/compare_full.png differ diff --git a/report/kyushu_semantic_icon_v1_2026-08-06/visual/karatsu_kyushu_icon_v1_semantic_z10/compare_left.png b/report/kyushu_semantic_icon_v1_2026-08-06/visual/karatsu_kyushu_icon_v1_semantic_z10/compare_left.png new file mode 100644 index 0000000..1fbd17a Binary files /dev/null and b/report/kyushu_semantic_icon_v1_2026-08-06/visual/karatsu_kyushu_icon_v1_semantic_z10/compare_left.png differ diff --git a/report/kyushu_semantic_icon_v1_2026-08-06/visual/karatsu_kyushu_icon_v1_semantic_z10/compare_right.png b/report/kyushu_semantic_icon_v1_2026-08-06/visual/karatsu_kyushu_icon_v1_semantic_z10/compare_right.png new file mode 100644 index 0000000..7c13173 Binary files /dev/null and b/report/kyushu_semantic_icon_v1_2026-08-06/visual/karatsu_kyushu_icon_v1_semantic_z10/compare_right.png differ diff --git a/report/kyushu_semantic_icon_v1_2026-08-06/visual/karatsu_kyushu_icon_v1_semantic_z12/compare_diff.png b/report/kyushu_semantic_icon_v1_2026-08-06/visual/karatsu_kyushu_icon_v1_semantic_z12/compare_diff.png new file mode 100644 index 0000000..c9e5392 Binary files /dev/null and b/report/kyushu_semantic_icon_v1_2026-08-06/visual/karatsu_kyushu_icon_v1_semantic_z12/compare_diff.png differ diff --git a/report/kyushu_semantic_icon_v1_2026-08-06/visual/karatsu_kyushu_icon_v1_semantic_z12/compare_full.png b/report/kyushu_semantic_icon_v1_2026-08-06/visual/karatsu_kyushu_icon_v1_semantic_z12/compare_full.png new file mode 100644 index 0000000..5f4064f Binary files /dev/null and b/report/kyushu_semantic_icon_v1_2026-08-06/visual/karatsu_kyushu_icon_v1_semantic_z12/compare_full.png differ diff --git a/report/kyushu_semantic_icon_v1_2026-08-06/visual/karatsu_kyushu_icon_v1_semantic_z12/compare_left.png b/report/kyushu_semantic_icon_v1_2026-08-06/visual/karatsu_kyushu_icon_v1_semantic_z12/compare_left.png new file mode 100644 index 0000000..1cde0ed Binary files /dev/null and b/report/kyushu_semantic_icon_v1_2026-08-06/visual/karatsu_kyushu_icon_v1_semantic_z12/compare_left.png differ diff --git a/report/kyushu_semantic_icon_v1_2026-08-06/visual/karatsu_kyushu_icon_v1_semantic_z12/compare_right.png b/report/kyushu_semantic_icon_v1_2026-08-06/visual/karatsu_kyushu_icon_v1_semantic_z12/compare_right.png new file mode 100644 index 0000000..b311866 Binary files /dev/null and b/report/kyushu_semantic_icon_v1_2026-08-06/visual/karatsu_kyushu_icon_v1_semantic_z12/compare_right.png differ diff --git a/report/object_preservation_full_semantic_unified_20260808/object_preservation_delivery_20nm.json b/report/object_preservation_full_semantic_unified_20260808/object_preservation_delivery_20nm.json new file mode 100644 index 0000000..14e401f --- /dev/null +++ b/report/object_preservation_full_semantic_unified_20260808/object_preservation_delivery_20nm.json @@ -0,0 +1,215 @@ +{ + "target_name": "delivery_20nm", + "raw_root": "/home/wwwroot/newpec/exported_auto/tile.mapple-on.jp__newpec-mvt-20260106__z___x___y_.pbf/tiles", + "target_root": "/home/wwwroot/pbf-delivery-full-semantic-unified-20260808", + "totals": { + "tiles_compared": 65148, + "raw_objects": 113578, + "preserved": 113578 + }, + "rule_stats": { + "P航路ククリ->route_outline": { + "raw_objects": 864, + "preserved": 864 + }, + "p投錨注意障害物->anchor_caution_hazard_point": { + "raw_objects": 49907, + "preserved": 49907 + }, + "p施設・境界線等->facility_boundary_point": { + "raw_objects": 5019, + "preserved": 5019 + }, + "p航行危険障害物->navigation_hazard_point": { + "raw_objects": 19268, + "preserved": 19268 + }, + "p航路標識群->navigation_marks": { + "raw_objects": 38520, + "preserved": 38520 + } + }, + "top_class_issues": [ + { + "class_key": "p投錨注意障害物:420", + "raw_objects": 22314, + "preserved": 22314, + "missing_object": 0, + "wrong_relayer": 0, + "identifier_lost": 0, + "identifier_mismatch": 0 + }, + { + "class_key": "p投錨注意障害物:428", + "raw_objects": 16403, + "preserved": 16403, + "missing_object": 0, + "wrong_relayer": 0, + "identifier_lost": 0, + "identifier_mismatch": 0 + }, + { + "class_key": "p航行危険障害物:404", + "raw_objects": 10366, + "preserved": 10366, + "missing_object": 0, + "wrong_relayer": 0, + "identifier_lost": 0, + "identifier_mismatch": 0 + }, + { + "class_key": "p航路標識群:30600003", + "raw_objects": 5120, + "preserved": 5120, + "missing_object": 0, + "wrong_relayer": 0, + "identifier_lost": 0, + "identifier_mismatch": 0 + }, + { + "class_key": "p投錨注意障害物:425", + "raw_objects": 4175, + "preserved": 4175, + "missing_object": 0, + "wrong_relayer": 0, + "identifier_lost": 0, + "identifier_mismatch": 0 + }, + { + "class_key": "p航路標識群:30600002", + "raw_objects": 3755, + "preserved": 3755, + "missing_object": 0, + "wrong_relayer": 0, + "identifier_lost": 0, + "identifier_mismatch": 0 + }, + { + "class_key": "p航行危険障害物:403", + "raw_objects": 3323, + "preserved": 3323, + "missing_object": 0, + "wrong_relayer": 0, + "identifier_lost": 0, + "identifier_mismatch": 0 + }, + { + "class_key": "p施設・境界線等:520", + "raw_objects": 3169, + "preserved": 3169, + "missing_object": 0, + "wrong_relayer": 0, + "identifier_lost": 0, + "identifier_mismatch": 0 + }, + { + "class_key": "p航路標識群:30600001", + "raw_objects": 3166, + "preserved": 3166, + "missing_object": 0, + "wrong_relayer": 0, + "identifier_lost": 0, + "identifier_mismatch": 0 + }, + { + "class_key": "p航路標識群:30200002", + "raw_objects": 2408, + "preserved": 2408, + "missing_object": 0, + "wrong_relayer": 0, + "identifier_lost": 0, + "identifier_mismatch": 0 + }, + { + "class_key": "p投錨注意障害物:421", + "raw_objects": 2355, + "preserved": 2355, + "missing_object": 0, + "wrong_relayer": 0, + "identifier_lost": 0, + "identifier_mismatch": 0 + }, + { + "class_key": "p航路標識群:30200001", + "raw_objects": 2218, + "preserved": 2218, + "missing_object": 0, + "wrong_relayer": 0, + "identifier_lost": 0, + "identifier_mismatch": 0 + }, + { + "class_key": "p投錨注意障害物:422", + "raw_objects": 2206, + "preserved": 2206, + "missing_object": 0, + "wrong_relayer": 0, + "identifier_lost": 0, + "identifier_mismatch": 0 + }, + { + "class_key": "p航路標識群:30100004", + "raw_objects": 2136, + "preserved": 2136, + "missing_object": 0, + "wrong_relayer": 0, + "identifier_lost": 0, + "identifier_mismatch": 0 + }, + { + "class_key": "p航行危険障害物:432", + "raw_objects": 2119, + "preserved": 2119, + "missing_object": 0, + "wrong_relayer": 0, + "identifier_lost": 0, + "identifier_mismatch": 0 + }, + { + "class_key": "p航路標識群:30600000", + "raw_objects": 1905, + "preserved": 1905, + "missing_object": 0, + "wrong_relayer": 0, + "identifier_lost": 0, + "identifier_mismatch": 0 + }, + { + "class_key": "p航路標識群:31000000", + "raw_objects": 1746, + "preserved": 1746, + "missing_object": 0, + "wrong_relayer": 0, + "identifier_lost": 0, + "identifier_mismatch": 0 + }, + { + "class_key": "p航行危険障害物:402", + "raw_objects": 1178, + "preserved": 1178, + "missing_object": 0, + "wrong_relayer": 0, + "identifier_lost": 0, + "identifier_mismatch": 0 + }, + { + "class_key": "p航路標識群:31235001", + "raw_objects": 1140, + "preserved": 1140, + "missing_object": 0, + "wrong_relayer": 0, + "identifier_lost": 0, + "identifier_mismatch": 0 + }, + { + "class_key": "p航路標識群:31235102", + "raw_objects": 1126, + "preserved": 1126, + "missing_object": 0, + "wrong_relayer": 0, + "identifier_lost": 0, + "identifier_mismatch": 0 + } + ], + "issue_examples": {} +} \ No newline at end of file diff --git a/report/object_preservation_full_semantic_unified_20260808/object_preservation_delivery_20nm.md b/report/object_preservation_full_semantic_unified_20260808/object_preservation_delivery_20nm.md new file mode 100644 index 0000000..a945773 --- /dev/null +++ b/report/object_preservation_full_semantic_unified_20260808/object_preservation_delivery_20nm.md @@ -0,0 +1,76 @@ +# Object Preservation Audit: delivery_20nm + +- raw root: `/home/wwwroot/newpec/exported_auto/tile.mapple-on.jp__newpec-mvt-20260106__z___x___y_.pbf/tiles` +- target root: `/home/wwwroot/pbf-delivery-full-semantic-unified-20260808` + +## Totals + +- tiles compared: `65148` +- raw objects: `113578` +- preserved: `113578` +- missing object: `0` +- wrong relayer: `0` +- identifier lost: `0` +- identifier mismatch: `0` + +## Per Rule + +### `P航路ククリ->route_outline` + +- raw objects: `864` +- preserved: `864` +- missing object: `0` +- wrong relayer: `0` +- identifier lost: `0` +- identifier mismatch: `0` + +### `p投錨注意障害物->anchor_caution_hazard_point` + +- raw objects: `49907` +- preserved: `49907` +- missing object: `0` +- wrong relayer: `0` +- identifier lost: `0` +- identifier mismatch: `0` + +### `p施設・境界線等->facility_boundary_point` + +- raw objects: `5019` +- preserved: `5019` +- missing object: `0` +- wrong relayer: `0` +- identifier lost: `0` +- identifier mismatch: `0` + +### `p航行危険障害物->navigation_hazard_point` + +- raw objects: `19268` +- preserved: `19268` +- missing object: `0` +- wrong relayer: `0` +- identifier lost: `0` +- identifier mismatch: `0` + +### `p航路標識群->navigation_marks` + +- raw objects: `38520` +- preserved: `38520` +- missing object: `0` +- wrong relayer: `0` +- identifier lost: `0` +- identifier mismatch: `0` + +## Top Class Issues + +- `p投錨注意障害物:420` raw=`22314` preserved=`22314` missing=`0` wrong_relayer=`0` identifier_lost=`0` identifier_mismatch=`0` +- `p投錨注意障害物:428` raw=`16403` preserved=`16403` missing=`0` wrong_relayer=`0` identifier_lost=`0` identifier_mismatch=`0` +- `p航行危険障害物:404` raw=`10366` preserved=`10366` missing=`0` wrong_relayer=`0` identifier_lost=`0` identifier_mismatch=`0` +- `p航路標識群:30600003` raw=`5120` preserved=`5120` missing=`0` wrong_relayer=`0` identifier_lost=`0` identifier_mismatch=`0` +- `p投錨注意障害物:425` raw=`4175` preserved=`4175` missing=`0` wrong_relayer=`0` identifier_lost=`0` identifier_mismatch=`0` +- `p航路標識群:30600002` raw=`3755` preserved=`3755` missing=`0` wrong_relayer=`0` identifier_lost=`0` identifier_mismatch=`0` +- `p航行危険障害物:403` raw=`3323` preserved=`3323` missing=`0` wrong_relayer=`0` identifier_lost=`0` identifier_mismatch=`0` +- `p施設・境界線等:520` raw=`3169` preserved=`3169` missing=`0` wrong_relayer=`0` identifier_lost=`0` identifier_mismatch=`0` +- `p航路標識群:30600001` raw=`3166` preserved=`3166` missing=`0` wrong_relayer=`0` identifier_lost=`0` identifier_mismatch=`0` +- `p航路標識群:30200002` raw=`2408` preserved=`2408` missing=`0` wrong_relayer=`0` identifier_lost=`0` identifier_mismatch=`0` +- `p投錨注意障害物:421` raw=`2355` preserved=`2355` missing=`0` wrong_relayer=`0` identifier_lost=`0` identifier_mismatch=`0` +- `p航路標識群:30200001` raw=`2218` preserved=`2218` missing=`0` wrong_relayer=`0` identifier_lost=`0` identifier_mismatch=`0` diff --git a/report/object_preservation_unified_semantic_20260808-test/object_preservation_delivery_20nm.json b/report/object_preservation_unified_semantic_20260808-test/object_preservation_delivery_20nm.json new file mode 100644 index 0000000..d7d0086 --- /dev/null +++ b/report/object_preservation_unified_semantic_20260808-test/object_preservation_delivery_20nm.json @@ -0,0 +1,211 @@ +{ + "target_name": "delivery_20nm", + "raw_root": "/home/wwwroot/newpec/exported_auto/tile.mapple-on.jp__newpec-mvt-20260106__z___x___y_.pbf/tiles", + "target_root": "/home/wwwroot/pbf-delivery-full-semantic-unified-20260808-test", + "totals": { + "tiles_compared": 46, + "raw_objects": 1278, + "preserved": 1278 + }, + "rule_stats": { + "p投錨注意障害物->anchor_caution_hazard_point": { + "raw_objects": 364, + "preserved": 364 + }, + "p施設・境界線等->facility_boundary_point": { + "raw_objects": 66, + "preserved": 66 + }, + "p航行危険障害物->navigation_hazard_point": { + "raw_objects": 295, + "preserved": 295 + }, + "p航路標識群->navigation_marks": { + "raw_objects": 553, + "preserved": 553 + } + }, + "top_class_issues": [ + { + "class_key": "p投錨注意障害物:428", + "raw_objects": 240, + "preserved": 240, + "missing_object": 0, + "wrong_relayer": 0, + "identifier_lost": 0, + "identifier_mismatch": 0 + }, + { + "class_key": "p航行危険障害物:404", + "raw_objects": 221, + "preserved": 221, + "missing_object": 0, + "wrong_relayer": 0, + "identifier_lost": 0, + "identifier_mismatch": 0 + }, + { + "class_key": "p投錨注意障害物:420", + "raw_objects": 89, + "preserved": 89, + "missing_object": 0, + "wrong_relayer": 0, + "identifier_lost": 0, + "identifier_mismatch": 0 + }, + { + "class_key": "p航路標識群:30600003", + "raw_objects": 78, + "preserved": 78, + "missing_object": 0, + "wrong_relayer": 0, + "identifier_lost": 0, + "identifier_mismatch": 0 + }, + { + "class_key": "p航路標識群:30600001", + "raw_objects": 68, + "preserved": 68, + "missing_object": 0, + "wrong_relayer": 0, + "identifier_lost": 0, + "identifier_mismatch": 0 + }, + { + "class_key": "p航路標識群:30600002", + "raw_objects": 64, + "preserved": 64, + "missing_object": 0, + "wrong_relayer": 0, + "identifier_lost": 0, + "identifier_mismatch": 0 + }, + { + "class_key": "p航路標識群:30100004", + "raw_objects": 54, + "preserved": 54, + "missing_object": 0, + "wrong_relayer": 0, + "identifier_lost": 0, + "identifier_mismatch": 0 + }, + { + "class_key": "p施設・境界線等:520", + "raw_objects": 53, + "preserved": 53, + "missing_object": 0, + "wrong_relayer": 0, + "identifier_lost": 0, + "identifier_mismatch": 0 + }, + { + "class_key": "p航路標識群:30200002", + "raw_objects": 33, + "preserved": 33, + "missing_object": 0, + "wrong_relayer": 0, + "identifier_lost": 0, + "identifier_mismatch": 0 + }, + { + "class_key": "p航路標識群:31000000", + "raw_objects": 33, + "preserved": 33, + "missing_object": 0, + "wrong_relayer": 0, + "identifier_lost": 0, + "identifier_mismatch": 0 + }, + { + "class_key": "p航行危険障害物:403", + "raw_objects": 33, + "preserved": 33, + "missing_object": 0, + "wrong_relayer": 0, + "identifier_lost": 0, + "identifier_mismatch": 0 + }, + { + "class_key": "p航路標識群:30600000", + "raw_objects": 23, + "preserved": 23, + "missing_object": 0, + "wrong_relayer": 0, + "identifier_lost": 0, + "identifier_mismatch": 0 + }, + { + "class_key": "p航路標識群:31300003", + "raw_objects": 23, + "preserved": 23, + "missing_object": 0, + "wrong_relayer": 0, + "identifier_lost": 0, + "identifier_mismatch": 0 + }, + { + "class_key": "p航行危険障害物:432", + "raw_objects": 22, + "preserved": 22, + "missing_object": 0, + "wrong_relayer": 0, + "identifier_lost": 0, + "identifier_mismatch": 0 + }, + { + "class_key": "p航路標識群:30600004", + "raw_objects": 20, + "preserved": 20, + "missing_object": 0, + "wrong_relayer": 0, + "identifier_lost": 0, + "identifier_mismatch": 0 + }, + { + "class_key": "p航路標識群:30200001", + "raw_objects": 19, + "preserved": 19, + "missing_object": 0, + "wrong_relayer": 0, + "identifier_lost": 0, + "identifier_mismatch": 0 + }, + { + "class_key": "p航路標識群:31336300", + "raw_objects": 18, + "preserved": 18, + "missing_object": 0, + "wrong_relayer": 0, + "identifier_lost": 0, + "identifier_mismatch": 0 + }, + { + "class_key": "p航路標識群:32700002", + "raw_objects": 14, + "preserved": 14, + "missing_object": 0, + "wrong_relayer": 0, + "identifier_lost": 0, + "identifier_mismatch": 0 + }, + { + "class_key": "p投錨注意障害物:425", + "raw_objects": 12, + "preserved": 12, + "missing_object": 0, + "wrong_relayer": 0, + "identifier_lost": 0, + "identifier_mismatch": 0 + }, + { + "class_key": "p航路標識群:31235102", + "raw_objects": 10, + "preserved": 10, + "missing_object": 0, + "wrong_relayer": 0, + "identifier_lost": 0, + "identifier_mismatch": 0 + } + ], + "issue_examples": {} +} \ No newline at end of file diff --git a/report/object_preservation_unified_semantic_20260808-test/object_preservation_delivery_20nm.md b/report/object_preservation_unified_semantic_20260808-test/object_preservation_delivery_20nm.md new file mode 100644 index 0000000..1f1cc01 --- /dev/null +++ b/report/object_preservation_unified_semantic_20260808-test/object_preservation_delivery_20nm.md @@ -0,0 +1,67 @@ +# Object Preservation Audit: delivery_20nm + +- raw root: `/home/wwwroot/newpec/exported_auto/tile.mapple-on.jp__newpec-mvt-20260106__z___x___y_.pbf/tiles` +- target root: `/home/wwwroot/pbf-delivery-full-semantic-unified-20260808-test` + +## Totals + +- tiles compared: `46` +- raw objects: `1278` +- preserved: `1278` +- missing object: `0` +- wrong relayer: `0` +- identifier lost: `0` +- identifier mismatch: `0` + +## Per Rule + +### `p投錨注意障害物->anchor_caution_hazard_point` + +- raw objects: `364` +- preserved: `364` +- missing object: `0` +- wrong relayer: `0` +- identifier lost: `0` +- identifier mismatch: `0` + +### `p施設・境界線等->facility_boundary_point` + +- raw objects: `66` +- preserved: `66` +- missing object: `0` +- wrong relayer: `0` +- identifier lost: `0` +- identifier mismatch: `0` + +### `p航行危険障害物->navigation_hazard_point` + +- raw objects: `295` +- preserved: `295` +- missing object: `0` +- wrong relayer: `0` +- identifier lost: `0` +- identifier mismatch: `0` + +### `p航路標識群->navigation_marks` + +- raw objects: `553` +- preserved: `553` +- missing object: `0` +- wrong relayer: `0` +- identifier lost: `0` +- identifier mismatch: `0` + +## Top Class Issues + +- `p投錨注意障害物:428` raw=`240` preserved=`240` missing=`0` wrong_relayer=`0` identifier_lost=`0` identifier_mismatch=`0` +- `p航行危険障害物:404` raw=`221` preserved=`221` missing=`0` wrong_relayer=`0` identifier_lost=`0` identifier_mismatch=`0` +- `p投錨注意障害物:420` raw=`89` preserved=`89` missing=`0` wrong_relayer=`0` identifier_lost=`0` identifier_mismatch=`0` +- `p航路標識群:30600003` raw=`78` preserved=`78` missing=`0` wrong_relayer=`0` identifier_lost=`0` identifier_mismatch=`0` +- `p航路標識群:30600001` raw=`68` preserved=`68` missing=`0` wrong_relayer=`0` identifier_lost=`0` identifier_mismatch=`0` +- `p航路標識群:30600002` raw=`64` preserved=`64` missing=`0` wrong_relayer=`0` identifier_lost=`0` identifier_mismatch=`0` +- `p航路標識群:30100004` raw=`54` preserved=`54` missing=`0` wrong_relayer=`0` identifier_lost=`0` identifier_mismatch=`0` +- `p施設・境界線等:520` raw=`53` preserved=`53` missing=`0` wrong_relayer=`0` identifier_lost=`0` identifier_mismatch=`0` +- `p航路標識群:30200002` raw=`33` preserved=`33` missing=`0` wrong_relayer=`0` identifier_lost=`0` identifier_mismatch=`0` +- `p航路標識群:31000000` raw=`33` preserved=`33` missing=`0` wrong_relayer=`0` identifier_lost=`0` identifier_mismatch=`0` +- `p航行危険障害物:403` raw=`33` preserved=`33` missing=`0` wrong_relayer=`0` identifier_lost=`0` identifier_mismatch=`0` +- `p航路標識群:30600000` raw=`23` preserved=`23` missing=`0` wrong_relayer=`0` identifier_lost=`0` identifier_mismatch=`0` diff --git a/report/object_preservation_unified_semantic_20260808-test/object_preservation_final_20nm.json b/report/object_preservation_unified_semantic_20260808-test/object_preservation_final_20nm.json new file mode 100644 index 0000000..012f4e8 --- /dev/null +++ b/report/object_preservation_unified_semantic_20260808-test/object_preservation_final_20nm.json @@ -0,0 +1,211 @@ +{ + "target_name": "final_20nm", + "raw_root": "/home/wwwroot/newpec/exported_auto/tile.mapple-on.jp__newpec-mvt-20260106__z___x___y_.pbf/tiles", + "target_root": "/home/wwwroot/pbf-delivery-full-semantic-unified-20260808-test", + "totals": { + "tiles_compared": 46, + "raw_objects": 1278, + "preserved": 1278 + }, + "rule_stats": { + "p投錨注意障害物->anchor_caution_hazard_point": { + "raw_objects": 364, + "preserved": 364 + }, + "p施設・境界線等->facility_boundary_point": { + "raw_objects": 66, + "preserved": 66 + }, + "p航行危険障害物->navigation_hazard_point": { + "raw_objects": 295, + "preserved": 295 + }, + "p航路標識群->navigation_marks": { + "raw_objects": 553, + "preserved": 553 + } + }, + "top_class_issues": [ + { + "class_key": "p投錨注意障害物:428", + "raw_objects": 240, + "preserved": 240, + "missing_object": 0, + "wrong_relayer": 0, + "identifier_lost": 0, + "identifier_mismatch": 0 + }, + { + "class_key": "p航行危険障害物:404", + "raw_objects": 221, + "preserved": 221, + "missing_object": 0, + "wrong_relayer": 0, + "identifier_lost": 0, + "identifier_mismatch": 0 + }, + { + "class_key": "p投錨注意障害物:420", + "raw_objects": 89, + "preserved": 89, + "missing_object": 0, + "wrong_relayer": 0, + "identifier_lost": 0, + "identifier_mismatch": 0 + }, + { + "class_key": "p航路標識群:30600003", + "raw_objects": 78, + "preserved": 78, + "missing_object": 0, + "wrong_relayer": 0, + "identifier_lost": 0, + "identifier_mismatch": 0 + }, + { + "class_key": "p航路標識群:30600001", + "raw_objects": 68, + "preserved": 68, + "missing_object": 0, + "wrong_relayer": 0, + "identifier_lost": 0, + "identifier_mismatch": 0 + }, + { + "class_key": "p航路標識群:30600002", + "raw_objects": 64, + "preserved": 64, + "missing_object": 0, + "wrong_relayer": 0, + "identifier_lost": 0, + "identifier_mismatch": 0 + }, + { + "class_key": "p航路標識群:30100004", + "raw_objects": 54, + "preserved": 54, + "missing_object": 0, + "wrong_relayer": 0, + "identifier_lost": 0, + "identifier_mismatch": 0 + }, + { + "class_key": "p施設・境界線等:520", + "raw_objects": 53, + "preserved": 53, + "missing_object": 0, + "wrong_relayer": 0, + "identifier_lost": 0, + "identifier_mismatch": 0 + }, + { + "class_key": "p航路標識群:30200002", + "raw_objects": 33, + "preserved": 33, + "missing_object": 0, + "wrong_relayer": 0, + "identifier_lost": 0, + "identifier_mismatch": 0 + }, + { + "class_key": "p航路標識群:31000000", + "raw_objects": 33, + "preserved": 33, + "missing_object": 0, + "wrong_relayer": 0, + "identifier_lost": 0, + "identifier_mismatch": 0 + }, + { + "class_key": "p航行危険障害物:403", + "raw_objects": 33, + "preserved": 33, + "missing_object": 0, + "wrong_relayer": 0, + "identifier_lost": 0, + "identifier_mismatch": 0 + }, + { + "class_key": "p航路標識群:30600000", + "raw_objects": 23, + "preserved": 23, + "missing_object": 0, + "wrong_relayer": 0, + "identifier_lost": 0, + "identifier_mismatch": 0 + }, + { + "class_key": "p航路標識群:31300003", + "raw_objects": 23, + "preserved": 23, + "missing_object": 0, + "wrong_relayer": 0, + "identifier_lost": 0, + "identifier_mismatch": 0 + }, + { + "class_key": "p航行危険障害物:432", + "raw_objects": 22, + "preserved": 22, + "missing_object": 0, + "wrong_relayer": 0, + "identifier_lost": 0, + "identifier_mismatch": 0 + }, + { + "class_key": "p航路標識群:30600004", + "raw_objects": 20, + "preserved": 20, + "missing_object": 0, + "wrong_relayer": 0, + "identifier_lost": 0, + "identifier_mismatch": 0 + }, + { + "class_key": "p航路標識群:30200001", + "raw_objects": 19, + "preserved": 19, + "missing_object": 0, + "wrong_relayer": 0, + "identifier_lost": 0, + "identifier_mismatch": 0 + }, + { + "class_key": "p航路標識群:31336300", + "raw_objects": 18, + "preserved": 18, + "missing_object": 0, + "wrong_relayer": 0, + "identifier_lost": 0, + "identifier_mismatch": 0 + }, + { + "class_key": "p航路標識群:32700002", + "raw_objects": 14, + "preserved": 14, + "missing_object": 0, + "wrong_relayer": 0, + "identifier_lost": 0, + "identifier_mismatch": 0 + }, + { + "class_key": "p投錨注意障害物:425", + "raw_objects": 12, + "preserved": 12, + "missing_object": 0, + "wrong_relayer": 0, + "identifier_lost": 0, + "identifier_mismatch": 0 + }, + { + "class_key": "p航路標識群:31235102", + "raw_objects": 10, + "preserved": 10, + "missing_object": 0, + "wrong_relayer": 0, + "identifier_lost": 0, + "identifier_mismatch": 0 + } + ], + "issue_examples": {} +} \ No newline at end of file diff --git a/report/object_preservation_unified_semantic_20260808-test/object_preservation_final_20nm.md b/report/object_preservation_unified_semantic_20260808-test/object_preservation_final_20nm.md new file mode 100644 index 0000000..9d54528 --- /dev/null +++ b/report/object_preservation_unified_semantic_20260808-test/object_preservation_final_20nm.md @@ -0,0 +1,67 @@ +# Object Preservation Audit: final_20nm + +- raw root: `/home/wwwroot/newpec/exported_auto/tile.mapple-on.jp__newpec-mvt-20260106__z___x___y_.pbf/tiles` +- target root: `/home/wwwroot/pbf-delivery-full-semantic-unified-20260808-test` + +## Totals + +- tiles compared: `46` +- raw objects: `1278` +- preserved: `1278` +- missing object: `0` +- wrong relayer: `0` +- identifier lost: `0` +- identifier mismatch: `0` + +## Per Rule + +### `p投錨注意障害物->anchor_caution_hazard_point` + +- raw objects: `364` +- preserved: `364` +- missing object: `0` +- wrong relayer: `0` +- identifier lost: `0` +- identifier mismatch: `0` + +### `p施設・境界線等->facility_boundary_point` + +- raw objects: `66` +- preserved: `66` +- missing object: `0` +- wrong relayer: `0` +- identifier lost: `0` +- identifier mismatch: `0` + +### `p航行危険障害物->navigation_hazard_point` + +- raw objects: `295` +- preserved: `295` +- missing object: `0` +- wrong relayer: `0` +- identifier lost: `0` +- identifier mismatch: `0` + +### `p航路標識群->navigation_marks` + +- raw objects: `553` +- preserved: `553` +- missing object: `0` +- wrong relayer: `0` +- identifier lost: `0` +- identifier mismatch: `0` + +## Top Class Issues + +- `p投錨注意障害物:428` raw=`240` preserved=`240` missing=`0` wrong_relayer=`0` identifier_lost=`0` identifier_mismatch=`0` +- `p航行危険障害物:404` raw=`221` preserved=`221` missing=`0` wrong_relayer=`0` identifier_lost=`0` identifier_mismatch=`0` +- `p投錨注意障害物:420` raw=`89` preserved=`89` missing=`0` wrong_relayer=`0` identifier_lost=`0` identifier_mismatch=`0` +- `p航路標識群:30600003` raw=`78` preserved=`78` missing=`0` wrong_relayer=`0` identifier_lost=`0` identifier_mismatch=`0` +- `p航路標識群:30600001` raw=`68` preserved=`68` missing=`0` wrong_relayer=`0` identifier_lost=`0` identifier_mismatch=`0` +- `p航路標識群:30600002` raw=`64` preserved=`64` missing=`0` wrong_relayer=`0` identifier_lost=`0` identifier_mismatch=`0` +- `p航路標識群:30100004` raw=`54` preserved=`54` missing=`0` wrong_relayer=`0` identifier_lost=`0` identifier_mismatch=`0` +- `p施設・境界線等:520` raw=`53` preserved=`53` missing=`0` wrong_relayer=`0` identifier_lost=`0` identifier_mismatch=`0` +- `p航路標識群:30200002` raw=`33` preserved=`33` missing=`0` wrong_relayer=`0` identifier_lost=`0` identifier_mismatch=`0` +- `p航路標識群:31000000` raw=`33` preserved=`33` missing=`0` wrong_relayer=`0` identifier_lost=`0` identifier_mismatch=`0` +- `p航行危険障害物:403` raw=`33` preserved=`33` missing=`0` wrong_relayer=`0` identifier_lost=`0` identifier_mismatch=`0` +- `p航路標識群:30600000` raw=`23` preserved=`23` missing=`0` wrong_relayer=`0` identifier_lost=`0` identifier_mismatch=`0` diff --git a/report/old_png_semantic_mapping.csv b/report/old_png_semantic_mapping.csv new file mode 100644 index 0000000..10b93e3 --- /dev/null +++ b/report/old_png_semantic_mapping.csv @@ -0,0 +1,477 @@ +png_filename,sprite_key,category,width_px,height_px,semantic_ja,semantic_zh,html_image_ref,html_section,match_confidence,match_basis,notes +arc-daytime-0105306901192310.png,arc-daytime-0105306901192310,arc-daytime,288,288,灯弧(緑:233°→249° / 緑:12°→130°),灯光扇区/光弧(绿:233°→249° / 绿:12°→130°),image079,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-01180035.png,arc-daytime-01180035,arc-daytime,288,288,灯弧(緑:0°→215°),灯光扇区/光弧(绿:0°→215°),image079,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-01293219.png,arc-daytime-01293219,arc-daytime,288,288,灯弧(緑:113°→39°),灯光扇区/光弧(绿:113°→39°),image079,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-0200103104031001.png,arc-daytime-0200103104031001,arc-daytime,288,288,灯弧(赤:181°→211° / 黄:211°→181°),灯光扇区/光弧(红:181°→211° / 黄:211°→181°),image080;image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-02002252.png,arc-daytime-02002252,arc-daytime,288,288,灯弧(赤:182°→72°),灯光扇区/光弧(红:182°→72°),image080,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-0201102104021011.png,arc-daytime-0201102104021011,arc-daytime,288,288,灯弧(赤:191°→201° / 黄:201°→191°),灯光扇区/光弧(红:191°→201° / 黄:201°→191°),image080;image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-02048301.png,arc-daytime-02048301,arc-daytime,288,288,灯弧(赤:228°→121°),灯光扇区/光弧(红:228°→121°),image080,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-0206408002180297.png,arc-daytime-0206408002180297,arc-daytime,288,288,灯弧(赤:244°→260° / 赤:0°→117°),灯光扇区/光弧(红:244°→260° / 红:0°→117°),image080,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-02113325.png,arc-daytime-02113325,arc-daytime,288,288,灯弧(赤:293°→145°),灯光扇区/光弧(红:293°→145°),image080,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-0222231004310222.png,arc-daytime-0222231004310222,arc-daytime,288,288,灯弧(赤:42°→130° / 黄:130°→42°),灯光扇区/光弧(红:42°→130° / 黄:130°→42°),image080;image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-0223726704267237.png,arc-daytime-0223726704267237,arc-daytime,288,288,灯弧(赤:57°→87° / 黄:87°→57°),灯光扇区/光弧(红:57°→87° / 黄:87°→57°),image080;image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-0225529904299089.png,arc-daytime-0225529904299089,arc-daytime,288,288,灯弧(赤:75°→119° / 黄:119°→269°),灯光扇区/光弧(红:75°→119° / 黄:119°→269°),image080;image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-02257145.png,arc-daytime-02257145,arc-daytime,288,288,灯弧(赤:77°→325°),灯光扇区/光弧(红:77°→325°),image080,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-02300210.png,arc-daytime-02300210,arc-daytime,288,288,灯弧(赤:120°→30°),灯光扇区/光弧(红:120°→30°),image080,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-02317310.png,arc-daytime-02317310,arc-daytime,288,288,灯弧(赤:137°→130°),灯光扇区/光弧(红:137°→130°),image080,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04002244.png,arc-daytime-04002244,arc-daytime,288,288,灯弧(黄:182°→64°),灯光扇区/光弧(黄:182°→64°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04004246.png,arc-daytime-04004246,arc-daytime,288,288,灯弧(黄:184°→66°),灯光扇区/光弧(黄:184°→66°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04006315.png,arc-daytime-04006315,arc-daytime,288,288,灯弧(黄:186°→135°),灯光扇区/光弧(黄:186°→135°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04007277.png,arc-daytime-04007277,arc-daytime,288,288,灯弧(黄:187°→97°),灯光扇区/光弧(黄:187°→97°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04008243.png,arc-daytime-04008243,arc-daytime,288,288,灯弧(黄:188°→63°),灯光扇区/光弧(黄:188°→63°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04010293.png,arc-daytime-04010293,arc-daytime,288,288,灯弧(黄:190°→113°),灯光扇区/光弧(黄:190°→113°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04014213.png,arc-daytime-04014213,arc-daytime,288,288,灯弧(黄:194°→33°),灯光扇区/光弧(黄:194°→33°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04016181.png,arc-daytime-04016181,arc-daytime,288,288,灯弧(黄:196°→1°),灯光扇区/光弧(黄:196°→1°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04016291.png,arc-daytime-04016291,arc-daytime,288,288,灯弧(黄:196°→111°),灯光扇区/光弧(黄:196°→111°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04018198.png,arc-daytime-04018198,arc-daytime,288,288,灯弧(黄:198°→18°),灯光扇区/光弧(黄:198°→18°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04018258.png,arc-daytime-04018258,arc-daytime,288,288,灯弧(黄:198°→78°),灯光扇区/光弧(黄:198°→78°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04020236.png,arc-daytime-04020236,arc-daytime,288,288,灯弧(黄:200°→56°),灯光扇区/光弧(黄:200°→56°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04020243.png,arc-daytime-04020243,arc-daytime,288,288,灯弧(黄:200°→63°),灯光扇区/光弧(黄:200°→63°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04021213.png,arc-daytime-04021213,arc-daytime,288,288,灯弧(黄:201°→33°),灯光扇区/光弧(黄:201°→33°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04021253.png,arc-daytime-04021253,arc-daytime,288,288,灯弧(黄:201°→73°),灯光扇区/光弧(黄:201°→73°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04022202.png,arc-daytime-04022202,arc-daytime,288,288,灯弧(黄:202°→22°),灯光扇区/光弧(黄:202°→22°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04022307.png,arc-daytime-04022307,arc-daytime,288,288,灯弧(黄:202°→127°),灯光扇区/光弧(黄:202°→127°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04024258.png,arc-daytime-04024258,arc-daytime,288,288,灯弧(黄:204°→78°),灯光扇区/光弧(黄:204°→78°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04025273.png,arc-daytime-04025273,arc-daytime,288,288,灯弧(黄:205°→93°),灯光扇区/光弧(黄:205°→93°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04027289.png,arc-daytime-04027289,arc-daytime,288,288,灯弧(黄:207°→109°),灯光扇区/光弧(黄:207°→109°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04028287.png,arc-daytime-04028287,arc-daytime,288,288,灯弧(黄:208°→107°),灯光扇区/光弧(黄:208°→107°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04029268.png,arc-daytime-04029268,arc-daytime,288,288,灯弧(黄:209°→88°),灯光扇区/光弧(黄:209°→88°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04029280.png,arc-daytime-04029280,arc-daytime,288,288,灯弧(黄:209°→100°),灯光扇区/光弧(黄:209°→100°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04030275.png,arc-daytime-04030275,arc-daytime,288,288,灯弧(黄:210°→95°),灯光扇区/光弧(黄:210°→95°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04031330.png,arc-daytime-04031330,arc-daytime,288,288,灯弧(黄:211°→150°),灯光扇区/光弧(黄:211°→150°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04033249.png,arc-daytime-04033249,arc-daytime,288,288,灯弧(黄:213°→69°),灯光扇区/光弧(黄:213°→69°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04035209.png,arc-daytime-04035209,arc-daytime,288,288,灯弧(黄:215°→29°),灯光扇区/光弧(黄:215°→29°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04035221042430270202703502221243.png,arc-daytime-04035221042430270202703502221243,arc-daytime,288,288,灯弧(黄:215°→41° / 黄:63°→207° / 赤:207°→215° / 赤:41°→63°),灯光扇区/光弧(黄:215°→41° / 黄:63°→207° / 红:207°→215° / 红:41°→63°),image080;image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04035283.png,arc-daytime-04035283,arc-daytime,288,288,灯弧(黄:215°→103°),灯光扇区/光弧(黄:215°→103°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04036216.png,arc-daytime-04036216,arc-daytime,288,288,灯弧(黄:216°→36°),灯光扇区/光弧(黄:216°→36°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04040253.png,arc-daytime-04040253,arc-daytime,288,288,灯弧(黄:220°→73°),灯光扇区/光弧(黄:220°→73°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04043223.png,arc-daytime-04043223,arc-daytime,288,288,灯弧(黄:223°→43°),灯光扇区/光弧(黄:223°→43°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04045135.png,arc-daytime-04045135,arc-daytime,288,288,灯弧(黄:225°→315°),灯光扇区/光弧(黄:225°→315°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04048213.png,arc-daytime-04048213,arc-daytime,288,288,灯弧(黄:228°→33°),灯光扇区/光弧(黄:228°→33°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04051314.png,arc-daytime-04051314,arc-daytime,288,288,灯弧(黄:231°→134°),灯光扇区/光弧(黄:231°→134°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-040522800208109201052073.png,arc-daytime-040522800208109201052073,arc-daytime,288,288,灯弧(黄:232°→100° / 赤:261°→272° / 緑:232°→253°),灯光扇区/光弧(黄:232°→100° / 红:261°→272° / 绿:232°→253°),image079;image080;image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04052305.png,arc-daytime-04052305,arc-daytime,288,288,灯弧(黄:232°→125°),灯光扇区/光弧(黄:232°→125°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04053279.png,arc-daytime-04053279,arc-daytime,288,288,灯弧(黄:233°→99°),灯光扇区/光弧(黄:233°→99°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04054226.png,arc-daytime-04054226,arc-daytime,288,288,灯弧(黄:234°→46°),灯光扇区/光弧(黄:234°→46°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04057308.png,arc-daytime-04057308,arc-daytime,288,288,灯弧(黄:237°→128°),灯光扇区/光弧(黄:237°→128°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04060257.png,arc-daytime-04060257,arc-daytime,288,288,灯弧(黄:240°→77°),灯光扇区/光弧(黄:240°→77°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04060319.png,arc-daytime-04060319,arc-daytime,288,288,灯弧(黄:240°→139°),灯光扇区/光弧(黄:240°→139°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-0406126602079097.png,arc-daytime-0406126602079097,arc-daytime,288,288,灯弧(黄:241°→86° / 赤:259°→277°),灯光扇区/光弧(黄:241°→86° / 红:259°→277°),image080;image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04063251042640410204106302251264.png,arc-daytime-04063251042640410204106302251264,arc-daytime,288,288,灯弧(黄:243°→71° / 黄:84°→221° / 赤:221°→243° / 赤:71°→84°),灯光扇区/光弧(黄:243°→71° / 黄:84°→221° / 红:221°→243° / 红:71°→84°),image080;image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04068298.png,arc-daytime-04068298,arc-daytime,288,288,灯弧(黄:248°→118°),灯光扇区/光弧(黄:248°→118°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04070270.png,arc-daytime-04070270,arc-daytime,288,288,灯弧(黄:250°→90°),灯光扇区/光弧(黄:250°→90°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04070314.png,arc-daytime-04070314,arc-daytime,288,288,灯弧(黄:250°→134°),灯光扇区/光弧(黄:250°→134°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04070336.png,arc-daytime-04070336,arc-daytime,288,288,灯弧(黄:250°→156°),灯光扇区/光弧(黄:250°→156°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04073309.png,arc-daytime-04073309,arc-daytime,288,288,灯弧(黄:253°→129°),灯光扇区/光弧(黄:253°→129°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04077286.png,arc-daytime-04077286,arc-daytime,288,288,灯弧(黄:257°→106°),灯光扇区/光弧(黄:257°→106°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04079310.png,arc-daytime-04079310,arc-daytime,288,288,灯弧(黄:259°→130°),灯光扇区/光弧(黄:259°→130°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04079335.png,arc-daytime-04079335,arc-daytime,288,288,灯弧(黄:259°→155°),灯光扇区/光弧(黄:259°→155°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04081293.png,arc-daytime-04081293,arc-daytime,288,288,灯弧(黄:261°→113°),灯光扇区/光弧(黄:261°→113°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04082332.png,arc-daytime-04082332,arc-daytime,288,288,灯弧(黄:262°→152°),灯光扇区/光弧(黄:262°→152°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-0408402102021084.png,arc-daytime-0408402102021084,arc-daytime,288,288,灯弧(黄:264°→201° / 赤:201°→264°),灯光扇区/光弧(黄:264°→201° / 红:201°→264°),image080;image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-0408626602266086.png,arc-daytime-0408626602266086,arc-daytime,288,288,灯弧(黄:266°→86° / 赤:86°→266°),灯光扇区/光弧(黄:266°→86° / 红:86°→266°),image080;image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04091357.png,arc-daytime-04091357,arc-daytime,288,288,灯弧(黄:271°→177°),灯光扇区/光弧(黄:271°→177°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04092292.png,arc-daytime-04092292,arc-daytime,288,288,灯弧(黄:272°→112°),灯光扇区/光弧(黄:272°→112°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04093033.png,arc-daytime-04093033,arc-daytime,288,288,灯弧(黄:273°→213°),灯光扇区/光弧(黄:273°→213°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04093340.png,arc-daytime-04093340,arc-daytime,288,288,灯弧(黄:273°→160°),灯光扇区/光弧(黄:273°→160°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04094000.png,arc-daytime-04094000,arc-daytime,288,288,灯弧(黄:274°→180°),灯光扇区/光弧(黄:274°→180°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-040951040203509502104170.png,arc-daytime-040951040203509502104170,arc-daytime,288,288,灯弧(黄:275°→284° / 赤:215°→275° / 赤:284°→350°),灯光扇区/光弧(黄:275°→284° / 红:215°→275° / 红:284°→350°),image080;image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04095312.png,arc-daytime-04095312,arc-daytime,288,288,灯弧(黄:275°→132°),灯光扇区/光弧(黄:275°→132°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04097050.png,arc-daytime-04097050,arc-daytime,288,288,灯弧(黄:277°→230°),灯光扇区/光弧(黄:277°→230°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04097335.png,arc-daytime-04097335,arc-daytime,288,288,灯弧(黄:277°→155°),灯光扇区/光弧(黄:277°→155°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04098000.png,arc-daytime-04098000,arc-daytime,288,288,灯弧(黄:278°→180°),灯光扇区/光弧(黄:278°→180°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04099318.png,arc-daytime-04099318,arc-daytime,288,288,灯弧(黄:279°→138°),灯光扇区/光弧(黄:279°→138°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04102142.png,arc-daytime-04102142,arc-daytime,288,288,灯弧(黄:282°→322°),灯光扇区/光弧(黄:282°→322°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04102355.png,arc-daytime-04102355,arc-daytime,288,288,灯弧(黄:282°→175°),灯光扇区/光弧(黄:282°→175°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04104012.png,arc-daytime-04104012,arc-daytime,288,288,灯弧(黄:284°→192°),灯光扇区/光弧(黄:284°→192°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04105013.png,arc-daytime-04105013,arc-daytime,288,288,灯弧(黄:285°→193°),灯光扇区/光弧(黄:285°→193°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04105020.png,arc-daytime-04105020,arc-daytime,288,288,灯弧(黄:285°→200°),灯光扇区/光弧(黄:285°→200°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-0410533902339015.png,arc-daytime-0410533902339015,arc-daytime,288,288,灯弧(黄:285°→159° / 赤:159°→195°),灯光扇区/光弧(黄:285°→159° / 红:159°→195°),image080;image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04106344.png,arc-daytime-04106344,arc-daytime,288,288,灯弧(黄:286°→164°),灯光扇区/光弧(黄:286°→164°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04107043.png,arc-daytime-04107043,arc-daytime,288,288,灯弧(黄:287°→223°),灯光扇区/光弧(黄:287°→223°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04108347.png,arc-daytime-04108347,arc-daytime,288,288,灯弧(黄:288°→167°),灯光扇区/光弧(黄:288°→167°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04109033.png,arc-daytime-04109033,arc-daytime,288,288,灯弧(黄:289°→213°),灯光扇区/光弧(黄:289°→213°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04109316.png,arc-daytime-04109316,arc-daytime,288,288,灯弧(黄:289°→136°),灯光扇区/光弧(黄:289°→136°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04115052.png,arc-daytime-04115052,arc-daytime,288,288,灯弧(黄:295°→232°),灯光扇区/光弧(黄:295°→232°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04116064.png,arc-daytime-04116064,arc-daytime,288,288,灯弧(黄:296°→244°),灯光扇区/光弧(黄:296°→244°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-0411609202092116.png,arc-daytime-0411609202092116,arc-daytime,288,288,灯弧(黄:296°→272° / 赤:272°→296°),灯光扇区/光弧(黄:296°→272° / 红:272°→296°),image080;image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04118329.png,arc-daytime-04118329,arc-daytime,288,288,灯弧(黄:298°→149°),灯光扇区/光弧(黄:298°→149°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-041201250413031202125130.png,arc-daytime-041201250413031202125130,arc-daytime,288,288,灯弧(黄:300°→305° / 黄:310°→132° / 赤:305°→310°),灯光扇区/光弧(黄:300°→305° / 黄:310°→132° / 红:305°→310°),image080;image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04121318.png,arc-daytime-04121318,arc-daytime,288,288,灯弧(黄:301°→138°),灯光扇区/光弧(黄:301°→138°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04124324.png,arc-daytime-04124324,arc-daytime,288,288,灯弧(黄:304°→144°),灯光扇区/光弧(黄:304°→144°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04125351.png,arc-daytime-04125351,arc-daytime,288,288,灯弧(黄:305°→171°),灯光扇区/光弧(黄:305°→171°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04132318.png,arc-daytime-04132318,arc-daytime,288,288,灯弧(黄:312°→138°),灯光扇区/光弧(黄:312°→138°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04133030.png,arc-daytime-04133030,arc-daytime,288,288,灯弧(黄:313°→210°),灯光扇区/光弧(黄:313°→210°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04135320.png,arc-daytime-04135320,arc-daytime,288,288,灯弧(黄:315°→140°),灯光扇区/光弧(黄:315°→140°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04138018.png,arc-daytime-04138018,arc-daytime,288,288,灯弧(黄:318°→198°),灯光扇区/光弧(黄:318°→198°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-0413935602106139.png,arc-daytime-0413935602106139,arc-daytime,288,288,灯弧(黄:319°→176° / 赤:286°→319°),灯光扇区/光弧(黄:319°→176° / 红:286°→319°),image080;image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04140012.png,arc-daytime-04140012,arc-daytime,288,288,灯弧(黄:320°→192°),灯光扇区/光弧(黄:320°→192°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04140341.png,arc-daytime-04140341,arc-daytime,288,288,灯弧(黄:320°→161°),灯光扇区/光弧(黄:320°→161°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04152017.png,arc-daytime-04152017,arc-daytime,288,288,灯弧(黄:332°→197°),灯光扇区/光弧(黄:332°→197°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04155005.png,arc-daytime-04155005,arc-daytime,288,288,灯弧(黄:335°→185°),灯光扇区/光弧(黄:335°→185°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04156008.png,arc-daytime-04156008,arc-daytime,288,288,灯弧(黄:336°→188°),灯光扇区/光弧(黄:336°→188°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04156335.png,arc-daytime-04156335,arc-daytime,288,288,灯弧(黄:336°→155°),灯光扇区/光弧(黄:336°→155°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04159010.png,arc-daytime-04159010,arc-daytime,288,288,灯弧(黄:339°→190°),灯光扇区/光弧(黄:339°→190°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04160006.png,arc-daytime-04160006,arc-daytime,288,288,灯弧(黄:340°→186°),灯光扇区/光弧(黄:340°→186°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04160329.png,arc-daytime-04160329,arc-daytime,288,288,灯弧(黄:340°→149°),灯光扇区/光弧(黄:340°→149°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04162032.png,arc-daytime-04162032,arc-daytime,288,288,灯弧(黄:342°→212°),灯光扇区/光弧(黄:342°→212°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04166358.png,arc-daytime-04166358,arc-daytime,288,288,灯弧(黄:346°→178°),灯光扇区/光弧(黄:346°→178°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04168018.png,arc-daytime-04168018,arc-daytime,288,288,灯弧(黄:348°→198°),灯光扇区/光弧(黄:348°→198°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04169065.png,arc-daytime-04169065,arc-daytime,288,288,灯弧(黄:349°→245°),灯光扇区/光弧(黄:349°→245°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-041702050421505102205215.png,arc-daytime-041702050421505102205215,arc-daytime,288,288,灯弧(黄:350°→25° / 黄:35°→231° / 赤:25°→35°),灯光扇区/光弧(黄:350°→25° / 黄:35°→231° / 红:25°→35°),image080;image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04172080.png,arc-daytime-04172080,arc-daytime,288,288,灯弧(黄:352°→260°),灯光扇区/光弧(黄:352°→260°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04173082.png,arc-daytime-04173082,arc-daytime,288,288,灯弧(黄:353°→262°),灯光扇区/光弧(黄:353°→262°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04175017.png,arc-daytime-04175017,arc-daytime,288,288,灯弧(黄:355°→197°),灯光扇区/光弧(黄:355°→197°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04177071.png,arc-daytime-04177071,arc-daytime,288,288,灯弧(黄:357°→251°),灯光扇区/光弧(黄:357°→251°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04178066.png,arc-daytime-04178066,arc-daytime,288,288,灯弧(黄:358°→246°),灯光扇区/光弧(黄:358°→246°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04180008.png,arc-daytime-04180008,arc-daytime,288,288,灯弧(黄:0°→188°),灯光扇区/光弧(黄:0°→188°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04180060.png,arc-daytime-04180060,arc-daytime,288,288,灯弧(黄:0°→240°),灯光扇区/光弧(黄:0°→240°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04180062.png,arc-daytime-04180062,arc-daytime,288,288,灯弧(黄:0°→242°),灯光扇区/光弧(黄:0°→242°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-0418112902129181.png,arc-daytime-0418112902129181,arc-daytime,288,288,灯弧(黄:1°→309° / 赤:309°→1°),灯光扇区/光弧(黄:1°→309° / 红:309°→1°),image080;image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04182090.png,arc-daytime-04182090,arc-daytime,288,288,灯弧(黄:2°→270°),灯光扇区/光弧(黄:2°→270°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04185055.png,arc-daytime-04185055,arc-daytime,288,288,灯弧(黄:5°→235°),灯光扇区/光弧(黄:5°→235°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04185095.png,arc-daytime-04185095,arc-daytime,288,288,灯弧(黄:5°→275°),灯光扇区/光弧(黄:5°→275°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04187142.png,arc-daytime-04187142,arc-daytime,288,288,灯弧(黄:7°→322°),灯光扇区/光弧(黄:7°→322°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04190057.png,arc-daytime-04190057,arc-daytime,288,288,灯弧(黄:10°→237°),灯光扇区/光弧(黄:10°→237°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04190085.png,arc-daytime-04190085,arc-daytime,288,288,灯弧(黄:10°→265°),灯光扇区/光弧(黄:10°→265°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04194029.png,arc-daytime-04194029,arc-daytime,288,288,灯弧(黄:14°→209°),灯光扇区/光弧(黄:14°→209°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04195021.png,arc-daytime-04195021,arc-daytime,288,288,灯弧(黄:15°→201°),灯光扇区/光弧(黄:15°→201°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04197017.png,arc-daytime-04197017,arc-daytime,288,288,灯弧(黄:17°→197°),灯光扇区/光弧(黄:17°→197°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04198097.png,arc-daytime-04198097,arc-daytime,288,288,灯弧(黄:18°→277°),灯光扇区/光弧(黄:18°→277°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04198358.png,arc-daytime-04198358,arc-daytime,288,288,灯弧(黄:18°→178°),灯光扇区/光弧(黄:18°→178°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04199019.png,arc-daytime-04199019,arc-daytime,288,288,灯弧(黄:19°→199°),灯光扇区/光弧(黄:19°→199°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-0419907902043079.png,arc-daytime-0419907902043079,arc-daytime,288,288,灯弧(黄:19°→259° / 赤:223°→259°),灯光扇区/光弧(黄:19°→259° / 红:223°→259°),image080;image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04199343.png,arc-daytime-04199343,arc-daytime,288,288,灯弧(黄:19°→163°),灯光扇区/光弧(黄:19°→163°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04201091.png,arc-daytime-04201091,arc-daytime,288,288,灯弧(黄:21°→271°),灯光扇区/光弧(黄:21°→271°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04203099.png,arc-daytime-04203099,arc-daytime,288,288,灯弧(黄:23°→279°),灯光扇区/光弧(黄:23°→279°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04204043.png,arc-daytime-04204043,arc-daytime,288,288,灯弧(黄:24°→223°),灯光扇区/光弧(黄:24°→223°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04204099.png,arc-daytime-04204099,arc-daytime,288,288,灯弧(黄:24°→279°),灯光扇区/光弧(黄:24°→279°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04205045.png,arc-daytime-04205045,arc-daytime,288,288,灯弧(黄:25°→225°),灯光扇区/光弧(黄:25°→225°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04205097.png,arc-daytime-04205097,arc-daytime,288,288,灯弧(黄:25°→277°),灯光扇区/光弧(黄:25°→277°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04207038.png,arc-daytime-04207038,arc-daytime,288,288,灯弧(黄:27°→218°),灯光扇区/光弧(黄:27°→218°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-0420704802048070.png,arc-daytime-0420704802048070,arc-daytime,288,288,灯弧(黄:27°→228° / 赤:228°→250°),灯光扇区/光弧(黄:27°→228° / 红:228°→250°),image080;image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04209116.png,arc-daytime-04209116,arc-daytime,288,288,灯弧(黄:29°→296°),灯光扇区/光弧(黄:29°→296°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04210091.png,arc-daytime-04210091,arc-daytime,288,288,灯弧(黄:30°→271°),灯光扇区/光弧(黄:30°→271°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04213013.png,arc-daytime-04213013,arc-daytime,288,288,灯弧(黄:33°→193°),灯光扇区/光弧(黄:33°→193°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04215162.png,arc-daytime-04215162,arc-daytime,288,288,灯弧(黄:35°→342°),灯光扇区/光弧(黄:35°→342°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04216098.png,arc-daytime-04216098,arc-daytime,288,288,灯弧(黄:36°→278°),灯光扇区/光弧(黄:36°→278°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04217119.png,arc-daytime-04217119,arc-daytime,288,288,灯弧(黄:37°→299°),灯光扇区/光弧(黄:37°→299°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04221052.png,arc-daytime-04221052,arc-daytime,288,288,灯弧(黄:41°→232°),灯光扇区/光弧(黄:41°→232°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04221104.png,arc-daytime-04221104,arc-daytime,288,288,灯弧(黄:41°→284°),灯光扇区/光弧(黄:41°→284°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04222055.png,arc-daytime-04222055,arc-daytime,288,288,灯弧(黄:42°→235°),灯光扇区/光弧(黄:42°→235°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04222063.png,arc-daytime-04222063,arc-daytime,288,288,灯弧(黄:42°→243°),灯光扇区/光弧(黄:42°→243°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04223137.png,arc-daytime-04223137,arc-daytime,288,288,灯弧(黄:43°→317°),灯光扇区/光弧(黄:43°→317°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04229073.png,arc-daytime-04229073,arc-daytime,288,288,灯弧(黄:49°→253°),灯光扇区/光弧(黄:49°→253°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04230050.png,arc-daytime-04230050,arc-daytime,288,288,灯弧(黄:50°→230°),灯光扇区/光弧(黄:50°→230°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04230076.png,arc-daytime-04230076,arc-daytime,288,288,灯弧(黄:50°→256°),灯光扇区/光弧(黄:50°→256°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-042310350405610002035056.png,arc-daytime-042310350405610002035056,arc-daytime,288,288,灯弧(黄:51°→215° / 黄:236°→280° / 赤:215°→236°),灯光扇区/光弧(黄:51°→215° / 黄:236°→280° / 红:215°→236°),image080;image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-0423116704125167.png,arc-daytime-0423116704125167,arc-daytime,288,288,灯弧(黄:51°→347° / 黄:305°→347°),灯光扇区/光弧(黄:51°→347° / 黄:305°→347°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04232050.png,arc-daytime-04232050,arc-daytime,288,288,灯弧(黄:52°→230°),灯光扇区/光弧(黄:52°→230°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-0423222602226232.png,arc-daytime-0423222602226232,arc-daytime,288,288,灯弧(黄:52°→46° / 赤:46°→52°),灯光扇区/光弧(黄:52°→46° / 红:46°→52°),image080;image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04233110.png,arc-daytime-04233110,arc-daytime,288,288,灯弧(黄:53°→290°),灯光扇区/光弧(黄:53°→290°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-042352850429530504320170.png,arc-daytime-042352850429530504320170,arc-daytime,288,288,灯弧(黄:55°→105° / 黄:115°→125° / 黄:140°→350°),灯光扇区/光弧(黄:55°→105° / 黄:115°→125° / 黄:140°→350°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04237100.png,arc-daytime-04237100,arc-daytime,288,288,灯弧(黄:57°→280°),灯光扇区/光弧(黄:57°→280°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04240170.png,arc-daytime-04240170,arc-daytime,288,288,灯弧(黄:60°→350°),灯光扇区/光弧(黄:60°→350°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-0424122702227241.png,arc-daytime-0424122702227241,arc-daytime,288,288,灯弧(黄:61°→47° / 赤:47°→61°),灯光扇区/光弧(黄:61°→47° / 红:47°→61°),image080;image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04242150.png,arc-daytime-04242150,arc-daytime,288,288,灯弧(黄:62°→330°),灯光扇区/光弧(黄:62°→330°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04245092.png,arc-daytime-04245092,arc-daytime,288,288,灯弧(黄:65°→272°),灯光扇区/光弧(黄:65°→272°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-0424628604296140.png,arc-daytime-0424628604296140,arc-daytime,288,288,灯弧(黄:66°→106° / 黄:116°→320°),灯光扇区/光弧(黄:66°→106° / 黄:116°→320°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04251115.png,arc-daytime-04251115,arc-daytime,288,288,灯弧(黄:71°→295°),灯光扇区/光弧(黄:71°→295°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-0425408002080101.png,arc-daytime-0425408002080101,arc-daytime,288,288,灯弧(黄:74°→260° / 赤:260°→281°),灯光扇区/光弧(黄:74°→260° / 红:260°→281°),image080;image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04254169.png,arc-daytime-04254169,arc-daytime,288,288,灯弧(黄:74°→349°),灯光扇区/光弧(黄:74°→349°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04255075.png,arc-daytime-04255075,arc-daytime,288,288,灯弧(黄:75°→255°),灯光扇区/光弧(黄:75°→255°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04257132.png,arc-daytime-04257132,arc-daytime,288,288,灯弧(黄:77°→312°),灯光扇区/光弧(黄:77°→312°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04257134.png,arc-daytime-04257134,arc-daytime,288,288,灯弧(黄:77°→314°),灯光扇区/光弧(黄:77°→314°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-042572820429532304010148022172570228229502323010.png,arc-daytime-042572820429532304010148022172570228229502323010,arc-daytime,288,288,灯弧(黄:77°→102° / 黄:115°→143° / 黄:190°→328° / 赤:37°→77° / 赤:102°→115° / 赤:143°→190°),灯光扇区/光弧(黄:77°→102° / 黄:115°→143° / 黄:190°→328° / 红:37°→77° / 红:102°→115° / 红:143°→190°),image080;image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04259113.png,arc-daytime-04259113,arc-daytime,288,288,灯弧(黄:79°→293°),灯光扇区/光弧(黄:79°→293°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04261114.png,arc-daytime-04261114,arc-daytime,288,288,灯弧(黄:81°→294°),灯光扇区/光弧(黄:81°→294°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04263083.png,arc-daytime-04263083,arc-daytime,288,288,灯弧(黄:83°→263°),灯光扇区/光弧(黄:83°→263°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04265214.png,arc-daytime-04265214,arc-daytime,288,288,灯弧(黄:85°→34°),灯光扇区/光弧(黄:85°→34°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-0426524202242265.png,arc-daytime-0426524202242265,arc-daytime,288,288,灯弧(黄:85°→62° / 赤:62°→85°),灯光扇区/光弧(黄:85°→62° / 红:62°→85°),image080;image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04266162.png,arc-daytime-04266162,arc-daytime,288,288,灯弧(黄:86°→342°),灯光扇区/光弧(黄:86°→342°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04269146.png,arc-daytime-04269146,arc-daytime,288,288,灯弧(黄:89°→326°),灯光扇区/光弧(黄:89°→326°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04270080.png,arc-daytime-04270080,arc-daytime,288,288,灯弧(黄:90°→260°),灯光扇区/光弧(黄:90°→260°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-0427021502215270.png,arc-daytime-0427021502215270,arc-daytime,288,288,灯弧(黄:90°→35° / 赤:35°→90°),灯光扇区/光弧(黄:90°→35° / 红:35°→90°),image080;image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04271113.png,arc-daytime-04271113,arc-daytime,288,288,灯弧(黄:91°→293°),灯光扇区/光弧(黄:91°→293°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04271115.png,arc-daytime-04271115,arc-daytime,288,288,灯弧(黄:91°→295°),灯光扇区/光弧(黄:91°→295°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04272211.png,arc-daytime-04272211,arc-daytime,288,288,灯弧(黄:92°→31°),灯光扇区/光弧(黄:92°→31°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-0427410502250274.png,arc-daytime-0427410502250274,arc-daytime,288,288,灯弧(黄:94°→285° / 赤:70°→94°),灯光扇区/光弧(黄:94°→285° / 红:70°→94°),image080;image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04274157.png,arc-daytime-04274157,arc-daytime,288,288,灯弧(黄:94°→337°),灯光扇区/光弧(黄:94°→337°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04275131.png,arc-daytime-04275131,arc-daytime,288,288,灯弧(黄:95°→311°),灯光扇区/光弧(黄:95°→311°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04278130.png,arc-daytime-04278130,arc-daytime,288,288,灯弧(黄:98°→310°),灯光扇区/光弧(黄:98°→310°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04279098.png,arc-daytime-04279098,arc-daytime,288,288,灯弧(黄:99°→278°),灯光扇区/光弧(黄:99°→278°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04285147.png,arc-daytime-04285147,arc-daytime,288,288,灯弧(黄:105°→327°),灯光扇区/光弧(黄:105°→327°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-042900770207709004090189.png,arc-daytime-042900770207709004090189,arc-daytime,288,288,灯弧(黄:110°→257° / 赤:257°→270° / 黄:270°→9°),灯光扇区/光弧(黄:110°→257° / 红:257°→270° / 黄:270°→9°),image080;image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04295180.png,arc-daytime-04295180,arc-daytime,288,288,灯弧(黄:115°→0°),灯光扇区/光弧(黄:115°→0°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04297154.png,arc-daytime-04297154,arc-daytime,288,288,灯弧(黄:117°→334°),灯光扇区/光弧(黄:117°→334°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04297190.png,arc-daytime-04297190,arc-daytime,288,288,灯弧(黄:117°→10°),灯光扇区/光弧(黄:117°→10°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04297254.png,arc-daytime-04297254,arc-daytime,288,288,灯弧(黄:117°→74°),灯光扇区/光弧(黄:117°→74°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04300156.png,arc-daytime-04300156,arc-daytime,288,288,灯弧(黄:120°→336°),灯光扇区/光弧(黄:120°→336°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04301172.png,arc-daytime-04301172,arc-daytime,288,288,灯弧(黄:121°→352°),灯光扇区/光弧(黄:121°→352°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04301175.png,arc-daytime-04301175,arc-daytime,288,288,灯弧(黄:121°→355°),灯光扇区/光弧(黄:121°→355°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04306184.png,arc-daytime-04306184,arc-daytime,288,288,灯弧(黄:126°→4°),灯光扇区/光弧(黄:126°→4°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04307120.png,arc-daytime-04307120,arc-daytime,288,288,灯弧(黄:127°→300°),灯光扇区/光弧(黄:127°→300°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04311219.png,arc-daytime-04311219,arc-daytime,288,288,灯弧(黄:131°→39°),灯光扇区/光弧(黄:131°→39°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04313145.png,arc-daytime-04313145,arc-daytime,288,288,灯弧(黄:133°→325°),灯光扇区/光弧(黄:133°→325°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04314107.png,arc-daytime-04314107,arc-daytime,288,288,灯弧(黄:134°→287°),灯光扇区/光弧(黄:134°→287°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04314201.png,arc-daytime-04314201,arc-daytime,288,288,灯弧(黄:134°→21°),灯光扇区/光弧(黄:134°→21°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04318146.png,arc-daytime-04318146,arc-daytime,288,288,灯弧(黄:138°→326°),灯光扇区/光弧(黄:138°→326°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04323171.png,arc-daytime-04323171,arc-daytime,288,288,灯弧(黄:143°→351°),灯光扇区/光弧(黄:143°→351°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04323233.png,arc-daytime-04323233,arc-daytime,288,288,灯弧(黄:143°→53°),灯光扇区/光弧(黄:143°→53°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04325262.png,arc-daytime-04325262,arc-daytime,288,288,灯弧(黄:145°→82°),灯光扇区/光弧(黄:145°→82°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04326162.png,arc-daytime-04326162,arc-daytime,288,288,灯弧(黄:146°→342°),灯光扇区/光弧(黄:146°→342°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04326164.png,arc-daytime-04326164,arc-daytime,288,288,灯弧(黄:146°→344°),灯光扇区/光弧(黄:146°→344°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04327228.png,arc-daytime-04327228,arc-daytime,288,288,灯弧(黄:147°→48°),灯光扇区/光弧(黄:147°→48°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04331151.png,arc-daytime-04331151,arc-daytime,288,288,灯弧(黄:151°→331°),灯光扇区/光弧(黄:151°→331°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04334203.png,arc-daytime-04334203,arc-daytime,288,288,灯弧(黄:154°→23°),灯光扇区/光弧(黄:154°→23°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04336243.png,arc-daytime-04336243,arc-daytime,288,288,灯弧(黄:156°→63°),灯光扇区/光弧(黄:156°→63°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04343296.png,arc-daytime-04343296,arc-daytime,288,288,灯弧(黄:163°→116°),灯光扇区/光弧(黄:163°→116°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04346177.png,arc-daytime-04346177,arc-daytime,288,288,灯弧(黄:166°→357°),灯光扇区/光弧(黄:166°→357°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04350210.png,arc-daytime-04350210,arc-daytime,288,288,灯弧(黄:170°→30°),灯光扇区/光弧(黄:170°→30°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04352232.png,arc-daytime-04352232,arc-daytime,288,288,灯弧(黄:172°→52°),灯光扇区/光弧(黄:172°→52°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04356186.png,arc-daytime-04356186,arc-daytime,288,288,灯弧(黄:176°→6°),灯光扇区/光弧(黄:176°→6°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-04358167.png,arc-daytime-04358167,arc-daytime,288,288,灯弧(黄:178°→347°),灯光扇区/光弧(黄:178°→347°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-05177027.png,arc-daytime-05177027,arc-daytime,288,288,灯弧(黄系:357°→207°),灯光扇区/光弧(黄系:357°→207°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-06172050.png,arc-daytime-06172050,arc-daytime,288,288,灯弧(黄系:352°→230°),灯光扇区/光弧(黄系:352°→230°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-06191091.png,arc-daytime-06191091,arc-daytime,288,288,灯弧(黄系:11°→271°),灯光扇区/光弧(黄系:11°→271°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-07207029.png,arc-daytime-07207029,arc-daytime,288,288,灯弧(黄系:27°→209°),灯光扇区/光弧(黄系:27°→209°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-07207075.png,arc-daytime-07207075,arc-daytime,288,288,灯弧(黄系:27°→255°),灯光扇区/光弧(黄系:27°→255°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-07357229.png,arc-daytime-07357229,arc-daytime,288,288,灯弧(黄系:177°→49°),灯光扇区/光弧(黄系:177°→49°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-08007250.png,arc-daytime-08007250,arc-daytime,288,288,灯弧(黄系:187°→70°),灯光扇区/光弧(黄系:187°→70°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-08024245.png,arc-daytime-08024245,arc-daytime,288,288,灯弧(黄系:204°→65°),灯光扇区/光弧(黄系:204°→65°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-08034279.png,arc-daytime-08034279,arc-daytime,288,288,灯弧(黄系:214°→99°),灯光扇区/光弧(黄系:214°→99°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-08057336.png,arc-daytime-08057336,arc-daytime,288,288,灯弧(黄系:237°→156°),灯光扇区/光弧(黄系:237°→156°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-08068287.png,arc-daytime-08068287,arc-daytime,288,288,灯弧(黄系:248°→107°),灯光扇区/光弧(黄系:248°→107°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-08189045.png,arc-daytime-08189045,arc-daytime,288,288,灯弧(黄系:9°→225°),灯光扇区/光弧(黄系:9°→225°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-08208134.png,arc-daytime-08208134,arc-daytime,288,288,灯弧(黄系:28°→314°),灯光扇区/光弧(黄系:28°→314°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-08241098.png,arc-daytime-08241098,arc-daytime,288,288,灯弧(黄系:61°→278°),灯光扇区/光弧(黄系:61°→278°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-08255101.png,arc-daytime-08255101,arc-daytime,288,288,灯弧(黄系:75°→281°),灯光扇区/光弧(黄系:75°→281°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-08350232.png,arc-daytime-08350232,arc-daytime,288,288,灯弧(黄系:170°→52°),灯光扇区/光弧(黄系:170°→52°),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,角度与颜色来自光弧Key解析CSV;PNG角度为编码角+180°。 +arc-daytime-l3.png,arc-daytime-l3,arc-daytime,288,288,灯弧・特殊テンプレート(黄色),灯光扇区/光弧特殊模板(黄),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,特殊模板;颜色来自光弧Key解析CSV。 +arc-daytime-m1.png,arc-daytime-m1,arc-daytime,192,192,灯弧・特殊テンプレート(绿色),灯光扇区/光弧特殊模板(绿),image079,航路標識群,high,光弧Key解析CSV + new pec灯色语义,特殊模板;颜色来自光弧Key解析CSV。 +arc-daytime-m2.png,arc-daytime-m2,arc-daytime,192,192,灯弧・特殊テンプレート(红色),灯光扇区/光弧特殊模板(红),image080,航路標識群,high,光弧Key解析CSV + new pec灯色语义,特殊模板;颜色来自光弧Key解析CSV。 +arc-daytime-m3.png,arc-daytime-m3,arc-daytime,192,192,灯弧・特殊テンプレート(黄色),灯光扇区/光弧特殊模板(黄),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,特殊模板;颜色来自光弧Key解析CSV。 +arc-daytime-s1.png,arc-daytime-s1,arc-daytime,128,128,灯弧・特殊テンプレート(绿色),灯光扇区/光弧特殊模板(绿),image079,航路標識群,high,光弧Key解析CSV + new pec灯色语义,特殊模板;颜色来自光弧Key解析CSV。 +arc-daytime-s2.png,arc-daytime-s2,arc-daytime,128,128,灯弧・特殊テンプレート(红色),灯光扇区/光弧特殊模板(红),image080,航路標識群,high,光弧Key解析CSV + new pec灯色语义,特殊模板;颜色来自光弧Key解析CSV。 +arc-daytime-s3.png,arc-daytime-s3,arc-daytime,128,128,灯弧・特殊テンプレート(黄色),灯光扇区/光弧特殊模板(黄),image081,航路標識群,high,光弧Key解析CSV + new pec灯色语义,特殊模板;颜色来自光弧Key解析CSV。 +arrow-daytime-0.png,arrow-daytime-0,arrow-daytime,16,64,潮流・流向矢印(横線0本),潮流/流向箭头(横杠0条),,,medium,文件名族 + 图形外观,该组不在 new pec「記号一覧」点/线图例中形成一对一条目,属于流向/流速显示组件。 +arrow-daytime-1.png,arrow-daytime-1,arrow-daytime,16,64,潮流・流向矢印(横線1本),潮流/流向箭头(横杠1条),,,medium,文件名族 + 图形外观,该组不在 new pec「記号一覧」点/线图例中形成一对一条目,属于流向/流速显示组件。 +arrow-daytime-2.png,arrow-daytime-2,arrow-daytime,16,64,潮流・流向矢印(横線2本),潮流/流向箭头(横杠2条),,,medium,文件名族 + 图形外观,该组不在 new pec「記号一覧」点/线图例中形成一对一条目,属于流向/流速显示组件。 +arrow-daytime-3.png,arrow-daytime-3,arrow-daytime,16,64,潮流・流向矢印(横線3本),潮流/流向箭头(横杠3条),,,medium,文件名族 + 图形外观,该组不在 new pec「記号一覧」点/线图例中形成一对一条目,属于流向/流速显示组件。 +arrow-daytime-4.png,arrow-daytime-4,arrow-daytime,16,64,潮流・流向矢印(横線4本),潮流/流向箭头(横杠4条),,,medium,文件名族 + 图形外观,该组不在 new pec「記号一覧」点/线图例中形成一对一条目,属于流向/流速显示组件。 +fill-daytime-175.png,fill-daytime-175,fill-daytime,16,16,浅所危険界/障害区域系の交差パターン,浅滩危险界/障碍区域类交叉纹理,,区域/障害物/漁業区域,low,区域填充图案与 new pec 图例对照,fill sprite 是可重复填充纹理,语义为区域表现组件;低置信度项需结合图层业务字段确认。 +fill-daytime-401.png,fill-daytime-401,fill-daytime,16,16,岩礁・危険物区域の斜線パターン,岩礁/危险物区域斜线填充,image220,区域/障害物/漁業区域,medium,区域填充图案与 new pec 图例对照,fill sprite 是可重复填充纹理,语义为区域表现组件;低置信度项需结合图层业务字段确认。 +fill-daytime-407.png,fill-daytime-407,fill-daytime,16,16,区域斜線パターン(淡色),区域斜线填充(浅色),,区域/障害物/漁業区域,low,区域填充图案与 new pec 图例对照,fill sprite 是可重复填充纹理,语义为区域表现组件;低置信度项需结合图层业务字段确认。 +fill-daytime-420.png,fill-daytime-420,fill-daytime,16,16,険悪物区域・交差パターン,碍航物区域交叉填充,image221,区域/障害物/漁業区域,medium,区域填充图案与 new pec 图例对照,fill sprite 是可重复填充纹理,语义为区域表现组件;低置信度项需结合图层业务字段确认。 +fill-daytime-421.png,fill-daytime-421,fill-daytime,32,32,サンドウェーブ・急潮等の波形パターン,沙波/急流等波形区域填充,image222,区域/障害物/漁業区域,medium,区域填充图案与 new pec 图例对照,fill sprite 是可重复填充纹理,语义为区域表现组件;低置信度项需结合图层业务字段确认。 +fill-daytime-427.png,fill-daytime-427,fill-daytime,32,32,障害物区域の編み目パターン,障碍物区域网纹填充,image223,区域/障害物/漁業区域,medium,区域填充图案与 new pec 图例对照,fill sprite 是可重复填充纹理,语义为区域表现组件;低置信度项需结合图层业务字段确认。 +fill-daytime-428.png,fill-daytime-428,fill-daytime,16,16,魚礁区域の点パターン,鱼礁区域点状填充,image224,区域/障害物/漁業区域,medium,区域填充图案与 new pec 图例对照,fill sprite 是可重复填充纹理,语义为区域表现组件;低置信度项需结合图层业务字段确认。 +fill-daytime-429.png,fill-daytime-429,fill-daytime,16,16,危険魚礁区域のマゼンタ点パターン,危险鱼礁区域洋红点状填充,,区域/障害物/漁業区域,medium,区域填充图案与 new pec 图例对照,fill sprite 是可重复填充纹理,语义为区域表现组件;低置信度项需结合图层业务字段确认。 +fill-daytime-745.png,fill-daytime-745,fill-daytime,8,8,赤色点状区域パターン,红色点状区域填充,,区域/障害物/漁業区域,low,区域填充图案与 new pec 图例对照,fill sprite 是可重复填充纹理,语义为区域表现组件;低置信度项需结合图层业务字段确认。 +fill-daytime-746.png,fill-daytime-746,fill-daytime,8,8,黄色点状区域パターン,黄色点状区域填充,,区域/障害物/漁業区域,low,区域填充图案与 new pec 图例对照,fill sprite 是可重复填充纹理,语义为区域表现组件;低置信度项需结合图层业务字段确认。 +fill-daytime-747.png,fill-daytime-747,fill-daytime,8,8,緑色点状区域パターン,绿色点状区域填充,,区域/障害物/漁業区域,low,区域填充图案与 new pec 图例对照,fill sprite 是可重复填充纹理,语义为区域表现组件;低置信度项需结合图层业务字段确认。 +fill-daytime-750.png,fill-daytime-750,fill-daytime,16,16,灰緑点状区域パターン,灰绿色点状区域填充,,区域/障害物/漁業区域,low,区域填充图案与 new pec 图例对照,fill sprite 是可重复填充纹理,语义为区域表现组件;低置信度项需结合图层业务字段确认。 +fill-daytime-753.png,fill-daytime-753,fill-daytime,8,8,黄系格子/点状区域パターン,黄系网格/点状区域填充,,区域/障害物/漁業区域,low,区域填充图案与 new pec 图例对照,fill sprite 是可重复填充纹理,语义为区域表现组件;低置信度项需结合图层业务字段确认。 +fill-daytime-754.png,fill-daytime-754,fill-daytime,16,16,灰緑点状・交差区域パターン,灰绿色点状/交叉区域填充,,区域/障害物/漁業区域,low,区域填充图案与 new pec 图例对照,fill sprite 是可重复填充纹理,语义为区域表现组件;低置信度项需结合图层业务字段确认。 +fill-daytime-755.png,fill-daytime-755,fill-daytime,32,32,マゼンタ網目区域パターン,洋红网纹区域填充,,区域/障害物/漁業区域,low,区域填充图案与 new pec 图例对照,fill sprite 是可重复填充纹理,语义为区域表现组件;低置信度项需结合图层业务字段确认。 +fill-daytime-756.png,fill-daytime-756,fill-daytime,16,16,灰緑斜線区域パターン,灰绿色斜线区域填充,,区域/障害物/漁業区域,low,区域填充图案与 new pec 图例对照,fill sprite 是可重复填充纹理,语义为区域表现组件;低置信度项需结合图层业务字段确认。 +fill-daytime-900.png,fill-daytime-900,fill-daytime,8,8,定置漁業の格子パターン,定置渔业网格填充,,区域/障害物/漁業区域,medium,区域填充图案与 new pec 图例对照,fill sprite 是可重复填充纹理,语义为区域表现组件;低置信度项需结合图层业务字段确认。 +fill-daytime-910.png,fill-daytime-910,fill-daytime,16,16,区画漁業の斜線パターン,区划渔业斜线填充,,区域/障害物/漁業区域,medium,区域填充图案与 new pec 图例对照,fill sprite 是可重复填充纹理,语义为区域表现组件;低置信度项需结合图层业务字段确认。 +light-daytime-1.png,light-daytime-1,light-daytime,64,64,灯(緑),灯(绿),image079,航路標識群,high,灯色与 new pec 图例直接对应, +light-daytime-2.png,light-daytime-2,light-daytime,64,64,灯(赤),灯(红),image080,航路標識群,high,灯色与 new pec 图例直接对应, +light-daytime-3.png,light-daytime-3,light-daytime,64,64,灯(黄、白),灯(黄/白),image081,航路標識群,high,灯色与 new pec 图例直接对应, +line-daytime-710.png,line-daytime-710,line-daytime,32,32,海底線(電信・電話/電力),海底电缆(通信/电力),image042,航路境界等、錨泊地等、施設・境界線等(線・区域),high,线型图案与 new pec 图例对照,line sprite 是重复纹理/线段组件,未必等同于完整对象图标。 +line-daytime-712.png,line-daytime-712,line-daytime,32,32,海底輸送管(水),海底输水管,image043,航路境界等、錨泊地等、施設・境界線等(線・区域),high,线型图案与 new pec 图例对照,line sprite 是重复纹理/线段组件,未必等同于完整对象图标。 +line-daytime-713.png,line-daytime-713,line-daytime,32,32,海底輸送管(油・ガス),海底油/气输送管,image044,航路境界等、錨泊地等、施設・境界線等(線・区域),high,线型图案与 new pec 图例对照,line sprite 是重复纹理/线段组件,未必等同于完整对象图标。 +line-daytime-721.png,line-daytime-721,line-daytime,16,16,制限区域境界(短い直角目盛を伴う線),限制区域边界(带短垂直刻线),image047,航路境界等、錨泊地等、施設・境界線等(線・区域),medium,线型图案与 new pec 图例对照,line sprite 是重复纹理/线段组件,未必等同于完整对象图标。 +line-daytime-730.png,line-daytime-730,line-daytime,128,128,情報/注意を伴う波形線記号,带信息/注意标记的波形线符号,,航路境界等、錨泊地等、施設・境界線等(線・区域),low,线型外观推定,line sprite 是重复纹理/线段组件,未必等同于完整对象图标。 +line-daytime-748.png,line-daytime-748,line-daytime,128,128,誘導線(矢印付き線),诱导线(带箭头),image060,航路境界等、錨泊地等、施設・境界線等(線・区域),medium,线型图案与 new pec 图例对照,line sprite 是重复纹理/线段组件,未必等同于完整对象图标。 +line-daytime-754.png,line-daytime-754,line-daytime,16,16,直角目盛付き境界線パターン,带直角刻线的边界线纹理,,航路境界等、錨泊地等、施設・境界線等(線・区域),low,线型外观推定,line sprite 是重复纹理/线段组件,未必等同于完整对象图标。 +shipfinder-hull-blue.png,shipfinder-hull-blue,shipfinder,32,64,船舶船体(青),船舶船体(蓝),,,high,文件名语义 + 图形外观,应用UI/船舶目标显示组件,不属于 new pec 海图符号表的一对一项目。 +shipfinder-hull-gray.png,shipfinder-hull-gray,shipfinder,32,64,船舶船体(灰),船舶船体(灰),,,high,文件名语义 + 图形外观,应用UI/船舶目标显示组件,不属于 new pec 海图符号表的一对一项目。 +shipfinder-hull-green.png,shipfinder-hull-green,shipfinder,32,64,船舶船体(緑),船舶船体(绿),,,high,文件名语义 + 图形外观,应用UI/船舶目标显示组件,不属于 new pec 海图符号表的一对一项目。 +shipfinder-hull-orange.png,shipfinder-hull-orange,shipfinder,32,64,船舶船体(橙),船舶船体(橙),,,high,文件名语义 + 图形外观,应用UI/船舶目标显示组件,不属于 new pec 海图符号表的一对一项目。 +shipfinder-hull-red.png,shipfinder-hull-red,shipfinder,32,64,船舶船体(赤),船舶船体(红),,,high,文件名语义 + 图形外观,应用UI/船舶目标显示组件,不属于 new pec 海图符号表的一对一项目。 +shipfinder-hull-yellow.png,shipfinder-hull-yellow,shipfinder,32,64,船舶船体(黄),船舶船体(黄),,,high,文件名语义 + 图形外观,应用UI/船舶目标显示组件,不属于 new pec 海图符号表的一对一项目。 +shipfinder-left.png,shipfinder-left,shipfinder,32,128,左転/左側進路補助記号,左转/左侧航向辅助符号,,,high,文件名语义 + 图形外观,应用UI/船舶目标显示组件,不属于 new pec 海图符号表的一对一项目。 +shipfinder-lost.png,shipfinder-lost,shipfinder,32,48,船舶ターゲット消失/ロスト,船舶目标丢失,,,high,文件名语义 + 图形外观,应用UI/船舶目标显示组件,不属于 new pec 海图符号表的一对一项目。 +shipfinder-right.png,shipfinder-right,shipfinder,32,128,右転/右側進路補助記号,右转/右侧航向辅助符号,,,high,文件名语义 + 图形外观,应用UI/船舶目标显示组件,不属于 new pec 海图符号表的一对一项目。 +shipfinder-sog1.png,shipfinder-sog1,shipfinder,4,600,SOGベクトル目盛 1,SOG速度矢量刻度1,,,high,文件名语义 + 图形外观,应用UI/船舶目标显示组件,不属于 new pec 海图符号表的一对一项目。 +shipfinder-sog2.png,shipfinder-sog2,shipfinder,4,600,SOGベクトル目盛 2,SOG速度矢量刻度2,,,high,文件名语义 + 图形外观,应用UI/船舶目标显示组件,不属于 new pec 海图符号表的一对一项目。 +shipfinder-sog3.png,shipfinder-sog3,shipfinder,4,600,SOGベクトル目盛 3,SOG速度矢量刻度3,,,high,文件名语义 + 图形外观,应用UI/船舶目标显示组件,不属于 new pec 海图符号表的一对一项目。 +shipfinder-sog4.png,shipfinder-sog4,shipfinder,4,600,SOGベクトル目盛 4,SOG速度矢量刻度4,,,high,文件名语义 + 图形外观,应用UI/船舶目标显示组件,不属于 new pec 海图符号表的一对一项目。 +shipfinder-sog5.png,shipfinder-sog5,shipfinder,4,600,SOGベクトル目盛 5,SOG速度矢量刻度5,,,high,文件名语义 + 图形外观,应用UI/船舶目标显示组件,不属于 new pec 海图符号表的一对一项目。 +shipfinder-sog6.png,shipfinder-sog6,shipfinder,4,600,SOGベクトル目盛 6,SOG速度矢量刻度6,,,high,文件名语义 + 图形外观,应用UI/船舶目标显示组件,不属于 new pec 海图符号表的一对一项目。 +shipfinder-straight.png,shipfinder-straight,shipfinder,4,128,直進/進路補助記号,直行/航向辅助符号,,,high,文件名语义 + 图形外观,应用UI/船舶目标显示组件,不属于 new pec 海图符号表的一对一项目。 +symbol-daytime-300.png,symbol-daytime-300,symbol-daytime,96,128,沿岸灯台,沿岸灯塔,image067,航路標識群,high,图形直接对照 new pec 符号表, +symbol-daytime-301.png,symbol-daytime-301,symbol-daytime,24,96,港湾灯台,港湾灯塔,image068,航路標識群,medium,图形/结构与 new pec 符号表近似对照, +symbol-daytime-302.png,symbol-daytime-302,symbol-daytime,16,64,防波堤灯台,防波堤灯塔,image069,航路標識群,medium,图形/结构与 new pec 符号表近似对照, +symbol-daytime-303.png,symbol-daytime-303,symbol-daytime,20,20,灯火星形記号,灯光星形符号,,,low,图形/结构与 new pec 符号表近似对照, +symbol-daytime-30500001.png,symbol-daytime-30500001,symbol-daytime,96,64,灯標(緑),灯标(绿),image086,航路標識群,high,图形直接对照 new pec 符号表, +symbol-daytime-30500002.png,symbol-daytime-30500002,symbol-daytime,96,64,灯標(赤),灯标(红),image087,航路標識群,high,图形直接对照 new pec 符号表, +symbol-daytime-30500003.png,symbol-daytime-30500003,symbol-daytime,96,64,灯標(黄、白),灯标(黄/白),image088,航路標識群,high,图形直接对照 new pec 符号表, +symbol-daytime-30700001.png,symbol-daytime-30700001,symbol-daytime,64,120,灯浮標(緑),灯浮标(绿),image098,航路標識群,high,图形直接对照 new pec 符号表, +symbol-daytime-30700002.png,symbol-daytime-30700002,symbol-daytime,64,120,灯浮標(赤),灯浮标(红),image099,航路標識群,high,图形直接对照 new pec 符号表, +symbol-daytime-30700003.png,symbol-daytime-30700003,symbol-daytime,64,120,灯浮標(黄、白),灯浮标(黄/白),image100,航路標識群,high,图形直接对照 new pec 符号表, +symbol-daytime-308.png,symbol-daytime-308,symbol-daytime,64,64,無線局・レーダー局(円形記号),无线电站/雷达站(圆形符号),image083,航路標識群,medium,图形/结构与 new pec 符号表近似对照, +symbol-daytime-310.png,symbol-daytime-310,symbol-daytime,32,96,立標,立标,image085,航路標識群,high,图形直接对照 new pec 符号表, +symbol-daytime-311350.png,symbol-daytime-311350,symbol-daytime,32,96,左舷標識灯標,左舷标识灯标,image089,航路標識群,high,结构族 + 顶标形状与 new pec 图例直接对应, +symbol-daytime-311351.png,symbol-daytime-311351,symbol-daytime,32,96,右舷標識灯標,右舷标识灯标,image090,航路標識群,high,结构族 + 顶标形状与 new pec 图例直接对应, +symbol-daytime-311354.png,symbol-daytime-311354,symbol-daytime,32,96,北方位標識灯標,北方位灯标,image091,航路標識群,high,结构族 + 顶标形状与 new pec 图例直接对应, +symbol-daytime-311355.png,symbol-daytime-311355,symbol-daytime,32,96,東方位標識灯標,东方位灯标,image092,航路標識群,high,结构族 + 顶标形状与 new pec 图例直接对应, +symbol-daytime-311356.png,symbol-daytime-311356,symbol-daytime,32,96,西方位標識灯標,西方位灯标,image093,航路標識群,high,结构族 + 顶标形状与 new pec 图例直接对应, +symbol-daytime-311357.png,symbol-daytime-311357,symbol-daytime,32,96,南方位標識灯標,南方位灯标,image094,航路標識群,high,结构族 + 顶标形状与 new pec 图例直接对应, +symbol-daytime-311358.png,symbol-daytime-311358,symbol-daytime,32,96,孤立障害標識灯標,孤立危险灯标,image095,航路標識群,high,结构族 + 顶标形状与 new pec 图例直接对应, +symbol-daytime-311359.png,symbol-daytime-311359,symbol-daytime,32,96,安全水域標識灯標,安全水域灯标,image096,航路標識群,high,结构族 + 顶标形状与 new pec 图例直接对应, +symbol-daytime-311360.png,symbol-daytime-311360,symbol-daytime,32,96,特殊標識灯標,特殊标识灯标,image097,航路標識群,high,结构族 + 顶标形状与 new pec 图例直接对应, +symbol-daytime-311362.png,symbol-daytime-311362,symbol-daytime,32,96,灯標・立標型 + 係船・円環頂標系,灯标/立标型 + 系船/圆环顶标类,,航路標識群,low,结构族 + 顶标形状推定,HTML中未找到该结构族与此顶标的唯一一对一图例;导航含义按顶标确定。 +symbol-daytime-312350.png,symbol-daytime-312350,symbol-daytime,64,96,左舷灯浮標,左舷灯浮标,image101,航路標識群,high,结构族 + 顶标形状与 new pec 图例直接对应, +symbol-daytime-312351.png,symbol-daytime-312351,symbol-daytime,64,96,右舷灯浮標,右舷灯浮标,image102,航路標識群,high,结构族 + 顶标形状与 new pec 图例直接对应, +symbol-daytime-312354.png,symbol-daytime-312354,symbol-daytime,64,96,北方位灯浮標,北方位灯浮标,image105,航路標識群,high,结构族 + 顶标形状与 new pec 图例直接对应, +symbol-daytime-312355.png,symbol-daytime-312355,symbol-daytime,64,96,東方位灯浮標,东方位灯浮标,image107,航路標識群,high,结构族 + 顶标形状与 new pec 图例直接对应, +symbol-daytime-312356.png,symbol-daytime-312356,symbol-daytime,64,96,西方位灯浮標,西方位灯浮标,image108,航路標識群,high,结构族 + 顶标形状与 new pec 图例直接对应, +symbol-daytime-312357.png,symbol-daytime-312357,symbol-daytime,64,96,南方位灯浮標,南方位灯浮标,image106,航路標識群,high,结构族 + 顶标形状与 new pec 图例直接对应, +symbol-daytime-312358.png,symbol-daytime-312358,symbol-daytime,64,96,孤立障害灯浮標,孤立危险灯浮标,image109,航路標識群,high,结构族 + 顶标形状与 new pec 图例直接对应, +symbol-daytime-312359.png,symbol-daytime-312359,symbol-daytime,64,96,安全水域灯浮標,安全水域灯浮标,image110,航路標識群,high,结构族 + 顶标形状与 new pec 图例直接对应, +symbol-daytime-312360.png,symbol-daytime-312360,symbol-daytime,64,96,特殊標識灯浮標,特殊标识灯浮标,image111,航路標識群,high,结构族 + 顶标形状与 new pec 图例直接对应, +symbol-daytime-313362.png,symbol-daytime-313362,symbol-daytime,48,64,大型係船浮標,大型系船浮标,image125,航路標識群,medium,图形/结构与 new pec 符号表近似对照, +symbol-daytime-314.png,symbol-daytime-314,symbol-daytime,48,96,浮標(やぐら形),架形浮标,image112,航路標識群,medium,图形/结构与 new pec 符号表近似对照, +symbol-daytime-314350.png,symbol-daytime-314350,symbol-daytime,48,96,左舷浮標,左舷浮标,image113,航路標識群,high,结构族 + 顶标形状与 new pec 图例直接对应, +symbol-daytime-314351.png,symbol-daytime-314351,symbol-daytime,48,96,右舷浮標,右舷浮标,image114,航路標識群,high,结构族 + 顶标形状与 new pec 图例直接对应, +symbol-daytime-314354.png,symbol-daytime-314354,symbol-daytime,48,96,北方位浮標,北方位浮标,image115,航路標識群,high,结构族 + 顶标形状与 new pec 图例直接对应, +symbol-daytime-314355.png,symbol-daytime-314355,symbol-daytime,48,96,東方位浮標,东方位浮标,image117,航路標識群,high,结构族 + 顶标形状与 new pec 图例直接对应, +symbol-daytime-314356.png,symbol-daytime-314356,symbol-daytime,48,96,西方位浮標,西方位浮标,image118,航路標識群,high,结构族 + 顶标形状与 new pec 图例直接对应, +symbol-daytime-314357.png,symbol-daytime-314357,symbol-daytime,48,96,南方位浮標,南方位浮标,image116,航路標識群,high,结构族 + 顶标形状与 new pec 图例直接对应, +symbol-daytime-314358.png,symbol-daytime-314358,symbol-daytime,48,96,孤立障害浮標,孤立危险浮标,image119,航路標識群,high,结构族 + 顶标形状与 new pec 图例直接对应, +symbol-daytime-314359.png,symbol-daytime-314359,symbol-daytime,48,96,安全水域浮標,安全水域浮标,image120,航路標識群,high,结构族 + 顶标形状与 new pec 图例直接对应, +symbol-daytime-314360.png,symbol-daytime-314360,symbol-daytime,48,96,特殊標識浮標,特殊标识浮标,image121,航路標識群,high,结构族 + 顶标形状与 new pec 图例直接对应, +symbol-daytime-314362.png,symbol-daytime-314362,symbol-daytime,48,96,浮標(やぐら形)系 + 係船・円環頂標系,架形浮标类 + 系船/圆环顶标类,,航路標識群,low,结构族 + 顶标形状推定,HTML中未找到该结构族与此顶标的唯一一对一图例;导航含义按顶标确定。 +symbol-daytime-316.png,symbol-daytime-316,symbol-daytime,32,128,特大灯標,特大灯标,image127,航路標識群,medium,图形/结构与 new pec 符号表近似对照, +symbol-daytime-316350.png,symbol-daytime-316350,symbol-daytime,32,128,特大灯標・大型塔架系 + 左舷標識,特大灯标/大型塔架类 + 左舷标识,,航路標識群,medium,结构族 + 顶标形状推定,HTML中未找到该结构族与此顶标的唯一一对一图例;导航含义按顶标确定。 +symbol-daytime-316351.png,symbol-daytime-316351,symbol-daytime,32,128,特大灯標・大型塔架系 + 右舷標識,特大灯标/大型塔架类 + 右舷标识,,航路標識群,medium,结构族 + 顶标形状推定,HTML中未找到该结构族与此顶标的唯一一对一图例;导航含义按顶标确定。 +symbol-daytime-316354.png,symbol-daytime-316354,symbol-daytime,32,128,特大灯標・大型塔架系 + 北方位標識,特大灯标/大型塔架类 + 北方位标识,,航路標識群,medium,结构族 + 顶标形状推定,HTML中未找到该结构族与此顶标的唯一一对一图例;导航含义按顶标确定。 +symbol-daytime-316355.png,symbol-daytime-316355,symbol-daytime,32,128,特大灯標・大型塔架系 + 東方位標識,特大灯标/大型塔架类 + 东方位标识,,航路標識群,medium,结构族 + 顶标形状推定,HTML中未找到该结构族与此顶标的唯一一对一图例;导航含义按顶标确定。 +symbol-daytime-316356.png,symbol-daytime-316356,symbol-daytime,32,128,特大灯標・大型塔架系 + 西方位標識,特大灯标/大型塔架类 + 西方位标识,,航路標識群,medium,结构族 + 顶标形状推定,HTML中未找到该结构族与此顶标的唯一一对一图例;导航含义按顶标确定。 +symbol-daytime-316357.png,symbol-daytime-316357,symbol-daytime,32,128,特大灯標・大型塔架系 + 南方位標識,特大灯标/大型塔架类 + 南方位标识,,航路標識群,medium,结构族 + 顶标形状推定,HTML中未找到该结构族与此顶标的唯一一对一图例;导航含义按顶标确定。 +symbol-daytime-316358.png,symbol-daytime-316358,symbol-daytime,32,128,特大灯標・大型塔架系 + 孤立障害標識,特大灯标/大型塔架类 + 孤立危险标识,,航路標識群,medium,结构族 + 顶标形状推定,HTML中未找到该结构族与此顶标的唯一一对一图例;导航含义按顶标确定。 +symbol-daytime-316359.png,symbol-daytime-316359,symbol-daytime,32,128,特大灯標・大型塔架系 + 安全水域標識,特大灯标/大型塔架类 + 安全水域标识,,航路標識群,medium,结构族 + 顶标形状推定,HTML中未找到该结构族与此顶标的唯一一对一图例;导航含义按顶标确定。 +symbol-daytime-316360.png,symbol-daytime-316360,symbol-daytime,32,128,特大灯標・大型塔架系 + 特殊標識,特大灯标/大型塔架类 + 特殊标识,,航路標識群,medium,结构族 + 顶标形状推定,HTML中未找到该结构族与此顶标的唯一一对一图例;导航含义按顶标确定。 +symbol-daytime-316362.png,symbol-daytime-316362,symbol-daytime,32,128,特大灯標・大型塔架系 + 係船・円環頂標系,特大灯标/大型塔架类 + 系船/圆环顶标类,,航路標識群,low,结构族 + 顶标形状推定,HTML中未找到该结构族与此顶标的唯一一对一图例;导航含义按顶标确定。 +symbol-daytime-317.png,symbol-daytime-317,symbol-daytime,32,96,タワー型標識,塔式标识,image128,航路標識群,high,图形直接对照 new pec 符号表, +symbol-daytime-318350.png,symbol-daytime-318350,symbol-daytime,32,96,タワー型灯標(左舷標識),塔式灯标(左舷),image132,航路標識群,high,结构族 + 顶标形状与 new pec 图例直接对应, +symbol-daytime-318351.png,symbol-daytime-318351,symbol-daytime,32,96,タワー型灯標(右舷標識),塔式灯标(右舷),image133,航路標識群,high,结构族 + 顶标形状与 new pec 图例直接对应, +symbol-daytime-318354.png,symbol-daytime-318354,symbol-daytime,32,96,タワー型灯標(北方位標識),塔式灯标(北方位),image136,航路標識群,high,结构族 + 顶标形状与 new pec 图例直接对应, +symbol-daytime-318355.png,symbol-daytime-318355,symbol-daytime,32,96,タワー型灯標(東方位標識),塔式灯标(东方位),image138,航路標識群,high,结构族 + 顶标形状与 new pec 图例直接对应, +symbol-daytime-318356.png,symbol-daytime-318356,symbol-daytime,32,96,タワー型浮標(西方位標識),塔式浮标(西方位),image139,航路標識群,high,结构族 + 顶标形状与 new pec 图例直接对应, +symbol-daytime-318357.png,symbol-daytime-318357,symbol-daytime,32,96,タワー型灯標(南方位標識),塔式灯标(南方位),image137,航路標識群,high,结构族 + 顶标形状与 new pec 图例直接对应, +symbol-daytime-318358.png,symbol-daytime-318358,symbol-daytime,32,96,タワー型灯標(孤立障害標識),塔式灯标(孤立危险),image140,航路標識群,high,结构族 + 顶标形状与 new pec 图例直接对应, +symbol-daytime-318359.png,symbol-daytime-318359,symbol-daytime,32,96,タワー型灯標系 + 安全水域標識,塔式灯标类 + 安全水域标识,,航路標識群,medium,结构族 + 顶标形状推定,HTML中未找到该结构族与此顶标的唯一一对一图例;导航含义按顶标确定。 +symbol-daytime-318360.png,symbol-daytime-318360,symbol-daytime,32,96,タワー型灯標(特殊標識),塔式灯标(特殊标识),image141,航路標識群,high,结构族 + 顶标形状与 new pec 图例直接对应, +symbol-daytime-318362.png,symbol-daytime-318362,symbol-daytime,32,96,タワー型灯標系 + 係船・円環頂標系,塔式灯标类 + 系船/圆环顶标类,,航路標識群,low,结构族 + 顶标形状推定,HTML中未找到该结构族与此顶标的唯一一对一图例;导航含义按顶标确定。 +symbol-daytime-320.png,symbol-daytime-320,symbol-daytime,16,16,球形浮標(小型/簡略図式),球形浮标(小型/简化图式),image145,航路標識群,medium,图形/结构与 new pec 符号表近似对照, +symbol-daytime-321.png,symbol-daytime-321,symbol-daytime,48,96,球形浮標,球形浮标,image145,航路標識群,high,图形直接对照 new pec 符号表, +symbol-daytime-321350.png,symbol-daytime-321350,symbol-daytime,48,96,球形浮標系 + 左舷標識,球形浮标类 + 左舷标识,,航路標識群,medium,结构族 + 顶标形状推定,HTML中未找到该结构族与此顶标的唯一一对一图例;导航含义按顶标确定。 +symbol-daytime-321351.png,symbol-daytime-321351,symbol-daytime,48,96,球形浮標系 + 右舷標識,球形浮标类 + 右舷标识,,航路標識群,medium,结构族 + 顶标形状推定,HTML中未找到该结构族与此顶标的唯一一对一图例;导航含义按顶标确定。 +symbol-daytime-321354.png,symbol-daytime-321354,symbol-daytime,48,96,球形浮標系 + 北方位標識,球形浮标类 + 北方位标识,,航路標識群,medium,结构族 + 顶标形状推定,HTML中未找到该结构族与此顶标的唯一一对一图例;导航含义按顶标确定。 +symbol-daytime-321355.png,symbol-daytime-321355,symbol-daytime,48,96,球形浮標系 + 東方位標識,球形浮标类 + 东方位标识,,航路標識群,medium,结构族 + 顶标形状推定,HTML中未找到该结构族与此顶标的唯一一对一图例;导航含义按顶标确定。 +symbol-daytime-321356.png,symbol-daytime-321356,symbol-daytime,48,96,球形浮標系 + 西方位標識,球形浮标类 + 西方位标识,,航路標識群,medium,结构族 + 顶标形状推定,HTML中未找到该结构族与此顶标的唯一一对一图例;导航含义按顶标确定。 +symbol-daytime-321357.png,symbol-daytime-321357,symbol-daytime,48,96,球形浮標系 + 南方位標識,球形浮标类 + 南方位标识,,航路標識群,medium,结构族 + 顶标形状推定,HTML中未找到该结构族与此顶标的唯一一对一图例;导航含义按顶标确定。 +symbol-daytime-321358.png,symbol-daytime-321358,symbol-daytime,48,96,球形浮標系 + 孤立障害標識,球形浮标类 + 孤立危险标识,,航路標識群,medium,结构族 + 顶标形状推定,HTML中未找到该结构族与此顶标的唯一一对一图例;导航含义按顶标确定。 +symbol-daytime-321359.png,symbol-daytime-321359,symbol-daytime,48,96,球形浮標系 + 安全水域標識,球形浮标类 + 安全水域标识,,航路標識群,medium,结构族 + 顶标形状推定,HTML中未找到该结构族与此顶标的唯一一对一图例;导航含义按顶标确定。 +symbol-daytime-321360.png,symbol-daytime-321360,symbol-daytime,48,96,球形浮標系 + 特殊標識,球形浮标类 + 特殊标识,,航路標識群,medium,结构族 + 顶标形状推定,HTML中未找到该结构族与此顶标的唯一一对一图例;导航含义按顶标确定。 +symbol-daytime-321362.png,symbol-daytime-321362,symbol-daytime,48,96,球形浮標系 + 係船・円環頂標系,球形浮标类 + 系船/圆环顶标类,,航路標識群,low,结构族 + 顶标形状推定,HTML中未找到该结构族与此顶标的唯一一对一图例;导航含义按顶标确定。 +symbol-daytime-323.png,symbol-daytime-323,symbol-daytime,48,96,円柱形浮標,圆柱形浮标,image147,航路標識群,high,图形直接对照 new pec 符号表, +symbol-daytime-324350.png,symbol-daytime-324350,symbol-daytime,48,96,円柱形灯浮標(左舷標識),圆柱形灯浮标(左舷),image151,航路標識群,high,结构族 + 顶标形状与 new pec 图例直接对应, +symbol-daytime-324351.png,symbol-daytime-324351,symbol-daytime,48,96,円柱形灯浮標(右舷標識),圆柱形灯浮标(右舷),image152,航路標識群,high,结构族 + 顶标形状与 new pec 图例直接对应, +symbol-daytime-324354.png,symbol-daytime-324354,symbol-daytime,48,96,円柱形灯浮標(北方位標識),圆柱形灯浮标(北方位),image155,航路標識群,high,结构族 + 顶标形状与 new pec 图例直接对应, +symbol-daytime-324355.png,symbol-daytime-324355,symbol-daytime,48,96,円柱形灯浮標(東方位標識),圆柱形灯浮标(东方位),image157,航路標識群,high,结构族 + 顶标形状与 new pec 图例直接对应, +symbol-daytime-324356.png,symbol-daytime-324356,symbol-daytime,48,96,円柱形灯浮標(西方位標識),圆柱形灯浮标(西方位),image158,航路標識群,high,结构族 + 顶标形状与 new pec 图例直接对应, +symbol-daytime-324357.png,symbol-daytime-324357,symbol-daytime,48,96,円柱形灯浮標(南方位標識),圆柱形灯浮标(南方位),image156,航路標識群,high,结构族 + 顶标形状与 new pec 图例直接对应, +symbol-daytime-324358.png,symbol-daytime-324358,symbol-daytime,48,96,円柱形灯浮標(孤立障害標識),圆柱形灯浮标(孤立危险),image159,航路標識群,high,结构族 + 顶标形状与 new pec 图例直接对应, +symbol-daytime-324359.png,symbol-daytime-324359,symbol-daytime,48,96,円柱形灯浮標(安全水域標識),圆柱形灯浮标(安全水域),image160,航路標識群,high,结构族 + 顶标形状与 new pec 图例直接对应, +symbol-daytime-324360.png,symbol-daytime-324360,symbol-daytime,48,96,円柱形灯浮標(特殊標識),圆柱形灯浮标(特殊标识),image161,航路標識群,high,结构族 + 顶标形状与 new pec 图例直接对应, +symbol-daytime-324362.png,symbol-daytime-324362,symbol-daytime,48,96,円柱形灯浮標系 + 係船・円環頂標系,圆柱形灯浮标类 + 系船/圆环顶标类,,航路標識群,low,结构族 + 顶标形状推定,HTML中未找到该结构族与此顶标的唯一一对一图例;导航含义按顶标确定。 +symbol-daytime-325.png,symbol-daytime-325,symbol-daytime,48,64,円筒形浮標,圆筒形浮标,image162,航路標識群,high,图形直接对照 new pec 符号表, +symbol-daytime-327.png,symbol-daytime-327,symbol-daytime,40,48,円錐形浮標,圆锥形浮标,image166,航路標識群,high,图形直接对照 new pec 符号表, +symbol-daytime-331.png,symbol-daytime-331,symbol-daytime,32,96,小型標識,小型标识,image171,航路標識群,high,图形直接对照 new pec 符号表, +symbol-daytime-332350.png,symbol-daytime-332350,symbol-daytime,32,96,小型ビーコン(左舷標識),小型信标(左舷),image175,航路標識群,high,结构族 + 顶标形状与 new pec 图例直接对应, +symbol-daytime-332351.png,symbol-daytime-332351,symbol-daytime,32,96,小型ビーコン(右舷標識),小型信标(右舷),image176,航路標識群,high,结构族 + 顶标形状与 new pec 图例直接对应, +symbol-daytime-332354.png,symbol-daytime-332354,symbol-daytime,32,96,小型ビーコン系 + 北方位標識,小型信标类 + 北方位标识,,航路標識群,medium,结构族 + 顶标形状推定,HTML中未找到该结构族与此顶标的唯一一对一图例;导航含义按顶标确定。 +symbol-daytime-332355.png,symbol-daytime-332355,symbol-daytime,32,96,小型ビーコン系 + 東方位標識,小型信标类 + 东方位标识,,航路標識群,medium,结构族 + 顶标形状推定,HTML中未找到该结构族与此顶标的唯一一对一图例;导航含义按顶标确定。 +symbol-daytime-332356.png,symbol-daytime-332356,symbol-daytime,32,96,小型ビーコン系 + 西方位標識,小型信标类 + 西方位标识,,航路標識群,medium,结构族 + 顶标形状推定,HTML中未找到该结构族与此顶标的唯一一对一图例;导航含义按顶标确定。 +symbol-daytime-332357.png,symbol-daytime-332357,symbol-daytime,32,96,小型ビーコン系 + 南方位標識,小型信标类 + 南方位标识,,航路標識群,medium,结构族 + 顶标形状推定,HTML中未找到该结构族与此顶标的唯一一对一图例;导航含义按顶标确定。 +symbol-daytime-332358.png,symbol-daytime-332358,symbol-daytime,32,96,小型ビーコン系 + 孤立障害標識,小型信标类 + 孤立危险标识,,航路標識群,medium,结构族 + 顶标形状推定,HTML中未找到该结构族与此顶标的唯一一对一图例;导航含义按顶标确定。 +symbol-daytime-332359.png,symbol-daytime-332359,symbol-daytime,32,96,小型ビーコン系 + 安全水域標識,小型信标类 + 安全水域标识,,航路標識群,medium,结构族 + 顶标形状推定,HTML中未找到该结构族与此顶标的唯一一对一图例;导航含义按顶标确定。 +symbol-daytime-332360.png,symbol-daytime-332360,symbol-daytime,32,96,小型ビーコン(特殊標識),小型信标(特殊标识),image177,航路標識群,high,结构族 + 顶标形状与 new pec 图例直接对应, +symbol-daytime-332362.png,symbol-daytime-332362,symbol-daytime,32,96,小型ビーコン系 + 係船・円環頂標系,小型信标类 + 系船/圆环顶标类,,航路標識群,low,结构族 + 顶标形状推定,HTML中未找到该结构族与此顶标的唯一一对一图例;导航含义按顶标确定。 +symbol-daytime-333.png,symbol-daytime-333,symbol-daytime,48,96,樽形灯浮標系,桶形灯浮标类,image181,航路標識群,medium,图形/结构与 new pec 符号表近似对照, +symbol-daytime-333350.png,symbol-daytime-333350,symbol-daytime,48,96,樽形/球形灯浮標系 + 左舷標識,桶形/球形灯浮标类 + 左舷标识,,航路標識群,medium,结构族 + 顶标形状推定,HTML中未找到该结构族与此顶标的唯一一对一图例;导航含义按顶标确定。 +symbol-daytime-333351.png,symbol-daytime-333351,symbol-daytime,48,96,樽形/球形灯浮標系 + 右舷標識,桶形/球形灯浮标类 + 右舷标识,,航路標識群,medium,结构族 + 顶标形状推定,HTML中未找到该结构族与此顶标的唯一一对一图例;导航含义按顶标确定。 +symbol-daytime-333354.png,symbol-daytime-333354,symbol-daytime,48,96,樽形/球形灯浮標系 + 北方位標識,桶形/球形灯浮标类 + 北方位标识,,航路標識群,medium,结构族 + 顶标形状推定,HTML中未找到该结构族与此顶标的唯一一对一图例;导航含义按顶标确定。 +symbol-daytime-333355.png,symbol-daytime-333355,symbol-daytime,48,96,樽形/球形灯浮標系 + 東方位標識,桶形/球形灯浮标类 + 东方位标识,,航路標識群,medium,结构族 + 顶标形状推定,HTML中未找到该结构族与此顶标的唯一一对一图例;导航含义按顶标确定。 +symbol-daytime-333356.png,symbol-daytime-333356,symbol-daytime,48,96,樽形/球形灯浮標系 + 西方位標識,桶形/球形灯浮标类 + 西方位标识,,航路標識群,medium,结构族 + 顶标形状推定,HTML中未找到该结构族与此顶标的唯一一对一图例;导航含义按顶标确定。 +symbol-daytime-333357.png,symbol-daytime-333357,symbol-daytime,48,96,樽形/球形灯浮標系 + 南方位標識,桶形/球形灯浮标类 + 南方位标识,,航路標識群,medium,结构族 + 顶标形状推定,HTML中未找到该结构族与此顶标的唯一一对一图例;导航含义按顶标确定。 +symbol-daytime-333358.png,symbol-daytime-333358,symbol-daytime,48,96,樽形/球形灯浮標系 + 孤立障害標識,桶形/球形灯浮标类 + 孤立危险标识,,航路標識群,medium,结构族 + 顶标形状推定,HTML中未找到该结构族与此顶标的唯一一对一图例;导航含义按顶标确定。 +symbol-daytime-333359.png,symbol-daytime-333359,symbol-daytime,48,96,樽形/球形灯浮標系 + 安全水域標識,桶形/球形灯浮标类 + 安全水域标识,,航路標識群,medium,结构族 + 顶标形状推定,HTML中未找到该结构族与此顶标的唯一一对一图例;导航含义按顶标确定。 +symbol-daytime-333360.png,symbol-daytime-333360,symbol-daytime,48,96,樽形/球形灯浮標系 + 特殊標識,桶形/球形灯浮标类 + 特殊标识,,航路標識群,medium,结构族 + 顶标形状推定,HTML中未找到该结构族与此顶标的唯一一对一图例;导航含义按顶标确定。 +symbol-daytime-333362.png,symbol-daytime-333362,symbol-daytime,48,96,樽形/球形灯浮標系 + 係船・円環頂標系,桶形/球形灯浮标类 + 系船/圆环顶标类,,航路標識群,low,结构族 + 顶标形状推定,HTML中未找到该结构族与此顶标的唯一一对一图例;导航含义按顶标确定。 +symbol-daytime-335350.png,symbol-daytime-335350,symbol-daytime,64,64,バーチャルAIS航路標識(左舷標識),虚拟AIS航标(左舷),image184,航路標識群,high,结构族 + 顶标形状与 new pec 图例直接对应, +symbol-daytime-335351.png,symbol-daytime-335351,symbol-daytime,64,64,バーチャルAIS航路標識(右舷標識),虚拟AIS航标(右舷),image185,航路標識群,high,结构族 + 顶标形状与 new pec 图例直接对应, +symbol-daytime-335354.png,symbol-daytime-335354,symbol-daytime,64,64,バーチャルAIS航路標識(北方位標識),虚拟AIS航标(北方位),image186,航路標識群,high,结构族 + 顶标形状与 new pec 图例直接对应, +symbol-daytime-335355.png,symbol-daytime-335355,symbol-daytime,64,64,バーチャルAIS航路標識(東方位標識),虚拟AIS航标(东方位),image188,航路標識群,high,结构族 + 顶标形状与 new pec 图例直接对应, +symbol-daytime-335356.png,symbol-daytime-335356,symbol-daytime,64,64,バーチャルAIS航路標識(西方位標識),虚拟AIS航标(西方位),image189,航路標識群,high,结构族 + 顶标形状与 new pec 图例直接对应, +symbol-daytime-335357.png,symbol-daytime-335357,symbol-daytime,64,64,バーチャルAIS航路標識(南方位標識),虚拟AIS航标(南方位),image187,航路標識群,high,结构族 + 顶标形状与 new pec 图例直接对应, +symbol-daytime-335358.png,symbol-daytime-335358,symbol-daytime,64,64,バーチャルAIS航路標識(孤立障害標識),虚拟AIS航标(孤立危险),image190,航路標識群,high,结构族 + 顶标形状与 new pec 图例直接对应, +symbol-daytime-335359.png,symbol-daytime-335359,symbol-daytime,64,64,バーチャルAIS航路標識(安全水域標識),虚拟AIS航标(安全水域),image191,航路標識群,high,结构族 + 顶标形状与 new pec 图例直接对应, +symbol-daytime-335360.png,symbol-daytime-335360,symbol-daytime,64,64,バーチャルAIS航路標識(特殊標識),虚拟AIS航标(特殊标识),image192,航路標識群,high,结构族 + 顶标形状与 new pec 图例直接对应, +symbol-daytime-335374.png,symbol-daytime-335374,symbol-daytime,64,64,バーチャルAIS航路標識(緊急沈船標識),虚拟AIS航标(紧急沉船标识),image193,航路標識群,high,结构族 + 顶标形状与 new pec 图例直接对应, +symbol-daytime-401.png,symbol-daytime-401,symbol-daytime,32,32,水上岩(露出岩)/干出岩・洗岩系,水上岩(露出岩)/干出岩・洗岩类,image194,障害物群(点),medium,图形/结构与 new pec 符号表近似对照, +symbol-daytime-404.png,symbol-daytime-404,symbol-daytime,32,32,暗岩,暗岩/水下岩,image196,障害物群(点),high,图形直接对照 new pec 符号表, +symbol-daytime-405.png,symbol-daytime-405,symbol-daytime,32,32,掃海済の危険物,已扫测危险物,image197,障害物群(点),high,图形直接对照 new pec 符号表, +symbol-daytime-406.png,symbol-daytime-406,symbol-daytime,24,32,海底火山,海底火山,image198,障害物群(点),high,图形直接对照 new pec 符号表, +symbol-daytime-407.png,symbol-daytime-407,symbol-daytime,32,32,サンゴ礁(干出),珊瑚礁(干出),image199,障害物群(点),high,图形直接对照 new pec 符号表, +symbol-daytime-408.png,symbol-daytime-408,symbol-daytime,32,32,サンゴ礁(暗岩),珊瑚礁(水下/暗岩),image200,障害物群(点),high,图形直接对照 new pec 符号表, +symbol-daytime-409.png,symbol-daytime-409,symbol-daytime,48,48,孤立危険物,孤立危险物,image201,障害物群(点),high,图形直接对照 new pec 符号表, +symbol-daytime-410.png,symbol-daytime-410,symbol-daytime,48,32,船体露出沈船、マスト露出沈船,船体/桅杆露出的沉船,image202,障害物群(点),high,图形直接对照 new pec 符号表, +symbol-daytime-412.png,symbol-daytime-412,symbol-daytime,32,24,危険全沈没船,危险全沉没船,image203,障害物群(点),high,图形直接对照 new pec 符号表, +symbol-daytime-413.png,symbol-daytime-413,symbol-daytime,32,24,測定済みの沈船/全沈没船(危険なし),已测量沉船/无危险全沉没船,image204,障害物群(点),high,图形直接对照 new pec 符号表, +symbol-daytime-414.png,symbol-daytime-414,symbol-daytime,32,12,掃海済みの沈船,已扫测沉船,image205,障害物群(点),high,图形直接对照 new pec 符号表, +symbol-daytime-420.png,symbol-daytime-420,symbol-daytime,32,24,険悪物,碍航物/恶劣底质危险物,image206,障害物群(点),high,图形直接对照 new pec 符号表, +symbol-daytime-421.png,symbol-daytime-421,symbol-daytime,40,16,サンドウェーブ,沙波,image207,障害物群(点),high,图形直接对照 new pec 符号表, +symbol-daytime-422.png,symbol-daytime-422,symbol-daytime,40,16,急潮・波紋,急流/波纹,image208,障害物群(点),high,图形直接对照 new pec 符号表, +symbol-daytime-424.png,symbol-daytime-424,symbol-daytime,40,48,渦流,涡流,image209,障害物群(点),high,图形直接对照 new pec 符号表, +symbol-daytime-425.png,symbol-daytime-425,symbol-daytime,48,16,海草,海草,image210,障害物群(点),high,图形直接对照 new pec 符号表, +symbol-daytime-426.png,symbol-daytime-426,symbol-daytime,32,32,沈木,沉木,image211,障害物群(点),high,图形直接对照 new pec 符号表, +symbol-daytime-427.png,symbol-daytime-427,symbol-daytime,32,32,障害物,障碍物,image212,障害物群(点),high,图形直接对照 new pec 符号表, +symbol-daytime-428.png,symbol-daytime-428,symbol-daytime,48,36,魚礁,鱼礁,image213,障害物群(点),high,图形直接对照 new pec 符号表, +symbol-daytime-429.png,symbol-daytime-429,symbol-daytime,48,36,魚礁(危険なもの),危险鱼礁,image214,障害物群(点),high,图形直接对照 new pec 符号表, +symbol-daytime-430.png,symbol-daytime-430,symbol-daytime,24,24,石油開発台,石油开发平台,image215,障害物群(点),high,图形直接对照 new pec 符号表, +symbol-daytime-431.png,symbol-daytime-431,symbol-daytime,16,16,塔、やぐら、測台,塔/架台/测量台,image216,障害物群(点),high,图形直接对照 new pec 符号表, +symbol-daytime-432.png,symbol-daytime-432,symbol-daytime,16,16,ポンツーン、パイル、杭,浮桥/桩/杭,image217,障害物群(点),high,图形直接对照 new pec 符号表, +symbol-daytime-433.png,symbol-daytime-433,symbol-daytime,24,24,ドルフィン,靠船墩/Dolphin,image218,障害物群(点),high,图形直接对照 new pec 符号表, +symbol-daytime-434.png,symbol-daytime-434,symbol-daytime,24,24,海底設置物、放水口、取水口,海底设施/排水口/取水口,image219,障害物群(点),high,图形直接对照 new pec 符号表, +symbol-daytime-498.png,symbol-daytime-498,symbol-daytime,12,12,汎用黒塗り矩形記号(HTML直接対応未確認),通用黑色实心矩形符号(HTML未直接确认),,,low,图形/结构与 new pec 符号表近似对照, +symbol-daytime-500.png,symbol-daytime-500,symbol-daytime,40,40,パイロットステーション,引航站/引水站,image024,航路境界等、錨泊地等、施設・境界線等(点),high,图形直接对照 new pec 符号表, +symbol-daytime-505.png,symbol-daytime-505,symbol-daytime,40,40,一般港湾、小港湾,一般港湾/小港湾,image025,航路境界等、錨泊地等、施設・境界線等(点),high,图形直接对照 new pec 符号表, +symbol-daytime-520.png,symbol-daytime-520,symbol-daytime,40,40,漁港,渔港,image026,航路境界等、錨泊地等、施設・境界線等(点),high,图形直接对照 new pec 符号表, +symbol-daytime-530.png,symbol-daytime-530,symbol-daytime,40,40,マリーナ,游艇港/码头,image027,航路境界等、錨泊地等、施設・境界線等(点),high,图形直接对照 new pec 符号表, +symbol-daytime-540.png,symbol-daytime-540,symbol-daytime,40,40,フィッシャリーナ,钓鱼休闲港/フィッシャリーナ,image028,航路境界等、錨泊地等、施設・境界線等(点),high,图形直接对照 new pec 符号表, +symbol-daytime-550.png,symbol-daytime-550,symbol-daytime,40,40,海の駅,海之驿/海上服务站,image029,航路境界等、錨泊地等、施設・境界線等(点),high,图形直接对照 new pec 符号表, +symbol-daytime-590.png,symbol-daytime-590,symbol-daytime,12,12,汎用黒塗り矩形記号(HTML直接対応未確認),通用黑色实心矩形符号(HTML未直接确认),,,low,图形/结构与 new pec 符号表近似对照, +symbol-daytime-640.png,symbol-daytime-640,symbol-daytime,48,96,煙突,烟囱,image015,,high,图形直接对照 new pec 符号表, +symbol-daytime-650.png,symbol-daytime-650,symbol-daytime,24,64,塔、やぐら、風車,塔/架台/风车,image016,,high,图形直接对照 new pec 符号表, +symbol-daytime-660.png,symbol-daytime-660,symbol-daytime,24,24,海事関係署,海事相关机关,image017,,medium,图形/结构与 new pec 符号表近似对照, +symbol-daytime-661.png,symbol-daytime-661,symbol-daytime,24,24,漁業共同組合/税関,渔业协同组合/海关,image018,,medium,图形/结构与 new pec 符号表近似对照, +symbol-daytime-670.png,symbol-daytime-670,symbol-daytime,32,32,コンビニエンスストア,便利店,image019,,high,图形直接对照 new pec 符号表, +symbol-daytime-680.png,symbol-daytime-680,symbol-daytime,32,32,陸上顕著物(観覧車等),陆上显著物(摩天轮等),image020,,high,图形直接对照 new pec 符号表, +symbol-daytime-681.png,symbol-daytime-681,symbol-daytime,40,28,山頂,山顶,image021,,high,图形直接对照 new pec 符号表, +symbol-daytime-682.png,symbol-daytime-682,symbol-daytime,62,46,管制信号所,管制信号站,image022,,high,图形直接对照 new pec 符号表, +symbol-daytime-698.png,symbol-daytime-698,symbol-daytime,32,64,その他(記念碑等),其他(纪念碑等),image023,,high,图形直接对照 new pec 符号表, +symbol-daytime-719.png,symbol-daytime-719,symbol-daytime,40,40,検疫錨地,检疫锚地,image030,航路境界等、錨泊地等、施設・境界線等(点),high,图形直接对照 new pec 符号表, +symbol-daytime-720.png,symbol-daytime-720,symbol-daytime,64,64,錨泊(指定)地,指定锚地,image031,航路境界等、錨泊地等、施設・境界線等(点),high,图形直接对照 new pec 符号表, +symbol-daytime-721.png,symbol-daytime-721,symbol-daytime,64,64,制限区域、航路横断等禁止区域、航泊禁止区域,限制区/航路横断禁止区/航泊禁止区,image033,航路境界等、錨泊地等、施設・境界線等(点),high,图形直接对照 new pec 符号表, +symbol-daytime-724.png,symbol-daytime-724,symbol-daytime,64,64,錨泊禁止区域,禁止锚泊区,image034,航路境界等、錨泊地等、施設・境界線等(点),high,图形直接对照 new pec 符号表, +symbol-daytime-759.png,symbol-daytime-759,symbol-daytime,40,90,進路矢印(法律による),法定航向箭头,image036,航路境界等、錨泊地等、施設・境界線等(点),high,图形直接对照 new pec 符号表, +symbol-daytime-760.png,symbol-daytime-760,symbol-daytime,40,90,進路矢印(指導による),指导航向箭头,image037,航路境界等、錨泊地等、施設・境界線等(点),high,图形直接对照 new pec 符号表, +symbol-daytime-761.png,symbol-daytime-761,symbol-daytime,48,32,水源方向,水源方向,image038,航路境界等、錨泊地等、施設・境界線等(点),high,图形直接对照 new pec 符号表, +tidespot-daytime.png,tidespot-daytime,tidespot-daytime,36,32,潮汐・潮流スポット記号,潮汐/潮流站点标记,,,medium,文件名 + 图形外观,属于潮汐/潮流功能标记,不是 new pec 記号一覧中的标准点符号。 diff --git a/src/pbf/coastline-mysql-v2/national/manifest.json b/src/pbf/coastline-mysql-v2/national/manifest.json new file mode 100644 index 0000000..5588d12 --- /dev/null +++ b/src/pbf/coastline-mysql-v2/national/manifest.json @@ -0,0 +1,19 @@ +{ + "database": "navsea_japan_coast_grid", + "generated_at": "2026-05-07T22:29:32", + "layer": { + "name": "hazard_50m", + "count": 3937106, + "bbox_lonlat": [ + 122.00109705155634, + 24.05695613653894, + 149.5272739875467, + 45.91038521822698 + ], + "cell_size_m": 50.0, + "export_file": "src/pbf/coastline-mysql-v2/national/hazard_50m_grid.geojson", + "source_desc": "pbf-delivery-full-20260418-rebuild z12", + "tile_root": "/home/wwwroot/pbf-delivery-full-20260418-rebuild", + "zoom": 12 + } +} \ No newline at end of file diff --git a/src/pbf/coastline-mysql/fish_port_debug/fpc_4320050/buffer_20/manifest.json b/src/pbf/coastline-mysql/fish_port_debug/fpc_4320050/buffer_20/manifest.json new file mode 100644 index 0000000..07079ce --- /dev/null +++ b/src/pbf/coastline-mysql/fish_port_debug/fpc_4320050/buffer_20/manifest.json @@ -0,0 +1,28 @@ +{ + "database": "navsea_japan_coast_grid", + "generated_at": "2026-05-03T13:10:28", + "fpc": "4320050", + "prc": "40", + "buffer_m": 20.0, + "coast_coarse_margin_m": 0.0, + "fish_bbox_lonlat": [ + 130.565319843547, + 33.8792757289029, + 130.57426656385, + 33.8894235239282 + ], + "fish_line_count": 1, + "coast_curve_count": 1, + "coast_bbox_mercator": [ + 14531976.23571004, + 4012408.3473962736, + 14542294.285690773, + 4014195.4032974597 + ], + "coast_200m_window_count": 16, + "scan_window_count": 19, + "cell_coast_count": 449, + "cell_sea_count": 1451, + "feature_count": 1940, + "export_file": "src/pbf/coastline-mysql/fish_port_debug/fpc_4320050/buffer_20/debug.geojson" +} \ No newline at end of file diff --git a/src/pbf/coastline-mysql/fish_port_debug/fpc_4320050/buffer_5/manifest.json b/src/pbf/coastline-mysql/fish_port_debug/fpc_4320050/buffer_5/manifest.json new file mode 100644 index 0000000..1b48474 --- /dev/null +++ b/src/pbf/coastline-mysql/fish_port_debug/fpc_4320050/buffer_5/manifest.json @@ -0,0 +1,28 @@ +{ + "database": "navsea_japan_coast_grid", + "generated_at": "2026-05-03T13:30:53", + "fpc": "4320050", + "prc": "40", + "buffer_m": 5.0, + "coast_coarse_margin_m": 0.0, + "fish_bbox_lonlat": [ + 130.565319843547, + 33.8792757289029, + 130.57426656385, + 33.8894235239282 + ], + "fish_line_count": 1, + "coast_curve_count": 1, + "coast_bbox_mercator": [ + 14531976.23571004, + 4012408.3473962736, + 14542294.285690773, + 4014195.4032974597 + ], + "coast_200m_window_count": 16, + "scan_window_count": 19, + "cell_coast_count": 245, + "cell_sea_count": 1655, + "feature_count": 1940, + "export_file": "src/pbf/coastline-mysql/fish_port_debug/fpc_4320050/buffer_5/debug.geojson" +} \ No newline at end of file diff --git a/src/pbf/coastline-mysql/fukuoka_saga/manifest.json b/src/pbf/coastline-mysql/fukuoka_saga/manifest.json new file mode 100644 index 0000000..ee13a71 --- /dev/null +++ b/src/pbf/coastline-mysql/fukuoka_saga/manifest.json @@ -0,0 +1,44 @@ +{ + "database": "navsea_fukuoka_saga_grid", + "generated_at": "2026-04-24T22:47:04", + "fish_prc": [ + "40", + "41" + ], + "fish_state_filter": "ALL", + "layers": { + "coast_200m": { + "count": 9743, + "bbox_lonlat": [ + 129.7346933325413, + 32.949478517778076, + 131.18816746224667, + 34.25133269393213 + ], + "cell_size_m": 200.0, + "export_file": "src/pbf/coastline-mysql/fukuoka_saga/coast_200m_grid.geojson" + }, + "fish_port_20m": { + "count": 126888, + "bbox_lonlat": [ + 129.75445626879193, + 32.949478517778076, + 130.86297732939542, + 34.0104105922824 + ], + "cell_size_m": 20.0, + "export_file": "src/pbf/coastline-mysql/fukuoka_saga/fish_port_20m_grid.geojson" + }, + "hazard_50m": { + "count": 176454, + "bbox_lonlat": [ + 129.72481186441598, + 32.914795919370135, + 131.22275260068528, + 34.30700374442901 + ], + "cell_size_m": 50.0, + "export_file": "src/pbf/coastline-mysql/fukuoka_saga/hazard_50m_grid.geojson" + } + } +} \ No newline at end of file diff --git a/src/pbf/coastline-mysql/japan_coast_200m/manifest.json b/src/pbf/coastline-mysql/japan_coast_200m/manifest.json new file mode 100644 index 0000000..f3d12d3 --- /dev/null +++ b/src/pbf/coastline-mysql/japan_coast_200m/manifest.json @@ -0,0 +1,25 @@ +{ + "version": "v1.0", + "database": "navsea_japan_coast_grid", + "generated_at": "2026-04-24T19:44:47", + "layer": "coast_200m", + "description": "全国海岸线 200m 硬阻塞格", + "source_desc": "coastline/C23-06_*_GML.zip", + "source_manifest": "out/coastline/japan_coast_grid_mysql/japan_coast_grid_mysql.manifest.json", + "count": 336215, + "cell_size_m": 200.0, + "grid_bounds_lonlat": [ + 122.93265000118826, + 20.424608033511294, + 153.98740937320014, + 45.527805904155706 + ], + "grid_bounds_mercator": [ + 13684800.0, + 2323400.0, + 17141800.0, + 5705000.0 + ], + "grid_file": "coast_200m_grid.geojson", + "notes": "从 navsea_japan_coast_grid.MySQL 直接导出的全国海岸 200m 硬阻塞格" +} \ No newline at end of file diff --git a/src/pbf/coastline-mysql/japan_coast_200m_hakata/manifest.json b/src/pbf/coastline-mysql/japan_coast_200m_hakata/manifest.json new file mode 100644 index 0000000..8228c18 --- /dev/null +++ b/src/pbf/coastline-mysql/japan_coast_200m_hakata/manifest.json @@ -0,0 +1,25 @@ +{ + "version": "v1.0", + "database": "navsea_japan_coast_grid", + "generated_at": "2026-04-24T19:46:24", + "layer": "coast_200m", + "description": "全国海岸线 200m 硬阻塞格", + "source_desc": "coastline/C23-06_*_GML.zip", + "source_manifest": "out/coastline/japan_coast_grid_mysql/japan_coast_grid_mysql.manifest.json", + "count": 3088, + "cell_size_m": 200.0, + "grid_bounds_lonlat": [ + 130.1, + 33.3, + 130.9, + 33.9 + ], + "grid_bounds_mercator": [ + 14482665.752204891, + 3935191.9821054353, + 14571721.34483951, + 4015382.36007316 + ], + "grid_file": "coast_200m_grid.geojson", + "notes": "从 navsea_japan_coast_grid.MySQL 直接导出的全国海岸 200m 硬阻塞格" +} \ No newline at end of file diff --git a/src/pbf/coastline-mysql/japan_national/manifest.json b/src/pbf/coastline-mysql/japan_national/manifest.json new file mode 100644 index 0000000..d5fc941 --- /dev/null +++ b/src/pbf/coastline-mysql/japan_national/manifest.json @@ -0,0 +1,55 @@ +{ + "database": "navsea_japan_coast_grid", + "generated_at": "2026-05-03T09:38:01", + "layers": { + "coast_200m": { + "count": 336215, + "bbox_lonlat": [ + 122.93265000118826, + 20.424608033511294, + 153.98740937320014, + 45.527805904155706 + ], + "cell_size_m": 200.0, + "export_file": "src/pbf/coastline-mysql/japan_national/coast_200m_grid.geojson" + }, + "fish_port_20m": { + "count": 3971790, + "bbox_lonlat": [ + 122.93354831647238, + 24.04555362373063, + 145.81777085330356, + 45.52302281953002 + ], + "cell_size_m": 20.0, + "export_file": "src/pbf/coastline-mysql/japan_national/fish_port_20m_grid.geojson" + }, + "hazard_50m": { + "count": 3950063, + "bbox_lonlat": [ + 122.00109705155634, + 24.05695613653894, + 149.5272739875467, + 45.91038521822698 + ], + "cell_size_m": 50.0, + "export_file": "src/pbf/coastline-mysql/japan_national/hazard_50m_grid.geojson" + }, + "density_overview": { + "count": 7823975, + "bbox_lonlat": [ + 122.00109705155634, + 20.424608033511294, + 153.98740937320014, + 45.91038521822698 + ], + "cell_size_m": null, + "export_file": "src/pbf/coastline-mysql/japan_national/density_overview_grid.geojson", + "by_density": { + "20": 3971790, + "50": 3776059, + "200": 76126 + } + } + } +} \ No newline at end of file diff --git a/src/pbf/coastline-mysql/prc50_test/manifest.json b/src/pbf/coastline-mysql/prc50_test/manifest.json new file mode 100644 index 0000000..f5c1695 --- /dev/null +++ b/src/pbf/coastline-mysql/prc50_test/manifest.json @@ -0,0 +1,19 @@ +{ + "database": "navsea_japan_coast_grid", + "generated_at": "2026-05-03T10:03:16", + "prc": "50", + "layers": { + "fish_port_20m": { + "count": 331, + "bbox_lonlat": [ + 131.96988142248748, + 33.155032042652714, + 131.98120019506737, + 33.16119875056157 + ], + "cell_size_m": 20.0, + "export_file": "src/pbf/coastline-mysql/prc50_test/fish_port_20m_prc50_grid.geojson", + "filter": "state_name='COASTLINE' AND source_name LIKE 'C09-06+coastline PRC=50%'" + } + } +} \ No newline at end of file diff --git a/src/pbf/coastline-only/fukuoka_saga_fish_port_50m/fish_port_grid_fukuoka_saga_50m_manifest.json b/src/pbf/coastline-only/fukuoka_saga_fish_port_50m/fish_port_grid_fukuoka_saga_50m_manifest.json new file mode 100644 index 0000000..b8f2c20 --- /dev/null +++ b/src/pbf/coastline-only/fukuoka_saga_fish_port_50m/fish_port_grid_fukuoka_saga_50m_manifest.json @@ -0,0 +1,34 @@ +{ + "version": "v1.0", + "source_package": "/root/sourceserver/pbf/coastline/C09-06.zip", + "prc_scope": [ + "40", + "41" + ], + "cell_size_m": 50.0, + "line_buffer_m": 80.0, + "polygon_mode": "polygonize", + "selected_line_count": 128, + "polygon_count": 6, + "grid_count": 5772, + "bbox_lonlat": [ + 128.7, + 31.8, + 131.4, + 34.9 + ], + "feature_bbox_lonlat": [ + 129.756426112548, + 32.9478291636797, + 131.1863011125, + 34.246512999841 + ], + "grid_bbox_mercator": [ + 14560814.249114646, + 4022221.735479324, + 14567878.707343385, + 4029977.8891696907 + ], + "line_file": "fish_port_grid_fukuoka_saga_50m_lines.geojson", + "grid_file": "fish_port_grid_fukuoka_saga_50m_grid.geojson" +} \ No newline at end of file diff --git a/src/pbf/coastline-only/fukuoka_saga_fish_port_navsplit_20m/fish_port_navsplit_fukuoka_saga_20m_manifest.json b/src/pbf/coastline-only/fukuoka_saga_fish_port_navsplit_20m/fish_port_navsplit_fukuoka_saga_20m_manifest.json new file mode 100644 index 0000000..3983187 --- /dev/null +++ b/src/pbf/coastline-only/fukuoka_saga_fish_port_navsplit_20m/fish_port_navsplit_fukuoka_saga_20m_manifest.json @@ -0,0 +1,35 @@ +{ + "version": "v1.0", + "fish_port_source": "/root/sourceserver/pbf/coastline/C09-06.zip", + "coastline_sources": [ + "/root/sourceserver/pbf/coastline/C23-06_40_GML.zip", + "/root/sourceserver/pbf/coastline/C23-06_41_GML.zip" + ], + "prc_scope": [ + "40", + "41" + ], + "cell_size_m": 20.0, + "coast_buffer_m": 12.0, + "fish_mode": "polygonize", + "fish_line_count": 128, + "coast_line_count": 1067, + "fish_polygon_count": 6, + "grid_count": 35026, + "land_count": 2196, + "sea_count": 32830, + "bbox_lonlat": [ + 128.7, + 31.8, + 131.4, + 34.9 + ], + "fish_bbox_lonlat": [ + 130.80201989205, + 33.95097999983719, + 130.865481000059, + 34.0087566371229 + ], + "line_file": "fish_port_navsplit_fukuoka_saga_20m_lines.geojson", + "grid_file": "fish_port_navsplit_fukuoka_saga_20m_grid.geojson" +} \ No newline at end of file diff --git a/src/pbf/coastline-only/fukuoka_saga_fish_port_navsplit_25m/fish_port_navsplit_fukuoka_saga_25m_manifest.json b/src/pbf/coastline-only/fukuoka_saga_fish_port_navsplit_25m/fish_port_navsplit_fukuoka_saga_25m_manifest.json new file mode 100644 index 0000000..1e9e601 --- /dev/null +++ b/src/pbf/coastline-only/fukuoka_saga_fish_port_navsplit_25m/fish_port_navsplit_fukuoka_saga_25m_manifest.json @@ -0,0 +1,35 @@ +{ + "version": "v1.0", + "fish_port_source": "/root/sourceserver/pbf/coastline/C09-06.zip", + "coastline_sources": [ + "/root/sourceserver/pbf/coastline/C23-06_40_GML.zip", + "/root/sourceserver/pbf/coastline/C23-06_41_GML.zip" + ], + "prc_scope": [ + "40", + "41" + ], + "cell_size_m": 25.0, + "coast_buffer_m": 15.0, + "fish_mode": "polygonize", + "fish_line_count": 128, + "coast_line_count": 1067, + "fish_polygon_count": 6, + "grid_count": 22535, + "land_count": 1742, + "sea_count": 20793, + "bbox_lonlat": [ + 128.7, + 31.8, + 131.4, + 34.9 + ], + "fish_bbox_lonlat": [ + 130.80201989205, + 33.95097999983719, + 130.865481000059, + 34.0087566371229 + ], + "line_file": "fish_port_navsplit_fukuoka_saga_25m_lines.geojson", + "grid_file": "fish_port_navsplit_fukuoka_saga_25m_grid.geojson" +} \ No newline at end of file diff --git a/src/pbf/coastline-only/fukuoka_saga_fish_port_navsplit_50m/fish_port_navsplit_fukuoka_saga_50m_manifest.json b/src/pbf/coastline-only/fukuoka_saga_fish_port_navsplit_50m/fish_port_navsplit_fukuoka_saga_50m_manifest.json new file mode 100644 index 0000000..dbb17be --- /dev/null +++ b/src/pbf/coastline-only/fukuoka_saga_fish_port_navsplit_50m/fish_port_navsplit_fukuoka_saga_50m_manifest.json @@ -0,0 +1,35 @@ +{ + "version": "v1.0", + "fish_port_source": "/root/sourceserver/pbf/coastline/C09-06.zip", + "coastline_sources": [ + "/root/sourceserver/pbf/coastline/C23-06_40_GML.zip", + "/root/sourceserver/pbf/coastline/C23-06_41_GML.zip" + ], + "prc_scope": [ + "40", + "41" + ], + "cell_size_m": 50.0, + "coast_buffer_m": 25.0, + "fish_mode": "polygonize", + "fish_line_count": 128, + "coast_line_count": 1067, + "fish_polygon_count": 6, + "grid_count": 5772, + "land_count": 737, + "sea_count": 5035, + "bbox_lonlat": [ + 128.7, + 31.8, + 131.4, + 34.9 + ], + "fish_bbox_lonlat": [ + 130.80201989205, + 33.95097999983719, + 130.865481000059, + 34.0087566371229 + ], + "line_file": "fish_port_navsplit_fukuoka_saga_50m_lines.geojson", + "grid_file": "fish_port_navsplit_fukuoka_saga_50m_grid.geojson" +} \ No newline at end of file diff --git a/src/pbf/coastline-only/fukuoka_saga_fish_port_navsplit_full_20m_aoi/fish_port_navsplit_fukuoka_saga_full_20m_aoi.png b/src/pbf/coastline-only/fukuoka_saga_fish_port_navsplit_full_20m_aoi/fish_port_navsplit_fukuoka_saga_full_20m_aoi.png new file mode 100644 index 0000000..d9906ea Binary files /dev/null and b/src/pbf/coastline-only/fukuoka_saga_fish_port_navsplit_full_20m_aoi/fish_port_navsplit_fukuoka_saga_full_20m_aoi.png differ diff --git a/src/pbf/coastline-only/fukuoka_saga_fish_port_navsplit_full_20m_aoi/fish_port_navsplit_fukuoka_saga_full_20m_aoi_manifest.json b/src/pbf/coastline-only/fukuoka_saga_fish_port_navsplit_full_20m_aoi/fish_port_navsplit_fukuoka_saga_full_20m_aoi_manifest.json new file mode 100644 index 0000000..fdf29ca --- /dev/null +++ b/src/pbf/coastline-only/fukuoka_saga_fish_port_navsplit_full_20m_aoi/fish_port_navsplit_fukuoka_saga_full_20m_aoi_manifest.json @@ -0,0 +1,29 @@ +{ + "version": "v1.0", + "aoi_source": "/root/sourceserver/pbf/src/pbf/port-overlay/kyushu/port_overlay_kyushu_areas.geojson", + "coastline_sources": [ + "/root/sourceserver/pbf/coastline/C23-06_40_GML.zip", + "/root/sourceserver/pbf/coastline/C23-06_41_GML.zip" + ], + "cell_size_m": 20.0, + "coast_buffer_m": 12.0, + "fish_polygon_count": 169, + "coast_line_count": 1067, + "grid_count": 1, + "land_count": 0, + "sea_count": 1, + "bbox_lonlat": [ + 129.73110007140482, + 32.9464631795233, + 131.19176072338317, + 34.25430274729531 + ], + "fish_bbox_lonlat": [ + 129.71687300417852, + 32.9341944973693, + 131.19779439355898, + 34.22699057549146 + ], + "line_file": "fish_port_navsplit_fukuoka_saga_full_20m_aoi_lines.geojson", + "grid_file": "fish_port_navsplit_fukuoka_saga_full_20m_aoi_grid.geojson" +} \ No newline at end of file diff --git a/src/pbf/coastline-only/fukuoka_saga_fish_port_navsplit_full_20m_aoi/fish_port_navsplit_fukuoka_saga_full_20m_aoi_raster_manifest.json b/src/pbf/coastline-only/fukuoka_saga_fish_port_navsplit_full_20m_aoi/fish_port_navsplit_fukuoka_saga_full_20m_aoi_raster_manifest.json new file mode 100644 index 0000000..5ee3cc0 --- /dev/null +++ b/src/pbf/coastline-only/fukuoka_saga_fish_port_navsplit_full_20m_aoi/fish_port_navsplit_fukuoka_saga_full_20m_aoi_raster_manifest.json @@ -0,0 +1,14 @@ +{ + "aoi_source": "/root/sourceserver/pbf/src/pbf/port-overlay/kyushu/port_overlay_kyushu_areas.geojson", + "bbox_lonlat": [ + 129.73110007140482, + 32.9464631795233, + 131.19176072338317, + 34.25430274729531 + ], + "pixel_size_m": 20.0, + "selected_polygon_count": 169, + "image_width": 8130, + "image_height": 8740, + "png_file": "fish_port_navsplit_fukuoka_saga_full_20m_aoi.png" +} \ No newline at end of file diff --git a/src/pbf/coastline-only/fukuoka_saga_three_layer/fukuoka_saga_three_layer.png b/src/pbf/coastline-only/fukuoka_saga_three_layer/fukuoka_saga_three_layer.png new file mode 100644 index 0000000..f1d792b Binary files /dev/null and b/src/pbf/coastline-only/fukuoka_saga_three_layer/fukuoka_saga_three_layer.png differ diff --git a/src/pbf/coastline-only/fukuoka_saga_three_layer/fukuoka_saga_three_layer_manifest.json b/src/pbf/coastline-only/fukuoka_saga_three_layer/fukuoka_saga_three_layer_manifest.json new file mode 100644 index 0000000..9218695 --- /dev/null +++ b/src/pbf/coastline-only/fukuoka_saga_three_layer/fukuoka_saga_three_layer_manifest.json @@ -0,0 +1,29 @@ +{ + "bbox_lonlat": [ + 129.73110007140482, + 32.9464631795233, + 131.19176072338317, + 34.25430274729531 + ], + "pixel_size_m": 20.0, + "coast_cell_m": 200.0, + "fish_cell_m": 20.0, + "hazard_cell_m": 50.0, + "fish_polygon_count": 169, + "fish_green_cells": 0, + "fish_red_cells": 20742, + "hazard_cells_50m": 196940, + "hazard_features": 5130, + "hazard_source_counts": { + "anchor_caution_hazard_point": 1377, + "fixed_fishing_gear_area": 1200, + "navigation_marks": 1444, + "anchor_caution_hazard_area": 235, + "navigation_hazard_area": 10, + "navigation_hazard_point": 864 + }, + "pbf_tiles_scanned": 323, + "image_width": 8243, + "image_height": 8638, + "png_file": "fukuoka_saga_three_layer_v8.png" +} \ No newline at end of file diff --git a/src/pbf/coastline-only/fukuoka_saga_three_layer/fukuoka_saga_three_layer_v4.png b/src/pbf/coastline-only/fukuoka_saga_three_layer/fukuoka_saga_three_layer_v4.png new file mode 100644 index 0000000..1f74f3f Binary files /dev/null and b/src/pbf/coastline-only/fukuoka_saga_three_layer/fukuoka_saga_three_layer_v4.png differ diff --git a/src/pbf/coastline-only/fukuoka_saga_three_layer/fukuoka_saga_three_layer_v5.png b/src/pbf/coastline-only/fukuoka_saga_three_layer/fukuoka_saga_three_layer_v5.png new file mode 100644 index 0000000..1f74f3f Binary files /dev/null and b/src/pbf/coastline-only/fukuoka_saga_three_layer/fukuoka_saga_three_layer_v5.png differ diff --git a/src/pbf/coastline-only/fukuoka_saga_three_layer/fukuoka_saga_three_layer_v6.png b/src/pbf/coastline-only/fukuoka_saga_three_layer/fukuoka_saga_three_layer_v6.png new file mode 100644 index 0000000..a9ea996 Binary files /dev/null and b/src/pbf/coastline-only/fukuoka_saga_three_layer/fukuoka_saga_three_layer_v6.png differ diff --git a/src/pbf/coastline-only/fukuoka_saga_three_layer/fukuoka_saga_three_layer_v7.png b/src/pbf/coastline-only/fukuoka_saga_three_layer/fukuoka_saga_three_layer_v7.png new file mode 100644 index 0000000..be5db7a Binary files /dev/null and b/src/pbf/coastline-only/fukuoka_saga_three_layer/fukuoka_saga_three_layer_v7.png differ diff --git a/src/pbf/coastline-only/fukuoka_saga_three_layer/fukuoka_saga_three_layer_v8.png b/src/pbf/coastline-only/fukuoka_saga_three_layer/fukuoka_saga_three_layer_v8.png new file mode 100644 index 0000000..44d1e94 Binary files /dev/null and b/src/pbf/coastline-only/fukuoka_saga_three_layer/fukuoka_saga_three_layer_v8.png differ diff --git a/src/pbf/coastline-only/kyushu/coastline_only_port_overlay_kyushu_manifest.json b/src/pbf/coastline-only/kyushu/coastline_only_port_overlay_kyushu_manifest.json new file mode 100644 index 0000000..5804706 --- /dev/null +++ b/src/pbf/coastline-only/kyushu/coastline_only_port_overlay_kyushu_manifest.json @@ -0,0 +1,45 @@ +{ + "version": "v1.0", + "source_packages": [ + "/root/sourceserver/pbf/coastline/C02-08.zip", + "/root/sourceserver/pbf/coastline/C09-06.zip" + ], + "bbox_lonlat": [ + 123.0, + 31.0, + 132.7, + 34.9 + ], + "line_count": 1965, + "point_count": 1366, + "stats": [ + { + "dataset": "C02-08", + "kind": "harbor", + "path": "/root/sourceserver/pbf/coastline/C02-08.zip", + "line_count": 721, + "point_count": 371, + "bbox_lonlat": [ + 128.611582, + 31.01064, + 132.763907, + 34.92218 + ] + }, + { + "dataset": "C09-06", + "kind": "fish_port", + "path": "/root/sourceserver/pbf/coastline/C09-06.zip", + "line_count": 1244, + "point_count": 995, + "bbox_lonlat": [ + 128.391022775, + 31.0062249998023, + 132.707816000005, + 34.9139741665176 + ] + } + ], + "line_file": "coastline_only_port_overlay_kyushu_lines.geojson", + "point_file": "coastline_only_port_overlay_kyushu_points.geojson" +} \ No newline at end of file diff --git a/src/pbf/coastline/fukuoka_saga_manifest.json b/src/pbf/coastline/fukuoka_saga_manifest.json new file mode 100644 index 0000000..bc309bf --- /dev/null +++ b/src/pbf/coastline/fukuoka_saga_manifest.json @@ -0,0 +1,24 @@ +{ + "version": "v1.0", + "source_db": "/root/sourceserver/pbf/out/coastline/fukuoka_saga_test/fukuoka_saga_coast_grid.sqlite", + "grid_file": "fukuoka_saga_blocked_cells.geojson", + "coastline_file": "fukuoka_saga_coastline_lines.geojson", + "source_scope": "福冈/佐贺", + "source_code": "C23-06_40+41", + "cell_size_m": 200.0, + "buffer_m": 50.0, + "grid_bounds_mercator": [ + 14441600.0, + 3888200.0, + 14604200.0, + 4063000.0 + ], + "grid_bounds_lonlat": [ + 129.73110007140482, + 32.9464631795233, + 131.19176072338317, + 34.25430274729531 + ], + "blocked_count": 9743, + "coastline_count": 1067 +} \ No newline at end of file diff --git a/src/pbf/navsea-click-target-karatsu-20nm.html b/src/pbf/navsea-click-target-karatsu-20nm.html new file mode 100644 index 0000000..892a434 --- /dev/null +++ b/src/pbf/navsea-click-target-karatsu-20nm.html @@ -0,0 +1,523 @@ + + + + + + NavSea Click Target · Karatsu 20nm + + + + +
+
+
NavSea 红点对位页
+
+ 这个页面只做一件事:把 native 提供的 GPS 点投到同一套 Karatsu 20nm 图面上。 + 打开后直接点击红点,就能检查 web 与 native 在同一位置上的 pickup 表现。 +
+
+
loading…
+
+ +
+
+
+
+ +
+ + + + + diff --git a/src/pbf/navsea-coast-wall-z12-viewer.html b/src/pbf/navsea-coast-wall-z12-viewer.html new file mode 100644 index 0000000..c65581b --- /dev/null +++ b/src/pbf/navsea-coast-wall-z12-viewer.html @@ -0,0 +1,978 @@ + + + + + + NavSea 阻断墙 bin 预览 v2.1 + + + + +
+ + +
+
NavSea 阻断墙 bin 预览
+
+ 拖动这里挪开面板 + 左上 +
+
+ 版本:v2.1
+ 说明:直接加载 `coast_wall_*.bin`,看最终阻断墙效果
+ 方式:选择 `.bin`,可选再选同名 `.meta.json` +
+ +
+ + +
+ + + +
+
最终阻断格
+
低缩放时显示 tile 级范围,方便看整体分布
+
底图:GSI 标准地图
+
+ +
+
文件:未加载
+
输出:-
+
tile 数:-
+
blocked cell:-
+
sparse / bitset:-
+
coast 层:-
+
+ +
等待选择 .bin 文件。
+
+ +
可直接选择本地 bin 文件
+ + + + + diff --git a/src/pbf/navsea-coastline-fukuoka-saga-200m-v2.html b/src/pbf/navsea-coastline-fukuoka-saga-200m-v2.html new file mode 100644 index 0000000..a1ce442 --- /dev/null +++ b/src/pbf/navsea-coastline-fukuoka-saga-200m-v2.html @@ -0,0 +1,459 @@ + + + + + + NavSea 全国海岸 / 渔港 / 障碍红格预览 v2.2 + + + + +
+
+
NavSea 全国海岸 / 渔港 / 障碍红格预览
+
+ 版本:v2.2
+ 数据:全国统一库导出
+ 底盘:navsea_japan_coast_grid
+ 默认视图:全国 200x200
+ 底图:GSI 标准地图(mapple) +
+
+ + + + + +
+
+
当前图层采用红色填充和深色边线显示
+
+
等待加载中...
+
+
当前加载:200x200 全国海岸格
+ + + + + diff --git a/src/pbf/navsea-coastline-fukuoka-saga.html b/src/pbf/navsea-coastline-fukuoka-saga.html new file mode 100644 index 0000000..b8fb22d --- /dev/null +++ b/src/pbf/navsea-coastline-fukuoka-saga.html @@ -0,0 +1,296 @@ + + + + + + NavSea 福冈/佐贺海岸 200m 栅格预览 v1.0 + + + + +
+
+
NavSea 福冈/佐贺海岸 200m 栅格预览
+
+ 版本:v1.0
+ 数据:GSI 海岸线 C23-06_40 + C23-06_41
+ 底图:GSI 标准地图(mapple) +
+
+ + +
+
+
200m 硬阻塞格子,淡红色
+
海岸线轮廓
+
+
等待加载中...
+
+
红色格子越贴海岸线,说明裁切越准
+ + + + + diff --git a/src/pbf/navsea-compare-fukuoka-20nm-msil.html b/src/pbf/navsea-compare-fukuoka-20nm-msil.html new file mode 100644 index 0000000..1e19b17 --- /dev/null +++ b/src/pbf/navsea-compare-fukuoka-20nm-msil.html @@ -0,0 +1,39 @@ + + + + + + 福冈湾 20 海里:NewPec 与 MSIL PBF 对比 + + + + +
福冈湾 20 海里:NewPec 与 MSIL PBF 对比
同步平移、缩放;左侧为完整 NewPec 海图,右侧为 MSIL PBF 海图与同一陆地底图。点击对象可查看渲染层与属性。
HTML: fukuoka-20nm-msil-v1-20260810-r5样式加载中
+
左侧 · NewPec 海图完整本地缓存样式与瓦片
右侧 · MSIL 海图MSIL PBF + 本地陆地底图
+
等待加载样式…
+ + + + diff --git a/src/pbf/navsea-compare-full-audit.html b/src/pbf/navsea-compare-full-audit.html index cd19e56..9de0426 100644 --- a/src/pbf/navsea-compare-full-audit.html +++ b/src/pbf/navsea-compare-full-audit.html @@ -21,6 +21,9 @@ html, body { margin: 0; height: 100%; + width: 100%; + max-width: 100vw; + overflow-x: hidden; background: radial-gradient(circle at top left, rgba(48, 95, 114, 0.12), transparent 28%), radial-gradient(circle at bottom right, rgba(139, 94, 52, 0.1), transparent 24%), @@ -32,69 +35,94 @@ body { display: grid; grid-template-rows: auto 1fr; + width: 100vw; + max-width: 100vw; + overflow-x: hidden; } .toolbar { display: flex; justify-content: space-between; - gap: 18px; - align-items: flex-start; - padding: 14px 18px 12px; + gap: 10px; + align-items: center; + padding: 7px 12px; background: linear-gradient(180deg, rgba(250, 248, 242, 0.98), rgba(250, 248, 242, 0.9)); border-bottom: 1px solid var(--line); box-shadow: var(--shadow); z-index: 20; - flex-wrap: wrap; + flex-wrap: nowrap; + width: 100%; + min-width: 0; + } + + .toolbar-summary { + flex: 0 1 420px; + min-width: 240px; + min-width: 0; } .title { - font-size: 18px; + font-size: 16px; font-weight: 700; - letter-spacing: 0.02em; } .subtitle { - margin-top: 4px; - max-width: 920px; - font-size: 13px; - line-height: 1.5; + margin-top: 2px; + max-width: 1080px; + font-size: 12px; + line-height: 1.35; color: var(--muted); + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; } .toolbar-actions { display: flex; - gap: 10px; + gap: 8px; flex-wrap: wrap; align-items: center; + justify-content: flex-end; + flex: 1 1 auto; + flex-wrap: nowrap; + min-width: 0; + overflow: hidden; + max-width: calc(100vw - 460px); } .version-chip { display: inline-flex; align-items: center; - min-height: 40px; - padding: 0 14px; + min-height: 30px; + padding: 0 10px; border-radius: 999px; border: 1px solid rgba(23, 35, 43, 0.16); background: rgba(250, 248, 242, 0.9); color: var(--ink); - font-size: 12px; + font-size: 11px; font-weight: 700; - letter-spacing: 0.01em; white-space: nowrap; box-shadow: 0 10px 22px rgba(23, 35, 43, 0.08); + flex: 1 1 auto; + min-width: 0; + max-width: 360px; + overflow: hidden; + text-overflow: ellipsis; } button { - height: 40px; - padding: 0 14px; - border-radius: 12px; + height: 32px; + padding: 0 12px; + border-radius: 9px; border: 1px solid rgba(23, 35, 43, 0.16); background: linear-gradient(180deg, #234a59, #17333f); color: #fff; font: inherit; + font-size: 12px; font-weight: 700; cursor: pointer; box-shadow: 0 10px 22px rgba(23, 35, 43, 0.18); + flex: 0 0 auto; } .layout { @@ -102,6 +130,8 @@ grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); min-height: 0; position: relative; + width: 100%; + min-width: 0; } .pane { @@ -149,10 +179,9 @@ right: 14px; bottom: 14px; z-index: 30; - width: min(380px, calc(100vw - 28px)); - max-height: 42vh; - overflow: auto; - padding: 11px 12px; + width: min(460px, calc(100vw - 28px)); + overflow: hidden; + padding: 0; border-radius: 14px; background: rgba(250, 248, 242, 0.95); border: 1px solid rgba(23, 35, 43, 0.12); @@ -160,11 +189,55 @@ backdrop-filter: blur(10px); } + .inspect-panel.is-dragging { + user-select: none; + } + + .inspect-panel.is-collapsed { + width: 176px; + } + + .inspect-header { + display: flex; + align-items: center; + justify-content: space-between; + gap: 10px; + min-height: 38px; + padding: 8px 10px 8px 12px; + border-bottom: 1px solid rgba(23, 35, 43, 0.09); + cursor: move; + touch-action: none; + } + + .inspect-panel.is-collapsed .inspect-header { + border-bottom: none; + } + .inspect-panel h3 { - margin: 0 0 6px; + margin: 0; font-size: 13px; } + .inspect-toggle { + flex: 0 0 auto; + height: 24px; + min-width: 44px; + padding: 0 8px; + border-radius: 7px; + font-size: 11px; + box-shadow: none; + } + + .inspect-body { + max-height: 44vh; + overflow: auto; + padding: 9px 12px 12px; + } + + .inspect-panel.is-collapsed .inspect-body { + display: none; + } + .inspect-hint { margin: 0 0 8px; color: var(--muted); @@ -231,6 +304,26 @@ } @media (max-width: 980px) { + .toolbar { + flex-wrap: wrap; + } + + .toolbar-summary, + .toolbar-actions { + flex: 1 1 100%; + } + + .toolbar-actions { + flex-wrap: wrap; + justify-content: flex-start; + overflow: visible; + } + + .version-chip { + flex: 1 1 220px; + max-width: none; + } + .layout { grid-template-columns: 1fr; grid-template-rows: 1fr 1fr; @@ -247,11 +340,14 @@ .inspect-panel { width: min(360px, calc(100vw - 24px)); - max-height: 30vh; right: 12px; bottom: 54px; } + .inspect-body { + max-height: 30vh; + } + .status { max-width: calc(100% - 24px); } @@ -260,7 +356,7 @@
-
+
全国人工审计对比页
左侧固定加载原始 style.json + 原始 newpec 瓦片;右侧固定加载全国 delivery 的 style.navsea-delivery-full.json + 全国 delivery PBF + 当前 sprite。两边联动同步,适合直接审 style / pbf / sprite 的整体视觉差异。
@@ -291,33 +387,38 @@
-