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

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

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

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

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

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

圧縮ファイルの内容
getPrecipitation.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', 1);
0036: 
0037: //住所検索サービスの選択
0038: //    0:Google
0039: //    1:Yahoo!JAPAN
0040: //   11:HeartRails Geo API
0041: define('GEOSERVICE', 1);
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!マップ表示

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

1007: /**
1008:  * 「YOLP 気象情報API」のリクエストURLを取得する
1009:  * @param float $latitude  緯度(世界測地系)
1010:  * @param float $longitude 経度(世界測地系)
1011:  * @return string URL YOLP 標高API のURL
1012: */
1013: function getURL_YOLP_precipitation($latitude$longitude) {
1014:     $appID = $this->YAHOO_APPLICATION_ID;
1015: 
1016:     $url = "https://map.yahooapis.jp/weather/V1/place?appid={$appID}&coordinates={$longitude},{$latitude}&output=xml&past=2&interval=10";
1017: 
1018:     return $url;
1019: }

1021: /**
1022:  * 「YOLP 気象情報API」を利用して降水量を求める
1023:  * @param array  $items     降水量を格納する配列
1024:  * @param float $latitude  緯度(世界測地系)
1025:  * @param float $longitude 経度(世界測地系)
1026:  * @return bool TRUE/FALSE
1027: */
1028: function getPrecipitation(&$items$latitude$longitude) {
1029:     $url = $this->getURL_YOLP_precipitation($latitude$longitude);
1030:     $this->webapi = $url;
1031: 
1032: //PHP4用; DOM XML利用
1033:     if ($this->isphp5over() == FALSE) {
1034:         if (($dom = $this->read_xml($url)) == NULL)  return FALSE;
1035:         //レスポンス・チェック
1036:         $node = $dom->get_elements_by_tagname('ResultInfo');
1037:         $node = $node[0]->get_elements_by_tagname('Count');
1038:         $rc = (int)$node[0]->get_content();
1039:         if ($rc <= 0)   return FALSE;
1040:         //検索結果取りだし
1041:         $node = $dom->get_elements_by_tagname('Feature');
1042:         $node = $node[0]->get_elements_by_tagname('Property');
1043:         $node = $node[0]->get_elements_by_tagname('WeatherList');
1044:         $node = $node[0]->get_elements_by_tagname('Weather');
1045:         foreach ($node as $val) {
1046:             $n2 = $val->get_elements_by_tagname('Date');
1047:             $dt = (string)$n2[0]->get_content();
1048:             $n2 = $val->get_elements_by_tagname('Rainfall');
1049:             $items[$dt]['Rainfall'] = (double)$n2[0]->get_content();
1050:             $n2 = $val->get_elements_by_tagname('Type');
1051:             $items[$dt]['Type'] = (string)$n2[0]->get_content();
1052:         }
1053: 
1054: //PHP5用; SimpleXML利用
1055:     } else {
1056:         $this->unknown_certificate();
1057:         $xml = simplexml_load_file($url);
1058:         //レスポンス・チェック
1059:         if ($xml->ResultInfo->Count <= 0) return FALSE;
1060:         //検索結果取りだし
1061:         foreach ($xml->Feature->Property->WeatherList->Weather as $weather) {
1062:             $dt = (string)$weather->Date;
1063:             $items[$dt]['Rainfall'] = (double)$weather->Rainfall;
1064:             $items[$dt]['Type'] = (string)$weather->Type;
1065:         }
1066:     }
1067: 
1068:     return TRUE;
1069: }

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

参考サイト

(この項おわり)
header