目次

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