⚠️26/6/22追記 この現象は最新版ではFIXされています
たまたま見つけたQGISに関する小ネタですが、タイトルの通りです
現象
QGIS 3.40.5-Bratislava on MacOSで確認
こんなイメージの属性でランダムに作成した位置の1000ポイント、なおかつ"id"列に重複データのあるGeoJSONデータがあったとする
| id | name |
|---|---|
| 0 | pt_0001 |
| 0 | pt_0002 |
| 1 | pt_0003 |
| 1 | pt_0004 |
| 2 | pt_0005 |
| 2 | pt_0006 |
| … | … |
しかしQGISでは地図上に表示され、属性テーブルでは左下で「すべての地物を表示」となっていても勝手にフィルタがかかってしまい、最後のセットのみ表示される。
マップキャンパスですべてのフィーチャーを選択しても属性テーブルでは100レコードしか選択されない

原因・対応
QGISではGeoJSON の "id" を文字列でしか扱えず数値 ID を無視する不具合が報告されている。
つまり、QGISはGeoJSONの"id"をFeatureIDとして扱う仕様になっており、"id" が数値の場合は、その値を内部のFeatureIDとして強制的に利用しようとする。
その結果、今回のようなデータを読み込むと「FeatureID はレイヤ内で一意でなければならない!」 という仕様と衝突し、後から読み込まれた要素が前の要素を上書きしたような扱いになります(なので最後の100レコードのみ表示されてしまう)。その影響で属性テーブルの行数が減り、まるでフィルタがかかったように見える、という現象が起きている。なお、この不具合のFIXはされていない()
なので、(そうそうある話ではないが)このような”id”列に重複するデータが入ったGeoJSONは作らないほうが得策のようである。君子、危うきに近寄らず。

