swift 室内海拔高度不准确

swift altitude indoor not accurate

我正在尝试收集我的用户在他们所在的建筑物上上下下时的高度。我使用了 guard let lastLocation = locations.last else {return} let altitude = lastLocation.altitude 使用 CoreLocation 收集海拔高度,但海拔高度似乎非常不准确。有人知道如何更准确地收集这些信息吗?

GPS 在建筑物内不是很准确,尤其是钢架结构建筑物(这在商业建筑中很常见)。即使它的精度很好,"good" GPS accuracy for a cell phone is expected to be about 5m,或超过楼层之间的常见距离。 iPhone 使用各种其他技术(例如 WiFi 定位)来改进这一点。我自己的开发经验是,你经常可以得到 3m 数量级的精度。

但那些是水平的。由于角度变化很小,海拔高度往往不如那个准确。如果您告诉我您的测量结果垂直偏离 10 米(约 3 层楼),那会让我大吃一惊。听起来你想要三角洲(高度的变化),但即使在建筑物中也很难。

WiFi 定位是这个故事的关键部分。 Google 和 Apple(以及其他公司)在 GPS 信息和 WiFi 信息之间进行大量关联。当用户使用他们的地图产品时,他们会了解大量的 WiFi 接入点。他们将来自接入点的信息(例如 RSSI 信号强度)与来自数百万部手机的 GPS 信息相关联,并使用它来确定接入点的位置,并使用它来创建更好的位置信息,尤其是在内部。 (请记住,GPS 卫星距离大约 20,000 公里,您周围环绕着一个巨大的金属盒子。它们正在尽力而为。)确保整个位置(以及各种网络)都有稳定的 WiFi 接入点楼层)应该随着时间的推移帮助系统了解你的建筑。不幸的是,这不是一个非常可靠的解决方案。

这个很长的答案的简短答案是,改善位置信息的方法是获取大量读数并取平均值,用惯性(加速度)信息进行补偿以处理运动。 OS 已经做到了这一点,但您可以继续对更多数据点(位置和速度)进行平均,以尝试随着时间的推移获得更高的准确性。

当然,使用尽可能高的定位精度。 kCLLocationAccuracyBest 通常是不插电时的最佳状态(这当然是一个耗电大户,所以你不能一直 运行)。如果有外接电源,可以用kCLLocationAccuracyBestForNavigation.

否则,您将不得不对大量测量值进行平均,然后才能确定您认为自己何时真正换了楼层。