はじめに
GIS関係のプログラミングでは、EPSGコードを使っていると思います。
測地系の変換には、pythonだと pyprojが便利であることを前にメモしました。
今回、pyproj のもとである PROJ のライブラリが対応しているEPSGを調べてみました。このメモのポイントは、
- PROJは内部に持っている(インストールされた)proj.db に EPSGの情報を保持している
- proj コマンドでEPSGの情報を取得できる
- jq を使うと json で出力されたテキストの整形に便利
です。
PROJでEPSGの情報を表示
インストールされている PROJについて
まずPROJがインストールされていることを前提にします。
$ projinfo
Rel. 8.1.0, July 1st, 2021
私の場合、インストールするときに/usr/local/lib を指定してしまった(configure するときのprefixに指定)ので、ここにあります。インストールの方法によっては他にあるはずです。
$ ls /usr/local/lib/libproj.*
/usr/local/lib/libproj.a /usr/local/lib/libproj.so /usr/local/lib/libproj.so.22.0.0
/usr/local/lib/libproj.la /usr/local/lib/libproj.so.22
また、PROJがデフォルトで参照する設定ファイルは、ここにあるようです。
$ ls /usr/local/share/proj/
CH ITRF2000 ITRF2014 nad.lst nad83 proj.db projjson.schema.json world
GL27 ITRF2008 deformation_model.schema.json nad27 other.extra proj.ini triangulation.schema.json
EPSG リストの取得
proj.db からEPSGを取り出します。 (sqlite3のコマンド、よくわからないが。。^^;)
sqlite3 /usr/local/share/proj/proj.db "SELECT code FROM projected_crs WHERE auth_name = 'EPSG';"
EPSGの情報
projinfo で出力できます。
$ projinfo EPSG:4326
PROJ.4 string:
+proj=longlat +datum=WGS84 +no_defs +type=crs
WKT2:2019 string:
GEOGCRS["WGS 84",
ENSEMBLE["World Geodetic System 1984 ensemble",
MEMBER["World Geodetic System 1984 (Transit)"],
MEMBER["World Geodetic System 1984 (G730)"],
MEMBER["World Geodetic System 1984 (G873)"],
MEMBER["World Geodetic System 1984 (G1150)"],
MEMBER["World Geodetic System 1984 (G1674)"],
MEMBER["World Geodetic System 1984 (G1762)"],
ELLIPSOID["WGS 84",6378137,298.257223563,
LENGTHUNIT["metre",1]],
ENSEMBLEACCURACY[2.0]],
PRIMEM["Greenwich",0,
ANGLEUNIT["degree",0.0174532925199433]],
CS[ellipsoidal,2],
AXIS["geodetic latitude (Lat)",north,
ORDER[1],
ANGLEUNIT["degree",0.0174532925199433]],
AXIS["geodetic longitude (Lon)",east,
ORDER[2],
ANGLEUNIT["degree",0.0174532925199433]],
USAGE[
SCOPE["Horizontal component of 3D system."],
AREA["World."],
BBOX[-90,-180,90,180]],
ID["EPSG",4326]]
WKT(well-known text) はテキストで図形やGISの情報を表すためのテキストでのデータ形式のようです。
projinfo では-o
で出力形式をjson に指定できます。最初にフォーマット名を出力しないように -q
をつけると、標準出力でJSONの文字列が得られます。
$ projinfo EPSG:4326 -o PROJJSON -q
{
"$schema": "https://proj.org/schemas/v0.2/projjson.schema.json",
"type": "GeographicCRS",
"name": "WGS 84",
"datum_ensemble": {
"name": "World Geodetic System 1984 ensemble",
...
ここまでの話は実は、以下に書いてある内容です。
jqによるJSONの整形
ここでJSONのデータから所望のものをCSVで出力することを考えます。コマンドラインで便利なツールにjqというのがありました。 sudo apt -y install jq
で問題なくインストールできました。知らなかったなぁ、こんな便利なツール。
ここでは、いくつかの要素を出力してみます。
$ projinfo EPSG:4326 -o PROJJSON -q | jq --raw-output '[.name,.type,.id.authority,.id.code,.area] | @csv'
"WGS 84","GeographicCRS","EPSG",4326,"World."
その他 proj 情報源
- PROJのサイトにいくと、DownloadのページにPDF Manual (proj.pdf) があります。
- 面積の計算ができるらしい。4D Transformation with Time も気になる。
- 自分はインストールで make install するときに以下のように言われた。
Libraries have been installed in:
/usr/local/libIf you ever happen to want to link against installed libraries
in a given directory, LIBDIR, you must either use libtool, and
specify the full pathname of the library, or use the '-LLIBDIR'
flag during linking and do at least one of the following:
- add LIBDIR to the 'LD_LIBRARY_PATH' environment variable
during execution - add LIBDIR to the 'LD_RUN_PATH' environment variable
during linking - use the '-Wl,-rpath -Wl,LIBDIR' linker flag
- have your system administrator add LIBDIR to '/etc/ld.so.conf'
See any operating system documentation about shared libraries for
more information, such as the ld(1) and ld.so(8) manual pages.
なので、LD_LIBRARY_PATH に/usr/local/lib を追加しました。
EPSGについて
EPSGの本家を探していたら、GeoRopository というのが見つかりました。
ここからEPSGに関するDBをダウンロードできます。
また、おそらく最新のDBの情報については、GeoRepository API というWEB APIで情報を取得できます。
うーん、どうやって使うかな。とにかくしっかり定義とかこだわって、管理していそう。
まとめ
PROJでEPSGをどのように参照しているのか調べ、proj.db の存在、projinfo の使い方を勉強しました。TODOは今のところ思いつかないが、奥が深そうだ。EPSGの全体像、だれかわかりやすく解説してくれないかな。。。
ところでPROJをキーワードに書こうとしたら、候補で出てこなかった。いままでだれも書いていないのか?
(2021/05/25)
関連した自分の投稿