我正在尝试收集用户在他们所在的建筑物中上下移动的高度。我使用了guard let lastLocation = locations.last else {return}
let altitude = lastLocation.altitude
使用CoreLocation收集海拔高度,但海拔高度似乎非常不准确。有人知道更准确地收集这些信息的方法吗?
答案 0 :(得分:1)
在建筑物内,尤其是在钢结构建筑中(在商业建筑中非常常见),GPS不太准确。即使其准确性很高,"good" GPS accuracy for a cell phone is expected to be about 5m还是比楼层之间的普通距离还大。 iPhone使用了其他各种技术(例如WiFi定位)对此进行了改进。我自己的开发经验是,您通常可以达到3m的精度。
但是这些是水平。由于角度变化很小,因此高度的准确性往往不如后者。如果您告诉我您的测量值在垂直方向上相距10m(约3层),那将使我感到惊讶。听起来好像您想要三角洲(海拔变化),但是即使在建筑物中,这也非常困难。
WiFi定位是这个故事的关键部分。 Google和Apple(及其他公司)在GPS信息和WiFi信息之间进行了大量关联。当用户使用其地图产品时,他们会了解许多WiFi接入点。它们将来自接入点的信息(例如RSSI信号强度)与来自数百万部电话的GPS信息相关联,并使用它们来确定接入点的位置,并使用它来创建更好的位置信息,尤其是在内部。 (请记住,GPS卫星大约在20,000公里之外,并且您已经用一个巨大的金属盒子围住了自己。它们正在尽力而为。)确保整个位置(以及各种位置)上都有稳定的WiFi接入点楼层)应该会随着时间的推移帮助系统学习您的建筑物。不幸的是,这不是一个非常可靠的解决方案。
这个长答案的简短答案是,改善位置信息的方法是获取大量读数并取平均值,并用惯性(加速度)信息进行补偿以应对运动。操作系统已经做到了这一点,但是您可以继续平均更多的数据点(位置和速度),以期获得更高的精度。
当然可以使用尽可能高的位置精度。 kCLLocationAccuracyBest
通常是您无需插入即可获得的最佳选择(它当然是一种耗电的工具,因此您无法一直运行)。如果您有外部电源,则可以使用kCLLocationAccuracyBestForNavigation
。
否则,您只需要对很多测量值取平均值,即可确定何时您确实已更改地板。