5.1 KiB
Step 4 / Step 5 実装記録
Step 4 — 道路・鉄道ポータルの必須再接続
追加生成前の交通線から、パッチ境界を横断する地点を transport portal contract として保存するようにした。
各ポータルには以下を保持する。
- 境界外側の既存中心線セル
- 境界内側の中心線セル
- 外側から内側へ向かう進行方向
- 元の道路・鉄道路線レイヤー
- 近傍の旧中心線ガイド
- 路線階層の優先度
候補交通網を統合した後、ポータルごとに次の処理を行う。
- 描画中心線をセルへ高密度ラスタライズする。
- 外側既存ネットワークと内側生成ネットワークが、8近傍で実際に連続しているか検査する。
- 未接続の場合、ポータル内側の固定ゲートを通る二段階経路探索を行う。
- 元路線と同じレイヤーへコネクターを追加する。
- 追加後に再ラスタライズし、見た目上の接続が成立しなければロールバックする。
- 一般グラフ修復後にもう一度必須ポータルを検査する。
候補内交通網が検索範囲外にある場合だけ、旧中心線の短い内向きガイドを復元する。この使用件数は roadPortalLegacyGuideFallbacks / railPortalLegacyGuideFallbacks で確認できる。
グラフ接続判定の修正
従来は最大2セル離れた交通線も同一グラフ成分としていたため、内部判定では接続済みでも描画上は隙間が残ることがあった。
現在は、上下左右と斜めの 8近傍で接触するセルだけを接続済みとして扱う。
追加された診断値
roadPortalsRequiredroadPortalsConnectedroadPortalsUnresolvedroadPortalConnectorsAddedroadPortalLegacyGuideFallbacksrailPortalsRequiredrailPortalsConnectedrailPortalsUnresolvedrailPortalConnectorsAddedrailPortalLegacyGuideFallbacksportalPathAttempts
Step 5 — 最終IDラスターから行政境界を単一再構築
行政境界ベクトルの生成元を次の最終フィールドに限定した。
- 市町村境界:
world.fields.adminId - 都道府県境界:
world.fields.prefectureRegionId - 外周境界:
world.fields.prefectureMask
パッチ処理後に世界全体を再走査し、以下のベクトルを再構築する。
sourceMap.adminBorderssourceMap.regionalPrefectureBorderssourceMap.prefectureBorder
既存ベクトル、候補生成器の境界ベクトル、距離ベースの補完境界は統合しない。これにより、候補境界とラスター再構築境界が並行して残る経路を廃止した。
境界階層
市町村境界は、隣接セルの adminId が異なり、かつ prefectureRegionId が同じ場合だけ生成する。
したがって都道府県境界上では、市町村境界を後処理で近接除去するのではなく、生成段階から出力しない。
半セル位置ずれの修正
パッチ側のラスター境界座標が初期生成より0.5セルずれていた。
レンダラーが境界描画時に -0.5 セルのオフセットを適用するため、再構築座標を初期生成と同じ x + 1 / y + 1 の共有セル辺座標へ統一した。
重複境界診断
連続する同一チェーンの隣接単位セグメントを「二重境界」と誤判定しないようにした。現在は次を満たす平行線だけを重複候補とする。
- セグメント方向が近い
- 投影区間が十分に重なる
- 同一チェーンの共有端点ではない
- 線間距離が許容範囲内
市町村境界と都道府県境界の完全一致も検出対象にした。
検証
実行コマンド:
node STEP4_STEP5_VALIDATION.mjs
検証結果:
Expansion
mandatory road portals: 1
broken road portals: 0
broken rail portals: 0
duplicate boundary pairs: 0
Regeneration
mandatory road portals: 5
mandatory rail portals: 1
broken road portals: 0
broken rail portals: 0
duplicate boundary pairs: 0
検証スクリプトは、各境界セグメントについて隣接する最終IDセルを逆算し、以下を全件確認する。
- 市町村境界の両側で
adminIdが異なる - 市町村境界の両側で
prefectureRegionIdが同じ - 都道府県境界の両側で
prefectureRegionIdが異なる - 市町村境界と都道府県境界に完全一致セグメントがない
- 外周境界が最終
prefectureMaskの変化位置と一致する - 各レイヤー内に完全重複セグメントがない
Step 2 / Step 3 の検証スクリプトも再実行し、次を維持していることを確認した。
- 既存生成部分の海陸反転: 0
- 異なる生成窓での重複座標の最大標高差: 0
- 異なる生成窓での海陸不一致: 0
全JavaScript/MJSファイルは node --check を通過した。
既存の総合 test.js はこの環境で長時間実行が継続し、完了確認まで行えていない。今回の合否判定には、交通ポータルと最終ID境界を直接検証する専用回帰テストを使用した。