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

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

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

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

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

Yahoo! JAPAN Web サービスを利用するには Yahoo! JAPAN Web サービス アプリケーション IDが必要で、その入手方法は「Yahoo!JAPAN デベロッパーネットワーク - WebAPI の登録方法」を参照されたい。
また、地図として Google マップを利用するのであれば、Google Cloud Platform API キー が必要で、その入手方法は「Google Cloud Platform - WebAPI の登録方法」を参照されたい。

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

0031: //地図サービス(WebAPI)の選択
0032: //    0:Google
0033: //    1:Yahoo!JAPAN
0034: define('GEOSERVICE', 1);

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

解説:カレンダー作成

0224: /**
0225:  * カレンダー情報を追加する
0226:  * @param object $pcl   pahooCalendarオブジェクト
0227:  * @param array  $spot  場所情報
0228:  * @param array  $items カレンダー情報配列
0229:  * @return なし
0230: */
0231: function addWeeklyCalendar($pcl$spot, &$items) {
0232:     $longitude = $spot['longitude'];
0233:     $latitude  = $spot['latitude'];
0234:     $height    = $spot['height'];
0235:     $year  = date('Y');
0236:     $month = 0;
0237:     $yy = ($items[0]['month'] <= 2) ? $year - 1 : $year;
0238:     $pcl->makeLunarCalendar($yy);     //旧暦計算用テーブル準備
0239:     for ($i = 0; $i < count($items); $i++) {
0240:         //翌年
0241:         if ($month > $items[$i]['month']) {
0242:             $year++;
0243:             $month = $items[$i]['month'];
0244:         } else if ($month < $items[$i]['month']) {
0245:             $month = $items[$i]['month'];
0246:         }
0247:         $day = $items[$i]['day'];
0248:         $items[$i]['year'] = $year;
0249: 
0250:         //日出没・月出没・月齢・距離
0251:         $sunrise = $pcl->sun_time(0, $longitude$latitude$height$year$month$day);
0252:         $items[$i]['sunrise'] = $pcl->day2hhmm($sunrise);
0253:         $sunset = $pcl->sun_time(1, $longitude$latitude$height$year$month$day);
0254:         $items[$i]['sunset'] = $pcl->day2hhmm($sunset);
0255:         $moonrise = $pcl->moon_time(0, $longitude$latitude$height$year$month$day);
0256:         $items[$i]['moonrise'] = ($moonrise == FALSE) ? '---' : $pcl->day2hhmm($moonrise);
0257:         $moonset = $pcl->moon_time(1, $longitude$latitude$height$year$month$day);
0258:         $items[$i]['moonset'] = ($moonset == FALSE) ? '---' : $pcl->day2hhmm($moonset);
0259:         $items[$i]['moonage'] = $pcl->moon_age($year$month$day, 21 - UTCDIFF, 0, 0);
0260:         $items[$i]['moondist'] = sprintf('%4.3f', $pcl->distance_moon($year$month$day, 12, 0, 0));
0261: 
0262:         //潮
0263:         $moonmeridian = $pcl->moon_time(2, $longitude$latitude$height$year$month$day);
0264:         $moonmeridian = ($moonmeridian == FALSE) ? '---' : $pcl->day2hhmm($moonmeridian);
0265:         $items[$i]['tide'] = (preg_match('/([0-9]+)\:([0-9]+)/', $moonmeridian$arr) > 0) ? $pcl->tide($year$month$day$arr[1]$arr[2], 0)  : '';
0266: 
0267:         //二十四節気
0268:         $items[$i]['solarterm24'] = $pcl->getSolarTerm($year$month$day);
0269: 
0270:         //七十二候
0271:         $items[$i]['solarterm72'] = $pcl->getSolarTerm72($year$month$day);
0272: 
0273:         //祝日
0274:         $holiday = $pcl->getHoliday($year$month$day, 'jp');
0275:         $items[$i]['holiday'] = ($holiday == FALSE) ? '' : $holiday;
0276: 
0277:         //旧暦
0278:         list($oldmonth$oldday$oldleap) = $pcl->Gregorian2Lunar($year$month$day);
0279:         $oldleap = $oldleap ? '' : '';
0280:         $items[$i]['oldcal'] = sprintf('%s%d月%d日', $oldleap$oldmonth$oldday);
0281:         $items[$i]['rokuyou'] = $pcl->rokuyou($oldmonth$oldday);
0282: 
0283:         //日の干支
0284:         $items[$i]['eto'] = $pcl->eto_day($year$month$day);
0285:     }
0286: }
0287: 
0288: /**
0289:  * 1日分のカレンダーを作成
0290:  * @param array  $item カレンダー情報(1日分)
0291:  * @return string HTMLコンテンツ
0292: */
0293: function makeDailyCalendar($item) {
0294:     $moonage = ($item['moonage'] < 0 || $item['moonage'] > 30) ?
0295:         0 : sprintf('%03.1f', $item['moonage']);
0296:     $imgmoon = MOONAGE . sprintf('moon_%02d.png', $item['moonage']);
0297:     $image = ($item['weather'] == '') ? '' :  $item['image'];
0298: 
0299: $html =<<< EOT
0300: <table class="DailyCalendar">
0301: <tr>
0302: <td class="label1" colspan="6">{$item['year']}年{$item['month']}月{$item['day']}日({$item['week']})
0303: <span class="oldcal"> {$item['holiday']} {$item['solarterm24']} {$item['solarterm72']} {$item['eto']} 旧暦:{$item['oldcal']}({$item['rokuyou']})</span></td>
0304: </tr>
0305: <tr>
0306: <td class="label3">日出</td><td class="data3">{$item['sunrise']}</td>
0307: <td class="label3">日没</td><td class="data3">{$item['sunset']}</td>
0308: <td class="label3" rowspan="2">月齢<br /><br />距離<br />潮</td><td class="data3" rowspan="2">{$moonage}<br /><img class="moonage" src="{$imgmoon}" /><br />{$item['moondist']}<br />{$item['tide']}</td>
0309: </tr>
0310: <tr>
0311: <td class="label3">月出</td><td class="data3">{$item['moonrise']}</td>
0312: <td class="label3">月没</td><td class="data3">{$item['moonset']}</td>
0313: </tr>
0314: <tr>
0315: <td class="label3">天候</td><td class="data3">{$item['weather']}<br /><img src="{$image}" /></td>
0316: <td class="label3">最高気温</td><td class="data3">{$item['temp_max']}℃</td>
0317: <td class="label3">最低気温</td><td class="data3">{$item['temp_min']}℃</td>
0318: </tr>
0319: </table>
0320: 
0321: EOT;
0322:     return $html;
0323: }

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

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

活用例

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

参考サイト

(この項おわり)
header