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

(1/1)
PHP で Google を利用して住所から緯度・経度を求める」では住所から緯度・経度を求めたが、今回は「YOLP 気象情報 API」をマッシュアップすることで、その地点における降水量を求め、3 時間の合計雨量を表示する PHP プログラムを作ってみることにする。

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

YOLP気象情報APIを利用して住所から降水量を求める

サンプル・プログラム

解説:クラスファイル

住所やランドマークから緯度・経度を求める処理は、「PHP で最寄り駅を求める」で作成したクラス pahooGeoCode を利用する。
クラスファイル "pahooGeoCode.php" の配置、各種WebAPI用のアプリケーション ID の設定方法については、「解説:pahooGeoCode クラス」を参照してほしい。

標高、気圧、降水量などを求める処理は、「解説:クラスファイル」を参照してほしい。

WebAPI:YOLP 気象情報API

リクエストURL
http://weather.olp.yahooapis.jp/v1/place

入力パラメータ
項目名 フィールド名 内  容
アプリケーションID appid string 【必須】Yahoo! DEVELOPER NETWORKのアプリケーションID。無料で入手できる。
緯度,経度 coordinates float,float,,, 【必須】経度、緯度の順で「,」で区切る。
緯度、経度はfloat型。
複数の緯度経度を指定する場合は「経度,緯度,経度,緯度,……」のように指定する。GETリクエストの場合は40点、POSTリクエストの場合は100点まで同時に指定できる。
出力形式 output string xml:XML形式【デフォルト】
json:JSON形式
コールバック関数 callback string outputパラメータがjsonのとき、JSONPとして出力する際のコールバック関数名を指定する。UTF-8でエンコードした文字列を指定する。
日時 date string 日時を指定(YYYYMMDDHHMI形式)。
現在から2時間前までの日時を指定可能。
実測値取得 past int 過去の降水強度実測値を取得する場合に指定する。
0 - 取得しない【デフォルト】
1 - 1時間前までの降水強度実測値を取得する
2 - 2時間前までの降水強度実測値を取得する
取得間隔 interval int 過去の降水強度実測値を取得する場合に指定する。
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の使い方

0716: // YOLP 気象情報API ==========================================================
0717: /**
0718:  * 「YOLP 気象情報API」のリクエストURLを取得する
0719:  * @param double $latitude  緯度(世界測地系)
0720:  * @param double $longitude 経度(世界測地系)
0721:  * @return string URL YOLP 標高API のURL
0722: */
0723: function getURL_YOLP_precipitation($latitude$longitude) {
0724:     $appID = $this->YAHOO_APPLICATION_ID;
0725: 
0726:     $url = "http://weather.olp.yahooapis.jp/v1/place?appid={$appID}&coordinates={$longitude},{$latitude}&output=xml&past=2&interval=10";
0727: 
0728:     return $url;
0729: }
0730: 
0731: /**
0732:  * 「YOLP 気象情報API」を利用して降水量を求める
0733:  * @param array  $items     降水量を格納する配列
0734:  * @param double $latitude  緯度(世界測地系)
0735:  * @param double $longitude 経度(世界測地系)
0736:  * @return bool TRUE/FALSE
0737: */
0738: function getPrecipitation(&$items$latitude$longitude) {
0739:     $url = $this->getURL_YOLP_precipitation($latitude$longitude);
0740:     $this->webapi = $url;
0741: 
0742: //PHP4用; DOM XML利用
0743:     if ($this->isphp5over() == FALSE) {
0744:         if (($dom = $this->read_xml($url)) == NULL)  return FALSE;
0745:         //レスポンス・チェック
0746:         $node = $dom->get_elements_by_tagname('ResultInfo');
0747:         $node = $node[0]->get_elements_by_tagname('Count');
0748:         $rc = (int)$node[0]->get_content();
0749:         if ($rc <= 0)   return FALSE;
0750:         //検索結果取りだし
0751:         $node = $dom->get_elements_by_tagname('Feature');
0752:         $node = $node[0]->get_elements_by_tagname('Property');
0753:         $node = $node[0]->get_elements_by_tagname('WeatherList');
0754:         $node = $node[0]->get_elements_by_tagname('Weather');
0755:         foreach ($node as $val) {
0756:             $n2 = $val->get_elements_by_tagname('Date');
0757:             $dt = (string)$n2[0]->get_content();
0758:             $n2 = $val->get_elements_by_tagname('Rainfall');
0759:             $items[$dt]['Rainfall'] = (double)$n2[0]->get_content();
0760:             $n2 = $val->get_elements_by_tagname('Type');
0761:             $items[$dt]['Type'] = (string)$n2[0]->get_content();
0762:         }
0763: 
0764: //PHP5用; SimpleXML利用
0765:     } else {
0766:         $xml = @simplexml_load_file($url);
0767:         //レスポンス・チェック
0768:         if ($xml->ResultInfo->Count <= 0) return FALSE;
0769:         //検索結果取りだし
0770:         foreach ($xml->Feature->Property->WeatherList->Weather as $weather) {
0771:             $dt = (string)$weather->Date;
0772:             $items[$dt]['Rainfall'] = (double)$weather->Rainfall;
0773:             $items[$dt]['Type'] = (string)$weather->Type;
0774:         }
0775:     }
0776: 
0777:     return TRUE;
0778: }

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

参考サイト

(この項おわり)
header