4

あなたの GPS 位置を正常に検出するアプリがありますが、その GPS と GPS 位置のリストを比較できるようにする必要があります。両方が同じであれば、ボーナスが得られます。

私はそれが機能していると思っていましたが、そうではないようです。

あなたがいる場所として「newLocation」があります。問題は、newLocation の経度データと緯度データを分離できる必要があることだと思います。

これまでのところ、これを試しました:

NSString *latitudeVar = [[NSString alloc] initWithFormat:@"%g°", newLocation.coordinate.latitude];

NSString *longitudeVar = [[NSString alloc] initWithFormat:@"%g°", newLocation.coordinate.longitude];

GPS ロケーションのリストの例:

location:(CLLocation*)newLocation;

CLLocationCoordinate2D bonusOne;    

bonusOne.latitude = 37.331689;
bonusOne.longitude = -122.030731;

その後

if (latitudeVar == bonusOne.latitude && longitudeVar == bonusOne.longitude) {
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"infinite loop firday" message:@"infloop" delegate:nil cancelButtonTitle:@"Stinky" otherButtonTitles:nil ];    

    [alert show];
    [alert release];
}

これにより、「invalid operands to binary == have strut NSstring and CLlocationDegrees」というエラーが発生します

何かご意見は?

4

2 に答える 2

20

一般に、浮動小数点数を直接比較する場合は注意が必要です。それらの定義方法により、内部値は初期化したとおりではない場合があります。つまり、それらが同一になることはめったにありません。代わりに、たとえば、それらの差が特定のしきい値を下回っているかどうかを確認する必要があります。

if(fabs(latitude1 - latitude2) <= 0.000001)
...

別のオプションとして、距離を計算して目的の場所から人までの距離を確認することもできます。これは、GPS からの座標が正確ではないという事実も考慮に入れることができますが、良好な条件下でも最大 10 メートルほど異なる可能性があります。

CLLocation *loc1 = [[CLLocation alloc] initWithLatitude:lat1 longitude:lon1];
double distance = [loc1 getDistanceFrom:position2];
if(distance <= 10)
...

クロース

于 2010-03-19T21:57:55.323 に答える
0

BonusOne.latitude と newLocation.coordinate.latitude を直接比較しないのはなぜですか? 浮動小数点数を文字列に変換してから、それを浮動小数点数と比較しているため、そのエラーが発生しています。

また、GPS ユニットが少し飛び回る傾向があることを考えると、おそらく次のいずれかを行います。

a: BonusOne と newLocation.coordinate の間の距離を測定します (三角形の斜辺にはピタゴラスの定理を使用します。この小さな縮尺ではそれよりも正確な理由はありません。うるさい場合は、マップ キットの距離を使用してください)。測定機能)を指定し、一定量未満を指定します。

b: 緯度と経度を特定の桁数に丸めて、たとえば 100 フィート以内に収まるようにします。

どちらも、2 つの浮動小数点数が等しいことに依存するよりもうまく機能します。これは、一般的にソフトウェアで問題があり、特に測定しているデバイスのノイズ レベルが高い場合に問題になります。

于 2010-03-19T21:50:04.470 に答える