proj4php
PROJ というオープンソースの座標系ツールをPHPに移植したもの。
座標系の変換を行える。できることの詳細は、同じくPythonに移植された pyproj を参照。
ただし、proj4phpの方は、インストールしたままで扱える座標系の種類が少なく、pyprojと比べて使い勝手がやや劣る印象。
インストール
composer.jsonから
{ "require": { "proj4php/proj4php": "~2.0", } }
EPSG定義
最初から使えるEPSGコードは限られており、それ以外は定義をあらかじめ教えておく必要がある。
上手くいかない例
GitHubのREADMEのコードを参考に旧日本測地系から世界測地系に変換しようとしても、動かないという罠。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
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
オブジェクトに教えるとよいっぽい。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
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 |