首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何比较CLLocationCoordinate2D

如何比较CLLocationCoordinate2D
EN

Stack Overflow用户
提问于 2012-04-18 05:04:47
回答 12查看 25.1K关注 0票数 50

我需要一种比较两个CLLocationCoordinate2D的方法,但是当我尝试使用==时,它不起作用。有人能帮我找出比较它们的最佳方法吗?

EN

回答 12

Stack Overflow用户

回答已采纳

发布于 2012-04-18 05:10:56

比较任何给定结构类型的两个实例的通用方法:

代码语言:javascript
复制
memcmp(&cllc2d1, &second_cllc2d, sizeof(CLLocationCoordinate2D))

代码语言:javascript
复制
cllc2d1.latitude == cllc2d2.latitude && cllc2d1.longitude == cllc2d2.longitude

如果你真的想确保它们是完全相等的,应该是可行的。但是,考虑到纬度和经度被定义为双精度,您可能真的希望进行“足够接近”的比较:

代码语言:javascript
复制
fabs(cllc2d1.latitude - cllc2d2.latitude) <= epsilon && fabs(cllc2d1.longitude - cllc2d2.longitude) <= epsilon

其中epsilon是您希望接受的任何级别的错误。

票数 59
EN

Stack Overflow用户

发布于 2012-08-17 06:02:32

作为对所有这些答案的一个小补充,将比较定义为预处理器定义是非常方便的:

代码语言:javascript
复制
#define CLCOORDINATES_EQUAL( coord1, coord2 ) (coord1.latitude == coord2.latitude && coord1.longitude == coord2.longitude)

或者使用epsilon:

代码语言:javascript
复制
#define CLCOORDINATE_EPSILON 0.005f
#define CLCOORDINATES_EQUAL2( coord1, coord2 ) (fabs(coord1.latitude - coord2.latitude) < CLCOORDINATE_EPSILON && fabs(coord1.longitude - coord2.longitude) < CLCOORDINATE_EPSILON)

这使您可以进行如下比较:

代码语言:javascript
复制
CLLocationCoordinate2D resultingCoordinate = ... a method call ...;
CLLocationCoordinate2D expectedCoordinate = CLLocationCoordinate2DMake(48.11, 11.12);

if(CLCOORDINATES_EQUAL( resultingCoordinate, expectedCoordinate)) {
    NSLog(@"equal");
} else {
    NSLog(@"not equal");
}

另一种选择是使用内联方法,如果您不喜欢预处理器的话。

票数 34
EN

Stack Overflow用户

发布于 2016-07-26 06:04:26

Swift扩展:

代码语言:javascript
复制
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、Swift 2.2开始测试

票数 23
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10199133

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档