概要
OSM建物とPlateauオブジェクトの2つを同時に選択した状態で、OSMエンティティのIDと履歴を保持したまま、ジオメトリをPlateau側のものに置換する機能の提案。
JOSMの ReplaceGeometry プラグインに相当する機能をRapidに実装するもの。
関連Issue
背景・動機
Plateauデータを使ってOSM建物のジオメトリを更新する際、OSMエンティティの編集履歴を維持したい。現状では既存建物を削除して新規にPlateauデータを取り込むしかなく、履歴チェーンが途切れてしまう。iD editorにはReplaceGeometry相当の機能がないため、Rapid側での実装を検討する。
提案する操作フロー
- OSM建物とPlateauオブジェクトを同時に選択
- 専用操作(メニューまたはショートカット)で「ジオメトリ置換」を実行
- OSM wayのIDを保持したままノードがPlateau側の座標に置換される
- タグのマージ(OSM優先 or 手動選択)
- アップロード時に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 を送信 |
✅ 実装済み |
想定される実装方針
-
新規 Action の作成: modules/actions/replace_way_geometry.js
actionReplaceWayGeometry(osmWayID, plateauEntity) として実装
- 既存OSM wayのIDを保持したまま、ノードリストをPlateau側の座標で再構築
actionRapidAcceptFeature のノード処理ロジックを参考に実装
-
新規 Operation の作成: modules/operations/replace_geometry.js
- OSMエンティティとRapidフィーチャーが同時選択されている場合に
available() が true
- タグの競合がある場合はマージ戦略の選択UIを表示
難しい点・考慮事項
| 課題 |
詳細 |
難易度 |
| 共有ノードの処理 |
OSM建物が隣接建物とノードを共有している場合、置換時に隣接建物が壊れる可能性。共有ノードの検出と適切な処理が必要 |
⚠️ 高 |
| リレーション(multipolygon等)の維持 |
既存wayがリレーションのメンバーの場合、メンバーシップを保持する必要あり |
⚠️ 中〜高 |
| タグのマージ戦略 |
OSM側のタグとPlateau側のタグが競合する場合のルール決め(OSM優先?Plateau優先?手動?) |
⚠️ 中 |
| ジオメトリの妥当性検証 |
置換後のジオメトリが有効か(閉合しているか等)の検証 |
中 |
| 2オブジェクト同時選択のUI |
OSMエンティティとRapidフィーチャーを同時選択する操作フローが現状ない |
⚠️ 中 |
特に共有ノードの処理が最大の難所であり、JOSMのReplaceGeometryでも最も複雑な部分となっている。
参考
概要
OSM建物とPlateauオブジェクトの2つを同時に選択した状態で、OSMエンティティのIDと履歴を保持したまま、ジオメトリをPlateau側のものに置換する機能の提案。
JOSMの ReplaceGeometry プラグインに相当する機能をRapidに実装するもの。
関連Issue
背景・動機
Plateauデータを使ってOSM建物のジオメトリを更新する際、OSMエンティティの編集履歴を維持したい。現状では既存建物を削除して新規にPlateauデータを取り込むしかなく、履歴チェーンが途切れてしまう。iD editorにはReplaceGeometry相当の機能がないため、Rapid側での実装を検討する。
提案する操作フロー
技術的な仕組み
履歴保持の原理
OSMではエンティティIDに履歴が紐づくため、「履歴を移送する」のではなく、既存OSM wayのノードをPlateau側の座標で置き換えることで自然に履歴が維持される。
活用できる既存コード
way.replaceNode(oldID, newID)way.mergeTags(tags)graph.replace(entity)actionRapidAcceptFeature内のロジックway.asJXON()で@id/@versionを送信想定される実装方針
新規 Action の作成:
modules/actions/replace_way_geometry.jsactionReplaceWayGeometry(osmWayID, plateauEntity)として実装actionRapidAcceptFeatureのノード処理ロジックを参考に実装新規 Operation の作成:
modules/operations/replace_geometry.jsavailable()が true難しい点・考慮事項
特に共有ノードの処理が最大の難所であり、JOSMのReplaceGeometryでも最も複雑な部分となっている。
参考