PHPで YOLP API を利用して住所から降水量を求める

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

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

目次

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

YOLP気象情報APIを利用して住所から降水量を求める
Googleマップ表示

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

圧縮ファイルの内容
getPrecipitation.phpサンプル・プログラム本体
pahooGeoCode.php住所・緯度・経度に関わるクラス pahooGeoCode。
使い方は「PHPで住所・ランドマークから最寄り駅を求める」「PHPで住所・ランドマークから緯度・経度を求める」などを参照。include_path が通ったディレクトリに配置すること。
getPrecipitation.php 更新履歴
バージョン 更新日 内容
3.5.0 2023/07/16 検索キーの最小・最大長の指定
3.4.0 2023/07/02 国土地理院ジオコーディングAPIを追加
3.3 2021/10/17 PHP8対応,リファラ・チェック改良
3.2 2020/04/11 OSM Nominatim Search API追加
3.11 2019/06/01 逆ジオコーディングサービスの選択肢を増やした
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)の選択

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

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

WebAPI:YOLP 気象情報API

リクエストURL
https://map.yahooapis.jp/weather/V1/place

入力パラメータ
フィールド名 要否 内  容
appid 必須 Yahoo! JAPAN Webサービス アプリケーションID
coordinates 必須 経度、緯度の順で「,」で区切る。
緯度、経度はfloat型。
複数の緯度経度を指定する場合は「経度,緯度,経度,緯度,……」のように指定する。GETリクエストの場合は40点、POSTリクエストの場合は100点まで同時に指定できる。
output 任意 xml:XML形式【デフォルト】
json:JSON形式
callback 任意 outputパラメータがjsonのとき、JSONPとして出力する際のコールバック関数名を指定する。UTF-8でエンコードした文字列を指定する。
date 任意 日時を指定(YYYYMMDDHHMI形式)。
現在から2時間前までの日時を指定可能。
past 任意 過去の降水強度実測値を取得する場合に指定する。
0 - 取得しない【デフォルト】
1 - 1時間前までの降水強度実測値を取得する
2 - 2時間前までの降水強度実測値を取得する
interval 任意 過去の降水強度実測値を取得する場合に指定する。
10 - 10分毎【デフォルト】
5 - 5分毎
応答データ構造(xml) YDF ResultInfo Count 検索データ数 Total 全データ数 Start 取得開始位置 Status 処理結果コード Latency 処理時間 Description データの説明 Copyright 著作権情報 Feature Id データID Name 地点 Geometry Type データの種類 Coordinates 経度,緯度 Property WeatherAreaCode 一次細分コード(4桁) WeatherList Weather Type 実測/予測 Date 年月日時分 Rainfall 降水量(mm/h) Weather Type 実測/予測 Date 年月日時分 Rainfall 降水量(mm/h)

解説:YOLP 気象情報APIの使い方

1185: /**
1186:  * 「YOLP 気象情報API」のリクエストURLを取得する
1187:  * @param   float $latitude  緯度(世界測地系)
1188:  * @param   float $longitude 経度(世界測地系)
1189:  * @return  string URL YOLP 標高API のURL
1190: */
1191: function getURL_YOLP_precipitation($latitude, $longitude) {
1192:     $appID = $this->YAHOO_APPLICATION_ID;
1193: 
1194:     $url = "https://map.yahooapis.jp/weather/V1/place?appid={$appID}&coordinates={$longitude},{$latitude}&output=xml&past=2&interval=10";
1195: 
1196:     return $url;
1197: }

1199: /**
1200:  * 「YOLP 気象情報API」を利用して降水量を求める
1201:  * @param   array  $items     降水量を格納する配列
1202:  * @param   float $latitude  緯度(世界測地系)
1203:  * @param   float $longitude 経度(世界測地系)
1204:  * @return  bool TRUE/FALSE
1205: */
1206: function getPrecipitation(&$items, $latitude, $longitude) {
1207:     $url = $this->getURL_YOLP_precipitation($latitude, $longitude);
1208:     $this->webapi = $url;
1209: 
1210: //PHP4用; DOM XML利用
1211:     if ($this->isphp5over() == FALSE) {
1212:         if (($dom = $this->read_xml($url)) == NULLreturn FALSE;
1213:         //レスポンス・チェック
1214:         $node = $dom->get_elements_by_tagname('ResultInfo');
1215:         $node = $node[0]->get_elements_by_tagname('Count');
1216:         $rc = (int)$node[0]->get_content();
1217:         if ($rc <0)    return FALSE;
1218:         //検索結果取りだし
1219:         $node = $dom->get_elements_by_tagname('Feature');
1220:         $node = $node[0]->get_elements_by_tagname('Property');
1221:         $node = $node[0]->get_elements_by_tagname('WeatherList');
1222:         $node = $node[0]->get_elements_by_tagname('Weather');
1223:         foreach ($node as $val) {
1224:             $n2 = $val->get_elements_by_tagname('Date');
1225:             $dt = (string)$n2[0]->get_content();
1226:             $n2 = $val->get_elements_by_tagname('Rainfall');
1227:             $items[$dt]['Rainfall'] = (double)$n2[0]->get_content();
1228:             $n2 = $val->get_elements_by_tagname('Type');
1229:             $items[$dt]['Type'] = (string)$n2[0]->get_content();
1230:         }
1231: 
1232: //PHP5用; SimpleXML利用
1233:     } else {
1234:         $this->unknown_certificate();
1235:         $xml = simplexml_load_file($url);
1236:         //レスポンス・チェック
1237:         if ($xml->ResultInfo->Count <0)    return FALSE;
1238:         //検索結果取りだし
1239:         foreach ($xml->Feature->Property->WeatherList->Weather as $weather) {
1240:             $dt = (string)$weather->Date;
1241:             $items[$dt]['Rainfall'] = (double)$weather->Rainfall;
1242:             $items[$dt]['Type'] = (string)$weather->Type;
1243:         }
1244:     }
1245: 
1246:     return TRUE;
1247: }

緯度・経度をユーザー関数 getPrecipitation に渡してやることで、降水量の実測値と予測値を配列に格納する。
ユーザー関数 getPrecipitation 内では、ユーザー関数 getURL_YOLP_precipitation をコールしてリクエストURLを取得する。

参考サイト

(この項おわり)
header