QGISで表示できないshapefile

外部の人から受け取った SHAPE 形式のGISデータを、 QGISで見てみようとしたところ、データはちゃんと入っているっぽいのに 画面には何も表示されない、という状況になり、 原因調査にちょっと時間が掛かったのでメモしておく。

原因

先に結論を述べると、地物のジオメトリが緯度経度座標なのに、 bounding box (以下BBOX)がウェブメルカトル(EPSG3857)座標になっていたのが原因。

受け取ったデータはポリゴンデータだったのだが、 ポリゴンデータのような、複数の座標を持つジオメトリ型の場合、 SHAPEファイル内には、

  • レイヤ全体のBBOX
  • 個々のジオメトリごとのBBOX

が保持される。詳しくは ESRI の解説書 を見よ。

今回のケースでは、レイヤ全体のBBOXはジオメトリデータと同じく 緯度経度座標になっていたのだが、ジオメトリごとのBBOXは 何故か EPSG3857 になっていた。 おそらくQGISは、ジオメトリごとのBBOXを律儀に適用し、 地物の表示をマスクしてしまった、ということだと思われる。

症状

原因調査に時間が掛かったのは、SHAPEファイルを読み込ませた時に QGISが何もエラーを出さなかったからだ。

同様に、ogrinfo もエラーを出さなかった。 ogrinfo を実行すると Extent という表記でBBOXを表示するが、 これはSHAPEファイル内の「レイヤ全体のBBOX」の数値で、 ジオメトリごとのBBOXはまったく出力されない。

原因特定

ogr2ogr を使って SHAPE形式からSHAPE形式に変換したところ、 QGISで表示できるようになったので、バイナリ用diffを使って 変化した部分を特定し、ESRIの説明書と突き合わせて ジオメトリごとのBBOXが不適切であることを突き止めた。

HEX表記の浮動小数点データを10進表記にする作業には、 python の struct モジュールを使用した。