私はCLLocationCoordinate2D
を比較する方法が必要ですが、==
を使ってみるとうまくいかないでしょう。誰かが彼らを比較する最善の方法で私を助けてくれますか?2つのCLLocationCoordinate2Dをどのように比較できますか? (iPhone/iPad)
答えて
どちらの任意の構造体タイプの2つのインスタンスを比較するための一般的なアプローチ:
memcmp(&cllc2d1, &second_cllc2d, sizeof(CLLocationCoordinate2D))
または
cllc2d1.latitude == cllc2d2.latitude && cllc2d1.longitude == cllc2d2.longitude
が動作するはずです、あなたは本当に彼らが正確同じだことを確認したい場合。 epsilon
は、あなたが受け入れるようにしたいエラーのどんなレベルである
fabs(cllc2d1.latitude - cllc2d2.latitude) <= epsilon && fabs(cllc2d1.longitude - cllc2d2.longitude) <= epsilon
:しかし、緯度と経度がダブルスのように定義されていることを考えると、あなたは本当に「十分に近い」の比較をしたいかもしれません。
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
}
はい、これは、コードが遅いですが、これはあなたが浮動小数点数のように完璧ではない精度に起因する問題を回避するために役立つかもしれません。
これらすべての答えに小さな追加として、それはプリプロセッサとして定義された比較が定義持っていることは非常に便利です:
#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");
}
また、インラインメソッドを使用することもできますプリプロセッサとは違います。
浮動小数点数を '=='と比較しないでください。人々が 'イプシロン 'を使う答えを見てください。 – DanSkeel
@DanSkeel私の編集された答えを見てください。場合によっては、正確な座標を比較したいユースケースがあります。例えば。座標のソースが場所データベースであり、それらを比較したい場合のみです。それで、等しい比較のための範囲の必要はありません。だからあなたはもう一度投票を考えているかもしれません。 – Klaas
あなたは私のポイントを得ていません。 '1!= 0.99999999999'の場合を想像してみてください...浮動小数点比較の一般的なルールです。 [について読む](http://floating-point-gui.de/errors/comparison/)それ。このルールはコンピュータとして古いものです。 – DanSkeel
CLLocationクラスのdistanceFromLocation:メソッドを使用できます。戻り値はCLLocationDistanceであり、実際は2倍です。
- (CLLocationDistance)distanceFromLocation:(const CLLocation *)location
あなたはかなりCoreLocationから来るように感じている機能を定義することができます。
BOOL CLLocationCoordinateEqual(CLLocationCoordinate2D coordinate1, CLLocationCoordinate2D coordinate2) { return (fabs(coordinate1.latitude - coordinate2.latitude) <= DBL_EPSILON && fabs(coordinate1.longitude - coordinate2.longitude) <= DBL_EPSILON); }
これは最も保守的な解決策であるため、これを上書きします。IMO – mvanallen
良い解決策。ここでは、新しいハチのための完全な方法です。 - (BOOL)compairLastSavedCoordinates:(CLLocationCoordinate2D)coordinate1 withNewCoordinates :(CLLocationCoordinate2D)coordinate2 { return(coordinate1.latitude == coordinate2.latitude)&&(coordinate1.longitude == coordinate2.longitude); } – iLearner
浮動小数点数を比較しないでください!あなたがそうした場合、それは信頼できません。実際には、異なるソースから生成された実際の場所からのほとんどの比較は、お互いにかなり近く、「等しい」とみなされても、「偽」を返します。 – CouchDeveloper
あなたがこの機能に+ (NSValue *)valueWithMKCoordinate:(CLLocationCoordinate2D)coordinate
を使用してNSValue
にCLLocationCoordinate
をラップそして比較することisEqualToValue
を使用することができます。 isEqualToValue
関数のアップルドキュメントから
引用:
NSValueクラスは、等価を決定するために各値オブジェクトの種類と内容を比較します。
参考:NSValue
のアップルのドキュメント私たちは、NSStringのに緯度と経度を変換してから比較する文字列を行うことができます。
+ (BOOL)isEqualWithCoordinate:(CLLocationCoordinate2D)location1 withAnotherCoordinate:(CLLocationCoordinate2D)location2{
NSString *locationString1 = [NSString stringWithFormat:@"%g, %g", location1.latitude, location1.longitude];
NSString *locationString2 = [NSString stringWithFormat:@"%g, %g", location2.latitude, location2.longitude];
if ([locationString1 isEqualToString:locationString2]) {
return YES;
}else{
return NO;
}
}
% gは4桁の10進数を切り捨てる変換するからです。
スウィフト拡張子:
import MapKit
extension CLLocationCoordinate2D: Equatable {}
public func ==(lhs: CLLocationCoordinate2D, rhs: CLLocationCoordinate2D) -> Bool {
return (lhs.latitude == rhs.latitude && lhs.longitude == rhs.longitude)
}
[Xcodeの7.3.1、スウィフト2.2のように試験] [そして、もちろん、まだ浮動小数点値を比較する固有の危険性を持っているので、あなたがしたい場合があります以前の回答で述べたようにepsilon
を使用することを検討してください]
Swift 3では、DBL_EPSILON
は推奨されていません。 Double.ulpOfOne
を使用してください。
extension CLLocationCoordinate2D {
func isEqual(_ coord: CLLocationCoordinate2D) -> Bool {
return (fabs(self.latitude - coord.latitude) < .ulpOfOne) && (fabs(self.longitude - coord.longitude) < .ulpOfOne)
}
}
- 1. 2つのSQLiteファイルをどのように比較できますか?
- 2. 2つのiOSローカルWebサーバーをどのように比較できますか?
- 3. 、どのように2つのcsvファイルを比較する?
- 4. 2つのオブジェクトをフィールドでどのように比較するのですか?
- 5. 2つのハッシュセットの内容をどのように比較しますか?
- 6. どのように2つのデータテーブルを比較するのですか
- 7. UIPickerViewでどのように比較できますか?
- 8. 2つの文字列はどのように比較されますか?
- 9. どのように2つのテーブルの値を比較することができますか?
- 10. 2つのXMLファイルの違いをどのように比較できますか?
- 11. C++で2つの構造を比較できますか?
- 12. どのようにして迅速な2つの一般的なリンクリストを比較できますか?
- 13. ARMのsssemblyで前のcmpと比較してbne分岐をどのように比較できますか?
- 14. このように2つの文字列を比較するにはどうすればよいですか?
- 15. Array.findとforeachなどのイテレータをどのように比較できますか?
- 16. どのように私はPHPで2つの配列を比較することができます
- 17. SAS。どのように2つの比較グループの2つのROC曲線を同じプロットにするか?
- 18. 文字列の比較。どのようにstd :: wstringと文字列を比較できますか? WRT strcmp
- 19. 2回のnunitテストの結果をどのように比較しますか?
- 20. C#Viewbagの値をJavascriptでどのように比較できますか?
- 21. gsonと2つのjsonファイルを比較できませんか?
- 22. スキーム:2つのリストが等しいかどうか比較/チェック
- 23. Excel VBAで2つのワークブックをテキストファイルと比較する比較
- 24. どのように変数をPowerShellの配列と比較できますか?
- 25. (Jagged Arrays、Arrays、ArrayList)のパフォーマンスをどのように比較できますか?
- 26. Eigenで2つのテンソルが等しいかどうか比較するには?
- 27. 2つのUIImagesを比較します
- 28. 2つのエンティティを比較します
- 29. 2つのJTextFieldを比較します
- 30. 2つのNSStringsを比較します
構造体がメンバー間でバイトなしでパックされていると仮定しているため、最初はスケッチと見なされることがあります。 – joerick
良い点。作成/割り当て時に構造体全体をゼロにすると、memcmpのアプローチはパックされていない構造体であっても安全ですが、そうでない場合は慎重に使用してください。 – Glenn
@Glennは、ファブや
Shmidt