3

プロットしたGPS座標の方向に単純な矢印を向けるアプリを作成しています。つまり、現在の場所latとlongについて話しているので、lat1、lon1が現在の場所です...次に、それらをlatとlongの静的座標と比較してlat2、lon2と呼びます。

私は何時間も研究とテストに費やしましたが、同じ問題を抱え続けています。それは非常に悪化しています。目的地に向かって運転を開始するとすぐに、iPhoneに組み込まれているGPS/コンパスを使用しているときに矢印がすべて打ち砕かれます。矢印が必要な場所の完全に反対側に表示され、右側にぶら下がっている場合があります。

これが私が実行している現在のコードです

cpLocLat = 43.026629;

cpLocLon = -78.867188;

これらは、フロート値と、ドライブしたい場所の座標です。

float lat1 = self.locManager.location.coordinate.latitude;
float lat2 = cpLocLat;
float lon1 = self.locManager.location.coordinate.longitude;
float lon2 = cpLocLon;

float heading = atan2(sin(lon2 - lon1) * cos(lat2), cos(lat1) * sin(lat2) - sin(lat1) * cos(lat2) * cos(lon2 - lon1));

heading = RADIANS_TO_DEGREES(heading);

if (heading < 0) {
    heading = heading + 360;
}

locationManagerdidUpdateToLocationdelagateが呼び出されるたびにこの関数を使用します。その情報を取得すると、それはlocationManagerのdidUpdateHeadingdelagteで次のように使用されます。

CGAffineTransform where  = CGAffineTransformMakeRotation(degreesToRadians((degrees - newHeading.magneticHeading)));

[self.compassContainer2 setTransform:where];

これがdegressToRadiansマクロです

#define degreesToRadians(x) (M_PI * x / 180.0)

したがって、このコードを実行するたびに、それは叙事詩的に失敗し、私を狂わせています!

ところで-私は参照のために次のURLを使用しました

http://www.shawngrimes.me/2011/07/calculating-heading-with-corelocation/

北だけでなく、実際の座標位置を指すためにコンパスを使用する

コンパスを使用して場所を指す

4

1 に答える 1

1

私の知る限り、Haversineの式による初期ベアリングの式は次のとおりです。

θ=atan2(sin(Δlong).cos(lat2)、cos(lat1).sin(lat2)− sin(lat1).cos(lat2).cos(Δlong))

これはまさにあなたが使用したもののようです。エントリによると、man次の2つの引数の逆の順序を使用する必要がある場合がありますatan2

ATAN2(3)                 BSD Library Functions Manual                 ATAN2(3)

NAME
     atan2 -- arc tangent function of two variables

SYNOPSIS
     ....
     float
     atan2f(float y, float x);

だからy前に来るx。多分それはエラーです。
また、座標デルタ(lat2-lat1など)がラジアンであることを確認してください。

于 2012-06-15T08:50:29.160 に答える