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

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


もともとは、正月に各家庭で迎える歳神様がやって来る方角を意味していた。旧暦では立春が正月にあたるので、その前日の節分に、歳神様を迎える準備をする。
陰陽道が普及すると、恵方の方角に、その年の歳徳神(恵方神)がいて、祟り神が巡ってこない良い方角とされた。
恵方は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.php" を require_once し、オブジェクトを生成する。
準備:pahooGeoCode クラス
73: //住所・緯度・経度に関わるクラス:include_pathが通ったディレクトリに配置
74: require_once('pahooGeoCode.php');
349: //pahooGeoCodeクラス
350: $pgc = new pahooGeoCode();
クラスについては「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);
あらかじめ、定数 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);
あらかじめ、定数 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); //恵方:矢の長さ(全長に対する比率)
解説:恵方の方位角を求める
解説:地図上に矢印を描く
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 で計算している。
解説:方位角と距離を指定した地点の緯度・経度を求める
解説:Google JavaScriptマップ用スクリプト生成(直線描画)
解説:Leaflet用スクリプト生成(直線描画)
解説:マップ上に直線を描くスクリプト生成
#jsLine_Leaflet:title=jsLine_Leaflet] で生成したスクリプトは、drawJSmap メソッドの引数 $call に渡してやる。
参考サイト
- 各種WebAPIの登録方法:ぱふぅ家のホームページ
- PHPで二十四節気・七十二候一覧を作成
- PHPで大圏航路を描く:ぱふぅ家のホームページ