PHPで地図上に恵方を表示

(1/1)
PHPで二十四節気・七十二候一覧を作成」では、毎年の節分の日を計算するプログラムを作成した。節分の日に恵方の方角を向いて恵方巻きを無言で食べると良いとされるが、この恵方は、年によって方角が変化する。そこで今回は、PHPを使い、指定した年の恵方の方角を地図上に矢印で描くPHPプログラムを作ってみることにする。

目次

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

PHPで地図上に恵方を表示
Googleマップ

サンプル・プログラムのダウンロード

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

恵方とは

恵方ロールケーキを食べる男の子のイラスト
節分の日に恵方の方角を向いて恵方巻きを無言で食べると良いとされるが、この恵方は、年によって方角が変化する。

もともとは、正月に各家庭で迎える歳神 (としがみ) 様がやって来る方角を意味していた。旧暦では立春が正月にあたるので、その前日の節分に、歳神様を迎える準備をする。
陰陽道が普及すると、恵方の方角に、その年の歳徳神 (としとくじん) (恵方神)がいて、祟り神が巡ってこない良い方角とされた。
恵方は、その年の十干 (じっかん) によって決まる。十干は、甲・乙・丙・丁・戊・己・庚・辛・壬・癸の10の要素が割り当てられている。つまり、年号を10で割った余りで、その年の十干を知ることができる。
恵方は4種類しかなく、たとえば甲の年と己の年の恵方は同じである。
十干と恵方の対応を整理すると、下表のようになる。
十干 西暦の下1桁 恵方
4 東北東微東 75度
5 西南西微西 255度
6 南南東微南 165度
7 北北西微北 345度
8 南南東微南 165度
9 東北東微東 75度
0 西南西微西 255度
1 南南東微南 165度
2 北北西微北 345度
3 南南東微南 165度

解説:pahooCalendarクラス

  76: //暦計算クラス:include_pathが通ったディレクトリに配置
  77: require_once('pahooCalendar.php');

 351: //pahooCalendarクラス
 352: $pcl = new pahooCalendar();
 353: $pcl->setLanguage('jp');

恵方の方位角の計算は、ユーザークラス "pahooCalendar" に分離している。
まず、クラスファイル "pahooCalendar.php" を  require_once  し、オブジェクトを生成する。

準備:pahooGeoCode クラス

  73: //住所・緯度・経度に関わるクラス:include_pathが通ったディレクトリに配置
  74: require_once('pahooGeoCode.php');

 349: //pahooGeoCodeクラス
 350: $pgc = new pahooGeoCode();

地図サービスを利用するために、クラスファイル "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の登録方法」を参照されたい。また、Googleマップで経路探索を行う場合は、DirectionsService APIを有効にする必要がある。課金率が高いので留意されたい。

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

  34: //地図サービス(WebAPI)の選択
  35: //    0:Google
  36: //    2:地理院地図・OSM
  37: define('MAPSERVICE', 2);

表示する地図は、Googleマップと地理院地図・OSMから選べる。
あらかじめ、定数 MAPSERVICE に値を設定すること。

準備:住所検索サービス(WebAPI)の選択

  39: //住所検索サービスの選択
  40: //    0:Google
  41: //    1:Yahoo!JAPAN
  42: //   11:HeartRails Geo API
  43: //   12:OSM Nominatim Search API
  44: define('GEOSERVICE', 0);

住所やワンドマークから緯度・軽度を検索するWebAPIを選ぶことができる。
あらかじめ、定数 GEOSERVICE に値を設定すること。

準備:各種パラメータ

  53: //マップの表示サイズ(単位:ピクセル)
  54: define('MAP_WIDTH',  600);
  55: define('MAP_HEIGHT', 400);
  56: //マップID
  57: define('MAPID', 'map_id');
  58: 
  59: //初期値
  60: define('DEF_LONGITUDE', 139.766667);    //地図中心(経度)
  61: define('DEF_LATITUDE',  35.681111);     //    (緯度)
  62: define('DEF_QUERY',     '東京駅');      //検索クエリ
  63: define('DEF_TYPE',      'roadmap');     //マップタイプ
  64: define('DEF_ZOOM',      12);            //ズーム
  65: define('DEF_CAT',       'address');     //カテゴリ(Yahoo!)
  66: define('LINE_COLOR',    '#FF0000');     //恵方の色
  67: define('LINE_OPACITY',  0.6);           //恵方の透明度
  68: define('LINE_WEIGHT',   5);             //恵方の太さ
  69: define('LINE_LENGTH',   5000);          //恵方の全長(メートル)
  70: define('ARROW_ANGLE',   20);            //恵方:矢印の角度
  71: define('ARROW_LENGTH',  0.1);           //恵方:矢の長さ(全長に対する比率)

地図や矢印の表示レイアウトを決めるための各種パラメータである。変更不可としているもの以外は、任意の値を設定できる。

解説:恵方の方位角を求める

恵方の方位角を求めるには、前述の「恵方とは」で紹介した一覧を配列として用意しておき、西暦年を10で割った剰余と紐付けてやる。

解説:地図上に矢印を描く

 202: /**
 203:  * 地図上に矢印を描くスクリプトを生成
 204:  * @param   object $pgc       pahooGeoCodeクラス
 205:  * @param   float  $lat, $lng 開始点の緯度・経度
 206:  * @param   float  $angle     方位角(北を0度として時計回り)
 207:  * @param   int    $api   0:Google Maps JavaScript(省略時)
 208:  *                       11:地理院地図・OSM(Leaflet使用)
 209:  * @return  string JavaScript
 210: */
 211: function jsArrow($pgc, $latitude, $longitude, $angle, $api=0) {
 212:     //本線
 213:     list($lat1, $lng1) = $pgc->getPointAngle($longitude, $latitude, $angle, LINE_LENGTH);
 214:     $points[0]['latitude']  = $latitude;
 215:     $points[0]['longitude'] = $longitude;
 216:     $points[1]['latitude']  = $lat1;
 217:     $points[1]['longitude'] = $lng1;
 218:     $js = $pgc->jsLine($points, LINE_COLOR, LINE_OPACITY, LINE_WEIGHT, MAPSERVICE);
 219: 
 220:     //矢印
 221:     $a = $angle - 180 - ARROW_ANGLE;
 222:     if ($a < 0)      $a +360;
 223:     list($lat2, $lng2) = $pgc->getPointAngle($lng1, $lat1, $a, LINE_LENGTH * ARROW_LENGTH);
 224:     $points[0]['latitude']  = $lat1;
 225:     $points[0]['longitude'] = $lng1;
 226:     $points[1]['latitude']  = $lat2;
 227:     $points[1]['longitude'] = $lng2;
 228:     $js .$pgc->jsLine($points, LINE_COLOR, LINE_OPACITY, LINE_WEIGHT, MAPSERVICE);
 229: 
 230:     $a = $angle - 180 + ARROW_ANGLE;
 231:     if ($a < 0)      $a +360;
 232:     list($lat3, $lng3) = $pgc->getPointAngle($lng1, $lat1, $a, LINE_LENGTH * ARROW_LENGTH);
 233:     $points[1]['latitude']  = $lat3;
 234:     $points[1]['longitude'] = $lng3;
 235:     $js .$pgc->jsLine($points, LINE_COLOR, LINE_OPACITY, LINE_WEIGHT, MAPSERVICE);
 236: 
 237:     return $js;
 238: }

恵方の方角へ向かって、地図上に矢印を描く。
矢印を3本の直線に分解して描くことを考える。方位角を示す本線と、その終点にぶら下がる矢印(2本の短い線分)である。

本線は、eho 関数で得られた方位角へ向かって直線を描けばいい。始点と終点は緯度・経度で指定する必要があるので、始点から、方位角と距離を指定して終点を算出するユーザー関数 getPointAngle を用意した(後述)。

次に矢印部分であるが、これは、終点から見て、角度 +ARROW_ANGLE 方向、-ARROW_ANGLE 方向へ短い線分を描けばいい。線分の長さは、本線との比率 ARROW_LENGTH で計算している。

解説:方位角と距離を指定した地点の緯度・経度を求める

ある地点から方位角と距離を指定した地点の緯度・経度を求めるユーザー関数が getPointAngle である。球面三角法の方程式を解くことで計算している。

解説:Google JavaScriptマップ用スクリプト生成(直線描画)

Googleマップ上に直線(折れ線)を描くスクリプトを生成する。緯度・経度座標は配列で渡す。

解説:Leaflet用スクリプト生成(直線描画)

Googleマップ上に直線(折れ線)を描くスクリプトを生成する。緯度・経度座標は配列で渡す。

解説:マップ上に直線を描くスクリプト生成

jsLine_Gmap または jsLine_Leaflet を呼び出し、マップ上に直線を描くスクリプトを生成する。緯度・経度座標は配列で渡す。
#jsLine_Leaflet:title=jsLine_Leaflet] で生成したスクリプトは、drawJSmap メソッドの引数 $call に渡してやる。

参考サイト

(この項おわり)
header