経度・緯度と距離関連
DBには各地点が保存されており「A地点から半径300m以内の各地点を抜き出したい」ってことをしたい。
※まだ出来ていない。
距離を調べるには経度・緯度を元に距離を出すってのがいいらしい。
どっかのサイトで経度・緯度ともに「1度○○○m」ってのがあった。
少し乱暴だけどコレでよかったと思う。
ただ(私のミスが原因)計算がおかしいってコトでコレはNGにした。
NGだから記述をマルッと削除して翌日にミスに気づいた。
「1度○○○m」だったか調べようと思ったけど面倒だし、計算式もわかったから放置することにした。
経度・緯度について
ひとまずプログラムは置いといて経度・緯度について。
細かいことは置いといて「経度とは南北の線(経線)、緯度とは東西の線(緯線)」ってのが基本。
北が上になっている地図でいうと「縦線が経度、横線が緯度」になる。
縦線が東経○○○度・西経○○○度。横線が北緯○○○度・南緯○○○度。
※イギリスあたりを中心に東経・西経が分かれるらしい(子午線)。
話を距離に戻して「A地点の経度とB地点の経度」「A地点の緯度とB地点の緯度」ってのが何気にクセモノだったりする。
何がクセモノって「くし型切り」と「輪切り」でやり方を変える必要がある。
緯度
「A地点の緯度とB地点の緯度」ってのは特に気にする必要なし。
緯度ってのは赤道を中心に北極・南極まで「輪切り」にした感じになる。
輪切りだから赤道近辺であろうが北極近辺であろうが輪切りの幅は同じ。
同じだから1度の距離は全部一緒になってくる。
今ひとつ計算の意味がよくわからないが・・・
wikiによると地球の半径が6378150m(r)。
そこから円周(=2πr)を求めて1度を求める。
※1度じゃなくて1秒にしたかったら、さらに3600で割ればOK
経度
「A地点の経度とB地点の経度」ってのが気にする必要がでてくる。
経度ってのは南極と北極を頂点にした「くし型切り」にした感じになる。
くし型切りだから南極・北極近辺は幅が狭く、中心の赤道付近の幅が広くなる。
計算式の意味がまったく分からなかったんだが・・・
※1度じゃなくて1秒にしたかったら、さらに3600で割ればOK
経度にしても緯度にしても何故コレで距離がでてくるんだろう・・・?
分からなくても距離が出てくるんだから気にしない。ただ多少の誤差は出てくるっぽい。
php
ひとまず経度・緯度と距離の計算は分かったのでPHPに落とし込んでいくんだが・・・初めて使う関数が多くて困った。
※今回の分にたどりつくまでに諸々とあったわけで・・・
- deg2rad() – ラジアン値に変換してくれるらしいが、そもそもラジアン値って何?
- cos()、sin() – 三角関数ってヤツで何かをしてくれるらしい。
- pow() – 階乗のこと。「aの2乗」なら「a×a」でもいいんだが「aの3乗」となるとpow()を使いたい
- sqrt() – 平方根のこと。ルート○○ってヤツで「√2=1.41421356…」ってヤツだな。
あとは経度・緯度が小数なので普通に四則演算を使うわけにはいかず「bc○○○()」ってヤツで小数の計算をさせる必要があるっぽい。
wikiでまとめ中:「PHPで経度緯度と距離の計算」
A地点の半径300m
「1度の距離が分かるんだからA地点の経度と緯度にプラス・マイナスすればいいんじゃないの?」ってコトで試したらダメだった。
何がダメって・・・コレで出てくる範囲は
「A地点を中心とした直径600mの円」じゃなくて
「A地点を中心とした1辺が600mの正方形」になってしまう。
※半径が300mだから直径600m
geohexやgeohashっていう何かが存在するんだが、なんとなく、求めているモノと違うっぽいような気がする。
となってくると・・・「A地点を中心とした1辺が600mの正方形」の各地点をマルッとDBから取り出してA地点と各地点の距離を算出してってのが無難なような気がする。
もう少し調査が必要だな。