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

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

(2025年12月6日)PHP8.5対応:double→float表記変更
(2025年8月30日).pahooEnv 導入
(2025年6月14日)GoogleMaps JavaScript APIの変更に対応した.

目次

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

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

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

圧縮ファイルの内容
getAltitude.phpサンプル・プログラム本体
pahooGeoCode.php住所・緯度・経度に関わるクラス pahooGeoCode。
使い方は「PHPで住所・ランドマークから最寄り駅を求める」「PHPで住所・ランドマークから緯度・経度を求める」などを参照。include_path が通ったディレクトリに配置すること。
pahooInputData.phpデータ入力に関わる関数群。
使い方は「数値入力とバリデーション」「文字入力とバリデーション」などを参照。include_path が通ったディレクトリに配置すること。
getAltitude.php 更新履歴
バージョン 更新日 内容
3.4.0 2025/08/30 .pahooEnv導入
3.5.1 2024/09/23 参考URL
3.5.0 2023/07/16 国土地理院ジオコーディングAPIを追加,検索キーの最小・最大長の指定
3.4 2021/10/17 PHP8対応,リファラ・チェック改良
3.3 2020/04/10 OSM Nominatim Search API追加
pahooGeoCode.php 更新履歴
バージョン 更新日 内容
6.9.1 2025/11/25 PHP8.5対応:double→float
6.9.0 2025/09/21 jsPolygon, jsPolygon_Gmap, jsPolygon_Leaflet, loadGeoJSON, getPrefBorderList を追加
6.8.0 2025/08/10 アクセスキーなどを ".pahooEnd" に分離
6.7.1 2025/07/26 jsLine_Gmap() - bug-fix
6.7.0 2025/07/20 drawJSmap,drawGMap -- 引数 $markerLevel 追加
pahooInputData.php 更新履歴
バージョン 更新日 内容
2.0.1 2025/08/11 getParam() bug-fix
2.0.0 2025/08/11 pahooLoadEnv() 追加
1.9.0 2025/07/26 getParam() 引数に$trim追加
1.8.1 2025/03/15 validRegexPattern() debug
1.8.0 2024/11/12 validRegexPattern() 追加

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

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

準備:PHP の https対応

クラウド連携や相手先サイトのデータを読み込むのに https通信を使うため、PHPに OpenSSLモジュールが組み込まれている必要がある。関数  phpinfo  を使って、下図のように表示されればOKだ。
OpenSSL - PHP
そうでない場合は、次の手順に従ってOpenSSLを有効化し、PHPを再起動させる必要がある。

Windowsでは、"php.ini" の下記の行を有効化する。
extension=php_openssl.dll
Linuxでは --with-openssl=/usr オプションを付けて再ビルドする。→OpenSSLインストール手順

これで準備は完了だ。

準備:pahooGeoCode クラス

pahooGeoCode.php

  41: class pahooGeoCode {
  42:     public $items;      // 検索結果格納用
  43:     public $error;      // エラー・フラグ
  44:     public $errmsg;     // エラー・メッセージ
  45:     public $hits;       // 検索ヒット件数
  46:     public $webapi; // 直前に呼び出したWebAPI URL
  47: 
  48:     // 都道府県境界線データ
  49:     // SimpleMaps.com is a product of Pareto Software, LLC. © 2010-2025
  50:     // https://simplemaps.com/gis/country/jp
  51:     // ※各自の環境に合わせて設定すること
  52:     public $GeoJsonJP = __DIR__ . '/jp.json';
  53: 
  54:     // -- 以下のデータは .env ファイルに記述可能
  55:     // Google Cloud Platform APIキー
  56:     // https://cloud.google.com/maps-platform/
  57:     // ※Google Maps APIを利用しないのなら登録不要
  58:     public $GOOGLE_API_KEY_1 = '';      // HTTPリファラ用
  59:     public $GOOGLE_API_KEY_2 = '';      // IP制限用
  60:     public $GOOGLE_MAP_ID    = '';      // GoogleMaps ID
  61: 
  62:     // Yahoo! JAPAN Webサービス アプリケーションID
  63:     // https://e.developer.yahoo.co.jp/register
  64:     // ※Yahoo! JAPAN Webサービスを利用しないのなら登録不要
  65:     public $YAHOO_APPLICATION_ID = '';
  66: 
  67:     // OSM Nominatim Search API利用時に知らせるメールアドレス
  68:     // https://wiki.openstreetmap.org/wiki/JA:Nominatim#.E6.A4.9C.E7.B4.A2
  69:     // ※OSM Nominatim Search APIを利用しないのなら登録不要
  70:     public $NOMINATIM_EMAIL = '';
  71: 
  72:     // IP2Location.io APIキー
  73:     // https://www.ip2location.io/
  74:     // ※IP2Location.ioを利用しないのなら登録不要
  75:     public $IP2LOCATION_API_KEY = '';

GoogleマップやLeafletなどによる地図描画や住所検索を行うためのクラスが pahooGeoCode である。同梱のクラス・ファイル "pahooGeoCode.php" は include_path が通ったディレクトリに配置してほしい。他のプログラムでも pahooGeoCodeクラス を利用するが、常に最新のクラス・ファイルを1つ配置すればよい。

地図や住所検索として Google を利用するのであれば Google Cloud Platform APIキーマップID が必要で、その入手方法は「Google Cloud Platform - WebAPIの登録方法」を、Yahoo!JAPAN を利用するのであれば Yahoo! JAPAN Webサービス アプリケーションIDが必要で、その入手方法は「Yahoo!JAPAN デベロッパーネットワーク - WebAPIの登録方法」を、IP2Location.ioを利用するのであれば「PHPでIPアドレスやホスト名から住所を求める」を、それぞれ参照されたい。

PHPのクラスについては「PHPでクラスを使ってテキストの読みやすさを調べる」を参照されたい。

準備:pahooInputData 関数群

PHPのバージョンや入力データのバリデーションなど、汎用的に使う関数群を収めたファイル "pahooInputData.php" が同梱されているが、include_path が通ったディレクトリに配置してほしい。他のプログラムでも "pahooInputData.php" を利用するが、常に最新のファイルを1つ配置すればよい。

また、各種クラウドサービスに登録したときに取得するアカウント情報、アプリケーションパスワードなどを登録した .pahooEnv ファイルから読み込む関数 pahooLoadEnv を備えている。こちらについては、「各種クラウド連携サービス(WebAPI)の登録方法」をご覧いただきたい。

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

getAltitude.php

  57: // 地図描画サービスの選択
  58: //    0:Google
  59: //    2:地理院地図・OSM
  60: define('MAPSERVICE', 2);
  61: 
  62: // 住所検索サービスの選択
  63: //    0:Google
  64: //    1:Yahoo!JAPAN
  65: //   11:HeartRails Geo API
  66: //   12:OSM Nominatim Search API
  67: //   13:国土地理院ジオコーディングAPI
  68: define('GEOSERVICE', 11);
  69: 
  70: // 逆ジオコーディングサービスの選択
  71: //    0:Google
  72: //    1:Yahoo!JAPAN
  73: //   11:HeartRails Geo API
  74: //   21:簡易ジオコーディングサービス
  75: 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の使い方

pahooGeoCode.php

1292: /**
1293:  * 「YOLP 標高API」を利用して標高を求める
1294:  * @param   float $latitude  緯度(世界測地系)
1295:  * @param   float $longitude 経度(世界測地系)
1296:  * @return  float 標高(メートル)/FALSE
1297: */
1298: function getAltitude($latitude, $longitude) {
1299:     $url = $this->getURL_YOLP_altitude($latitude, $longitude);
1300:     $this->webapi = $url;
1301: 
1302: // PHP4用DOM XML利用
1303:     if ($this->isphp5over() == FALSE) {
1304:         if (($dom = $this->read_xml($url)) == NULLreturn FALSE;
1305:         $pagingInfo = $dom->get_elements_by_tagname('YDF');
1306:         // レスポンス・チェック
1307:         $rc = $pagingInfo[0]->get_elements_by_tagname('recordCount');
1308:         $rc = (int)$rc[0]->get_content();
1309:         if ($rc <0)    return FALSE;
1310:         // 検索結果取りだし
1311:         $hotels = $dom->get_elements_by_tagname('hotels');
1312:         $hotel  = $hotels[0]->get_elements_by_tagname('hotel');
1313:         $cnt = 1;
1314:         foreach ($hotel as $val) {
1315:             foreach ($RakutenItems as $name) {
1316:                 $node = $val->get_elements_by_tagname('hotelBasicInfo');
1317:                 $node = $node[0]->get_elements_by_tagname($name);
1318:                 if ($node !NULL) {
1319:                     $items[$cnt][$name] = (string)$node[0]->get_content();
1320:                 }
1321:             }
1322:             $cnt++;
1323:         }
1324: 
1325: // PHP5用SimpleXML利用
1326:     } else {
1327:         $this->unknown_certificate();
1328:         $xml = simplexml_load_file($url);
1329:         // レスポンス・チェック
1330:         if ($xml == NULL)   return FALSE;
1331:         if ($xml->ResultInfo->Count <0)    return FALSE;
1332:         // 検索結果取りだし
1333:         $alt = (float)$xml->Feature[0]->Property->Altitude;
1334:     }
1335: 
1336:     return $alt;
1337: }

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

解説:気圧を求める

pahooGeoCode.php

1339: /**
1340:  * 気圧を求める
1341:  * @param   float $altitude 標高(メートル)
1342:  * @return  float 気圧(ヘクトパスカル)
1343: */
1344: function getPressure($altitude) {
1345:     return pow(10, (log10(1013.25- ($altitude / 18410)));
1346: }

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

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

活用例

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

参考サイト

(この項おわり)
header