🗺️

QGISが出力するGeoJSONファイルに仕様未準拠の項目

2 min read

※本記事執筆時(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の文字列または数字である。

The GeoJSON Format

解決方法

いったん属性テーブル内に格納し、出力する際にトップレベルへ移動させる

いったん属性テーブル内に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

ログインするとコメントできます