JA:OsmChange

From OpenStreetMap Wiki
Jump to navigation Jump to search

このページは、osmChangeファイル形式について説明しています。同名のプログラムについては、osmchange (プログラム)を参照してください。


osmChangeは、2つのOSMデータダンプ間の差分を記述するために、多くのOSMツールやエディタで使用されているファイル形式です。しかし、変更を表現する必要のあるあらゆるデータの基盤としても使用できます。例えば、一括アップロード・削除・変更も変更セットであるため、この形式で記述できます。OSMはPlanet.osm/diffsのダウンロードもこの形式で提供しています。

データセット間の差分を記述する他の方法については、変更ファイル形式(planetdiffおよびJOSMファイル形式)を参照してください。

osmChangeファイルは、あるOSMエディタから別のエディタにデータをエクスポートする際にもよく使用されます。ファイル拡張子は通常.oscです。

例

<osmChange version="0.6" generator="acme osm editor">
    <modify>
        <node id="1234" changeset="42" version="2" lat="12.1234567" lon="-8.7654321">
            <tag k="amenity" v="school"/>
        </node>
    </modify>
</osmChange>

これは、単一ノードを変更するための変更セットです。最も外側のタグはosmChangeです。その中に含まれるノードは次の3種類があります。

  • create(作成)
  • modify(編集)
  • delete(削除)

これらのノードの内容は、サーバーから返されるosmタグの内容と同じで、ノード・ウェイ・リレーションからなる任意の集合です。すべての要素には、変更セットIDとバージョン番号を含める必要があります。削除の場合はノードのみが必要ですが、従来は、ファイルを読む人が実際に何が削除されるのかをより明確に理解できるように、実際のデータも含まれていました。しかし、削除の場合、要素に必要なフィールドは、id、changeset、versionのみで十分です。ファイルサイズを削減するために、位置とタグは省略するべきです。

注:作成・変更・削除の「アクション」は、ノード・ウェイ・リレーションレベルで適用されます。タグレベルで変更を適用する方法はありません。つまり、新しいタグを追加する場合は、変更後のエントリに既存のすべてのタグを含める必要があります。

OsmChangeドキュメントの<delete>ブロックには、if-unused属性(値は無視されます)を含めることができます。この属性が存在する場合、このブロック内の削除操作は条件付きとなり、削除対象オブジェクトが他のオブジェクトで使用されていない場合にのみ実行されます。if-unused属性がない場合、このような状況ではエラーが発生し、差分アップロード全体が失敗します。この属性を設定することで、すでに削除されたオブジェクトの削除時にもエラーが発生しなくなります。

メタデータ

注: OsmChangeの出力には、ファイルのソースを識別するために、最上位のosmChange要素にgeneratorタグとversionタグが含まれている場合があります。これらのタグは必須ではなく、OsmChangeドキュメントをサーバーにアップロードする際には無視されます。

osmChangeファイルを生成するツールは、generatorとversionに加えて、<osmChange>タグに他の属性を追加できます。これらの属性は無視されますが、ファイルの生成日など、メタデータとして役立つ場合があります。

コメント

osmChangeファイルをサポートするほとんどのツールは、ファイル内にXMLコメントを記述できます。例えば、のように記述します。

プレースホルダー

サーバーに新しいデータをアップロードする際によくある問題として、IDはサーバーによって割り当てられるため、ファイル作成時点では不明な点があります。この問題を解決するには、0未満の数値を使用します。これらの数値はプレースホルダーとして機能し、要素が作成されると、ファイル内の残りの部分ではプレースホルダーが作成された要素のIDに置き換えられます。

JOSMファイル形式にも同様の機能がありますが、planetdiffはplanetファイルの差分比較/パッチ適用専用に設計されているため、この機能はサポートしていません。この記事執筆時点では、osmosisはデータベースへの変更適用時にこの機能をサポートしていませんが、その他のタスクでは負の識別子をサポートしているはずです。ただし、この機能をサポートする一括アップロードスクリプト(bulk_import.pl)があります。

以下はプレースホルダーの例です。

<osmChange>
    <create>
        <node id="-1" changeset="43" version="1" lat="-33.9133123" lon="151.1173123" />
        <node id="-2" changeset="43" version="1" lat="-33.9233321" lon="151.1173321" />
        <way id="-1" changeset="43" version="1">
            <nd ref="-1"/>
            <nd ref="-2"/>
        </way>
    </create>
</osmChange>

このファイルでは、指定された位置に2つのノードを作成し、ウェイでそれらを結合します。既存のデータと競合することはありません。

注:アップロードAPI呼び出しはプレースホルダーをサポートしています。実際、createブロック内のすべてのid属性は、負の値か正の値かにかかわらず、プレースホルダーとして扱われます。ただし、プレースホルダーIDがOsmChangeドキュメント内の他のIDと衝突しないように、負の数を使用することをお勧めします。なお、Railsポートでは、負のプレースホルダーIDのみを実際のIDに置き換えるように実装されています。この動作は、ノードIDやリレーションのメンバーIDにも適用されます。したがって、IDの置き換えを正しく機能させるためには、負のプレースホルダーIDを使用することが事実上必須となります。

また、新しく作成した要素に対して、複数のOsmChangeブロックを通じて操作を行うことも可能です。例えば、同じOsmChangeファイル内でID -1のノードを作成し、続けてそのID -1のノードを削除するといった操作も、OSMサーバーは受け付けます。これは必ずしも最も適切なファイル生成方法とは言えませんが、技術的には可能です。

ソフトウェア

OsmChangeファイルを扱えるソフトウェアのリスト(一部)

エディタ

OsmChangeファイルを扱えるエディタのリスト(一部)

  • iD / Rapid - 通常版ではエクスポートのみ可能(iDのフォーク版 [1] を使用すればインポートも可能 [1]。メニューの「地図データ (Map data)」>>「ファイルから編集内容を読み込む (Load edits from file)」から利用可能 [2])
  • Level0
  • JOSM – インポート(開く...)のみ対応。JOSMの.osmファイルからXSLTを用いて.oscファイルを作成する方法については、こちらの説明を参照。
  • OsmAnd
  • Go Map!! – エクスポートのみ対応
  • Vespucci – インポートおよびエクスポート

出典

  1. ↑ Kyℓe Hensel: iD-fork GitHub
  2. ↑ Kyℓe Hensel: Feature request: "Open osmChange file" / "Upload osmChange file" / "Import CS" #7109 . GitHub, 2024-12-16 Issue comment post 2546907870