【GIS】PROJが利用しているEPSGの情報

# はじめに

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",
...
```

ここまでの話は実は、以下に書いてある内容です。

https://proj.org/apps/projinfo.html#examples

### jqによるJSONの整形

ここでJSONのデータから所望のものをCSVで出力することを考えます。コマンドラインで便利なツールにjqというのがありました。``` sudo apt -y install jq``` で問題なくインストールできました。知らなかったなぁ、こんな便利なツール。

https://stedolan.github.io/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) があります。

https://proj.org/download.html

- 面積の計算ができるらしい。4D Transformation with Time も気になる。

https://pyproj4.github.io/pyproj/stable/examples.html

- 自分はインストールで make install するときに以下のように言われた。


> Libraries have been installed in:
   /usr/local/lib
>
> If 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 というのが見つかりました。

https://epsg.org/home.html

ここからEPSGに関するDBをダウンロードできます。
また、おそらく最新のDBの情報については、GeoRepository API というWEB APIで情報を取得できます。

https://apps.epsg.org/api/swagger/ui/index

うーん、どうやって使うかな。とにかくしっかり定義とかこだわって、管理していそう。

# まとめ

PROJでEPSGをどのように参照しているのか調べ、proj.db の存在、projinfo の使い方を勉強しました。TODOは今のところ思いつかないが、奥が深そうだ。EPSGの全体像、だれかわかりやすく解説してくれないかな。。。

ところでPROJをキーワードに書こうとしたら、候補で出てこなかった。いままでだれも書いていないのか？

(2021/05/25)

### 関連した自分の投稿

https://qiita.com/XPT60/items/9aa41cab07ce6369fb99

https://qiita.com/XPT60/items/be4e3d9f9f58d17cf968