1

私のアプリでは、緯度と経度を持つ 2 点間の距離を計算したいと考えています。私はこのウェブサイト(http://andrew.hedges.name/experiments/haversine/)からそれを計算するために使用される方程式を取得することができました。ここに方程式があります:

dlon = lon2 - lon1 
dlat = lat2 - lat1 
a = (sin(dlat/2))^2 + cos(lat1) * cos(lat2) * (sin(dlon/2))^2 
c = 2 * atan2( sqrt(a), sqrt(1-a) ) 
d = R * c (where R is the radius of the Earth

だから私はそれらをコードとして翻訳します、ここにあります:

float distanceLongitude = lon2 - lon1;
float distanceLatitude = lat2 - lat1;
float a = powf(sinf((distanceLatitude/2)), 2) + cosf(lat1) * cosf(lat2) * powf((sinf(distanceLongitude/2)),2);
float c = 2 * atan2f(sqrtf(a), sqrtf(1-a));
float d = 6373 * c; //6373 radius of earth

次の座標でコードを試してみました: lat1 = 33.854025 lon1 = 35.506923 lat2 = 33.856835 lon2 = 35.506324

ウェブサイトによると、結果は 0.317 km または 0.197 マイルです。ただし、私のコードの出力は 18.143757 です。どうすればそれを修正できますか? (私が話していることを知るために、ウェブサイトのコンバーターをチェックしてください。

注: d は最終結果である必要があります。

4

3 に答える 3

3

sinfおよびcosfルーチンへの入力はラジアンです。角度を呼び出す前に、角度を度からラジアンに変換する必要があります。これを行うには、角度に π/180º を掛けます。

于 2013-07-26T12:26:54.087 に答える
2

緯度と経度は (ほとんどの場合) 52.09878 や 10.897934 などの 10 進数で表されます。しかし、sinf などの関数は放射を使用します。

distanceLongitudeandをラジアンに変換してdistanceLatitudeから、a = ... を続けます。

radiantLongitudeDistance = degreeLongitudeDistance * M_PI / 180.0 
于 2013-07-26T12:27:21.110 に答える