2008-04-24

距離の計算

しばらくバタバタしていたのですが ようやく時間がとれたので、住所表示Todayプラグインの作成を再開します。
 
先週の段階ではGPSの座標と住所データの座標を比較するときに緯度・経度を別々比較していたために 時々全く違う住所が表示されるという問題が発生していました。
 
何かいい方法はないかと検索してみると、緯度経度の2点間の座標から距離を計算することができる「ヒュベニの距離計算式」というものを見つけました。
 
「旧日本測地系」という言葉が気になりますが、住所データ自体が大雑把なので多少のズレは問題ないでしょう。
計算式の意味はわかりませんが、リンク先のサイトを参考にして最も距離の近い住所を採用するようにしてみました。
(卯酉線(ぼうゆうせん)なんていう言葉もあまり馴染みがないですよね)
 
// 2点間の距離を計算
static DOUBLE GetDistance(DOUBLE dblSrcLatitude, DOUBLE dblSrcLongitude, 
                          DOUBLE dblDstLatitude, DOUBLE dblDstLongitude)
{
    DOUBLE  dblSrcLatiRad   = dblSrcLatitude    * M_PI / 180,   // 始点緯度(ラジアン)
            dblSrcLongiRad  = dblSrcLongitude   * M_PI / 180,   // 始点経度(ラジアン)
            dblDstLatiRad   = dblDstLatitude    * M_PI / 180,   // 終点緯度(ラジアン)
            dblDstLongiRad  = dblDstLongitude   * M_PI / 180,   // 終点経度(ラジアン)

            dblLatiAvarage  = 0.0,                              // 平均経度

            dblLatiDiff     = 0.0,                              // 緯度差
            dblLongiDiff    = 0.0,                              // 経度差

            dblMeriRad      = 0.0,                              // 子午線曲率半径
            dblVertRad      = 0.0,                              // 卯酉線曲率半径

            dblTemp0        = 0.0,
            dblTemp1        = 0.0,
            dblTemp2        = 0.0;

    dblLatiAvarage  = (dblSrcLatiRad  + dblDstLatiRad)  / 2.0;

    dblLatiDiff     = dblSrcLatiRad   - dblDstLatiRad;
    dblLongiDiff    = dblSrcLongiRad  - dblDstLongiRad;

    dblTemp0        = 1.0 - 0.006674 * (pow(sin(dblLatiAvarage), 2.0));
    dblMeriRad      = 6334834.0 / sqrt(pow(dblTemp0, 3.0));
    dblVertRad      = 6377397.0 / sqrt(dblTemp0);

    dblTemp1        = dblMeriRad * dblLatiDiff;
    dblTemp2        = dblVertRad * cos(dblLatiAvarage) * dblLongiDiff;

    return sqrt(pow(dblTemp1, 2.0) + pow(dblTemp2, 2.0));
}
 
見当違いの住所が表示されたりすることは無くなったのですが、いちいち距離を計算しているので若干時間がかかるようになってしまいました。
データを検索するタイミング等をもう少し検討する必要がありそうですね。
 

0 件のコメント: