出于地理空间目的,我需要我的 Android 应用程序向用户提供当前的平均海平面高度。
我的第一次尝试是使用系统自带的
locationManager
。当请求一个位置时,它提供了我必须评估的那些属性——longitude
、latitude
和 altitude
。完美!
val locationManager = getSystemService(context, LocationManager::class.java) ?: return@launch
val locationListener = LocationListener { location ->
Text("Lat: ${location.latitude}°")
Text("Lng: ${location.longitude}°")
Text("z: ${location.altitude}[m NN]") // This is not [m NN] but metres over WGS84 ellipsoid
Text("horizontal_accuracy: ${location.accuracy}[m]")
Text("vertical_accuracy ${location.verticalAccuracyMeters}[m]")
return@LocationListener
}
val criteria = Criteria()
criteria.powerRequirement = Criteria.POWER_HIGH
criteria.accuracy = Criteria.ACCURACY_FINE
val bestProvider = locationManager.getBestProvider(criteria, true) ?: LocationManager.GPS_PROVIDER
locationManager.requestLocationUpdates(bestProvider, 100L, 0f, locationListener)
但是当我仔细查看我的高度结果时,我发现该值比我预期的高 40 米。进一步研究该主题,我了解到 Android 的 LocationManager 提供椭圆体高度。所以我注意到的差异是大地水准面起伏。我现在无法使用这些数据,因为我需要平均海平面高度。
我知道我可以在我的应用程序中包含一个 EGM 模型,但这些计算相当复杂,而且该模型会增加我的应用程序文件大小。 JavaScript(网络浏览器)应用程序和 iOS 应用程序解析平均海平面高度 - 有没有什么方法可以在 Android 上实现这一点而无需计算太多?有没有我没看到的参数?
编辑:
正如我所说,有可能包括 EGM96 模型。但这会使应用程序膨胀很多——只是为了获得更好的高程数据。
https://stackoverflow.com/a/12811478
但这似乎是一个很大的开销。
也许我不明白这个问题 - 但实际上所有 Android 设备都输出 NMEA“句子”,$GPGGA 句子包括正高和该高度所基于的大地水准面分离。遗憾的是,大地水准面分离与最新的大地水准面模型不太匹配,但相当接近。在我的例子中,Android Android 10 报告 61 米,Android 13 报告 60.6 米,2011 年冰岛该位置的公布值为 66 米。