proj4php
PROJ というオープンソースの座標系ツールをPHPに移植したもの。
座標系の変換を行える。できることの詳細は、同じくPythonに移植された pyproj を参照。
ただし、proj4phpの方は、インストールしたままで扱える座標系の種類が少なく、pyprojと比べて使い勝手がやや劣る印象。
インストール
composer.jsonから
{ "require": { "proj4php/proj4php": "~2.0", } }
EPSG定義
最初から使えるEPSGコードは限られており、それ以外は定義をあらかじめ教えておく必要がある。
上手くいかない例
GitHubのREADMEのコードを参考に旧日本測地系から世界測地系に変換しようとしても、動かないという罠。
require_once '/var/www/vendor/autoload.php'; use proj4php\Proj4php; use proj4php\Proj; use proj4php\Point; $proj4 = new Proj4php(); $projWgs84 = new Proj('EPSG:4326', $proj4); // 世界測地系 $projBessel = new Proj('EPSG:4301', $proj4); // 旧日本測地系 $src = new Point(135, 35, $projBessel); $dst = $proj4->transform($projWgs84, $src);
原因がイマイチわかりづらいのだが、transform()
の行で下記のエラーが出る。
Fatal error: Uncaught Exception: Proj4php initialization for: EPSG:4301 not yet complete in /var/www/vendor/proj4php/proj4php/src/Proj4php.php:642
EPSG:4301のinitializationが完了してないらしい。
これは、WGS84(EPSG:4326)の方は(よく使われる座標系なので)ライブラリ内に定義されているが、EPSG:4301はそれが無いためのようだ。
対処法
epsg.ioというサイトに各EPSGの情報がまとめられている。
ページ下方の「Export」欄で「PROJ.4」をクリックすると、閲覧中の座標系の定義が表示される。これをProj4php
オブジェクトに教えるとよいっぽい。
require_once '/var/www/vendor/autoload.php'; use proj4php\Proj4php; use proj4php\Proj; use proj4php\Point; $proj4 = new Proj4php(); // ↓ここ! $proj4->addDef('EPSG:4301', '+proj=longlat +ellps=bessel +towgs84=-146.414,507.337,680.507,0,0,0,0 +no_defs'); $projWgs84 = new Proj('EPSG:4326', $proj4); // 世界測地系 $projBessel = new Proj('EPSG:4301', $proj4); // 旧日本測地系 $src = new Point(135, 35, $projBessel); $dst = $proj4->transform($projWgs84, $src); echo $dst->toString(); // => 成功! // x=134.99720424901,y=35.003197179804