我一直在测试CoreLocation各个方面的准确性,并惊讶地发现传递给CLLocationMangerDelegate方法的新旧位置上提供的准确性值:(void)locationManager:didUpdateToLocation:fromLocation本身非常不准确。
走一定的人行横道(沿着一旁的道路和建筑物的一侧),我发现虽然CLLocationManager声称它提供的CLLocations的水平精度为5米,但实际上MKUserAnnotation显示的位置可以达到距离我知道的位置30米(通常显示为一排建筑物的对面)。这表明准确度读数本身是不准确的。 CLLocationManager告诉我其坐标精确到5米以内,但实际上最多30米。
需要说明的是,这不是缓存/时间戳记问题,它在某些区域是可重复的,并且不会随着时间的推移而有所改善。
还有其他人遇到过这个问题吗?
最佳答案
CoreLocation不是人类,也不知道您“真正”在哪里,这是对问题的答案的本质。它正在使用设备上的传感器,并为您提供最佳答案,而其知道所要求答案的准确性的能力所产生的问题反射(reflect)出定位问题本质上非常困难。
为了深入了解位置数据本身:CoreLocation从基站信号塔的三角剖分,附近的SSID以及最后的GPS中提取信息,以确定设备的位置。这些工具确实有不同程度的准确性,但是它们的共同点是,如果让设备工作更长的时间,您将获得更准确的答案。但是,由于CoreLocation使用的所有工具在电池生命周期方面都很昂贵,因此一旦生成的答案满足您的“足够好”标准,它将立即停止。
这就是为什么另一个答案告诉您从set your desiredAccuracy到kCLLocationAccuracyBestForNavigation
的原因-当您这样做时,您基本上是在告诉CoreLocation“告诉我您所拥有的最好的”,并且您还自愿提供了CPU负载,时间和电池消耗随之而来的。您还偏离了CoreLocation用来确定“足够好”的标准范围,而不是提前告诉它何时可以停止,而是说“我会告诉您什么时候足够好”。
因此,CoreLocation将继续尝试为您提供更好的答案,直到您告诉您完成为止,并且您需要承担确定该点的责任。这也是您需要记住的地方,CoreLocation的功能库中的工具的精确度是有限的-您可以获得很多有效的纬度和经度,但通过缩小规模,您自愿为弄清楚这些数字的可信度。预先定义的精度范围是10米,100米,1公里和3公里。 CoreLocation的创建者选择了这些临界点这一事实应该可以告诉您有关问题的难度的信息-如果容易实现更好的准确性,那么它很可能已经在框架中了。
因此回头转一下:CoreLocation正忠实地报告其答案的准确性,仅是这些答案所依据的数据有问题,并且,如果它进一步了解其准确性声明的准确性,则会在其准确性声明中反射(reflect)出来。考虑以下假设情况:CoreLocation确切知道其准确性声明的准确性,然后,CoreLocation不了解其准确性声明的准确性如何,并考虑如何设计API来解决该问题。 CoreLocation会尽可能合理地确定其确定性,如果您能找到一种在硬件限制范围内易于处理的方式来更确定自己的确定性,则App Store的财富正在等待中你。
关于iphone - CoreLocation的精度测量有多精确,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8229200/