飴屋

GMAPS/2座標間の距離測定

今回はGoogle Maps本体を離れて二点間の距離を計測する関数を作ってみたいと思います。

中学校ぐらいの数学でXY座標軸上の二点間の距離を計算する方法を学習したかと思います。確かピタゴラスの定理の話も関係していますね。直角三角形の斜辺の長さの二乗は、他の二辺の長さのそれぞれの二乗の和に等しい、という定理を使って計算するものでした。すなわち、点A(ax,ay)と点B(bx,by)の距離の二乗は以下の式によって表されます。

(ax-bx)*(ax-bx)+(ay-by)*(ay-by)

さて、Google Mapsにおいても同様に緯度と経度をXY座標に置き換えて計算することができなくもありません。経度1度あたりのメートル数と緯度1度あたりのメートル数がわかれば、それを掛け算して二点間の距離をメートル単位で計算できます。
東京近辺では、緯度1度が110880メートル、経度1度が90360メートルだそうなので、
以下の関数に二地点の緯度経度情報を引数で渡してやると、擬似的に二点間の
距離を得ることができます。

//緯度経度1度のメートル数を定数に
var METER_PER_LAT = 110880;
var METER_PER_LNG = 90360;
//a,bともにGLatLngのインスタンス
function measure(a,b) {
lt = Math.pow((a.lat()-b.lat())*METER_PER_LAT,2);
lg = Math.pow((a.lng()-b.lng())*METER_PER_LNG,2);
return Math.sqrt(lt+lg);
}

しかし、この計算は東京周辺のごく近い範囲の距離の計算にしか役にたちません。
理由は明白で地球はメルカトル図法でかかれた地図のような平面ではなく、
球体だからです。メルカトル図法では極地方に近づくほどに地形が歪みますので、
正確な距離を算出するには、他の方法が必要になります。

また、地球は自転の遠心力で正球ではなく、赤道部分が膨らんだ楕円球の形を
しているため、地理学上で使われる「地理緯度」を「地心緯度」に変換して
計算してやる必要があります。

地理緯度
「地表の一地点を通るその接面の垂線」と「赤道を含む平面」が作る角度
地心緯度
「地球の中心点と地表の一地点を結んだ線」と「赤道を含む平面」が作る角度

ややこしいですね。まずは地理緯度を地心緯度に変換する関数です。
引数にはGLatLng.lat()を渡してあげてください。
返り値はラジアン角になってます。

PI_PER_ANGLE = Math.PI/180;
function convertLat(a) {
a = 3.1415926535*PI_PER_ANGLE/180;
a = a*PI_PER_ANGLE-(0.1925*PI_PER_ANGLE)*Math.sin(2*a*PI_PER_ANGLE);
return a/PI_PER_ANGLE;
}

次に二点間の距離を計測する関数です。球面三角法というものを使うそうです。

//a,bともにGLatLngのインスタンス
PI_PER_ANGLE = Math.PI/180;
function measure2(a,b) {
//地心緯度やラジアン角に直す
alat = convertLat(a.lat());
alng = a.lng()*PI_PER_ANGLE;
blat = convertLat(b.lat());
blng = b.lng()*PI_PER_ANGLE;
c=Math.cos(alat)*Math.cos(blat)*Math.cos(alng-blng)+Math.sin(alat)*Math.sin(blat);
s=Math.sqrt(1-Math.pow(c,2));
t=s/c;
d=6369*Math.atan(t);
}

*あんまり、詳しくない分野なので間違っていたらごめんなさい。

Last-Modified