2010年10月5日

 最近blogやってないなーとか思ったので思いつきでメモ代わりにするテスト。
 今回はGPSで位置情報とかもにょるときによくやるアレ。なんかがんばって考えたけどきっと車輪の再発明。
 著作権もへったくれもない内容とコードなのでまるパクリOK。なんかCocoa的なクラス名があったりObjective-C的な文法の部分があるのは適当になんとかしてね☆


・二点間の緯度から距離への変換
 ぼくのちきゅうはまんまるです。
 ぼくのちきゅうはえんしゅうよんまんめーとるちょうどです。
 都合でunsigned intにしてるけどdoubleのままとかいっそCLLocationDegreeとかで良い。

/**
 *  @brief  緯度差からメートル
 *  @param  CLLocation* location1 地点1
 *  @param  CLLocation* location2 地点2
 *  @par    詳細
 *          地点1と地点2の差を "角度" とおいた時以下の式でメートル単位の距離が求められる
 *          ここでは地球を球と仮定して求めている
 *          距離=赤道円周*(角度/360)
 */
unsigned int latitudeToMeter(CLLocation* location1, CLLocation* location2)
{
    double degree = fabs(location1.coordinate.latitude - location2.coordinate.latitude);
    return (unsigned int)(40000000.0 * (degree / 360.0));
}

?

・二点間の経度から距離への変換
 緯度は適当にもらったのの平均で計算。緯度差大きいときとかは考えない。いっそ地球が平面ならいいのに。

/**
 *  @brief  経度差からメートル
 *  @param  CLLocation* location1 地点1
 *  @param  CLLocation* location2 地点2
 *  @par    詳細
 *          地点1と地点2の差を "角度" とおいた時以下の式でメートル単位の距離が求められる
 *          ただし緯線に沿う方向の距離は緯度に応じて円周の距離が変わるため、事前に円周を求める
 *          円周=cos((緯度/180)*π)*赤道半径
 *          距離=円周*(角度/360)
 */
unsigned int longitudeToMeter(CLLocation* location1, CLLocation* location2)
{
    double latitude = location1.coordinate.latitude + location2.coordinate.latitude / 2;
    double r  = 40000000 / ( 2 * M_PI );              // 半径
    double r2 = cos( ( latitude / 180 ) * M_PI ) * r; // 目的の緯度の半径を求める
    double degree = fabs(location1.coordinate.longitude - location2.coordinate.longitude);
    return (unsigned int)(r2 * (degree / 360.0));
}

posted @ 20:01 | Feedback (813)