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

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

(2023年8月5日)国土地理院ジオコーディングAPIを利用できるようにした.検索キーの最小・最大長が指定できるようにした.

目次

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

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

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

圧縮ファイルの内容
getAltitude.phpサンプル・プログラム本体
pahooGeoCode.php住所・緯度・経度に関わるクラス pahooGeoCode。
使い方は「PHPで住所・ランドマークから最寄り駅を求める」「PHPで住所・ランドマークから緯度・経度を求める」などを参照。include_path が通ったディレクトリに配置すること。
pahooInputData.phpデータ入力に関わる関数群。
使い方は「数値入力とバリデーション」「文字入力とバリデーション」などを参照。include_path が通ったディレクトリに配置すること。
getAltitude.php 更新履歴
バージョン 更新日 内容
3.5.0 2023/07/16 国土地理院ジオコーディングAPIを追加,検索キーの最小・最大長の指定
3.4 2021/10/17 PHP8対応,リファラ・チェック改良
3.3 2020/04/10 OSM Nominatim Search API追加
3.21 2019/06/01 逆ジオコーディングサービスの選択肢を増やした
3.2 2019/05/29 地理院地図、OpenStreetMapも利用できるようにした
pahooGeoCode.php 更新履歴
バージョン 更新日 内容
6.3.1 2023/07/09 bug-fix
6.3.0 2023/07/02 getPointsGSI()追加
6.2.0 2023/07/02 ip2address()追加
6.1.0 2022/12/30 ip2address()追加
6.0.4 2022/12/13 PHP8.2対応
pahooInputData.php 更新履歴
バージョン 更新日 内容
1.3.0 2023/07/11 roundFloat() 追加
1.2.0 2023/04/22 exitIfLessVersion() 追加
1.1.2 2023/02/05 validString() 修正
1.11 2022/07/03 isCommandLine() 修正
1.1 2022/06/04 getValidString() 修正

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

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

準備:pahooGeoCode クラス

  37: class pahooGeoCode {
  38:     var $items;     //検索結果格納用
  39:     var $error;     //エラー・フラグ
  40:     var $errmsg;    //エラー・メッセージ
  41:     var $hits;      //検索ヒット件数
  42:     var $webapi;    //直前に呼び出したWebAPI URL
  43: 
  44:     //Google Cloud Platform APIキー
  45:     //https://cloud.google.com/maps-platform/
  46:     //※Google Maps APIを利用しないのなら登録不要
  47:     var $GOOGLE_API_KEY_1 = '**************************';   //HTTPリファラ用
  48:     var $GOOGLE_API_KEY_2 = '**************************';   //IP制限用
  49: 
  50:     //Yahoo! JAPAN Webサービス アプリケーションID
  51:     //https://e.developer.yahoo.co.jp/register
  52:     //※Yahoo! JAPAN Webサービスを利用しないのなら登録不要
  53:     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が必要で、その入手方法は「Yahoo!JAPAN デベロッパーネットワーク - WebAPIの登録方法」を、それぞれ参照されたい。

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

  51: //地図描画サービスの選択
  52: //    0:Google
  53: //    2:地理院地図・OSM
  54: define('MAPSERVICE', 2);
  55: 
  56: //住所検索サービスの選択
  57: //    0:Google
  58: //    1:Yahoo!JAPAN
  59: //   11:HeartRails Geo API
  60: //   12:OSM Nominatim Search API
  61: //   13:国土地理院ジオコーディングAPI
  62: define('GEOSERVICE', 11);
  63: 
  64: //逆ジオコーディングサービスの選択
  65: //    0:Google
  66: //    1:Yahoo!JAPAN
  67: //   11:HeartRails Geo API
  68: //   21:簡易ジオコーディングサービス
  69: define('REVGEOSERVICE', 1);

表示する地図は、Googleマップ地理院地図・オープンストリートマップ(OSM)から選べる。あらかじめ、定数 MAPSERVIC に値を設定すること。
住所検索サービスは、GoogleYahoo!JAPANHeartRails Geo APIOSM Nominatim Search API国土地理院ジオコーディングAPIから選べる。あらかじめ、定数 GEOSERVICE に値を設定すること。
逆ジオコーディングサービスは、GoogleYahoo!JAPANHeartRails Geo API簡易ジオコーディングサービスから選べる。あらかじめ、定数 REVGEOSERVICE に値を設定すること。

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の使い方

1128: /**
1129:  * 「YOLP 標高API」を利用して標高を求める
1130:  * @param   float $latitude  緯度(世界測地系)
1131:  * @param   float $longitude 経度(世界測地系)
1132:  * @return  float 標高(メートル)/FALSE
1133: */
1134: function getAltitude($latitude, $longitude) {
1135:     $url = $this->getURL_YOLP_altitude($latitude, $longitude);
1136:     $this->webapi = $url;
1137: 
1138: //PHP4用; DOM XML利用
1139:     if ($this->isphp5over() == FALSE) {
1140:         if (($dom = $this->read_xml($url)) == NULLreturn FALSE;
1141:         $pagingInfo = $dom->get_elements_by_tagname('YDF');
1142:         //レスポンス・チェック
1143:         $rc = $pagingInfo[0]->get_elements_by_tagname('recordCount');
1144:         $rc = (int)$rc[0]->get_content();
1145:         if ($rc <0)    return FALSE;
1146:         //検索結果取りだし
1147:         $hotels = $dom->get_elements_by_tagname('hotels');
1148:         $hotel  = $hotels[0]->get_elements_by_tagname('hotel');
1149:         $cnt = 1;
1150:         foreach ($hotel as $val) {
1151:             foreach ($RakutenItems as $name) {
1152:                 $node = $val->get_elements_by_tagname('hotelBasicInfo');
1153:                 $node = $node[0]->get_elements_by_tagname($name);
1154:                 if ($node !NULL) {
1155:                     $items[$cnt][$name] = (string)$node[0]->get_content();
1156:                 }
1157:             }
1158:             $cnt++;
1159:         }
1160: 
1161: //PHP5用; SimpleXML利用
1162:     } else {
1163:         $this->unknown_certificate();
1164:         $xml = simplexml_load_file($url);
1165:         //レスポンス・チェック
1166:         if ($xml == NULL)   return FALSE;
1167:         if ($xml->ResultInfo->Count <0)    return FALSE;
1168:         //検索結果取りだし
1169:         $alt = (double)$xml->Feature[0]->Property->Altitude;
1170:     }
1171: 
1172:     return $alt;
1173: }

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

解説:気圧を求める

1175: /**
1176:  * 気圧を求める
1177:  * @param   float $altitude 標高(メートル)
1178:  * @return  float 気圧(ヘクトパスカル)
1179: */
1180: function getPressure($altitude) {
1181:     return pow(10, (log10(1013.25- ($altitude / 18410)));
1182: }

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

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

活用例

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

参考サイト

(この項おわり)
header