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

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

2020 年(令和 2 年)7 月 31 日をもって、livedoor 天気サービスが終了することがアナウンスされている。この日以降、ここで紹介するプログラムは正常に動作しなくなる。

(2020 年 4 月 10 日)OSM Nominatim Search API を利用できるようにした。
(2019 年 6 月 24 日)地理院地図、OpenStreetMap も利用できるようにした。緯度・経度から住所を検索する逆ジオコーディングサービスの選択肢を増やした。地図検索,リセット・ボタンを追加した。
(2019 年 3 月 16 日)Yahoo! JavaScript マップも利用できるようにした。

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

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

サンプル・プログラム

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

準備:pahooGeoCode クラス

0036: class pahooGeoCode {
0037:     var $items;      //検索結果格納用
0038:     var $error;      //エラーフラグ
0039:     var $hits;       //検索ヒット件数
0040:     var $webapi; //直前に呼び出したWebAPI URL
0041: 
0042:     //Google Cloud Platform APIキー
0043:     //https://cloud.google.com/maps-platform/
0044:     //※Google Maps APIを利用しないのなら登録不要
0045:     var $GOOGLE_API_KEY_1 = '**************************';   //HTTPリファラ用
0046:     var $GOOGLE_API_KEY_2 = '**************************';   //IP制限用
0047: 
0048:     //Yahoo! JAPAN Webサービス アプリケーションID
0049:     //https://e.developer.yahoo.co.jp/register
0050:     //※Yahoo! JAPAN Webサービスを利用しないのなら登録不要
0051:     var $YAHOO_APPLICATION_ID = '*****************************';

地図サービスを利用するために、クラスファイル "pahooGeoCode.php" を使用する。組み込み関数  require_once  を使って読めるディレクトリに配置する。ディレクトリは、設定ファイル php.ini に記述されているオプション設定 include_path に設定しておく。
クラスについては「PHP でクラスを使ってテキストの読みやすさを調べる」を参照されたい。

地図や住所検索として Google を利用するのであれば、Google Cloud Platform API キー が必要で、その入手方法は「Google Cloud Platform - WebAPI の登録方法」を、Yahoo!JAPAN を利用するのであれば、Yahoo! JAPAN Web サービス アプリケーション IDが必要で、その入手方法は「Yahoo!JAPAN デベロッパーネットワーク - 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: //   12:OSM Nominatim Search API
0042: define('GEOSERVICE', 1);
0043: 
0044: //逆ジオコーディングサービスの選択
0045: //    0:Google
0046: //    1:Yahoo!JAPAN
0047: //   11:HeartRails Geo API
0048: //   21:簡易ジオコーディングサービス
0049: define('REVGEOSERVICE', 21);

表示する地図は、Google マップと Yahoo!マップ(YOLP 地図)から選べる。
あらかじめ、定数 GEOSERVICE に値を設定すること。
PHPで地図で指定した場所の週間カレンダーを表示
Yahoo!マップ表示

解説:カレンダー作成

0234: /**
0235:  * カレンダー情報を追加する
0236:  * @param object $pcl   pahooCalendarオブジェクト
0237:  * @param array  $spot  場所情報
0238:  * @param array  $items カレンダー情報配列
0239:  * @return なし
0240: */
0241: function addWeeklyCalendar($pcl$spot, &$items) {
0242:     $longitude = $spot['longitude'];
0243:     $latitude  = $spot['latitude'];
0244:     $height    = $spot['height'];
0245:     $year  = date('Y');
0246:     $month = 0;
0247:     $yy = ($items[0]['month'] <= 2) ? $year - 1 : $year;
0248:     $pcl->makeLunarCalendar($yy);     //旧暦計算用テーブル準備
0249:     for ($i = 0; $i < count($items); $i++) {
0250:         //翌年
0251:         if ($month > $items[$i]['month']) {
0252:             $year++;
0253:             $month = $items[$i]['month'];
0254:         } else if ($month < $items[$i]['month']) {
0255:             $month = $items[$i]['month'];
0256:         }
0257:         $day = $items[$i]['day'];
0258:         $items[$i]['year'] = $year;
0259: 
0260:         //日出没・月出没・月齢・距離
0261:         $sunrise = $pcl->sun_time(0, $longitude$latitude$height$year$month$day);
0262:         $items[$i]['sunrise'] = $pcl->day2hhmm($sunrise);
0263:         $sunset = $pcl->sun_time(1, $longitude$latitude$height$year$month$day);
0264:         $items[$i]['sunset'] = $pcl->day2hhmm($sunset);
0265:         $moonrise = $pcl->moon_time(0, $longitude$latitude$height$year$month$day);
0266:         $items[$i]['moonrise'] = ($moonrise == FALSE) ? '---' : $pcl->day2hhmm($moonrise);
0267:         $moonset = $pcl->moon_time(1, $longitude$latitude$height$year$month$day);
0268:         $items[$i]['moonset'] = ($moonset == FALSE) ? '---' : $pcl->day2hhmm($moonset);
0269:         $items[$i]['moonage'] = $pcl->moon_age($year$month$day, 21 - UTCDIFF, 0, 0);
0270:         $items[$i]['moondist'] = sprintf('%4.3f', $pcl->distance_moon($year$month$day, 12, 0, 0));
0271: 
0272:         //潮
0273:         $moonmeridian = $pcl->moon_time(2, $longitude$latitude$height$year$month$day);
0274:         $moonmeridian = ($moonmeridian == FALSE) ? '---' : $pcl->day2hhmm($moonmeridian);
0275:         $items[$i]['tide'] = (preg_match('/([0-9]+)\:([0-9]+)/', $moonmeridian$arr) > 0) ? $pcl->tide($year$month$day$arr[1]$arr[2], 0)  : '';
0276: 
0277:         //二十四節気
0278:         $items[$i]['solarterm24'] = $pcl->getSolarTerm($year$month$day);
0279: 
0280:         //七十二候
0281:         $items[$i]['solarterm72'] = $pcl->getSolarTerm72($year$month$day);
0282: 
0283:         //祝日
0284:         $holiday = $pcl->getHoliday($year$month$day, 'jp');
0285:         $items[$i]['holiday'] = ($holiday == FALSE) ? '' : $holiday;
0286: 
0287:         //旧暦
0288:         list($oldmonth$oldday$oldleap) = $pcl->Gregorian2Lunar($year$month$day);
0289:         $oldleap = $oldleap ? '' : '';
0290:         $items[$i]['oldcal'] = sprintf('%s%d月%d日', $oldleap$oldmonth$oldday);
0291:         $items[$i]['rokuyou'] = $pcl->rokuyou($oldmonth$oldday);
0292: 
0293:         //日の干支
0294:         $items[$i]['eto'] = $pcl->eto_day($year$month$day);
0295:     }
0296: }

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

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

活用例

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

参考サイト

(この項おわり)
header