14
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

MIERUNEAdvent Calendar 2023

Day 6

チーム「shpファイル」のメンバーが足りません

Last updated at Posted at 2023-12-05

これは MIERUNE AdventCalendar 2023…6日目の記事です。
昨日は @KEI_YAMA さんによる テスト駆動開発でブログアプリのバックエンドを実装してみる でした。

はい出オチです(DALL-E2画伯による生成画像をベースにしていますので適宜利用可能かと)

はじめに

GISでデファクトスタンダードと呼ばれはや数十年…であるSHP(しぇいぷ)ファイルというファイル形式あります。
呼び名としては、SHPファイルのほかにShapeファイル・シェープファイル・シェイプファイル・例のアレ等いろいろです。

最近では、生まれたときからSHPファイルがすでにあったというSHPファイルネイティブ世代も世間を賑わせております(知らんけど)

そんなSHPファイルネイティブ世代やGIS初学者が、この記事で紹介する事案について、幼少時に焚き火を触ってから火の怖さを知る等とされる「ネイティブアメリカンの教え」の如く最初にやらかしがちなことがらですが、あまりに些末すぎてこのような情報や検証が世間にはあまりみあたらないのでこちらにおいておきます。

結論を先に書くと

拡張子shpのファイルだけ相手に送っても何も見れないよ!

です。

いわばこんな感じ

まあでも、初学者の方にとってこんなルールは理解に苦しむでしょう、無理もありません。
私だっていきなり電話かかってきて「今すぐ北京ダック一式送って!」と恫喝されたらどうしたらいいかわかりませんもの。

なんで?

仕様です。すみません。

An ESRI shapefile consists of a main file, an index file, and a dBASE table

The term "shapefile" is quite common, but the format consists of a collection of files with a common filename prefix, stored in the same directory. The three mandatory files have filename extensions .shp, .shx, and .dbf

つまり上記のネタツイートにあるように

hoge.shp
hoge.shx
hoge.dbf

の3つが必須とされています。

最近はほかにもいろいろなhoge.xxxといった拡張子が最初存在したり、GISソフトによってはあとから関連ファイルが生成されたりくっついてきます。そのため、他のユーザーから「shpファイルくださーい」と言われた場合は、今後の信頼性と世界の平穏を確保するために、同じ名前で拡張子が異なるファイルも一緒に念のため送ってあげましょう。

また、今回試しで使ってみる国土数値情報では、SHPファイルグループとは別の形式である、GeoJSONやXMLなども同梱されててなかなかややこしいです…ですので、GeoJSONとか数メガのXMLが入っている場合は送らなくても良い場合があります。

なお、上記wikipedia先生によるとshpファイルに関わる拡張子がいろいろ列挙されております。

必須とされる
hoge.shp hoge.shx hoge.dbf
以外ですと、独断と偏見ですがこのあたりの拡張子は高頻度で遭遇します

  • hoge.prj
  • hoge.sbn
  • hoge.sbx
  • hoge.qpj

また、こちらもたまに見ます

  • hoge.fbn
  • hoge.fbx
  • hoge.ain
  • hoge.aih
  • hoge.cpg
  • hoge.qix

これらはほとんど見たこと無い気がする…松茸レベルかな…

  • hoge.ixs
  • hoge.mxs

あとQGIS/ArcGISつかう方とやり取りしているとこのへんのファイルもくっついてくることがあります

  • hoge.qml
  • hoge.lyr

揃ってないとどうなるか

それでは、任意の拡張子だけの場合や、何かがヌケている場合どのような挙動をするのか確かめてみます。

環境はmacOS12.6.3 QGIS 3.28.8-Firenzeです。
さすがにこういう検証を意図的にやったことがないので、感電とか落盤しないか心配です。

今回は皆さんよく使う国土数値情報における行政区域の令和5年・東京都データをサンプルとして用います。
DLしてくるとこのような中身になっています。

image.png

*.shpをQGISで開くとこうなります、属性もこんな感じ
image.png

なお、

  • N03-23_13_230101.geojson
  • N03-23_13_230101.xml
  • KS-META-N03-23_13_230101.xml

は、前述のとおり今回検証に扱う一連のshpファイル群とは異なり、同梱されているGeoJSON形式やメタデータですので今回の検証から除外します(その理由はこちらにあるんですが、xmlの説明がないけどええまあはい)

*.shpのみしかない場合

では、*.shpのみ送られてきた場合はどうのような挙動になるでしょうか?

image.png

QGISでデータを追加するデータソースマネージャーでN03-23_13_230101.shpを単一で指定し「追加」を押すと

image.png

無効なデータソース: /hogehoge/hoge/N03-20230101_13_GML/N03-23_13_230101.shp は有効または認識されたデータソースではありません

と叱られます。ドラッグ&ドロップでも同じです。

*.dbfがない場合

では、*.dbfがない場合はどうでしょう、こんな構成に変えてみます。

image.png

こちらもQGISのデータソースマネージャーではN03-23_13_230101.shpをむやり指定し、「追加」を押すと

あら、マップキャンバスに東京都の行政区域が表示されます

image.png

でも、*.dbf…つまり属性のデータがないので属性テーブルをQGISで開いてみると空っぽです

image.png

もちろん、ドラッグ&ドロップでも同じ現象になります。

無理やり開くと、てっきりエラーが出ると思ったんですが、形状は読み込んでくれてしまうので、送られたデータを確認するときには形状だけでなく属性テーブルも上記のように中身を確認することをおすすめします(私みたいなジオジサンになると数々の事案に遭遇しているので癖になっている…)

*.shxがない場合

では、*.shxを削ってみましょう。この組み合わせになります。

image.png

とすると、やはり

image.png

無効なデータソース: /hogehoge/hoge/N03-20230101_13_GML/N03-23_13_230101.shp は有効または認識されたデータソースではありません

と叱られます。こちらもドラッグ&ドロップでも同じです。

そもそもフィルタリングすると読めない

上記のように、shpファイルに必須といわれる、*.shp *.shx *.dbfが揃っていな場合はデータソースマネージャーでデータ形式をESRI Shapefilesにフィルタリングした途端、ターゲットのファイルが全てグレーアウトしてしまい、選択することができなくなります。

image.png

補足…*.prjがない場合

*.prjファイルは、必須ではないものの、各データの座標系の定義が書き込まれています。中身はこんな感じです

GEOGCS["GCS_JGD_2011",DATUM["D_JGD_2011",SPHEROID["GRS_1980",6378137.0,298.257222101]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]]

では*.prjがない場合はどうなるのでしょうか?

読めることは読めます、属性も読めている…あれ、背景のOpenStreetMapなどがなんか変だ…

image.png

つまり、座標系の定義がないためOpenStreetMapなどEPSG:3857の地図タイル背景で確認すると…

image.png

アフリカ大陸の東にある座標[0,0]周辺…いわゆるnull島付近に飛ばされてしまいます。

なお、最近のQGISでは*.prjがない…つまり座標系定義がない場合「?」マークがレイヤの右横に出るしくみになっています

image.png

もし出てしまったらコチラの「?」マークを押すと、正しい座標系・投影法を選択するウインドウが開きます。

ここで本来の座標系を定義してあげると、ちゃんとした位置にデータが表示されます。

image.png

ただし、この処理ではQGISのプロジェクト上で「強制的に座標系を定義」しているだけですので、今後このデータを用いる際は新規ファイルとしてエクスポートすることをおすすめします。

image.png

前述のようにshpファイルが策定された際、とくに*.prjは必須ではなかったのですが、この記事を書きながらArcViewからArcGISにバージョンアップされた1999年頃などにオンザフライ投影機能が実装され、当該shpがそもそもどの座標系で作成されたか認識するためにprjが付与された瞬間に立ち会ったことを思い出しました
オンザフライ投影や*.prjの実装当時、なんだこれ、すげー!別々の投影法で作成してもちゃんと重なる!便利だ!と感動したのですが、それまではメタデータもメモもないまま送りつけられてきたshpが一体なんの座標系で作られたかを推定するのにトライ&エラーで半日以上かかるなどということもありました(略)、ということで*prj大事です。

まとめ

shpファイル関連でなにかのファイルが欠けていると、感電も落盤もしませんでしたがさまざまな処理上の不整合が起きます。

なので、これらを送るときはまとめてZipファイルなどで圧縮して送りましょう!

…という毎回毎回ZIPする手間やヌケモレを先方に確認するコストをジオジサンとして20年くらいやってると疲れてきたので、これからはfgbとかgdbとかGeoJSONなどSHPを凌駕するフォーマットの出現が待たれますね(でもけっきょくshpはなかなか減らないし使ってしまう…)

なお、このへんの議論はSwitch from Shapefileとか、Iguchi先生によるシェープファイルの真の後継規格 FlatGeobufの普及啓蒙活動などを御覧ください。















※DALL-E画伯にはこういうのも作っていただいたのだが、後ろのロボがなんかすごく悪い感じだったり、6人っていってるのに5人だったり、赤が被りすぎたのでこれはボツに…

14
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?