PHPで YOLP API を利用して住所から標高を求める

(1/1)
PHP で Google を利用して住所から緯度・経度を求める」では住所から緯度・経度を求めたが、今回は「YOLP 標高API」をマッシュアップすることで、標高や気圧を求める PHP プログラムを作ってみることにする。

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

YOLP API を利用して住所から標高を求める

サンプル・プログラム

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

YOLP API を利用して住所から標高を求める
プログラムの流れは「PHP で最寄り駅を求める」の時と同じで、緯度・経度から施設情報を求める部分を、「YOLP 標高API」に差し替えただけである。

解説:クラスファイル

住所やランドマークから緯度・経度を求める処理は、「PHP で最寄り駅を求める」で作成したクラス pahooGeoCode を利用する。
クラスファイル "pahooGeoCode.php" の配置、各種WebAPI用のアプリケーション ID の設定方法については、「解説:pahooGeoCode クラス」を参照してほしい。

0034:     //Yahoo! JAPAN Webサービス アプリケーションID
0035:     //https://developers.google.com/maps/documentation/javascript/get-api-key
0036:     var $YAHOO_APPLICATION_ID = '*****************************';

YOLP 標高API」を利用するためには、アプリケーション ID を取得する必要がある。http://e.developer.yahoo.co.jp/webservices/register_application から無料で取得できる。

YOLP 標高API

YOLP 標高API」は、入力パラメータ(IN)は GET 渡しで、出力結果(OUT)は XML などで戻すという形である。今回使う入力パラメータと出力結果のデータ構造を以下に示す。
なお、同 API の解説によると、「国土地理院長の承認を得て、同院発行の基盤地図情報及び日本のジオイド 2000 を複製したものである。(承認番号 平成 22 業複、第485 号)」そうなので、河川や海上、海外の標高は求めることができない。
WebAPIのURL
URL
http://alt.search.olp.yahooapis.jp/OpenLocalPlatform/V1/getAltitude

入力パラメータ
項目名 フィールド名 内  容
アプリケーションID appid string 【必須】Yahoo! DEVELOPER NETWORKのアプリケーションID。無料で入手できる。
緯度,経度 coordinates float,float,,, 【必須】経度、緯度の順で「,」で区切る。
緯度、経度はfloat型。
複数の緯度経度を指定する場合は「経度,緯度,経度,緯度,……」のように指定する。GETリクエストの場合は40点、POSTリクエストの場合は100点まで同時に指定できる。
出力形式 output string xml:XML形式【デフォルト】
json:JSON形式
コールバック関数 callback string outputパラメータがjsonのとき、JSONPとして出力する際のコールバック関数名を指定する。UTF-8でエンコードした文字列を指定する。
応答データ構造(xml) YDF ResultInfo Count 標高データ数 Total 全データ数 Start 取得開始位置 Status 処理結果コード Latency 処理時間 Description データの説明 Copyright 著作権情報 Feature Id データID Geometry Type データの種類 Coordinates 経度,緯度 Property Altitude 標高(メートル) EllipsoidHeight 楕円体高(メートル) GeoidHeight ジオイド高(メートル)

解説:YOLP 標高APIの使い方

0674: /**
0675:  * YOLP 標高API のURLを取得する
0676:  * @param double $latitude  緯度(世界測地系)
0677:  * @param double $longitude 経度(世界測地系)
0678:  * @return string URL YOLP 標高API のURL
0679: */
0680: function getURL_YOLP_altitude($latitude$longitude) {
0681:     $appID = $this->YAHOO_APPLICATION_ID;
0682: 
0683:     $url = "http://alt.search.olp.yahooapis.jp/OpenLocalPlatform/V1/getAltitude?appid={$appID}&coordinates={$longitude},{$latitude}&output=xml";
0684: 
0685:     return $url;
0686: }
0687: 
0688: /**
0689:  * 「YOLP 標高API」を利用して標高を求める
0690:  * @param double $latitude  緯度(世界測地系)
0691:  * @param double $longitude 経度(世界測地系)
0692:  * @return double 標高(メートル)/FALSE
0693: */
0694: function getAltitude($latitude$longitude) {
0695:     $url = $this->getURL_YOLP_altitude($latitude$longitude);
0696:     $this->webapi = $url;
0697: 
0698: //PHP4用; DOM XML利用
0699:     if ($this->isphp5over() == FALSE) {
0700:         if (($dom = $this->read_xml($url)) == NULL)  return FALSE;
0701:         $pagingInfo = $dom->get_elements_by_tagname('YDF');
0702:         //レスポンス・チェック
0703:         $rc = $pagingInfo[0]->get_elements_by_tagname('recordCount');
0704:         $rc = (int)$rc[0]->get_content();
0705:         if ($rc <= 0)   return FALSE;
0706:         //検索結果取りだし
0707:         $hotels = $dom->get_elements_by_tagname('hotels');
0708:         $hotel  = $hotels[0]->get_elements_by_tagname('hotel');
0709:         $cnt = 1;
0710:         foreach ($hotel as $val) {
0711:             foreach ($RakutenItems as $name) {
0712:                 $node = $val->get_elements_by_tagname('hotelBasicInfo');
0713:                 $node = $node[0]->get_elements_by_tagname($name);
0714:                 if ($node != NULL) {
0715:                     $items[$cnt][$name] = (string)$node[0]->get_content();
0716:                 }
0717:             }
0718:             $cnt++;
0719:         }
0720: 
0721: //PHP5用; SimpleXML利用
0722:     } else {
0723:         $this->unknown_certificate();
0724:         $xml = simplexml_load_file($url);
0725:         //レスポンス・チェック
0726:         if ($xml == NULL)   return FALSE;
0727:         if ($xml->ResultInfo->Count <= 0) return FALSE;
0728:         //検索結果取りだし
0729:         $alt = (double)$xml->Feature[0]->Property->Altitude;
0730:     }
0731: 
0732:     return $alt;
0733: }

PHP で Google を利用して住所から緯度・経度を求める」で使ったユーザー関数 getPointsV3_all を使って、住所や駅名から緯度・経度(世界測地系)を求める。

この緯度・経度をユーザー関数 getAltitude に渡してやることで、「YOLP 標高API」をコールして標高を取り出す。(緯度・経度は Google Geocoding API の値を流用)

サンプル・プログラムの解説:気圧を求める

0735: /**
0736:  * 気圧を求める
0737:  * @param double $altitude 標高(メートル)
0738:  * @return double 気圧(ヘクトパスカル)
0739: */
0740: function getPressure($altitude) {
0741:     return pow(10, (log10(1013.25) - ($altitude / 18410)));
0742: }

標高から気圧を求めるには、「標高とポテトチップス袋の変化」で用いた下の式を利用した。これは、地上の気温を 20℃としたときの近似式である。
P1 = 10 log10 P0 ÷ 18410.0


標高をユーザー関数 getPressure に渡してやることで、気圧を計算する。

活用例

みんなの知識 ちょっと便利帳」では、「地図・住所から標高/気圧/座標を調べる」で本プログラムを利用し、検索しやすいページを提供している。ありがとうございます。

参考サイト

(この項おわり)
header