map/archive/generated-history/STEP4_STEP5_NOTES.md
2026-08-08 17:41:30 +09:00

5.1 KiB

Step 4 / Step 5 実装記録

Step 4 — 道路・鉄道ポータルの必須再接続

追加生成前の交通線から、パッチ境界を横断する地点を transport portal contract として保存するようにした。

各ポータルには以下を保持する。

  • 境界外側の既存中心線セル
  • 境界内側の中心線セル
  • 外側から内側へ向かう進行方向
  • 元の道路・鉄道路線レイヤー
  • 近傍の旧中心線ガイド
  • 路線階層の優先度

候補交通網を統合した後、ポータルごとに次の処理を行う。

  1. 描画中心線をセルへ高密度ラスタライズする。
  2. 外側既存ネットワークと内側生成ネットワークが、8近傍で実際に連続しているか検査する。
  3. 未接続の場合、ポータル内側の固定ゲートを通る二段階経路探索を行う。
  4. 元路線と同じレイヤーへコネクターを追加する。
  5. 追加後に再ラスタライズし、見た目上の接続が成立しなければロールバックする。
  6. 一般グラフ修復後にもう一度必須ポータルを検査する。

候補内交通網が検索範囲外にある場合だけ、旧中心線の短い内向きガイドを復元する。この使用件数は roadPortalLegacyGuideFallbacks / railPortalLegacyGuideFallbacks で確認できる。

グラフ接続判定の修正

従来は最大2セル離れた交通線も同一グラフ成分としていたため、内部判定では接続済みでも描画上は隙間が残ることがあった。

現在は、上下左右と斜めの 8近傍で接触するセルだけを接続済みとして扱う。

追加された診断値

  • roadPortalsRequired
  • roadPortalsConnected
  • roadPortalsUnresolved
  • roadPortalConnectorsAdded
  • roadPortalLegacyGuideFallbacks
  • railPortalsRequired
  • railPortalsConnected
  • railPortalsUnresolved
  • railPortalConnectorsAdded
  • railPortalLegacyGuideFallbacks
  • portalPathAttempts

Step 5 — 最終IDラスターから行政境界を単一再構築

行政境界ベクトルの生成元を次の最終フィールドに限定した。

  • 市町村境界: world.fields.adminId
  • 都道府県境界: world.fields.prefectureRegionId
  • 外周境界: world.fields.prefectureMask

パッチ処理後に世界全体を再走査し、以下のベクトルを再構築する。

  • sourceMap.adminBorders
  • sourceMap.regionalPrefectureBorders
  • sourceMap.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境界を直接検証する専用回帰テストを使用した。