サンプル・プログラムの実行例
目次
サンプル・プログラムのダウンロード
| myWeather.php | サンプル・プログラム本体 |
| .pahooEnv | クラウドサービスを利用するためのアカウント情報などを記入する .env ファイル。 使い方は「各種クラウド連携サービス(WebAPI)の登録方法」を参照。include_path が通ったディレクトリに配置すること。 |
| pahooInputData.php | データ入力に関わる関数群。 使い方は「数値入力とバリデーション」「文字入力とバリデーション」などを参照。include_path が通ったディレクトリに配置すること。 |
| pahooGeoCode.php | 住所・緯度・経度に関わるクラス pahooGeoCode。 使い方は「PHPで住所・ランドマークから最寄り駅を求める」「PHPで住所・ランドマークから緯度・経度を求める」などを参照。include_path が通ったディレクトリに配置すること。 |
| pahooWeather.php | 気象情報に関わるクラス pahooWeather。 気象情報に関わるクラスの使い方は「PHPで天気予報を求める」を参照。include_path が通ったディレクトリに配置すること。 |
| pahooCache.php | キャッシュ処理に関わるクラス pahooCache。 キャッシュ処理に関わるクラスの使い方は「PHPで天気予報を求める」を参照。include_path が通ったディレクトリに配置すること。 |
| jmaweatherspots.xml | 予報地点情報ファイル。「PHPで天気予報を求める」参照。 |
| jmaWeatherInit.php | 予報地点情報ファイル作成プログラム。「PHPで天気予報を求める」参照。 |
| バージョン | 更新日 | 内容 |
|---|---|---|
| 3.6.1 | 2025/03/01 | 国外の天気予報が出来ないことから,GEOSERVICEにYahoo!JAPANを指定したとき,ラジオボタン[世界]を非表示にした |
| 3.6.0 | 2025/02/23 | 指定した場所が予報地点外の時にエラー表示 |
| 3.5.1 | 2025/02/23 | 予報表タイトルの誤記訂正 |
| 3.5.0 | 2023/08/12 | 検索キーの最小・最大長の指定 |
| 3.4.0 | 2023/08/12 | 国土地理院ジオコーディングAPIを追加 |
| バージョン | 更新日 | 内容 |
|---|---|---|
| 3.1.0 | 2023/03/18 | 地域気象観測所一覧のフォーマット変更に対応 |
| 3.0.0 | 2023/02/11 | アメダスのページから自動ダウンロード対応 |
| 2.2 | 2022/03/12 | 気象庁防災情報XMLのhttps化に対応, キャッシュ・システム導入:pahooCacheクラス |
| 2.11 | 2021/03/23 | bug-fix,地域観測所一覧(アメダス)を最新に |
| 2.1 | 2021/03/03 | 天気予報(2~3日予報)に対応 |
| バージョン | 更新日 | 内容 |
|---|---|---|
| 6.8.0 | 2025/08/10 | アクセスキーなどを ".env" に分離 |
| 6.7.1 | 2025/07/26 | jsLine_Gmap() - bug-fix |
| 6.7.0 | 2025/07/20 | drawJSmap,drawGMap -- 引数 $markerLevel 追加 |
| 6.6.0 | 2025/07/19 | drawJSmap,drawGMap,drawLeaflet -- マップ中心マーカー表示引数を追加 |
| 6.5.0 | 2025/06/14 | GoogleMaps JavaScript APIの変更に対応 |
| バージョン | 更新日 | 内容 |
|---|---|---|
| 5.7.0 | 2025/08/09 | readEnvWBGTinfoSpots(), readEnvWBGTforecast(), getWBGTcolor() 追加 |
| 5.6.2 | 2025/04/10 | readJmaSpots() -- bug-fix |
| 5.6.1 | 2025/04/08 | getMyscriptPathURL() -- bug-fix |
| 5.6.0 | 2025/02/23 | getJmaNearSpot() -- 引数 $distanceMax 追加 |
| 5.5.0 | 2025/02/01 | 予報地点情報ファイルを1週間毎に再作成する |
| バージョン | 更新日 | 内容 |
|---|---|---|
| 1.1.3 | 2025/08/10 | var→public |
| 1.1.2 | 2023/07/22 | bug-fix |
| 1.1.1 | 2023/02/11 | コメント追記 |
| 1.1 | 2021/04/08 | simplexml_load()メソッド追加 |
| 1.0 | 2021/04/02 | 初版 |
| バージョン | 更新日 | 内容 |
|---|---|---|
| 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() 追加 |
サンプル・プログラムの流れ
準備:PHP の https対応
Windowsでは、"php.ini" の下記の行を有効化する。
extension=php_openssl.dllLinuxでは --with-openssl=/usr オプションを付けて再ビルドする。→OpenSSLインストール手順
これで準備は完了だ。
準備:pahooInputData 関数群
また、各種クラウドサービスに登録したときに取得するアカウント情報、アプリケーションパスワードなどを登録した .pahooEnv ファイルから読み込む関数 pahooLoadEnv を備えている。こちらについては、「各種クラウド連携サービス(WebAPI)の登録方法」をご覧いただきたい。
準備:pahooGeoCode クラス
pahooGeoCode.php
40: class pahooGeoCode {
41: public $items; // 検索結果格納用
42: public $error; // エラー・フラグ
43: public $errmsg; // エラー・メッセージ
44: public $hits; // 検索ヒット件数
45: public $webapi; // 直前に呼び出したWebAPI URL
46:
47: // -- 以下のデータは .env ファイルに記述可能
48: // Google Cloud Platform APIキー
49: // https://cloud.google.com/maps-platform/
50: // ※Google Maps APIを利用しないのなら登録不要
51: public $GOOGLE_API_KEY_1 = ''; // HTTPリファラ用
52: public $GOOGLE_API_KEY_2 = ''; // IP制限用
53: public $GOOGLE_MAP_ID = ''; // GoogleMaps ID
54:
55: // Yahoo! JAPAN Webサービス アプリケーションID
56: // https://e.developer.yahoo.co.jp/register
57: // ※Yahoo! JAPAN Webサービスを利用しないのなら登録不要
58: public $YAHOO_APPLICATION_ID = '';
59:
60: // OSM Nominatim Search API利用時に知らせるメールアドレス
61: // https://wiki.openstreetmap.org/wiki/JA:Nominatim#.E6.A4.9C.E7.B4.A2
62: // ※OSM Nominatim Search APIを利用しないのなら登録不要
63: public $NOMINATIM_EMAIL = '';
64:
65: // IP2Location.io APIキー
66: // https://www.ip2location.io/
67: // ※IP2Location.ioを利用しないのなら登録不要
68: public $IP2LOCATION_API_KEY = '';
PHPのクラスについては「PHPでクラスを使ってテキストの読みやすさを調べる」を参照されたい。
地図や住所検索として 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でクラスを使ってテキストの読みやすさを調べる」を参照されたい。
準備:pahooCache クラス
pahooCache.php
13: class pahooCache {
14: const LIFE_CACHE = (2 * 60); // キャッシュ保持時間(デフォルト;分)
15: const DEF_DIRCACHE = './pcache/'; // キャッシュ・ディレクトリ(デフォルト)
16:
17: public $lifeCache; // キャッシュ保持時間(分)(0:キャッシュしない)
18: public $dirCache; // キャッシュ用ディレクトリ
19: public $error; // エラーフラグ
20: public $errmsg; // エラーメッセージ
21: public $debug; // デバッグ用ファイル名
22:
23: /**
24: * コンストラクタ
25: * 参考サイト https://www.pahoo.org/e-soul/webtech/php06/php06-72-01.shtm
26: * @param int $life キャッシュ保持時間(分)(省略可能)
27: * @param string $dir キャッシュ・ディレクトリ(省略可能)
28: * @return なし
29: */
30: function __construct($life=self::LIFE_CACHE, $dir=self::DEF_DIRCACHE) {
31: if ($life < 0) {
32: $life = 0;
33: }
34: if (preg_match('/\/$/ui', $dir) == 0) {
35: $dir = $dir . '/';
36: }
37: $this->error = FALSE;
38: $this->errmsg = '';
39: $this->debug = '';
40: $this->lifeCache = $life;
41: $this->dirCache = $dir;
42:
43: // PHP5以上であることを調べる.
44: if (! $this->isphp5over()) {
45: $this->error = TRUE;
46: $this->errmsg = '動作にはPHP5以上が必要です';
47: return;
48: }
49:
50: // キャッシュ・ディレクトリが無ければ作成する.
51: if (! is_dir($this->dirCache)) {
52: $res = mkdir($this->dirCache, 0744);
53: if ($res == FALSE) {
54: $this->error = TRUE;
55: $this->errmsg = 'キャッシュ・ディレクトリ "' . $this->$dirCache . '" の作成に失敗しました';
56: return;
57: }
58: }
59: }
そこで、頻繁に変更がないデータについては、一度取り込んだら、こちら側のサーバのローカルストレージにキャッシュしておく仕組みを用意した。それが pahooCacheクラス である。同梱のクラス・ファイル "pahooCache.php" は include_path が通ったディレクトリに配置してほしい。他のプログラムでも pahooCacheクラス を利用するが、常に最新のクラス・ファイルを1つ配置すればよい。
pahooCacheクラス の注意ポイントは、キャッシュ時間(単位:分)とキャッシュを保存するディレクトリをコンストラクタで指定している点だ。これらはプログラムによって変わるものである。インスタンス化するときの値は、pahooCacheクラス を利用するメイン・プログラムの方で解説する。
PHPのクラスについては「PHPでクラスを使ってテキストの読みやすさを調べる」を参照されたい。
準備:地図サービスの選択
myWeather.php
71: // 地図描画サービスの選択
72: // 0:Google
73: // 2:地理院地図・OSM
74: define('MAPSERVICE', 2);
75:
76: // 住所検索サービスの選択
77: // 0:Google
78: // 1:Yahoo!JAPAN
79: // 11:HeartRails Geo API
80: // 12:OSM Nominatim Search API
81: // 13:国土地理院ジオコーディングAPI
82: define('GEOSERVICE', 1);
83:
84: // 逆ジオコーディングサービスの選択
85: // 0:Google
86: // 1:Yahoo!JAPAN
87: // 11:HeartRails Geo API
88: // 21:簡易ジオコーディングサービス
89: define('REVGEOSERVICE', 1);
住所検索サービスは、Google、Yahoo!JAPAN、HeartRails Geo API、OSM Nominatim Search API、国土地理院ジオコーディングAPI から選べる。あらかじめ、定数 GEOSERVICE に値を設定すること。
逆ジオコーディングサービスは、Google、Yahoo!JAPAN、HeartRails Geo API、簡易ジオコーディングサービスから選べる。あらかじめ、定数 REVGEOSERVICE に値を設定すること。
準備:その他の定数
myWeather.php
91: // マップの表示サイズ(単位:ピクセル)
92: define('MAP_WIDTH', 700);
93: define('MAP_HEIGHT', 400);
94: // マップID
95: define('MAPID', 'map_id');
96: // 初期値
97: define('DEF_LATITUDE', 35.4658); // 緯度
98: define('DEF_LONGITUDE', 139.6223); // 経度
99: define('DEF_TYPE', 'roadmap'); // マップタイプ
100: define('DEF_ZOOM', 13); // ズーム
101: define('DEF_CATEGORY', 'address'); // カテゴリ
102:
103: // 検索キーの最小文字長
104: define('QUERY_MIN_LEN', 3);
105:
106: // 検索キーの最大文字長
107: define('QUERY_MAX_LEN', 99);
108:
109: // 予報地点までの最大距離(km)
110: define('DISTANCE_MAX', 400);
予報地点までの最大距離 DISTANCE_MAX は、この距離の範囲内に予報地点が見つからなければエラーを返す。
準備:地図サービスの選択
myWeather.php
71: // 地図描画サービスの選択
72: // 0:Google
73: // 2:地理院地図・OSM
74: define('MAPSERVICE', 2);
75:
76: // 住所検索サービスの選択
77: // 0:Google
78: // 1:Yahoo!JAPAN
79: // 11:HeartRails Geo API
80: // 12:OSM Nominatim Search API
81: // 13:国土地理院ジオコーディングAPI
82: define('GEOSERVICE', 1);
83:
84: // 逆ジオコーディングサービスの選択
85: // 0:Google
86: // 1:Yahoo!JAPAN
87: // 11:HeartRails Geo API
88: // 21:簡易ジオコーディングサービス
89: define('REVGEOSERVICE', 1);
住所検索サービスは、Google、Yahoo!JAPAN、HeartRails Geo API、OSM Nominatim Search API、国土地理院ジオコーディングAPI から選べる。あらかじめ、定数 GEOSERVICE に値を設定すること。
逆ジオコーディングサービスは、Google、Yahoo!JAPAN、HeartRails Geo API、簡易ジオコーディングサービスから選べる。あらかじめ、定数 REVGEOSERVICE に値を設定すること。
解説:最も近い予報地点
pahooWeather.php
233: /**
234: * 指定した緯度・経度に最も近い予報地点コードを求める.
235: * 参考サイト https://www.pahoo.org/e-soul/webtech/php06/php06-52-01.shtm
236: * @param object $pgc pahooGeoCodeオブジェクト
237: * @param double $longitude 経度(世界測地系)
238: * @param double $latitude 緯度(世界測地系)
239: * @param int $forecast 0:天気予報,1:週間天気予報(省略時:1)
240: * @param float $distanceMax 予報地点からの最大距離(km)
241: * これより近い予報地点が見つからなければNULLを返す
242: * @return string 予報地点コード/NULL:合致する予報地点がない
243: */
244: function getJmaNearSpot($pgc, $longitude, $latitude, $forecast=1, $distanceMax=99999) {
245: // 電文コード
246: $code = ($forecast == 0) ? 'VPFD51' : 'VPFW50';
247:
248: $res = NULL;
249: $cnt = 0;
250: $d0 = 999999999;
251: // 電文コードが一致する予報地点を選んで2地点間の距離を計算
252: while (1) {
253: if ($this->spots[$cnt]['code'] == $code
254: && isset($this->spots[$cnt]['stationCode'])
255: && isset($this->spots[$cnt]['longitude'])
256: && isset($this->spots[$cnt]['latitude'])) {
257: $d1 = $pgc->distance($this->spots[$cnt]['longitude'], $this->spots[$cnt]['latitude'], $longitude, $latitude);
258: // 距離がより小さければ採用
259: if ($d1 < $d0) {
260: $res = (string)$this->spots[$cnt]['stationCode'];
261: $d0 = $d1;
262: }
263: $cnt++;
264: } else {
265: break;
266: }
267: }
268: return ($d0 > $distanceMax * 1000) ? NULL : $res;
269: }
最も近い予報地点を取得するのがメソッド getJmaNearSpot である。
あらかじめ用意した予報地点情報 $spots とマップ・サービスから取得した緯度・経度の距離を計算し、それが最短になる予報地点を採用する。
最後に、計算した距離が引数 $distanceMax よりも大きい場合にはエラー(NULL)を返すようにした。これは、緯度・軽度として国外の地点を指定した場合に備えての措置である。
なお、予報地点情報 $spots は、あらかじめXML形式ファイル "FILE_JMASPOTS" として用意しておく必要がある。
"FILE_JMASPOTS" は圧縮ファイルに同梱しているが、もし新規作成する場合は、「予報地点情報ファイル - PHPで天気予報を求める」をご覧いただきたい。
解説:表示とURLパラメータ
myWeather.php
400: // 各種パラメータを代入する.
401: $items = array();
402: $html = $errmsg = $url = $address = '';
403: $id = (int)getParam('id', FALSE, 0); // 表示モード
404: $query = getValidString('query', $errmsg, '', QUERY_MIN_LEN, QUERY_MAX_LEN);
405: if ($errmsg != '') {
406: $errmsg = '検索キーの長さが' . $errmsg;
407: }
408: $latitude = (float)getParam('latitude', FALSE, DEF_LATITUDE); // 緯度
409: $longitude = (float)getParam('longitude', FALSE, DEF_LONGITUDE); // 経度
410: $zoom = (int)getParam('zoom', FALSE, DEF_ZOOM); // ズーム
411: $type = (string)getParam('type', FALSE, DEF_TYPE); // マップタイプ
412: $category = (string)getParam('category', FALSE, DEF_CATEGORY); // カテゴリ
413: $outenc = (string)getParam('charset', FALSE, INTERNAL_ENCODING);
myWeather.php?id=1&query=%E6%9C%AD%E5%B9%8C%E5%B8%82のようにすることで、query をキーワードにして検索した地点の天気予報のみを表示させることができる。つまり、このスクリプトをホームページやブログの一部として組み込むことで、週間天気予報を表示するパーツになる。
query はUTF-8をURLエンコードしたもの。Yahoo!JAPAN住所検索を使う場合は、category をあわせて指定すること。
また、出力はHTML文のみとなり、スタイルシートは本体ページの方で用意していただきたい。必要なclassは次の通り。
myWeather.php
149: <style>
150: /* エラー表示 */
151: p.werror {
152: color: red;
153: }
154: /* 天気予報表 */
155: table.weather {
156: width: {$width}px;
157: border:solid 1px #000000;
158: border-collapse:collapse;
159: margin-top:10px;
160:
161: }
162: /* 天気予報表:月日表示部 */
163: table.weather td.dt {
164: width: {$width}px;
165: border:solid 1px #000000;
166: border-collapse: collapse;
167: padding:4px;
168: white-space:nowrap;
169: text-align:center;
170: }
171: /* 天気予報表:予報表示部 */
172: table.weather td.info {
173: width: {$width}px;
174: border:solid 1px #000000;
175: border-collapse: collapse;
176: padding:4px;
177: white-space:nowrap;
178: text-align:center;
179: }
180: /* 天気予報表:予報アイコン */
181: img.wicon {
182: width: 60px;
183: }
184: /* 天気予報表:小さい文字 */
185: span.wsmall {
186: font-size: small;
187: }
188: </style>
myWeather.php?id=1&query=%E6%9C%AD%E5%B9%8C%E5%B8%82&charset=SJISとすると、シフトJISで出力することができる。
myWeather.php?id=1&latitude=26.591&longitude=127.977のようにすることで、北緯26.591度、東経127.977度の天気予報のみを表示させることができる。
質疑応答
お世話になっております。【回答】
PHPで地図で指定した場所の天気予報を求めるを活用させていただいております。
こちら、世界の天気予報が以前は国単位で取得可能でした。
現在、すべての場所で同じ天気が表示されます。
地図は問題なく表示されます。
例えば「韓国」「台湾」「イタリア」「カンボジア」「ベトナム」「シンガポール」で検索すると同一の天気になります。
予報地点情報ファイルを更新しましたが解消されません。
ご確認よろしくお願いいたします。
国外の天気予報を表示していたのは、プログラムの誤りでした。実際には当該国の天気予報は取得できておらず、国内の予報地点の情報を表示しているだけでした。
そこで、予報可能な地点から遠い場所を指定したときには、正しくエラーを表示するようにしました。
【質問】 ぱーまーさま
お世話になっております。【回答】
ご回答ありがとうございました。
こちらのサンプルプログラムで
カテゴリ[住所][ランドマーク][世界]というラジオボタンがあったので世界の天気が取得できると思ってしました。[世界]のラジオボタンは削除されるか、「地図のみの表示」ですという記載などされたほうが良いかもしれません。
下記のOpenWeatherMap APIというものを利用すれば世界の都市の週間天気予報を表示できるようです。
https://qiita.com/sdkk-rails/items/3589afefda4169976965
もし、今後お手すきでご意欲があればの話ですが、「地図で指定した場所の天気予報」の世界版を作成していただければ大変うれしく思います。
勝手な意見で申し訳ありません。
こちらの国内版は今後も利用させていただきます。
どうぞよろしくお願いいたします。
アドバイスをありがとうございます。
本編を通読していただくと分かる通り、ラジオボタン[世界]は住所検索に Yahoo!JAPAN を使ったときに限って表示します。とはいえ、本プログラムは国外の天気予報を表示できないので、このラジオボタンの意味がありませんので表示しないようにしました。
教えていただいた OpenWeatherMap API は、国内の天気予報について、本プログラムが参照している気象庁防災情報XML とは異なる予報を表示することから、すぐに本プログラムへ導入することは控えたいと思います。別プログラムにするかどうか、今後検討いたします。

(2025年8月13日).pahooEnv 導入
(2025年6月14日)GoogleMaps JavaScript APIの変更に対応した.
(2025年3月1日)国外の天気予報が出来ないことから,GEOSERVICEにYahoo!JAPANを指定したとき,ラジオボタン[世界]を非表示にした.
(2025年2月23日)指定した場所が予報地点外の時にエラー表示するようにした.
(2025年2月2日)予報地点情報ファイルを1週間毎に再作成するようにした.
(2024年11月9日)予報地点情報ファイルを更新