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

(1/1)
YOLP 標高API」は、指定した緯度・経度の標高を求めることができる WebAPI サービスだ(ただし、日本国内で、河川・湖沼・海岸は除く)。地図サービスをマッシュアップすることで、住所やランドマークから標高・気圧を求める PHP プログラムを作ってみる。

(2019 年 5 月 29 日)地理院地図、OpenStreetMap も利用できるようにした。緯度・経度から住所を検索する逆ジオコーディングサービスの選択肢を増やした。
(2019 年 3 月 22 日)Yahoo! JavaScript マップも利用できるようにした。

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

YOLP API を利用して住所から標高を求める
Google マップ表示

サンプル・プログラムのダウンロード

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

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

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

準備: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 の登録方法」を、YOLP マップを利用するのであれば、Yahoo! JAPAN Web サービス アプリケーション IDが必要で、その入手方法は「Google Cloud Platform - WebAPI の登録方法」を、それぞれ参照されたい。

準備:地図サービス(WebAPI)の選択

0031: //地図描画サービスの選択
0032: //    0:Google
0033: //    1:Yahoo!JAPAN
0034: //    2:地理院地図・OSM
0035: define('MAPSERVICE', 0);
0036: 
0037: //住所検索サービスの選択
0038: //    0:Google
0039: //    1:Yahoo!JAPAN
0040: //   11:HeartRails Geo API
0041: define('GEOSERVICE', 0);
0042: 
0043: //逆ジオコーディングサービスの選択
0044: //    0:Google
0045: //    1:Yahoo!JAPAN
0046: //   11:HeartRails Geo API
0047: //   21:簡易ジオコーディングサービス
0048: define('REVGEOSERVICE', 21);

表示する地図は、Google マップ、[Yahoo!マップ]blue]、地理院地図・オープンストリートマップ(OSM)から選べる。あらかじめ、定数 MAPSERVIC に値を設定すること。
住所検索サービスは、GoogleYahoo!JAPANHeartRails Geo APIから選べる。あらかじめ、定数 GEOSERVICE に値を設定すること。
逆ジオコーディングサービスは、GoogleYahoo!JAPANHeartRails Geo API簡易ジオコーディングサービスから選べる。あらかじめ、定数 REVGEOSERVICE に値を設定すること。
YOLP API を利用して住所から標高を求める
Yahoo!マップ表示

YOLP 標高API

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

入力パラメータ
フィールド名 要否 内  容
appid 必須 Yahoo! JAPAN Webサービス アプリケーションID
coordinates 必須 経度、緯度の順で「,」で区切る。
緯度、経度はfloat型。
複数の緯度経度を指定する場合は「経度,緯度,経度,緯度,……」のように指定する。GETリクエストの場合は40点、POSTリクエストの場合は100点まで同時に指定できる。
output 任意 xml:XML形式【デフォルト】
json:JSON形式
callback 任意 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の使い方

0950: /**
0951:  * 「YOLP 標高API」を利用して標高を求める
0952:  * @param float $latitude  緯度(世界測地系)
0953:  * @param float $longitude 経度(世界測地系)
0954:  * @return float 標高(メートル)/FALSE
0955: */
0956: function getAltitude($latitude$longitude) {
0957:     $url = $this->getURL_YOLP_altitude($latitude$longitude);
0958:     $this->webapi = $url;
0959: 
0960: //PHP4用; DOM XML利用
0961:     if ($this->isphp5over() == FALSE) {
0962:         if (($dom = $this->read_xml($url)) == NULL)  return FALSE;
0963:         $pagingInfo = $dom->get_elements_by_tagname('YDF');
0964:         //レスポンス・チェック
0965:         $rc = $pagingInfo[0]->get_elements_by_tagname('recordCount');
0966:         $rc = (int)$rc[0]->get_content();
0967:         if ($rc <= 0)   return FALSE;
0968:         //検索結果取りだし
0969:         $hotels = $dom->get_elements_by_tagname('hotels');
0970:         $hotel  = $hotels[0]->get_elements_by_tagname('hotel');
0971:         $cnt = 1;
0972:         foreach ($hotel as $val) {
0973:             foreach ($RakutenItems as $name) {
0974:                 $node = $val->get_elements_by_tagname('hotelBasicInfo');
0975:                 $node = $node[0]->get_elements_by_tagname($name);
0976:                 if ($node != NULL) {
0977:                     $items[$cnt][$name] = (string)$node[0]->get_content();
0978:                 }
0979:             }
0980:             $cnt++;
0981:         }
0982: 
0983: //PHP5用; SimpleXML利用
0984:     } else {
0985:         $this->unknown_certificate();
0986:         $xml = simplexml_load_file($url);
0987:         //レスポンス・チェック
0988:         if ($xml == NULL)   return FALSE;
0989:         if ($xml->ResultInfo->Count <= 0) return FALSE;
0990:         //検索結果取りだし
0991:         $alt = (double)$xml->Feature[0]->Property->Altitude;
0992:     }
0993: 
0994:     return $alt;
0995: }

緯度・経度をユーザー関数 getAltitude に渡してやることで、YOLP 標高API をコールして標高を取り出す。

解説:気圧を求める

0997: /**
0998:  * 気圧を求める
0999:  * @param float $altitude 標高(メートル)
1000:  * @return float 気圧(ヘクトパスカル)
1001: */
1002: function getPressure($altitude) {
1003:     return pow(10, (log10(1013.25) - ($altitude / 18410)));
1004: }

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


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

活用例

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

参考サイト

(この項おわり)
header