目次
pyprojのdatadir
2018/08頃、Anacondaで何の気なしにpyprojをアップデートしたところ、突然エラーを出すようになった件をきっかけに、調べたことをメモ。
発生した現象
EPSGコードを使ってProjオブジェクトを生成しようとすると、エラーになった。
import pyproj prj_jgd2000 = pyproj.Proj('+init=epsg:4612')
RuntimeError: b'no arguments in initialization list'
- Windows
- Anaconda経由
- Python 3.5
- pyproj 1.5.9.1
原因
EPSGコードはコードなのでそれ自体に情報は無く、実際にPROJ.4用に渡すパラメータがコード毎に決められている。個別のEPSGコードはEPSG.ioなどで調べられる。
- EPSG:4612
- PROJ.4用パラメータ:
+proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs
pyprojでEPSGコードからインスタンス生成しようとしたとき、裏では、このパラメータを引くための辞書のようなファイルを読んでいる。
その辞書ファイルのパスを記録しているのが、datadir.py
のようだ。
- Base環境
Anaconda3/Lib/site-packages/pyproj/datadir.py
- 任意環境
Anaconda3/envs/(envname)/Lib/site-packages/pyproj/datadir.py
このdatadir.py
の記述の場所に、辞書用データが存在していないことが原因だった。
「datadir.pyに書かれた場所にそんなん無いよ」という場合、手っ取り早くはこのファイルを適当な場所に展開してパス指定すればよい。
なお、全てのpyprojがダメということではなく、特定のビルド(1.9.5.1-py35hb98d9bb_1)のみでパスが上手く張られていなかったので、ちょっとしたミスかも知れない。 別のビルド(1.9.5.1-py35_0)を明示的に指定してインストールし直すと、解消した。 まぁ、さっさとpython3.6以上に上げればいいんだけどね。他のモジュールの提供状況との兼ね合いでね。
その他
なお、pyprojは本家から提供されているのはソースで、(Anacondaなど他人がビルドしてくれたものを用いない場合)本来は自力でビルドするタイプのモジュールであり、ビルド時の設定でEPSGコード辞書の場所を指定できるようだ。環境変数の'PROJ_DIR
'に、OSGeo4Wなどで提供されているデータファイルのパスを指定しておくとよいらしい。(といいつつ、OSGeo4Wのどのファイルのあるパスを指定すればいいのか、イマイチわかっていない)
実際、データファイルはEPSGコードの他にもいろいろな情報があり、全てあわせると5MB程度にはなる。pyprojの他にも使うモジュールが存在したり、環境を複数作っていたりすると、重複して各所にこれが作られることになるので、容量が無駄である。データファイルを1箇所にまとめ、参照場所をパラメータ化しようというのは理にかなっている。