【问题标题】:iPhone Mapkit: Annotation coordinate inconsistances when saved in core dataiPhone Mapkit:保存在核心数据中时的注释坐标不一致
【发布时间】:2011-02-24 12:49:22
【问题描述】:

这是我的情况。出于某种原因,我保存在核心数据中的注释坐标似乎与我可以从地图上的大头针位置检索到的坐标不匹配。

因此,我使用以下方式将数据保存到核心数据中:

[ride setLatitude:[NSNumber numberWithDouble:newRidePlacemark.coordinate.latitude]];
[ride setLongitude:[NSNumber numberWithDouble:newRidePlacemark.coordinate.longitude]];

我非常肯定这是保存 long 和 lat 的正确格式。但是,当我将核心数据中的坐标与放置的 pin 的坐标进行比较时,问题就出现了。我使用方法和日志来查看引脚的位置:

- (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control

NSLog(@"%f, %f", view.annotation.coordinate.latitude, view.annotation.coordinate.longitude);

这给了我类似的东西:

38.119432, -122.225647

但是,与此同时,我正在检查该引脚的核心数据中保存的内容,并且我有:

38.11943249695161,-122.2256469726562

这种差异从何而来?为什么要缩短一个?这是一个真正的问题,因为当我尝试删除注释时,坐标不匹配,并且注释没有被删除。

我错过了什么吗?

【问题讨论】:

    标签: iphone core-data mapkit mkmapview mkannotation


    【解决方案1】:

    首先,您需要确保在整个数据流中一直使用double 类型(64 位)。如果数据暂时转换为float(32 位),您将失去精度。如果您将核心数据存储在后端的 plist 中,您实际上可能会将其临时转换为其他一些数据表示形式,例如文本字符串。

    其次,一般比较浮点数时应该小心。而不是比较值是否相等,您应该根据您想要的精度允许一些微小的差异,例如

    if(fabs(num1 - num2) <= 0.000001) {
    // numbers are considered equal
    }
    

    希望这会有所帮助。

    【讨论】:

    • 好的,看来我一直将这个数字保持为两倍。数字本身不会改变,只会缩短。
    • 听起来可能是您的核心数据架构没有存储为 64 位浮点,而是 32 位的问题。
    • 但我将它们保存为双精度,而不是整数 32 或 64。
    猜你喜欢
    • 1970-01-01
    • 2016-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多