3

Google マップからいくつかの GPS 座標を取得し、Objective C を使用してそれらの間の距離を見つける必要があります。数式を実装しましたが、大きな結果が得られます。

Google マップの値を Google Earth とインターネット上のジオコーディング サービスに戻してテストしたところ、すべてがチェックアウトされました。コサインの法則では、座標を渡す前に何らかの変換を行う必要があるのではないかと疑い始めています。

私は Haversine 式の同様の実装を行いましたが、これも大きな結果をもたらしました。次に、デバッグが簡単で、非常に高い精度は必要ないため、コサインに切り替えました。

誰かがこれに少し光を当てるか、コードを使用できることを願っています:)

- (CGFloat) calculateDistanceBetweenPoints:(CGPoint) origin andDestination:(CGPoint) destination {

//To convert kilometers to miles, divide by 1.609
// x = latitude 
// y = longitude

/* example:
 Dubai      : 25.248665, 55.352917 
 Amsterdam  : 52.309071, 4.763385
 Approx dist: 5,182.62 KM
 Calc. dist : 8,253.33
 */

CGFloat toRad           =   (M_PI / 180);
CGFloat R               =   6371.0f; //earth's mean radius in Km

CGFloat sinePart        =   sinf( origin.x * toRad ) * sinf( destination.x * toRad );
CGFloat cosinePart      =   cosf( origin.x * toRad ) * cosf( destination.x * toRad );
CGFloat deltaCosinePart =   cosf( ( destination.y - origin.y ) * toRad );

CGFloat delta           =   acosf( sinePart + cosinePart * deltaCosinePart) * R;

return delta;
}

ここで参照されているリンクから計算された上記:stackoverflowの質問

4

5 に答える 5

4

次のような質問が役立つ可能性があります。

2 つの位置が与えられた場合、A をアムステルダムに、B をドバイに、C を北極に、辺 a = 90° - ϕ Ams、b = 90° - ϕ Dub、角度 C = Δλ = λの球面三角形のコーナーを作成します。ダブ-ラムズ. 必要な答えは辺 c です。

SO 389211 に対する私の回答の資料を使用します。

(これは根本的に修正された答えです - 私の以前の試みは間違った球面三角形を使っていたので、間違った答えを得ました。 )


最悪の ASCII アート:

                   + C (North Pole)
                  /|
                b/ |
                /  |
(Amsterdam) A  +   | a
                \  |
                c\ |
                  \|
                   + B (Dubai)

球面三角形の基本的な余弦法則は次のとおりです。

cos c = cos a . cos b + sin a . sin b . cos C

cos (90º - x) = sin x および sin (90º - x) = cos x であることに注意すると、次のように書くことができます。

cos c = sin ϕ Ams . sin ϕ Dub + cos ϕ Ams . cos φダブ。cosΔλ

ラジアン単位の角度 c は、地球の半径を掛けて距離に変換されます。


これをデータに適用します。

Dubai:φ Dub = 25.248665°N、λ Dub = 55.352917°E
Amsterdam: φ Ams = 52.309071°N、λ Ams = 4.763385°E

Δλ = 50.589532°

三角法の小数点第 6 位までの作業:

cos c = 0.426548 × 0.791320 + 0.904465 × 0.611402 × 0.634872
      = 0.337536            + 0.351079
      = 0.688615

出典:

c = 46.479426°
  =  0.811219 radians

これに地球の公称半径として 6371 km を掛けると、

c = 5168 km

したがって、R = 6371 km の場合、距離は 0.811219 × 6371 = 5168 km (4 平方フィートまで) です。

TrueKnowledgeによると、約 5155 km のはずです。使用した位置データは、指定した値と同等であり、ウィキペディアは指定した半径を確認しています。これはかなり近いです - 同じ座標で計算をやり直し、計算の数字を増やすと、より良い答えが得られますが、これに近いです。


于 2010-01-13T02:01:18.703 に答える
3

で提供されている方法を使用することを検討しましたかCLLocation:

- (CLLocationDistance)getDistanceFrom:(const CLLocation *)location?

于 2010-01-13T00:33:09.400 に答える
2

コードは問題ないかもしれません。サンプル データ (小数点以下の桁数を差し引いたもの) で実行すると、5168.3584 が返されます。

于 2010-01-13T01:50:21.167 に答える
0

私が質問を正しく理解していれば、あなたは地球の曲率を説明していません. 余弦法則は、球ではなく平面で機能します。例: 北極と南極は、飛行している場合は ~20,000 km 離れていますが、トンネルを掘った場合は ~6000 km しか離れていません;)

よろしく、 アリ

于 2010-01-13T00:50:17.870 に答える