QGISが出力するGeoJSONファイルに仕様未準拠の項目
※本記事執筆時(2021-07-08)の最新版(ヴァージョン3.20.0)前提の話です。
何が問題か
GeoJSONの仕様として、各Featureのトップレベルにidを保持する必要がある( SHOULD )とされています。
QGISでベクターファイルを編集し、GeoJSONファイルとして保存する際、そのままの操作では各Featureのトップレベルにidが格納されません。裏で動作しているogr2ogrへ、QGIS上のGUIでの操作が適切なパラメータを渡せていないためです。このため、
- QGISで出力したGeoJSONファイルが、仕様に準拠した別のソフトウェア(OpenLayersやMapbox GL JSなど)で期待される動作をしない
- すでにトップレベルにidが格納されているGeoJSONをQGISで編集すると、idが消失してしまう
といった不具合があります(筆者がテスト済み)。
仕様に準拠するならこのようにトップレベルにidとして保持しておくべき
{
"type": "Feature",
"id": "my_id",
"properties": {
"prop2": "prop2",
"prop3": "prop3",
},
"geometry": {
"type": "Point",
"coordinates": [
139.338925252999985,
35.622448612999982
]
}
},
GeoJSON仕様の該当箇所の記述
If a Feature has a commonly used identifier, that identifier SHOULD be included as a member of the Feature object with the name "id", and the value of this member is either a JSON string or number.
Featureに一般的に使用される識別子がある場合、その識別子はFeatureオブジェクトのメンバーとして "id "という名前で含めるべきである。このメンバーの値は、JSONの文字列または数字である。
解決方法
いったん属性テーブル内に格納し、出力する際にトップレベルへ移動させる
いったん属性テーブル内にidを格納します(一番右の列)。
上記の「仕様に準拠するなら…」になぞらえるなら一旦このような状態になっています。
{
"type": "Feature",
"properties": {
"id": "my_id",
"prop2": "prop2",
"prop3": "prop3",
},
"geometry": {
"type": "Point",
"coordinates": [
139.338925252999985,
35.622448612999982
]
}
},
エクスポート機能を用いて地物を出力する際に、カスタムオプションのレイヤー欄に以下の指定を入れます。
id_field=id
その結果、属性テーブル内にに存在したidが、各Featureのトップレベルへと移動します。
{
"type": "Feature",
"id": "my_id",
"properties": {
"prop2": "prop2",
"prop3": "prop3",
},
"geometry": {
"type": "Point",
"coordinates": [
139.338925252999985,
35.622448612999982
]
}
},
ogr2ogrを用いる
属性テーブル内にidが存在したままGeoJSONとして保存してしまっている場合は、シェルコマンドなどでogr2ogrを用いて、修正することが可能です。
ogr2ogr output.geojson input.geojson -lco id_field=id
Discussion