PHPで緯度・経度から住所を求める

(1/1)
今回は「PHP で住所・ランドマークから緯度・経度を求める」と逆のプログラム、すなわち、GoogleYahoo!JAPANHeartRails簡易逆ジオコーディングサービスのいずれかの逆ジオコーディングサービスを利用し、入力された緯度・経度から住所を求める PHP プログラムをつくる。

(2019 年 5 月 11 日)Google、Yahoo!JAPAN、HeartRails も利用できるようにした。

目次

サンプル・プログラムの実行例

PHPで緯度・経度から住所を求める

サンプル・プログラム

圧縮ファイルの内容
search_hotel.phpサンプル・プログラム本体。
pahooGeoCode.php住所・緯度・経度に関わるクラス pahooGeoCode。
使い方は「PHPで住所・ランドマークから最寄り駅を求める」「PHPで住所・ランドマークから緯度・経度を求める」などを参照。include_path が通ったディレクトリに配置すること。

サンプル・プログラムの流れ

PHPで緯度・経度から住所を求める

準備:pahooGeoCode クラス

0035: class pahooGeoCode {
0036:     var $items;      //検索結果格納用
0037:     var $error;      //エラーフラグ
0038:     var $hits;       //検索ヒット件数
0039:     var $webapi; //直前に呼び出したWebAPI URL
0040: 
0041:     //Google Cloud Platform APIキー
0042:     //https://cloud.google.com/maps-platform/
0043:     //※Google Maps APIを利用しないのなら登録不要
0044:     var $GOOGLE_API_KEY_1 = '**************************';   //HTTPリファラ用
0045:     var $GOOGLE_API_KEY_2 = '**************************';   //IP制限用
0046: 
0047:     //Yahoo! JAPAN Webサービス アプリケーションID
0048:     //https://e.developer.yahoo.co.jp/register
0049:     //※Yahoo! JAPAN Webサービスを利用しないのなら登録不要
0050:     var $YAHOO_APPLICATION_ID = '*****************************';

地図描画や住所検索を行うために、クラスファイル "pahooGeoCode.php" を使用する。組み込み関数  require_once  を使って読めるディレクトリに配置する。ディレクトリは、設定ファイル php.ini に記述されているオプション設定 include_path に設定しておく。
クラスについては「PHP でクラスを使ってテキストの読みやすさを調べる」を参照されたい。

地図や住所検索として Google を利用するのであれば、Google Cloud Platform API キー が必要で、その入手方法は「Google Cloud Platform - WebAPI の登録方法」を、Yahoo!JAPAN を利用するのであれば、Yahoo! JAPAN Web サービス アプリケーション IDが必要で、その入手方法は「Google Cloud Platform - WebAPI の登録方法」を、それぞれ参照されたい。

準備:逆ジオコーディングサービスの選択

0036: //逆ジオコーディングサービスの選択
0037: //    0:Google
0038: //    1:Yahoo!JAPAN
0039: //   11:HeartRails Geo API
0040: //   21:簡易ジオコーディングサービス
0041: define('REVGEOSERVICE', 11);

逆ジオコーディングサービスとして使う WebAPI は、GoogleYahoo!JAPANHeartRails Geo API簡易ジオコーディングサービスから選べる。あらかじめ、定数 REVGEOSERVICE に値を設定すること。
住所検索サービスの制約
サービス名 制 約
0 Google 有料(決められた無料枠あり)。
1 Yahoo!JAPAN 無料(?)。郵便番号が取得できない。
11 HeartRails Geo API 無料。市街地ではビル名が戻ることがある。
21 簡易ジオコーディングサービス 無料。郵便番号が取得できない。

「Google Geocoding API」による住所変換

Google Geocoding API」は、入力パラメータ(IN)は GET 渡しで、出力結果(OUT)は XML などで戻すという形である。今回使う入力パラメータと出力結果のデータ構造を以下に示す。
得られる緯度・経度は世界測地系(wgs84)であることに留意されたい。
WebAPIのURL
URL
https://maps.googleapis.com/maps/api/geocode/xml

入力パラメータ
フィールド名 要否 内  容
key 必須 APIキー
latlng 必須 検索対象の緯度,経度(世界測地系,10進数の度表記)
language 任意 使用言語。ja など
sensor 任意 true または false
応答データ構造(xml) GeocodeResponse status OK result type street_address formatted_address フォーマット済み住所 address_component type political:行政区画 type sublocality_level_*:街区以下 type locality:市区町村名 type administrative_area_*:都道府県名 type country:国名 type postal_code:郵便番号 long_name 長い名前 short_name 短い名前

解説:GoogleMaps API Geocoding

WebAPI を呼び出し、結果を配列変数に代入する処理は、これまでのサンプル・プログラムと同様である。
得られる要素が複数あるが、type=street_address であるものが住所表記であるので、これを選別して配列に格納してゆく。

0329: /**
0330:  * Google Geocoding API を用いて緯度・経度から住所を求める
0331:  * @param float $latitude  緯度(世界測地系,10進数の度表記)
0332:  * @param float $longitude 経度(世界測地系,10進数の度表記)
0333:  * @return array ['address']   フォーマット済み住所
0334:  *                ['$$$$']      都道府県など(サービスによって添字が変わる)
0335:  *          FALSE=エラー
0336: */
0337: function getGoogleAddress($latitude$longitude) {
0338:     $key = $this->GOOGLE_API_KEY_2;
0339:     $url = "https://maps.googleapis.com/maps/api/geocode/xml?key={$key}&latlng={$latitude},{$longitude}&language=ja&region=JP";
0340:     $this->webapi = $url;
0341: 
0342:     $res = array();
0343:     $this->unknown_certificate();
0344:     $xml = simplexml_load_file($url);
0345:     //レスポンス・チェック
0346:     if (preg_match("/ok/i", $xml->status) == 0)        return FALSE;
0347:     foreach ($xml->result as $element) {
0348:         if ($element->type == 'street_address') {
0349:             $res['address'] = $this->trimAddress((string)$element->formatted_address);
0350:             //有効な住所部品を格納
0351:             foreach ($element->address_component as $elem2) {
0352:                 $str = '';
0353:                 $flag = FALSE;
0354:                 foreach ($elem2->type as $val) {
0355:                     $type = (string)$val;
0356:                     if (preg_match('/_level_[0-9]+/i', $type) > 0) {
0357:                         $str = $type;
0358:                     } else if ($type == 'postal_code') {
0359:                         $flag = TRUE;
0360:                         $str = $type;
0361:                     } else if ($type == 'political') {
0362:                         $flag = TRUE;
0363:                     } else if ($str == '') {
0364:                         $str = $type;
0365:                     }
0366:                 }
0367:                 if ($flag && ($str != '')) {
0368:                     $res[$str] = (string)$elem2->long_name;
0369:                 }
0370:             }
0371:             break;
0372:         }
0373:     }
0374: 
0375:     return $res;
0376: }

「Yahoo!リバースジオコーダAPI」による住所変換

Yahoo!リバースジオコーダ API」は、入力パラメータ(IN)は GET 渡しで、出力結果(OUT)は XML などで戻すという形である。今回使う入力パラメータと出力結果のデータ構造を以下に示す。
得られる緯度・経度は世界測地系(wgs84)であることに留意されたい。
WebAPIのURL
URL
https://map.yahooapis.jp/geoapi/V1/reverseGeoCoder

入力パラメータ
フィールド名 要否 内  容
appid 必須 アプリケーションID
lat 必須 検索対象の緯度(世界測地系,10進数の度表記)
lng 必須 検索対象の経度(世界測地系,10進数の度表記)
datum 任意 測地系
wgs:世界測地系(デフォルト)
tky:日本測地系
output 任意 出力形式:xml(デフォルト)/json
callback 任意 JSONPとして出力する際のコールバック関数名を入力するためのパラメータ。UTF-8でエンコードした文字列を入力する。
応答データ構造(xml) YDF ResultInfo Count レスポンスに含まれるデータ件数 Total 全データ件数 Start レスポンスの開始位置 Status 200:正常終了 Description データの説明 Copyright 著作権表記 Feature Property Country Code 国コード(ISO) Name 国名 Address 整形済み住所 AddressElement Name 部分住所 Kana よみ(平仮名) Level prefecture:都道府県名 Level city:市区町村名 Level oaza:大字・町村名 Level aza:字 Level detail1:街区以下 Code 行政コード

解説:Yahoo!リバースジオコーダAPI

WebAPI を呼び出し、結果を配列変数に代入する処理は、これまでのサンプル・プログラムと同様である。

1177: /**
1178:  * Yahoo!リバースジオコーダAPIを用いて緯度・経度から住所を求める
1179:  * @param float $latitude  緯度(世界測地系,10進数の度表記)
1180:  * @param float $longitude 経度(世界測地系,10進数の度表記)
1181:  * @return array ['address']   フォーマット済み住所
1182:  *                ['city']      市区町村
1183:  *                ['oaza']      大字
1184:  *                ['aza']      字
1185:  *                ['detail1']  街区
1186:  *          FALSE=エラー
1187: */
1188: function getYOLP_Address($latitude$longitude) {
1189:     $appid = $this->YAHOO_APPLICATION_ID;
1190:     $url = "https://map.yahooapis.jp/geoapi/V1/reverseGeoCoder?appid={$appid}&lat={$latitude}&lon={$longitude}&datum=wgs&output=xml";
1191:     $this->webapi = $url;
1192: 
1193:     $res = array();
1194:     $this->unknown_certificate();
1195:     $xml = simplexml_load_file($url);
1196:     //レスポンス・チェック
1197:     if (isset($xml->Error)) {
1198:         $this->error = TRUE;
1199:         $this->errmsg = $xml->Message;
1200:         $res = FALSE;
1201:     } else {
1202:         $res['address'] = (string)$xml->Feature->Property->Address;
1203:         foreach ($xml->Feature->Property->AddressElement as $val) {
1204:             $res[(string)$val->Level] = (string)$val->Name;
1205:         }
1206:     }
1207: 
1208:     return $res;
1209: }

「HeartRails Geo API」による住所変換

HeartRails Geo API - 緯度経度による住所検索 API」は、入力パラメータ(IN)は GET 渡しで、出力結果(OUT)は XML などで戻すという形である。今回使う入力パラメータと出力結果のデータ構造を以下に示す。
得られる緯度・経度は世界測地系(wgs84)であることに留意されたい。
WebAPIのURL
URL
http://geoapi.heartrails.com/api/xml?method=searchByGeoLocation

入力パラメータ
フィールド名 要否 内  容
method 必須 メソッド名:searchByGeolocation(固定)
y 必須 検索対象の緯度(世界測地系,10進数の度表記)
x 必須 検索対象の経度(世界測地系,10進数の度表記)
応答データ構造(xml) response location prefecture 都道府県名 city 市区町村名 city-kana 市区町村名よみ(平仮名) town 町域名 town-kana 町域名よみ(平仮名) postal 郵便番号

解説:HeartRails Geo API

WebAPI を呼び出し、結果を配列変数に代入する処理は、これまでのサンプル・プログラムと同様である。

1347: /**
1348:  * HeartRails Geo API - 緯度経度による住所検索APIを用いて
1349:  * 緯度・経度から住所を求める
1350:  * @param float $latitude  緯度(世界測地系,10進数の度表記)
1351:  * @param float $longitude 経度(世界測地系,10進数の度表記)
1352:  * @return array ['address']       フォーマット済み住所
1353:  *                ['prefecture']  都道府県名
1354:  *                ['city']          市区町村名
1355:  *                ['town']          町域名
1356:  *                ['postal']      郵便番号
1357:  *          FALSE=エラー
1358: */
1359: function getHeartRailsGeo_Address($latitude$longitude) {
1360:     $appid = $this->YAHOO_APPLICATION_ID;
1361:     $url = "http://geoapi.heartrails.com/api/xml?method=searchByGeoLocation&y={$latitude}&x={$longitude}";
1362:     $this->webapi = $url;
1363: 
1364:     $res = array();
1365:     $this->unknown_certificate();
1366:     $xml = simplexml_load_file($url);
1367:     //レスポンス・チェック
1368:     if (isset($xml->error)) {
1369:         $this->error = TRUE;
1370:         $this->errmsg = (string)$res->error;
1371:         $res = FALSE;
1372:     } else if (! isset($xml->location)) {
1373:         $this->error = TRUE;
1374:         $this->errmsg = 'Not found';
1375:         $res = FALSE;
1376:     } else {
1377:         foreach ($xml->location as $element) {
1378:             $res['prefecture'] = $element->prefecture;
1379:             $res['city'] = $element->city;
1380:             $res['town'] = $element->town;
1381:             $res['postal'] = $element->postal;
1382:             $res['address'] = $res['prefecture'] . $res['city'] . $res['town'];
1383:             break;
1384:         }
1385:     }
1386: 
1387:     return $res;
1388: }

「簡易逆ジオコーディングサービス」による住所変換

簡易逆ジオコーディングサービス」は、入力パラメータ(IN)は GET 渡しで、出力結果(OUT)は XML で戻るという API である。独立行政法人 農業・食品産業技術総合研究機構の研究成果だ。
今回使う入力パラメータと出力結果のデータ構造を以下に示す。バージョン 2 の出力を利用する。
なお、入力する緯度・経度は世界測地系(wgs84)であることに留意されたい。
WebAPIのURL
URL
http://www.finds.jp/ws/rgeocode.php

入力パラメータ
フィールド名 要否 内  容
key 任意 出力文書のバージョン。現在は 1 または 2 のみ有効。省略時はバージョン 1。
lat 必須 検索対象点の緯度(世界測地系,10進数の度表記)
lon 必須 検索対象点の経度(世界測地系,10進数の度表記)
jsonp / php / ponp 任意 JSONP, PHPシリアライズ, PONP の各文書種別を指定する。いずれの指定も無い場合はXML文書を応答文書とする。
応答データ構造(xml) rgeocode status 正常終了なら "true", それ以外は "false" error エラー理由 result prefecture pcode 都道府県コード pname 都道府県名 municipality mcode 市町村コード mname 市町村名 local section 町丁目・字など homenumber 番地 argument latitude 緯度 longitude 経度 meta name メタ情報名 content メタ情報

解説:簡易逆ジオコーディングサービス

0492: /**
0493:  * 簡易逆ジオコーディングサービスのWebAPI URLを取得する
0494:  * @param float $latitude  緯度(世界測地系,10進数の度表記)
0495:  * @param float $longitude 経度(世界測地系,10進数の度表記)
0496:  * @return string URL URL
0497: */
0498: function getURLrgeocode($latitude$longitude) {
0499:     return "http://www.finds.jp/ws/rgeocode.php?v=2&lat={$latitude}&lon={$longitude}";
0500: }

0502: /**
0503:  * 簡易逆ジオコーディングサービスを用いて緯度・経度から住所を求める
0504:  * @param float $latitude  緯度(世界測地系,10進数の度表記)
0505:  * @param float $longitude 経度(世界測地系,10進数の度表記)
0506:  * @return array (都道府県名,市町村名,町丁目,番地)/FALSE=エラー
0507: */
0508: function getAddress($latitude$longitude) {
0509:     //APIコール
0510:     $url = $this->getURLrgeocode($latitude$longitude);
0511:     $this->webapi = $url;
0512: 
0513: //PHP4用; DOM XML利用
0514:     if ($this->isphp5over() == FALSE) {
0515:         if (($dom = read_xml($url)) == NULL)    return FALSE;
0516:         $rgeocode = $dom->get_elements_by_tagname('rgeocode');
0517:         //住所取得
0518:         if (($result = $rgeocode[0]->get_elements_by_tagname('result')) == NULL)  return FALSE;
0519:         if (($pref = $result[0]->get_elements_by_tagname('prefecture')) == NULL)  return FALSE;
0520:         if (($pref2 = $pref[0]->get_elements_by_tagname('pname')) == NULL)           return FALSE;
0521:         $prefecture = $pref2[0]->get_content();
0522:         $muni = $result[0]->get_elements_by_tagname('municipality');
0523:         $municipality = '';
0524:         if ($muni != NULL) {
0525:             $muni2 = $muni[0]->get_elements_by_tagname('mname');
0526:             if ($muni2 != NULL)      $municipality = $muni2[0]->get_content();
0527:         }
0528:         $section = '';
0529:         $homenumber = '';
0530:         $loc = $result[0]->get_elements_by_tagname('local');
0531:         if ($loc != NULL) {
0532:             $loc2 = $loc[0]->get_elements_by_tagname('section');
0533:             if ($loc2 != NULL)   $section = $loc2[0]->get_content();
0534:             $loc2 = $loc[0]->get_elements_by_tagname('homenumber');
0535:             if ($loc2 != NULL)   $homenumber = $loc2[0]->get_content();
0536:         }
0537: 
0538: //PHP5用; SimpleXML利用
0539:     } else {
0540:         $this->unknown_certificate();
0541:         $rgeocode = simplexml_load_file($url);
0542:         //レスポンス・チェック
0543:         if (! isset($rgeocode->result))       return FALSE;
0544:         //住所取得
0545:         $prefecture = $rgeocode->result->prefecture->pname;
0546:         $municipality = $rgeocode->result->municipality->mname;
0547:         $section = $rgeocode->result->local->section;
0548:         $homenumber = $rgeocode->result->local->homenumber;
0549:     }
0550: 
0551:     return array($prefecture$municipality$section$homenumber);
0552: }

WebAPI を呼び出し、結果を配列変数に代入する処理は、これまでのサンプル・プログラムと同様である。

解説:検索と結果取得

1684: /**
1685:  * 緯度・経度から住所を求める
1686:  *
1687:  * @param float  $latitude  緯度(世界測地系,10進数の度表記)
1688:  * @param float  $longitude 経度(世界測地系,10進数の度表記)
1689:  * @param int    $api    0:Google Geocoding API
1690:  *                         1:Yahoo!リバースジオコーダAPI
1691:  *                        11:HeartRails Geo API
1692:  *                        21:簡易ジオコーディングサービス(省略時)
1693:  * @return array ['address']       フォーマット済み住所
1694:  *                ['postalcode']  郵便番号(一部サービスのみ)
1695:  *                ['prefecture']  都道府県名
1696:  *                ['city']          市町村名
1697:  *                ['local']          市町村名以下
1698:  *          FALSE=エラー
1699: */
1700: function getAddress3($latitude$longitude$api=21) {
1701:     $this->hits = 1;
1702:     $ret = array();
1703:     switch ($api) {
1704:         //Google Geocoding API
1705:         case 0:
1706:             $res = $this->getGoogleAddress($latitude$longitude);
1707:             if ($res == FALSE) {
1708:                 $ret = FALSE;
1709:                 $this->error  = TRUE;
1710:                 $this->errmsg = 'Google Geocoding API にトラブル発生';
1711:                 $this->hits = 0;
1712:             } else {
1713:                 $ret['address' ]   = $res['address'];
1714:                 $ret['postalcode'] = preg_replace('/\-/', '', $res['postal_code']);
1715:                 $ret['prefecture'] = $res['administrative_area_level_1'];
1716:                 $ret['city']       = $res['locality'];
1717:                 $pat = '/' . $ret['prefecture'] . $ret['city'] . '(.+)$/ui';
1718:                 $ret['local'] = (preg_match($pat$ret['address'], $arr) > 0) ?
1719:                     $arr[1] : '';
1720:             }
1721:             break;
1722:         //Yahoo!リバースジオコーダAPI
1723:         case 1:
1724:             $res = $this->getYOLP_Address($latitude$longitude);
1725:             if ($res == FALSE) {
1726:                 $ret = FALSE;
1727:                 $this->error  = TRUE;
1728:                 $this->errmsg = 'Yahoo!リバースジオコーダAPI にトラブル発生';
1729:                 $this->hits = 0;
1730:             } else {
1731:                 $ret['address' ]   = $res['address'];
1732:                 $ret['postalcode'] = '';
1733:                 $ret['prefecture'] = $res['prefecture'];
1734:                 $ret['city']       = $res['city'];
1735:                 $pat = '/' . $ret['prefecture'] . $ret['city'] . '(.+)$/ui';
1736:                 $ret['local'] = (preg_match($pat$ret['address'], $arr) > 0) ?
1737:                     $arr[1] : '';
1738:             }
1739:             break;
1740:         //HeartRails Geo API
1741:         case 11:
1742:             $res = $this->getHeartRailsGeo_Address($latitude$longitude);
1743:             if ($res == FALSE) {
1744:                 $ret = FALSE;
1745:                 $this->error  = TRUE;
1746:                 $this->errmsg = 'HeartRails Geo API にトラブル発生';
1747:                 $this->hits = 0;
1748:             } else {
1749:                 $ret['address' ]   = $res['address'];
1750:                 $ret['postalcode'] = $res['postal'];
1751:                 $ret['prefecture'] = $res['prefecture'];
1752:                 $ret['city']       = $res['city'];
1753:                 $pat = '/' . $ret['prefecture'] . $ret['city'] . '(.+)$/ui';
1754:                 $ret['local'] = (preg_match($pat$ret['address'], $arr) > 0) ?
1755:                     $arr[1] : '';
1756:             }
1757:             break;
1758:         //簡易逆ジオコーディングサービス
1759:         case 21:
1760:             $arr = $this->getAddress($latitude$longitude);
1761:             if ($arr == FALSE) {
1762:                 $ret = FALSE;
1763:                 $this->error  = TRUE;
1764:                 $this->errmsg = '簡易ジオコーディングサービスにトラブル発生';
1765:                 $this->hits = 0;
1766:             } else {
1767:                 $ret['address']  = $arr[0] . $arr[1] . $arr[2] . $arr[3];
1768:                 $ret['postalcode'] = '';
1769:                 $ret['prefecture'] = $arr[0];
1770:                 $ret['city'] = $arr[1];
1771:                 $ret['local'] = $arr[2] . $arr[3];
1772:             }
1773:             break;
1774:         //エラー
1775:         default:
1776:             $ret = FALSE;
1777:             $this->error  = TRUE;
1778:             $this->errmsg = '逆ジオコーダーAPIの指定ミス';
1779:             $this->hits = 0;
1780:             break;
1781:     }
1782: 
1783:     return $ret;
1784: }

メソッド getAddress3 は、引数 $api の値によって、Google用メソッド getGoogleAddress、Yahoo!用メソッド getYOLP_Address、HeartRails Geo API用メソッド getHeartRailsGeo_Address、簡易ジオコーディングサービス用メソッド getAddress を呼び出す。
結果は API によらずに等しく使えるように、下記の要素をもつ配列として戻す。エラー時には FALSE を返す。
添 字 内 容
address フォーマット済み住所
postalcode 郵便番号(一部サービスのみ)
prefecture 都道府県名
city 市町村名
local 市町村名以下

解説:緯度・経度を正規化

0161: /**
0162:  * 緯度・経度を正規化する
0163:  * @param string $maps   緯度・経度表記
0164:  *            緯度(小数),経度(小数)
0165:  *            N緯度(度.分.秒)E(度.分.秒)
0166:  *            N緯度(度/分/秒)E(度/分/秒)
0167:  * @param string $ingeo  入力データの測地系(tokyo:日本測地系,wgs84:世界測地系)
0168:  * @param string $outgeo 出力データの測地系(tokyo:日本測地系,wgs84:世界測地系)
0169:  * @param   object $pgc    pahooGeoCodeクラス
0170:  * @return array (緯度,経度)/FALSE=エラー
0171: */
0172: function parseGeo($maps$ingeo$outgeo$pgc) {
0173:     //各種表記形式を小数表記に統一する
0174:     if (preg_match('/([0-9\.\+\-]+)[\,\/ ]+([0-9\.\+\-]+)/', $maps$arr) > 0) {
0175:         $v1 = $arr[1];
0176:         $v2 = $arr[2];
0177:     } else if (preg_match('/N([0-9]+)[\.\/]([0-9]*)[\.\/]?([0-9]*)[\.\/]?([0-9]*)/', $maps$arr) > 0) {
0178:         $v1 = $arr[1];
0179:         if (isset($arr[2]))     $v1 += ($arr[2] / 60);
0180:         if (isset($arr[3]))     $v1 += ($arr[3] / 3600);
0181:         if (isset($arr[4]))     $v1 += ($arr[4] / 36000);
0182:         if (preg_match('/E([0-9]+)[\.\/]([0-9]*)[\.\/]?([0-9]*)[\.\/]?([0-9]*)/', $maps$arr) > 0) {
0183:             $v2 = $arr[1];
0184:             if (isset($arr[2]))     $v2 += ($arr[2] / 60);
0185:             if (isset($arr[3]))     $v2 += ($arr[3] / 3600);
0186:             if (isset($arr[4]))     $v2 += ($arr[4] / 36000);
0187:         }
0188:     }
0189: 
0190:     //2桁の方を緯度、3桁の方を経度に
0191:     if ($v1 < 100)          $latitude  = $v1;
0192:     else if ($v1 >= 100)    $longitude = $v1;
0193:     if ($v2 < 100)          $latitude  = $v2;
0194:     else if ($v2 >= 100)    $longitude = $v2;
0195: 
0196:     //測地系の変換
0197:     if (preg_match('/tokyo/i', $ingeo) > 0) {
0198:         if (preg_match('/wgs84/i', $outgeo) > 0) {
0199:             list($latitude$longitude) = $pgc->tokyo_wgs84($latitude$longitude);
0200:         }
0201:     } else if (preg_match('/wgs84/i', $ingeo) > 0) {
0202:         if (preg_match('/tokyo/i', $outgeo) > 0) {
0203:             list($latitude$longitude) = $pgc->wgs84_tokyo($latitude$longitude);
0204:         }
0205:     }
0206: 
0207:     return array($latitude$longitude);
0208: }

ユーザー関数 parseGeo は、入力された緯度・経度テキストを 10進数(小数)に正規化し、必要に応じて測地系を変換する。

参考サイト

(この項おわり)
header