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

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

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

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

サンプル・プログラム

サンプル・プログラムの流れ

メイン・プログラムの流れは、「PHP で地図で指定した場所の天気予報を求める」がベースになっている。

取得した緯度・経度から、天気予報、住所、標高を求める。
次に、ユーザー関数 addWeeklyCalendar によってカレンダー本体のデータを取得していく。

解説:クラス

0017: // GeoCodeクラス =============================================================
0018: class pahooGeoCode {
0019:     var $items;      //検索結果格納用
0020:     var $error;      //エラーフラグ
0021:     var $hits;           //検索ヒット件数
0022:     var $webapi;     //直前に呼び出したWebAPI URL
0023: 
0024:     //Google API KEY
0025:     //https://developers.google.com/maps/web/
0026:     var $GOOGLE_API_KEY = '**************************';
0027: 
0028:     //Yahoo! JAPAN Webサービス アプリケーションID
0029:     //https://developers.google.com/maps/documentation/javascript/get-api-key
0030:     var $YAHOO_APPLICATION_ID = '*****************************';
0031: 
0032:     //ジオどすII APIキー
0033:     //http://geodosu.com/user/register
0034:     var $APIKEY_GEODOS = '*****************';
0035: 
0036: /**
0037:  * コンストラクタ
0038:  * @param なし
0039:  * @return なし
0040: */
0041: function __construct() {
0042:     $this->error  = FALSE;
0043:     $this->errmsg = '';
0044:     $this->hits = 0;
0045:     $this->webapi = '';
0046: }
0047: 
0048: /**
0049:  * デストラクタ
0050:  * @return なし
0051: */
0052: function __destruct() {
0053:     unset($this->items);
0054: }

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

WebAPI「ジオどす II」では API キーが必要になる。これは http://geodosu.com/user/register から無料で入手することができる。この API キーの値は変数 $APIKEY_GEODOS にあらかじめ設定しておく。
2016 年(平成 28 年)6 月頃から、Google Maps API を呼び出すにもキーが必要になった。「Google Maps APIs for Web」にアクセスし、「キーを取得」ボタンをクリックすると無料で取得できる。変数 $GOOGLE_API_KEY に設定しておく。
Yahoo! JAPAN Web サービスを利用する場合は、アプリケーション ID を http://help.yahoo.co.jp/help/jp/developer/developer-06.html から無償取得し、変数 $YAHOO_APPLICATION_ID に設定しておく。

解説:カレンダー

0191: /**
0192:  * カレンダー情報を追加する
0193:  * @param object $pcl   pahooCalendarオブジェクト
0194:  * @param array  $spot  場所情報
0195:  * @param array  $items カレンダー情報配列
0196:  * @return なし
0197: */
0198: function addWeeklyCalendar($pcl$spot, &$items) {
0199:     $longitude = $spot['longitude'];
0200:     $latitude  = $spot['latitude'];
0201:     $height    = $spot['height'];
0202:     $year  = date('Y');
0203:     $month = 0;
0204:     $yy = ($items[0]['month'] <= 2) ? $year - 1 : $year;
0205:     $pcl->makeLunarCalendar($yy);     //旧暦計算用テーブル準備
0206:     for ($i = 0; $i < count($items); $i++) {
0207:         //翌年
0208:         if ($month > $items[$i]['month']) {
0209:             $year++;
0210:             $month = $items[$i]['month'];
0211:         } else if ($month < $items[$i]['month']) {
0212:             $month = $items[$i]['month'];
0213:         }
0214:         $day = $items[$i]['day'];
0215:         $items[$i]['year'] = $year;
0216: 
0217:         //日出没・月出没・月齢・距離
0218:         $sunrise = $pcl->sun_time(0, $longitude$latitude$height$year$month$day);
0219:         $items[$i]['sunrise'] = $pcl->day2hhmm($sunrise);
0220:         $sunset = $pcl->sun_time(1, $longitude$latitude$height$year$month$day);
0221:         $items[$i]['sunset'] = $pcl->day2hhmm($sunset);
0222:         $moonrise = $pcl->moon_time(0, $longitude$latitude$height$year$month$day);
0223:         $items[$i]['moonrise'] = ($moonrise == FALSE) ? '---' : $pcl->day2hhmm($moonrise);
0224:         $moonset = $pcl->moon_time(1, $longitude$latitude$height$year$month$day);
0225:         $items[$i]['moonset'] = ($moonset == FALSE) ? '---' : $pcl->day2hhmm($moonset);
0226:         $items[$i]['moonage'] = $pcl->moon_age($year$month$day, 21 - UTCDIFF, 0, 0);
0227:         $items[$i]['moondist'] = sprintf('%4.3f', $pcl->distance_moon($year$month$day, 12, 0, 0));
0228: 
0229:         //潮
0230:         $moonmeridian = $pcl->moon_time(2, $longitude$latitude$height$year$month$day);
0231:         $moonmeridian = ($moonmeridian == FALSE) ? '---' : $pcl->day2hhmm($moonmeridian);
0232:         $items[$i]['tide'] = (preg_match('/([0-9]+)\:([0-9]+)/', $moonmeridian$arr) > 0) ? $pcl->tide($year$month$day$arr[1]$arr[2], 0)  : '';
0233: 
0234:         //二十四節気
0235:         $items[$i]['solarterm24'] = $pcl->getSolarTerm($year$month$day);
0236: 
0237:         //七十二候
0238:         $items[$i]['solarterm72'] = $pcl->getSolarTerm72($year$month$day);
0239: 
0240:         //祝日
0241:         $holiday = $pcl->getHoliday($year$month$day, 'jp');
0242:         $items[$i]['holiday'] = ($holiday == FALSE) ? '' : $holiday;
0243: 
0244:         //旧暦
0245:         list($oldmonth$oldday$oldleap) = $pcl->Gregorian2Lunar($year$month$day);
0246:         $oldleap = $oldleap ? '' : '';
0247:         $items[$i]['oldcal'] = sprintf('%s%d月%d日', $oldleap$oldmonth$oldday);
0248:         $items[$i]['rokuyou'] = $pcl->rokuyou($oldmonth$oldday);
0249: 
0250:         //日の干支
0251:         $items[$i]['eto'] = $pcl->eto_day($year$month$day);
0252:     }
0253: }

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

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

活用例

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

参考サイト

(この項おわり)
header