从浮点 lat long 创建的 CLLocation 显示更高的精度

Posted

技术标签:

【中文标题】从浮点 lat long 创建的 CLLocation 显示更高的精度【英文标题】:CLLocation created from floating point lat long showing higher precision 【发布时间】:2015-01-05 13:12:17 【问题描述】:

我需要获取 CLLocation 对象,其纬度和经度的精度仅为 6 点。但是,当我从浮点值创建一个 CLLocation 对象时,我得到的 CLLocation 对象的纬度和经度精度更高(比如最多 10 个点)。

我拥有的是 纬度 = 10.268408,经度 = 76.353965

我使用以下代码创建具有上述坐标的 CLLocation 对象。

CLLocation *createdLocation = [[CLLocation alloc]initWithLatitude:latitude
                                                longitude:longitude];

创建上述对象后,我打印了 createdLocation.coordinate 的值。 我得到的是 (纬度 = 10.268408101671659,经度 = 76.353965649742264)

那么 ios 如何以及为什么自动将精度从我的 6 点精度完成到 15?

更新

现在我将纬度和经度插入到核心数据数据库中。然后我从数据库中获取经纬度,然后创建了一个 CLLocation 对象。现在精度如我所愿(如下所示)

纬度 = 10.268408,经度 = 76.353965

当我写信给 DB 时发生了什么不同?为什么它不适用于 6 点精度的浮点变量?

【问题讨论】:

CLLocations 将值存储为双精度值。因为 float 和 double 不是“连续的”,因为我们从数字中使用它们,它们存储“谨慎的步骤”。所以我的猜测是你会看到下一个匹配的双精度浮点数。例如,您可能会看到关于 float/double ***.com/questions/5098558/float-vs-double-precision 【参考方案1】:

正如沃尔克所说,位置管理器使用双精度来存储纬度/经度的坐标。

计算机使用 IEEE 二进制浮点,它实际上没有给定的小数位数。

如果你使用这样的代码:

double a = .1;
NSLog(@"a = %.9f", a);

你会看到像

这样的值
.099999998 

这是因为大多数十进制分数在二进制表示法中没有精确的等价物。 (就像 1/3 在十进制中没有精确的等价物一样,它的输出为 .3333333333333333333333 repeating)

如果要将值转换为具有固定小数位数的十进制值,可以将其转换为字符串,或者可能是 NSDecimalNumber。

(NSDecimalNumber 是将十进制值表示为一组精确的十进制数字的另一种方式,没有二进制到十进制的转换问题。)

要转换为字符串,您需要执行以下操作:

CLLocationCoordinate2D aCoordinate;
NSString *latString = [NSString stringWithFormat: @"%.6f", aCoordinate.latitude);

我没有使用足够的 NSDecimalNumber 来键入一个使用它的示例,而无需进行一些研究。我把它留给你作为练习。

【讨论】:

另请注意,尽管结果中有所有位,但您的实际精度永远不会那么好。站在我们办公室外面,我很少能得到比 +/- 70 米更好的结果。请参阅gis.stackexchange.com/questions/8650/…,了解有关 GPS 精度和准确性的精彩讨论。 好点。 iOS 设备中的 GPS 不是很好。我通常得到的最佳值是 +/- 15 米。 可以按照上述方法检索具有所需精度的坐标。但我的问题是不同的。当我使用精度较低的浮点值为 CLLocation 设置坐标时,我最终会得到精度更高的坐标。 @krishnanunni 并回答说,由于数字的存储方式,您无法避免这种情况-您可能想解释为什么这是一个问题,或者为什么您在开始时不使用双打来避免这种转换和精度“错误” 二进制浮点数没有任何小数精度的概念,就像分数没有任何小数精度一样。 1/3的小数精度是多少?这没有意义。二进制(以 2 为底)浮点数的十进制(以 10 为底)精度也没有。如果要保存具有特定小数位数的数字,请将其保存为字符串或 NSDecimalNumber。

以上是关于从浮点 lat long 创建的 CLLocation 显示更高的精度的主要内容,如果未能解决你的问题,请参考以下文章

从 1600 万+ lat/long 获取 FIPS 块代码

从 Json URL 读取 Lan ,Long 并将 lat 和 long 分配给 map 的标记?

PHP 地理编码,从地址到坐标lat long

Blob 存储上的 Azure 触发器,从图像 (Blob) 中提取 EXIF (lat/long/direction...) 数据

使用 Google 从 python 中查找 Lat/Long

GoogleMaps 和 GeoIP:从 IP 获取 Lat、Long 并绘制地图?