PHPの関数で複数の値を戻す

(1/1)
PHP の関数は、通常、1 つの値を return で戻す。では、2 つ以上の値を戻す場合にはどうすればよいか。
今回は座標変換を例に、2 つの値を戻す関数を作ってみることにする。

サンプル・プログラム

測地系の違い

日本地図に記されている緯度・経度には 2種類の座標系がある。いわゆる「日本測地系」と「世界測地系」である。同じ緯度・経度でも、測地系が違うと、緯度・経度にして約 12秒、距離にして 300 メートルほど異なる。これは大きな違いだ。

明治初期、当時の東京天文台(東京都港区麻布台 2-18-1)で行った観測によって日本経緯度原点が定められた。ここを基準にした三角測量によって全国の緯度・経度が測定された。これが日本測地系である。
一方、GPS衛星で測量している世界測地系の一種を WGS-84 と呼ぶ。
日本測地系では、1841 年に定められたベッセル楕円体の地球の長半径(6,377,397.155m)を用いてきた。一方の世界措置系では、1980 年(昭和 55 年)に定められたGRS80 地球楕円体の長半径(6,378,137m)を利用している。同じ地点でも、測地系が違うと、緯度・経度にして 12秒の差が生じするのである。

測地系変換プログラム

0094: /**
0095:  * 世界測地系を日本測地系に変換する
0096:  * @param double $latitude  緯度(世界測地系)
0097:  * @param double $longitude 経度(世界測地系)
0098:  * @return double array(緯度,経度)(日本測地系)
0099: */
0100: function wgs84_tokyo($latitude$longitude) {
0101:     $lat_tokyo = $latitude  + $latitude * 0.00010696 - $longitude * 0.000017467 - 0.0046020;
0102:     $lng_tokyo = $longitude + $latitude * 0.000046047 + $longitude * 0.000083049 - 0.010041;
0103: 
0104:     return array($lat_tokyo$lng_tokyo);
0105: }
0106: 
0107: /**
0108:  * 日本測地系を世界測地系に変換する
0109:  * @param double $lat_tokyo  緯度(日本測地系)
0110:  * @param double $lng_tokyo  経度(日本測地系)
0111:  * @return double array(経度,緯度)(世界測地系)
0112: */
0113: function tokyo_wgs84($lat_tokyo$lng_tokyo) {
0114:     $latitude  = $lat_tokyo - $lat_tokyo * 0.00010695  + $lng_tokyo * 0.000017464 + 0.0046017;
0115:     $longitude = $lng_tokyo - $lat_tokyo * 0.000046038 - $lng_tokyo * 0.000083043 + 0.010040;
0116: 
0117:     return array($latitude$longitude);
0118: }

そこで今回は、世界測地系を日本測地系に変換する wgs84_tokyo と、日本測地系を世界測地系に変換する tokyo_wgs84 の 2種類のユーザー関数を用意した。
いずれも、緯度・経度を引数とし、変換後の緯度・経度を戻す。
ここで問題なのが、2 つの戻り値があるということだ。

通常、PHP の関数は return 文で 1 つの値を返す。これを 2 つ返すためにどうしたらいいか。
ここでは配列を用いることにした。ユーザー関数側で  array  を使い、呼び出した側では  list  を使って受け取るのである。

0254: list($lat_tokyo$lng_tokyo) = wgs84_tokyo($latitude$longitude);

配列を使うメリットは、戻り値が 3 つ、4 つ‥‥いくつあっても戻すことができる点である。

参考サイト

(この項おわり)
header