Google Maps API を使って距離を測る2006年08月16日 01時10分01秒

まだまだプロトタイプのテスト版だがとりあえず公開してみる。最終的にはマーカーを地図の操作と連動した上にポリラインを設定できるようにしてそれなりに実用的な道のり計測プログラムにしようかと画策中。。。

Google Maps API には距離を求める関数が用意されておらず、緯度と経度が取得できるだけなので、測地学にかなりいい加減に基づいて自分で計算するようにしています。参考にしたのは以下のサイト。

算出方法としては、後者のサイトにあった地心緯度への換算方法が著しくアヤシイので、代わりに前者のサイトのここここを元に算出した係数を利用。該当するソース上での説明コメントを以下に転載しておこうかな。

    // 地理緯度から地心緯度を求める
    /*
        http://wwwsoc.nii.ac.jp/geod-soc/web-text/part2/2-1/2-1.html

        赤道半径: a
        極半径: b
        扁平率: f

        f = (a - b) / a
        a = 6378km
        f = 1/300

        1/300 = (6378 - b) / 6378
        6378/300 = 6378 - b
        b = 6378 - 6378/300 = 6356.74 km


        http://wwwsoc.nii.ac.jp/geod-soc/web-text/part2/2-1/2-1-6.html

        地理緯度: ψ
        地心緯度: φ

        tan φ = (b^2 / a^2) * tan ψ
        φ = arctan( (b^2 / a^2) * tan ψ)
           = arctan(0.9933444444444444 * tan ψ)
     */

で、距離の算出については球面三角法の公式を利用。正式な公式は前者サイトのここにある通りなのですが、実際には後者のサイトに書かれていた公式をそのまま利用しています。この公式の正当性は、三角形の 3 つ目の点を北極点とした場合、余弦定理から導き出すことができます。これも該当するコメントを以下に転載。

    // 球面三角法により、2点間の地心角度を求める
    /*
        http://wwwsoc.nii.ac.jp/geod-soc/web-text/part4/4-2/4-2.html
        http://www2.neweb.ne.jp/wd/nobuaki/New_Homepage/okinawa703.htm

        cos a = cos b * cos c + sin b * sin c * cos A
              = cos(90 - lat1) * cos(90 - abs(lat2)) +
                sin(90 - lat1) * sin(90 - lat2) * cos (lng2 - lng1)
              = sin(lat1) * sin(lat2) +
                cos(lat1) * cos(lat2) * cos(lng2 - lng1)
     */

で、実際に使ってみると、マップの左下にある尺の表示に対してびみょーな誤差があることが分かったりします (^_^;;; 。地心緯度を求めるのに、地球が扁平な回転楕円体であることを前提にしているのに、球体上の距離を求める球面三角法を用いているという矛盾や、そもそも実数の精度は足りているのかなどといった問題を抱えているわけで、ある程度の誤差はそれなりに覚悟はしているのですが。。。

どーでもいーけど IE で動かすの大変だった。。。_| ̄|○ どーやら IE は背景が透明で中身が空っぽな <div> 要素を z-index つかって上に重ねてもレイヤーとして重なっているものとしては扱ってくれないというバグがあるようで、仕方が無いので背景色 1ピクセルだけの GIF 画像をわざわざ作って背景として敷き詰めてやっとまともに動かすことができました。。。それ以前にレイヤーを提供する API が Google Maps API に用意されているんだからそれを使えって話だったりするわけですが (^_^;