从 mapView 中检索当前用户位置,而地图不在屏幕上
Posted
技术标签:
【中文标题】从 mapView 中检索当前用户位置,而地图不在屏幕上【英文标题】:Retrieving current user location from mapView, without map being on screen 【发布时间】:2012-03-09 03:01:43 【问题描述】:我正在编写一个应用程序来存储您一整天去过的地方的位置。我对 CLLocationManager 进行了大量研究,并且在过去 3 周内一直在测试我的应用程序。我使用 CLLocationManager 获得的位置有时非常不准确,有时距离我所在的位置 4 或 5 英里。 我在我的测试应用程序中有一个日志,并意识到每次我获得一个新位置时,我的 DidUpdateToLocation 方法都会连续调用 3 次,比如在一秒钟内,我会得到 3 个不同的位置。其中一个总是正确的,但另外两个是关闭的。我已经用不同的精度(hundredMeters、nearestTenMeters 和 Best)对其进行了测试,但仍然遇到同样的问题。所以,我的第一个问题是:
我是否可以找出这些位置中的哪一个是正确的,以便我可以存储它?
我也意识到用户在地图视图上的当前位置总是非常准确,所以我考虑从 mapView(蓝点)而不是 CLLocationManager 获取用户的位置,但我了解到 mapView 对象会如果地图实际上在屏幕上,则仅返回当前位置,但情况并非如此,因为我希望我的应用程序在后台运行。所以第二个问题是:
无论如何,如果地图不在屏幕上,是否可以从 mapView 获取用户的当前位置?或者至少使用 mapView 用于查找当前位置的相同技术?
如果您对 mapKit 和 CLLocationManager 有任何经验,请分享您的想法。
感谢您的宝贵时间。任何帮助表示赞赏。
【问题讨论】:
【参考方案1】:无论如何我可以找出这些位置中哪个是正确的 一个以便我可以存储它?
查看您收到的位置的horizontalAccuracy
属性。不要使用比您要查找的位置更不准确的位置。
我还意识到用户在地图视图上的当前位置是 总是非常准确
地图视图可能对 API 没有任何特殊访问权限,这些 API 比您所拥有的更准确,它只是更好地使用它们。不要在每次需要修复时从头开始,而是尝试缓存位置,然后在获得足够准确的新位置时进行更新。
【讨论】:
迦勒,谢谢你的提示!! HorizontalAccuracy 实际上起到了作用。我认为 CLLocation 管理器不会返回比我在 locationManager.desiredAccuracy 中设置的位置更准确的位置,但实际上它确实如此!一旦我过滤掉了所有不如我期望的准确度的位置,我就只能检索到好的位置! 我相信情况正好相反... CLLocationManager 不会竭尽全力返回比您期望的准确度更准确的位置。提供更准确的修复通常意味着使用更多功率。如果它恰好知道你的确切位置,它会告诉你,但如果你不需要比从最近的手机信号塔或 wifi 热点获得的更准确的修复,它可能不会启动 GPS 接收器.【参考方案2】:看看 Apple 的示例代码 Locate Me。它使用变量:
CLLocation *bestEffortAtLocation;
在更新时确定该位置是否小于最后一个位置并且小于设置的时间限制,直到找到最准确的位置。 特别是查看示例代码中的 GetLocationViewController。我在我的应用程序中使用了这段代码,效果很好。
https://developer.apple.com/library/ios/#samplecode/LocateMe/Listings/Classes_GetLocationViewController_m.html#//apple_ref/doc/uid/DTS40007801-Classes_GetLocationViewController_m-DontLinkElementID_8
【讨论】:
休伯特,谢谢!代码对我帮助很大。它向我展示了如何使用 HorizontalAccuracy 属性并仅选择准确的位置。以上是关于从 mapView 中检索当前用户位置,而地图不在屏幕上的主要内容,如果未能解决你的问题,请参考以下文章
打开地图屏幕时,如何将 MapView 以用户当前位置为中心?反应原生博览会
如何在 Android 的 MapView 中更新当前位置的蓝点标记