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の記述の場所に、辞書用データが存在していないことが原因だった。

なお、全ての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箇所にまとめ、参照場所をパラメータ化しようというのは理にかなっている。

参考

programming/python/packages/pyproj/datadir.txt · 最終更新: 2018/08/09 by ikatakos
CC Attribution 4.0 International
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0