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

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

(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 クラス

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

解説:カレンダー作成

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

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

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

活用例

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

参考サイト

(この項おわり)
header