2 つの を比較する方法が必要ですが、CLLocationCoordinate2D
使用しようとするとうまくいき==
ません。誰かがそれらを比較する最良の方法で私を助けてくれませんか?
12 に答える
特定の構造体型の 2 つのインスタンスを比較するための一般的なアプローチ:
memcmp(&cllc2d1, &second_cllc2d, sizeof(CLLocationCoordinate2D))
また
cllc2d1.latitude == cllc2d2.latitude && cllc2d1.longitude == cllc2d2.longitude
それらが正確に等しいことを本当に確認したい場合は、うまくいくはずです。ただし、緯度と経度が double として定義されていることを考えると、「十分に近い」比較を行いたい場合があります。
fabs(cllc2d1.latitude - cllc2d2.latitude) <= epsilon && fabs(cllc2d1.longitude - cllc2d2.longitude) <= epsilon
whereepsilon
は、受け入れたいエラーのレベルです。
これらすべての回答への小さな追加として、比較をプリプロセッサ定義として定義すると非常に便利です。
#define CLCOORDINATES_EQUAL( coord1, coord2 ) (coord1.latitude == coord2.latitude && coord1.longitude == coord2.longitude)
またはイプシロンで:
#define CLCOORDINATE_EPSILON 0.005f
#define CLCOORDINATES_EQUAL2( coord1, coord2 ) (fabs(coord1.latitude - coord2.latitude) < CLCOORDINATE_EPSILON && fabs(coord1.longitude - coord2.longitude) < CLCOORDINATE_EPSILON)
これにより、次のように比較できます。
CLLocationCoordinate2D resultingCoordinate = ... a method call ...;
CLLocationCoordinate2D expectedCoordinate = CLLocationCoordinate2DMake(48.11, 11.12);
if(CLCOORDINATES_EQUAL( resultingCoordinate, expectedCoordinate)) {
NSLog(@"equal");
} else {
NSLog(@"not equal");
}
プリプロセッサが気に入らない場合は、別の方法としてインライン メソッドを使用することもできます。
CLLocationクラスの distanceFromLocation: メソッドを使用できます。戻り値はCLLocationDistanceで、実際には double です。
- (CLLocationDistance)distanceFromLocation:(const CLLocation *)location
CLLocationCoordinate2D c1, c2;
if (c1.latitude == c2.latitude && c1.longitude == c2.longitude)
{
// ...
}
冗談じゃないよ。CLLocationCoordinate2DはC構造体であり、個々のメンバーを比較する以外に、C構造体を比較する簡単な方法はありません。
CLLocationCoordinate2D
はC構造体であるため、そのフィールドを比較する必要があります。
CLLocationCoordinate2D coord1, coord2;
if (coord1.latitude == coord2.latitude && coord1.longitude == coord2.longitude) {
// coordinates are equal
}
CLLocationCoordinate2D
したがって、フィールドはdouble
他の浮動小数点比較と同じ問題が発生する可能性があることに注意してください。したがって、少し値を丸めることをお勧めします。例:
CLLocationCoordinate2D coord1, coord2;
if (round(coord1.latitude * 1000.0) == round(coord2.latitude * 1000.0)
&& round(coord1.longitude * 1000.0) == round(coord2.longitude * 1000.0)) {
// coordinates are equal
}
はい、これはコードが遅くなりますが、浮動小数点数の精度がそれほど完全ではないために発生する問題を回避するのに役立つ場合があります。