Skip to content

OSM建物のジオメトリをPlateauジオメトリで置換する機能(履歴保持) #5

Description

@nyampire

概要

OSM建物とPlateauオブジェクトの2つを同時に選択した状態で、OSMエンティティのIDと履歴を保持したまま、ジオメトリをPlateau側のものに置換する機能の提案。

JOSMの ReplaceGeometry プラグインに相当する機能をRapidに実装するもの。

関連Issue

背景・動機

Plateauデータを使ってOSM建物のジオメトリを更新する際、OSMエンティティの編集履歴を維持したい。現状では既存建物を削除して新規にPlateauデータを取り込むしかなく、履歴チェーンが途切れてしまう。iD editorにはReplaceGeometry相当の機能がないため、Rapid側での実装を検討する。

提案する操作フロー

  1. OSM建物とPlateauオブジェクトを同時に選択
  2. 専用操作(メニューまたはショートカット)で「ジオメトリ置換」を実行
  3. OSM wayのIDを保持したままノードがPlateau側の座標に置換される
  4. タグのマージ(OSM優先 or 手動選択)
  5. アップロード時にOSM APIが新バージョンとして記録 → 履歴チェーンが自動保持

技術的な仕組み

履歴保持の原理

OSMではエンティティIDに履歴が紐づくため、「履歴を移送する」のではなく、既存OSM wayのノードをPlateau側の座標で置き換えることで自然に履歴が維持される。

OSM way (id=12345, v=3)   +   Plateau building (geometry)
         ↓
OSM way (id=12345, v=4) ← ノードをPlateau側の座標で置換
         ↓
OSM API にアップロード → 履歴チェーンは自動的に保持

活用できる既存コード

必要な機能 既存コード 状態
Way のノード置換 way.replaceNode(oldID, newID) ✅ 実装済み
タグのマージ way.mergeTags(tags) ✅ 実装済み
グラフ上のエンティティ更新 graph.replace(entity) ✅ 実装済み
ノード座標のマッチング・再利用 actionRapidAcceptFeature 内のロジック ✅ 参考にできる
バージョン管理・アップロード way.asJXON()@id / @version を送信 ✅ 実装済み

想定される実装方針

  1. 新規 Action の作成: modules/actions/replace_way_geometry.js

    • actionReplaceWayGeometry(osmWayID, plateauEntity) として実装
    • 既存OSM wayのIDを保持したまま、ノードリストをPlateau側の座標で再構築
    • actionRapidAcceptFeature のノード処理ロジックを参考に実装
  2. 新規 Operation の作成: modules/operations/replace_geometry.js

    • OSMエンティティとRapidフィーチャーが同時選択されている場合に available() が true
    • タグの競合がある場合はマージ戦略の選択UIを表示

難しい点・考慮事項

課題 詳細 難易度
共有ノードの処理 OSM建物が隣接建物とノードを共有している場合、置換時に隣接建物が壊れる可能性。共有ノードの検出と適切な処理が必要 ⚠️
リレーション(multipolygon等)の維持 既存wayがリレーションのメンバーの場合、メンバーシップを保持する必要あり ⚠️ 中〜高
タグのマージ戦略 OSM側のタグとPlateau側のタグが競合する場合のルール決め(OSM優先?Plateau優先?手動?) ⚠️
ジオメトリの妥当性検証 置換後のジオメトリが有効か(閉合しているか等)の検証
2オブジェクト同時選択のUI OSMエンティティとRapidフィーチャーを同時選択する操作フローが現状ない ⚠️

特に共有ノードの処理が最大の難所であり、JOSMのReplaceGeometryでも最も複雑な部分となっている。

参考

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions