PHPで地図で指定した場所の週間カレンダーを表示

(1/1)
PHPで地図で指定した場所の天気予報を求める」でつくったプログラムをベースに、「PHPで祝日を求める」「PHPで二十四節気一覧を作成」「PHPで日出没・月出没・月齢を計算」「PHPで万年カレンダーを作る」「PHPで月の満ち欠けを描画」を加え、地図で指定した地点の週間カレンダーを表示するPHPプログラムをつくる。

(2026年1月1日)旧暦テーブル作成不具合改善,PHP8.5対応
(2025年10月11日)「中秋の名月」を表示するようにした.
(2025年8月13日).pahooEnv 導入
(2025年6月14日)GoogleMaps JavaScript APIの変更に対応した.

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

PHPで地図で指定した場所の週間カレンダーを表示
Googleマップ表示

目次

サンプル・プログラム

圧縮ファイルの内容
weeklyCalendar.phpサンプル・プログラム本体
.pahooEnvクラウドサービスを利用するためのアカウント情報などを記入する .env ファイル。
使い方は「各種クラウド連携サービス(WebAPI)の登録方法」を参照。include_path が通ったディレクトリに配置すること。
pahooInputData.phpデータ入力に関わる関数群。
使い方は「数値入力とバリデーション」「文字入力とバリデーション」などを参照。include_path が通ったディレクトリに配置すること。
pahooGeoCode.php住所・緯度・経度に関わるクラス pahooGeoCode。
使い方は「PHPで住所・ランドマークから最寄り駅を求める」などを参照。include_path が通ったディレクトリに配置すること。
pahooWeather.php気象情報に関わるクラス pahooWeather。
気象情報に関わるクラスの使い方は「PHPで天気予報を求める」を参照。include_path が通ったディレクトリに配置すること。
pahooCalendar.php暦計算クラス pahooCalendar。
暦計算クラスの使い方は「PHPで日出没・月出没・月齢・潮を計算」を参照。include_path が通ったディレクトリに配置すること。
pahooCache.phpキャッシュ処理に関わるクラス pahooCache。
キャッシュ処理に関わるクラスの使い方は「PHPで天気予報を求める」を参照。include_path が通ったディレクトリに配置すること。
jmaweatherspots.xml予報地点情報ファイル。「PHPで天気予報を求める」参照。
jmaWeatherInit.php予報地点情報ファイル作成プログラム。「PHPで天気予報を求める」参照。
weeklyCalendar.php 更新履歴
バージョン 更新日 内容
3.3.1 2026/01/01 addWeeklyCalendar -- 旧暦テーブル作成の不具合修正
3.3.0 2025/10/11 「中秋の名月」を表示するようにした
3.2.0 2023/08/12 検索キーの最小・最大長の指定
3.1.0 2023/08/12 国土地理院ジオコーディングAPIを追加
3.0.0 2022/05/28 太陽・月に関わる計算精度向上
pahooGeoCode.php 更新履歴
バージョン 更新日 内容
6.9.1 2025/11/25 PHP8.5対応:double→float
6.9.0 2025/09/21 jsPolygon, jsPolygon_Gmap, jsPolygon_Leaflet, loadGeoJSON, getPrefBorderList を追加
6.8.0 2025/08/10 アクセスキーなどを ".pahooEnd" に分離
6.7.1 2025/07/26 jsLine_Gmap() - bug-fix
6.7.0 2025/07/20 drawJSmap,drawGMap -- 引数 $markerLevel 追加
pahooWeather.php 更新履歴
バージョン 更新日 内容
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週間毎に再作成する
pahooCalendar.php 更新履歴
バージョン 更新日 内容
4.6.1 2025/11/23 next_fullmoon: bug-fix
4.6.0 2025/10/08 getMidAutumnMoon() 追加
4.5.1 2025/05/31 deg2ddmm(), deg2hhmm() 不具合修正
4.5.0 2024/03/17 ヒジュラ暦メソッドを追加
4.4.1 2024/03/17 getCabinetOfficeHolidayTable() -- bug-fix
pahooCache.php 更新履歴
バージョン 更新日 内容
1.3.0 2025/12/06 PHP8.5対応:curl_closeを使わない
1.2.0 2025/09/06 cLoad() HTTPヘッダを送信できるようにした
1.1.3 2025/08/10 var→public
1.1.2 2023/07/22 bug-fix
1.1.1 2023/02/11 コメント追記
pahooInputData.php 更新履歴
バージョン 更新日 内容
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対応

クラウド連携や相手先サイトのデータを読み込むのに https通信を使うため、PHPに OpenSSLモジュールが組み込まれている必要がある。関数  phpinfo  を使って、下図のように表示されればOKだ。
OpenSSL - PHP
そうでない場合は、次の手順に従ってOpenSSLを有効化し、PHPを再起動させる必要がある。

Windowsでは、"php.ini" の下記の行を有効化する。
extension=php_openssl.dll
Linuxでは --with-openssl=/usr オプションを付けて再ビルドする。→OpenSSLインストール手順

これで準備は完了だ。

準備:pahooInputData 関数群

PHPのバージョンや入力データのバリデーションなど、汎用的に使う関数群を収めたファイル "pahooInputData.php" が同梱されているが、include_path が通ったディレクトリに配置してほしい。他のプログラムでも "pahooInputData.php" を利用するが、常に最新のファイルを1つ配置すればよい。

また、各種クラウドサービスに登録したときに取得するアカウント情報、アプリケーションパスワードなどを登録した .pahooEnv ファイルから読み込む関数 pahooLoadEnv を備えている。こちらについては、「各種クラウド連携サービス(WebAPI)の登録方法」をご覧いただきたい。

準備:pahooGeoCode クラス

pahooGeoCode.php

  41: class pahooGeoCode {
  42:     public $items;      // 検索結果格納用
  43:     public $error;      // エラー・フラグ
  44:     public $errmsg;     // エラー・メッセージ
  45:     public $hits;       // 検索ヒット件数
  46:     public $webapi; // 直前に呼び出したWebAPI URL
  47: 
  48:     // 都道府県境界線データ
  49:     // SimpleMaps.com is a product of Pareto Software, LLC. © 2010-2025
  50:     // https://simplemaps.com/gis/country/jp
  51:     // ※各自の環境に合わせて設定すること
  52:     public $GeoJsonJP = __DIR__ . '/jp.json';
  53: 
  54:     // -- 以下のデータは .env ファイルに記述可能
  55:     // Google Cloud Platform APIキー
  56:     // https://cloud.google.com/maps-platform/
  57:     // ※Google Maps APIを利用しないのなら登録不要
  58:     public $GOOGLE_API_KEY_1 = '';      // HTTPリファラ用
  59:     public $GOOGLE_API_KEY_2 = '';      // IP制限用
  60:     public $GOOGLE_MAP_ID    = '';      // GoogleMaps ID
  61: 
  62:     // Yahoo! JAPAN Webサービス アプリケーションID
  63:     // https://e.developer.yahoo.co.jp/register
  64:     // ※Yahoo! JAPAN Webサービスを利用しないのなら登録不要
  65:     public $YAHOO_APPLICATION_ID = '';
  66: 
  67:     // OSM Nominatim Search API利用時に知らせるメールアドレス
  68:     // https://wiki.openstreetmap.org/wiki/JA:Nominatim#.E6.A4.9C.E7.B4.A2
  69:     // ※OSM Nominatim Search APIを利用しないのなら登録不要
  70:     public $NOMINATIM_EMAIL = '';
  71: 
  72:     // IP2Location.io APIキー
  73:     // https://www.ip2location.io/
  74:     // ※IP2Location.ioを利用しないのなら登録不要
  75:     public $IP2LOCATION_API_KEY = '';

GoogleマップやLeafletなどによる地図描画や住所検索を行うためのクラスが pahooGeoCode である。同梱のクラス・ファイル "pahooGeoCode.php" は include_path が通ったディレクトリに配置してほしい。他のプログラムでも pahooGeoCodeクラス を利用するが、常に最新のクラス・ファイルを1つ配置すればよい。

地図や住所検索として 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でクラスを使ってテキストの読みやすさを調べる」を参照されたい。

準備:地図サービスの選択

weeklyCalendar.php

  65: // 地図描画サービスの選択
  66: //    0:Google
  67: //    2:地理院地図・OSM
  68: define('MAPSERVICE', 2);
  69: 
  70: // 住所検索サービスの選択
  71: //    0:Google
  72: //    1:Yahoo!JAPAN
  73: //   11:HeartRails Geo API
  74: //   12:OSM Nominatim Search API
  75: //   13:国土地理院ジオコーディングAPI
  76: define('GEOSERVICE', 1);
  77: 
  78: // 逆ジオコーディングサービスの選択
  79: //    0:Google
  80: //    1:Yahoo!JAPAN
  81: //   11:HeartRails Geo API
  82: //   21:簡易ジオコーディングサービス
  83: define('REVGEOSERVICE', 1);

表示する地図は、Googleマップ地理院地図・オープンストリートマップ(OSM)から選べる。あらかじめ、定数 MAPSERVIC に値を設定すること。
住所検索サービスは、GoogleYahoo!JAPANHeartRails Geo APIOSM Nominatim Search API国土地理院ジオコーディングAPI から選べる。あらかじめ、定数 GEOSERVICE に値を設定すること。
逆ジオコーディングサービスは、GoogleYahoo!JAPANHeartRails Geo API簡易ジオコーディングサービスから選べる。あらかじめ、定数 REVGEOSERVICE に値を設定すること。
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 $httpHeader;     // HTTPヘッダ(空文字の時は何も送らない)
  20:     public $error;          // エラーフラグ
  21:     public $errmsg;         // エラーメッセージ
  22:     public $debug;          // デバッグ用ファイル名
  23: 
  24: /**
  25:  * コンストラクタ
  26:  * 参考サイト https://www.pahoo.org/e-soul/webtech/php06/php06-72-01.shtm
  27:  * @param   int    $life キャッシュ保持時間(分)(省略可能)
  28:  * @param   string $dir キャッシュ・ディレクトリ(省略可能)
  29:  * @param   array  $httpHeader httpヘッダに渡す配列(省略可能)
  30:  *          USER AGENT偽装に用いることを想定
  31:  *          (例)
  32:  *           array(
  33:  *              'User-Agent: Mozilla/5.0(Windows NT 10.0; Win64; x64) pahooAppy/pahoo.org AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',
  34:  *              'Accept-Language: ja-JP'
  35:  *          );
  36:  * @return  なし
  37: */
  38: function __construct($life=self::LIFE_CACHE, $dir=self::DEF_DIRCACHE, $httpHeader=NULL) {
  39:     if ($life < 0) {
  40:         $life = 0;
  41:     }
  42:     if (preg_match('/\/$/ui', $dir) == 0) {
  43:         $dir = $dir . '/';
  44:     }
  45:     $this->error      = FALSE;
  46:     $this->errmsg     = '';
  47:     $this->debug      = '';
  48:     $this->lifeCache  = $life;
  49:     $this->dirCache   = $dir;
  50:     $this->httpHeader = $httpHeader;
  51: 
  52:     // PHP5以上であることを調べる.
  53:     if (! $this->isphp5over()) {
  54:         $this->error   = TRUE;
  55:         $this->errmsg  = '動作にはPHP5以上が必要です';
  56:         return;
  57:     }
  58: 
  59:     // キャッシュ・ディレクトリが無ければ作成する.
  60:     if (! is_dir($this->dirCache)) {
  61:         $res = mkdir($this->dirCache, 0744);
  62:         if ($res == FALSE) {
  63:             $this->error   = TRUE;
  64:             $this->errmsg  = 'キャッシュ・ディレクトリ "' . $this->$dirCache . '" の作成に失敗しました';
  65:             return;
  66:         }
  67:     }
  68: }

クラウド連携や相手先サイトの公開データを利用する際、こちらのアプリを起動する都度、APIを呼び出したりデータをダウンロードするのでは、相手サーバに負荷をかけてしまう。
そこで、頻繁に変更がないデータについては、一度取り込んだら、こちら側のサーバのローカルストレージにキャッシュしておく仕組みを用意した。それが pahooCacheクラス である。同梱のクラス・ファイル "pahooCache.php" は include_path が通ったディレクトリに配置してほしい。他のプログラムでも pahooCacheクラス を利用するが、常に最新のクラス・ファイルを1つ配置すればよい。

pahooCacheクラス の注意ポイントは、キャッシュ時間(単位:分)とキャッシュを保存するディレクトリをコンストラクタで指定している点だ。これらはプログラムによって変わるものである。インスタンス化するときの値は、pahooCacheクラス を利用するメイン・プログラムの方で解説する。

サイトによっては、User-Agent などを必要とすることがあるだろう。そこで、第3引数に HTTPヘッダ として送信するデータを配列で渡すことができるようにした。配列の構造はコメントを参照していただきたい。

PHPのクラスについては「PHPでクラスを使ってテキストの読みやすさを調べる」を参照されたい。

準備:pahooCalendar クラス

pahooCalendar.php

  11: class pahooCalendar {
  12:     var $CONVERGE = 0.00005;            // 逐次近似計算収束判定値
  13:     var $ASTRO_REFRACT = 0.585556;      // 大気差
  14:     var $TDIFF = +9.0;          // 世界時との時差
  15:     var $error, $errmsg;        // エラーフラグ,エラーメッセージ
  16:     var $year, $month, $day;    // 西暦年月日
  17:     var $tblmoon;               // グレゴリオ暦=旧暦テーブル
  18:     var $language;              // 表示言語(jp:日本語, en:英語, en3:英語略記)
  19:     var $resolve2033;           // 旧暦2033年問題解決案 0:解決しない,1:案1,2:案2,3:対応案3  https://www.pahoo.org/e-soul/webtech/php02/php02-45-01.shtm#php_resolveLunarCalendar2033
  20:     var $pcc;                   // pahooCacheインスタンス
  21:     var $CabinetOfficeHolidayTables;    // 内閣府が公開している祝日表
  22:     const CABINETOFFICE_HOLIDAY_FILE = 'https://www8.cao.go.jp/chosei/shukujitsu/syukujitsu.csv';   // 内閣府が公開している祝日表URL
  23: 
  24: /**
  25:  * コンストラクタ
  26:  * @param   string $language 表示言語;省略時 jp
  27:  * @param   float  $tdiff    世界時との時差(省略時 +9.0;日本標準時)
  28:  * @param   object $pcc      pahooCacheインスタンス;省略時 NULL
  29:  *              インターネット経由で内閣府の国民の祝日を参照するときに指定
  30:  * @return  bool オブジェクト/FALSE:$tdiffが不正
  31: */
  32: function __construct($language='jp', $tdiff=+9.0, $pcc=NULL) {
  33:     $this->error  = FALSE;
  34:     $this->errmsg = '';
  35:     $this->year  = date('Y');
  36:     $this->month = date('n');
  37:     $this->day   = date('j');
  38:     $this->resolve2033 = 0;
  39:     $this->pcc = $pcc;
  40:     $this->CabinetOfficeHolidayTables = array();
  41: 
  42:     $this->setLanguage($language);
  43:     if ($this->setTimeDifference($tdiff) == FALSE) {
  44:         $this->error = TRUE;
  45:         $this->errmsg = 'illegal tdiff';
  46:     }
  47: }

西暦(グレゴリオ暦)計算やヒジュラ暦(イスラム暦)への変換、祝祭日、六曜、二十四節気の算出などの暦関係の計算、太陽や月の位置計算、潮位などを求めるクラス・ファイル "pahooCalendar.php" が同梱されているが、include_path が通ったディレクトリに配置してほしい。他のプログラムでも "pahooCalendar.php" を利用するが、常に最新のクラス・ファイルを1つ配置すればよい。

解説:カレンダー作成

weeklyCalendar.php

 274: /**
 275:  * カレンダー情報を追加する
 276:  * @param   object $pcl   pahooCalendarオブジェクト
 277:  * @param   array  $spot  場所情報
 278:  * @param   array  $items カレンダー情報配列
 279:  * @return  なし
 280: */
 281: function addWeeklyCalendar($pcl, $spot, &$items) {
 282:     // 雑節テーブル
 283:     $table_za = array('春社', '秋社', '八十八夜', '入梅', '二百十日', '二百二十日');
 284: 
 285:     $longitude = $spot['longitude'];
 286:     $latitude  = $spot['latitude'];
 287:     $height    = $spot['height'];
 288:     $year  = date('Y');
 289:     $month = 0;
 290:     $yy = ($items[0]['month'<2? $year - 1 : $year;
 291: 
 292:     // 彼岸
 293:     $higan = $pcl->getHigan($year);
 294:     // 雑節
 295:     $zassetsu = $pcl->getZassetsu($year);
 296:     // 中秋の名月;このメソッド内で旧暦計算用テーブルを準備する
 297:     $midAutumnMoonList = $pcl->getMidAutumnMoon($yy, RESOLVE2033);
 298: 
 299:     foreach ($items as $i=>$item) {
 300:         if (is_numeric($i)) {
 301:             // 翌年
 302:             if ($month > $items[$i]['month']) {
 303:                 $year++;
 304:                 $month = $items[$i]['month'];
 305:                 // 彼岸
 306:                 $higan = $pcl->getHigan($year);
 307:                 // 雑節
 308:                 $zassetsu = $pcl->getZassetsu($year);
 309:             } else if ($month < $items[$i]['month']) {
 310:                 $month = $items[$i]['month'];
 311:             }
 312:             $day = $items[$i]['day'];
 313:             $items[$i]['year'] = $year;
 314: 
 315:             // 日出没・月出没・月齢・距離
 316:             $sunrise = $pcl->sun_time(0, $longitude, $latitude, $height, $year, $month, $day);
 317:             $items[$i]['sunrise'] = $pcl->day2hhmm($sunrise);
 318:             $sunset = $pcl->sun_time(1, $longitude, $latitude, $height, $year, $month, $day);
 319:             $items[$i]['sunset'] = $pcl->day2hhmm($sunset);
 320:             $moonrise = $pcl->moon_time(0, $longitude, $latitude, $height, $year, $month, $day);
 321:             $items[$i]['moonrise'] = ($moonrise == FALSE? '---' : $pcl->day2hhmm($moonrise);
 322:             $moonset = $pcl->moon_time(1, $longitude, $latitude, $height, $year, $month, $day);
 323:             $items[$i]['moonset'] = ($moonset == FALSE? '---' : $pcl->day2hhmm($moonset);
 324:             $items[$i]['moonage'] = $pcl->moon_age($year, $month, $day, CALC_HOUR, 0, 0);
 325:             $items[$i]['moondist'] = sprintf('%4.3f', $pcl->distance_moon($year, $month, $day, CALC_HOUR, 0, 0));
 326: 
 327:             // 
 328:             $moonmeridian = $pcl->moon_time(2, $longitude, $latitude, $height, $year, $month, $day);
 329:             $moonmeridian = ($moonmeridian == FALSE? '---' : $pcl->day2hhmm($moonmeridian);
 330:             $items[$i]['tide'] = (preg_match('/([0-9]+)\:([0-9]+)/', $moonmeridian, $arr> 0? $pcl->tide($year, $month, $day, $arr[1], $arr[2], 0)  : '';
 331: 
 332:             // 二十四節気
 333:             $items[$i]['solarterm24'] = $pcl->getSolarTerm($year, $month, $day);
 334: 
 335:             // 七十二候
 336:             $items[$i]['solarterm72'] = $pcl->getSolarTerm72($year, $month, $day);
 337: 
 338:             // 土用
 339:             list($ss1, $ss2) = $pcl->isDoyo($year, $month, $day);
 340:             if ($ss2 == '明け') {
 341:                 $ss2 = '';
 342:             } else if (($ss1 !'夏'&& ($ss2 == '丑')) {
 343:                 $ss2 = '';
 344:             }
 345:             if ($ss1 !'' && $ss2 !'') {
 346:                 $ss2 = '土用の' . $ss2;
 347:             }
 348:             $items[$i]['doyo'] = $ss2;
 349: 
 350:             // 彼岸
 351:             if (($higan[0]['in']['month'] == $month&& ($higan[0]['in']['day'] == $day)) {
 352:                 $solarterm = '彼岸入り';
 353:                 $ss2 = '彼岸入り' . $ss2;
 354:             } else if (($higan[0]['out']['month'] == $month&& ($higan[0]['out']['day'] == $day)) {
 355:                 $solarterm = '彼岸明け';
 356:                 $ss2 = '彼岸明け' . $ss2;
 357:             } else if (($higan[1]['in']['month'] == $month&& ($higan[1]['in']['day'] == $day)) {
 358:                 $solarterm = '彼岸入り';
 359:                 $ss2 = '彼岸入り' . $ss2;
 360:             } else if (($higan[1]['out']['month'] == $month&& ($higan[1]['out']['day'] == $day)) {
 361:                 $solarterm = '彼岸明け';
 362:                 $ss2 = '彼岸明け' . $ss2;
 363:             }
 364:             // 雑節
 365:             foreach ($table_za as $label) {
 366:                 if (($zassetsu[$label]['month'] == $month&& ($zassetsu[$label]['day'] == $day)) {
 367:                     $solarterm = $label;
 368:                     $ss2 = $label . $ss2;
 369:                 }
 370:             }
 371: 
 372:             // 祝日
 373:             $holiday = $pcl->getHoliday($year, $month, $day, 'jp');
 374:             $items[$i]['holiday'] = ($holiday == FALSE? '' : $holiday;
 375: 
 376:             // 旧暦
 377:             list($oldmonth, $oldday, $oldleap) = $pcl->Gregorian2Lunar($year, $month, $day);
 378:             $oldleap = $oldleap ? '閏' : '';
 379:             $items[$i]['oldcal'] = sprintf('%s%d月%d日', $oldleap, $oldmonth, $oldday);
 380:             $items[$i]['rokuyou'] = $pcl->rokuyou($oldmonth, $oldday);
 381: 
 382:             // 日の干支
 383:             $items[$i]['eto'] = $pcl->eto_day($year, $month, $day);
 384: 
 385:             // 中秋の名月
 386:             $items[$i]['midAutumnMoon'] = (($midAutumnMoonList !FALSE&& ($midAutumnMoonList[0] == $year&& ($midAutumnMoonList[1] == $month&& ($midAutumnMoonList[2] == $day)) ? '中秋の名月' : '';
 387:         }
 388:     }
 389: }

ユーザー関数 addWeeklyCalendar は、天気予報によって取得した年月日に基づき、カレンダーの計算を行う。
具体的には、毎日の天気予報情報を格納した配列 $items に対して、日出没・月出没・月齢、二十四節気、七十二候、土用、祝日、旧暦の順にデータを追加していく。

グレゴリオ暦から旧暦を求める手順は、「PHPで3ヶ月カレンダーを作る」で紹介している。

解説:表示とURLパラメータ

weeklyCalendar.php

 574: // 各種パラメータを代入する.
 575: $items  = array();
 576: $errmsg = $url = $address = '';
 577: $id        = (int)getParam('id', FALSE, 0);         // 表示モード
 578: $query    = getValidString('query', $errmsg, '', QUERY_MIN_LEN, QUERY_MAX_LEN);
 579: if ($errmsg !'') {
 580:     $errmsg = '検索キーの長さが' . $errmsg;
 581: }
 582: $latitude  = (float)getParam('latitude',  FALSE, DEF_LATITUDE); // 緯度
 583: $longitude = (float)getParam('longitude', FALSE, DEF_LONGITUDE);    // 経度
 584: $zoom      = (int)getParam('zoom',        FALSE, DEF_ZOOM);     // ズーム
 585: $type      = (string)getParam('type',     FALSE, DEF_TYPE);     // マップタイプ
 586: $category  = (string)getParam('category', FALSE, 'address');    // カテゴリ
 587: $outenc    = (string)getParam('charset',  FALSE, INTERNAL_ENCODING);

URLパラメータを使って
weeklyCalendar?id=1&query=%E6%9C%AD%E5%B9%8C%E5%B8%82
のようにすることで、query をキーワードにして検索した地点のカレンダーのみを表示させることができる。つまり、このスクリプトをホームページやブログの一部として組み込むことで、週間天気予報を表示するパーツになる。
query はUTF-8をURLエンコードしたもの。Yahoo!JAPAN住所検索を使う場合は、category をあわせて指定すること。
また、出力はHTML文のみとなり、スタイルシートは本体ページの方で用意していただきたい。必要なclassは次の通り。

weeklyCalendar.php

 162: <style>
 163: /* カレンダー:キャプション */
 164: h3.caption {
 165:     width: {$width}px;
 166:     font-size: 140%;
 167:     text-align: center;
 168: }
 169: /* カレンダー */
 170: table.DailyCalendar {
 171:     table-layout: fixed;
 172:     width: {$width}px;
 173:     border: solid 1px gray;
 174:     border-collapse: collapse;
 175:     margin-top:10px;
 176: }
 177: /* カレンダー:日付表示 */
 178: td.label1 {
 179:     border:solid 1px gray;
 180:     border-collapse: collapse;
 181:     padding: 4px;
 182:     white-space: nowrap;
 183:     font-size: 120%;
 184:     text-align:center;
 185:     color: white;
 186:     background-color: dimgray;
 187: }
 188: /* カレンダー:旧暦表示 */
 189: span.oldcal {
 190:     font-size: 80%;
 191: }
 192: /* カレンダー:ラベル表示 */
 193: td.label3 {
 194:     width: {$width3}px;
 195:     border:solid 1px gray;
 196:     border-collapse: collapse;
 197:     padding: 4px;
 198:     white-space: nowrap;
 199:     font-size: 100%;
 200:     text-align: center;
 201:     background-color: gainsboro;
 202: }
 203: /* カレンダー:データ表示 */
 204: td.data3 {
 205:     width: {$width3}px;
 206:     border:solid 1px gray;
 207:     border-collapse: collapse;
 208:     padding: 4px;
 209:     white-space: nowrap;
 210:     font-size: 100%;
 211:     text-align: center;
 212: }
 213: /* カレンダー:データ表示(小さい文字) */
 214: td.data4 {
 215:     width: {$width3}px;
 216:     border:solid 1px gray;
 217:     border-collapse: collapse;
 218:     padding: 4px;
 219:     white-space: nowrap;
 220:     font-size: 70%;
 221:     text-align: center;
 222: }
 223: /* 月の満ち欠け画像 */
 224: img.moonage {
 225:     width:  {$width9}px;
 226:     height: {$width9}px;
 227:     padding: 5px;
 228: }
 229: /* 天気予報表:予報アイコン */
 230: img.wicon {
 231:     width: 60px;
 232: }
 233: </style>

また、親となるホームページやブログの文字コードセットにあわせ、charset 変数で出力文字コードを変更できるようにした。たとえば
weeklyCalendar?id=1&query=%E6%9C%AD%E5%B9%8C%E5%B8%82&charset=SJIS
とすると、シフトJISで出力することができる。
緯度・経度を直接、URLパラメータに渡すこともできる。
weeklyCalendar?id=1&latitude=26.591&longitude=127.977
のようにすることで、北緯26.591度、東経127.977度のカレンダーのみを表示させることができる。

質疑応答

【質問】
ぱーまー様より
天気系のPHPサンプル3つですが、特定の場所の天気が3日分ほどしか表示されません。例えば、「京都市」「熱海市」などです。
最低気温や最高気温などの他のデータは取得しています。
一部の地域のみのようです。

下記の利用者様のサイトでは「京都市」「熱海市」も7日間表示されます。
https://www.benricho.org/koyomi/map_weeklycalendar/

なにか更新が必要なファイル等がございますでしょうか?
【回答】
ご指摘ありがとうございます。
原因は、ダウンロードファイルに含まれている "jmaweatherspots.xml" が古かったためでした。新しいファイルに差し替えました。ダウンロードしてお試しください。

参考サイト

(この項おわり)
header