これは MIERUNE AdventCalendar 2023…6日目の記事です。
昨日は @KEI_YAMA さんによる テスト駆動開発でブログアプリのバックエンドを実装してみる でした。
はい出オチです(DALL-E2画伯による生成画像をベースにしていますので適宜利用可能かと)
はじめに
GISでデファクトスタンダードと呼ばれはや数十年…であるSHP(しぇいぷ)ファイルというファイル形式あります。
呼び名としては、SHPファイルのほかにShapeファイル・シェープファイル・シェイプファイル・例のアレ等いろいろです。
最近では、生まれたときからSHPファイルがすでにあったというSHPファイルネイティブ世代も世間を賑わせております(知らんけど)
そんなSHPファイルネイティブ世代やGIS初学者が、この記事で紹介する事案について、幼少時に焚き火を触ってから火の怖さを知る等とされる「ネイティブアメリカンの教え」の如く最初にやらかしがちなことがらですが、あまりに些末すぎてこのような情報や検証が世間にはあまりみあたらないのでこちらにおいておきます。
結論を先に書くと
拡張子shpのファイルだけ相手に送っても何も見れないよ!
です。
いわばこんな感じ
Hello there!
— 🥔🗺️ ᴘᴏᴋᴀᴛᴇᴏ ᴍᴀᴘs (@pokateo_maps) June 16, 2021
General @shapefiIe! #mappymeme pic.twitter.com/ZeLviu3nqP
まあでも、初学者の方にとってこんなルールは理解に苦しむでしょう、無理もありません。
私だっていきなり電話かかってきて「今すぐ北京ダック一式送って!」と恫喝されたらどうしたらいいかわかりませんもの。
なんで?
仕様です。すみません。
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してくるとこのような中身になっています。
なお、
- N03-23_13_230101.geojson
- N03-23_13_230101.xml
- KS-META-N03-23_13_230101.xml
は、前述のとおり今回検証に扱う一連のshpファイル群とは異なり、同梱されているGeoJSON形式やメタデータですので今回の検証から除外します(その理由はこちらにあるんですが、xmlの説明がないけどええまあはい)
*.shpのみしかない場合
では、*.shpのみ送られてきた場合はどうのような挙動になるでしょうか?
QGISでデータを追加するデータソースマネージャーでN03-23_13_230101.shpを単一で指定し「追加」を押すと
無効なデータソース: /hogehoge/hoge/N03-20230101_13_GML/N03-23_13_230101.shp は有効または認識されたデータソースではありません
と叱られます。ドラッグ&ドロップでも同じです。
*.dbfがない場合
では、*.dbfがない場合はどうでしょう、こんな構成に変えてみます。
こちらもQGISのデータソースマネージャーではN03-23_13_230101.shpをむやり指定し、「追加」を押すと
あら、マップキャンバスに東京都の行政区域が表示されます
でも、*.dbf…つまり属性のデータがないので属性テーブルをQGISで開いてみると空っぽです
もちろん、ドラッグ&ドロップでも同じ現象になります。
無理やり開くと、てっきりエラーが出ると思ったんですが、形状は読み込んでくれてしまうので、送られたデータを確認するときには形状だけでなく属性テーブルも上記のように中身を確認することをおすすめします(私みたいなジオジサンになると数々の事案に遭遇しているので癖になっている…)
*.shxがない場合
では、*.shxを削ってみましょう。この組み合わせになります。
とすると、やはり
無効なデータソース: /hogehoge/hoge/N03-20230101_13_GML/N03-23_13_230101.shp は有効または認識されたデータソースではありません
と叱られます。こちらもドラッグ&ドロップでも同じです。
そもそもフィルタリングすると読めない
上記のように、shpファイルに必須といわれる、*.shp *.shx *.dbfが揃っていな場合はデータソースマネージャーでデータ形式をESRI Shapefiles
にフィルタリングした途端、ターゲットのファイルが全てグレーアウトしてしまい、選択することができなくなります。
補足…*.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などがなんか変だ…
つまり、座標系の定義がないためOpenStreetMapなどEPSG:3857の地図タイル背景で確認すると…
アフリカ大陸の東にある座標[0,0]周辺…いわゆるnull島付近に飛ばされてしまいます。
なお、最近のQGISでは*.prjがない…つまり座標系定義がない場合「?」マークがレイヤの右横に出るしくみになっています
もし出てしまったらコチラの「?」マークを押すと、正しい座標系・投影法を選択するウインドウが開きます。
ここで本来の座標系を定義してあげると、ちゃんとした位置にデータが表示されます。
ただし、この処理ではQGISのプロジェクト上で「強制的に座標系を定義」しているだけですので、今後このデータを用いる際は新規ファイルとしてエクスポートすることをおすすめします。
前述のようにshpファイルが策定された際、とくに*.prjは必須ではなかったのですが、この記事を書きながらArcViewからArcGISにバージョンアップされた1999年頃などにオンザフライ投影機能が実装され、当該shpがそもそもどの座標系で作成されたか認識するためにprjが付与された瞬間に立ち会ったことを思い出しました
オンザフライ投影や*.prjの実装当時、なんだこれ、すげー!別々の投影法で作成してもちゃんと重なる!便利だ!と感動したのですが、それまではメタデータもメモもないまま送りつけられてきたshpが一体なんの座標系で作られたかを推定するのにトライ&エラーで半日以上かかるなどということもありました(略)、ということで*prj大事です。
まとめ
shpファイル関連でなにかのファイルが欠けていると、感電も落盤もしませんでしたがさまざまな処理上の不整合が起きます。
なので、これらを送るときはまとめてZipファイルなどで圧縮して送りましょう!
…という毎回毎回ZIPする手間やヌケモレを先方に確認するコストをジオジサンとして20年くらいやってると疲れてきたので、これからはfgbとかgdbとかGeoJSONなどSHPを凌駕するフォーマットの出現が待たれますね(でもけっきょくshpはなかなか減らないし使ってしまう…)
なお、このへんの議論はSwitch from Shapefileとか、Iguchi先生によるシェープファイルの真の後継規格 FlatGeobufの普及啓蒙活動などを御覧ください。
明日は@moritoruさんによる地図のレンダリングを実現するまでの流れはどうなっているのか?です! お楽しみにー
※DALL-E画伯にはこういうのも作っていただいたのだが、後ろのロボがなんかすごく悪い感じだったり、6人っていってるのに5人だったり、赤が被りすぎたのでこれはボツに…