PHPで地図で指定した場所の天気予報を求める

(1/1)
PHP で天気予報を求める(その 2)」で紹介した「livedoor 天気情報」を利用し、地図サービスをマッシュアップすることで、住所やランドマークから週間天気予報を表示する PHP プログラムを作ってみる。

(2019 年 5 月 27 日)地理院地図、OpenStreetMap も利用できるようにした。緯度・経度から住所を検索する逆ジオコーディングサービスの選択肢を増やした。地図検索,リセット・ボタンを追加した。
(2019 年 3 月 16 日)Yahoo! JavaScript マップも利用できるようにした。
(2019 年 2 月 9 日)pahooCalendar::makeLunarCalendar の不具合を修正、getSolarTerm72 の漢字表記を変更した。

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

PHPで地図で指定した場所の天気予報を求める
Google マップ表示

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

圧縮ファイルの内容
myWeather.phpサンプル・プログラム本体
myWeatherInit.php予報地点情報ファイル作成プログラム
weatherspots.xml予報地点情報ファイル
pahooGeoCode.php住所・緯度・経度に関わるクラス pahooGeoCode。
使い方は「PHPで住所・ランドマークから最寄り駅を求める」「PHPで住所・ランドマークから緯度・経度を求める」などを参照。include_path が通ったディレクトリに配置すること。
pahooWeather.php気象情報に関わるクラス pahooWeather。
気象情報に関わるクラスの使い方は「PHPで天気予報を求める(その2)」を参照。include_path が通ったディレクトリに配置すること。

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

PHPで地図で指定した場所の天気予報を求める
プログラムの流れは「PHP で最寄り駅を求める」の時と同じで、緯度・経度から施設情報を求める部分を、「livedoor 天気情報」に差し替えただけである。

なお、「PHP で天気予報を求める(その 2)」と同様、URL 変数 query として住所、ランドマーク等を記載すれば、結果の天気予報情報だけ画面に表示する。

準備: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', 0);
0036: 
0037: //住所検索サービスの選択
0038: //    0:Google
0039: //    1:Yahoo!JAPAN
0040: //   11:HeartRails Geo API
0041: define('GEOSERVICE', 0);
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 に値を設定すること。
PHPで地図で指定した場所の天気予報を求める
Yahoo!マップ表示

解説:最も近い予報地点

0155: /**
0156:  * 最も近い予報地点ID
0157:  * @param object $pgc pahooGeoCodeオブジェクト
0158:  * @param double $longitude 経度(世界測地系)
0159:  * @param double $latitude  緯度(世界測地系)
0160:  * @return string 予報地点ID
0161: */
0162: function getNearSpot($pgc$longitude$latitude) {
0163:     $id = NULL;
0164:     $cnt = 0;
0165:     $d0  = 999999999;
0166:     while (1) {
0167:         if (isset($this->spots[$cnt]['id'])
0168:             && isset($this->spots[$cnt]['longitude'])
0169:             && isset($this->spots[$cnt]['latitude'])) {
0170:             $d1 = $pgc->distance($this->spots[$cnt]['longitude'], $this->spots[$cnt]['latitude'], $longitude$latitude);
0171:             if ($d1 < $d0) {
0172:                 $id = $this->spots[$cnt]['id'];
0173:                 $d0 = $d1;
0174:             }
0175:             $cnt++;
0176:         } else {
0177:             break;
0178:         }
0179:     }
0180: 
0181:     return $id;
0182: }

Google マップから取得した緯度・経度を取得できるが、一方、クラス "pahooWeather" では定められた都市の天気予報しか取得できない。そこで、マップ・サービスから取得した緯度・経度に最も近い予報地点の天気予報を表示することにした。
最も近い予報地点を取得するのがメソッド getNearSpot である。
あらかじめ用意した予報地点情報 $spots とマップ・サービスから取得した緯度・経度の距離を計算し、それが最短になる予報地点を採用する。

なお、予報地点情報 $spots は、あらかじめ XML 形式ファイル "FILE_SPOTS" として用意しておく必要がある。
"FILE_SPOTS" を作成するプログラムは、同梱の "pahooWeatherInit.php" である。「全国の地点定義表(RSS)」を読み込み、クラス "pahooGeoCode" を利用して各々の地点の緯度、経度、住所を取得し、XML ファイルに保存する。
予報地点の数が多いし、「全国の地点定義表(RSS)」が頻繁に変わることはないので、あらかじめ外部ファイルとして用意しておくことにした。

活用例

地図・地名で指定した場所の週間天気予報」(みんなの知識 ちょっと便利帳)では、このサンプル・プログラムを活用し、検索しやすく、また週間天気予報を見やすく表示している。ありがとうございます。

参考サイト

(この項おわり)
header