使用 Android GPS 位置纬度/经度准确计算车速 (MPH)

Posted

技术标签:

【中文标题】使用 Android GPS 位置纬度/经度准确计算车速 (MPH)【英文标题】:Accurately calculate Vehicle Speed (MPH) using Android GPS Location Latitude/Longitude 【发布时间】:2021-03-07 10:16:09 【问题描述】:

我目前正在尝试开发一个 android 应用程序,该应用程序使用来自 GPS 的位置纬度/经度以英里/小时 (MPH) 显示车辆的准确道路速度。

我有以下代码作为我的第一次尝试:-

private fun startLocationUpdates() 
    val locationRequest = LocationRequest.create()?.apply 
        interval = 1000
        fastestInterval = 500
        priority = LocationRequest.PRIORITY_HIGH_ACCURACY
    

    fusedLocationClient.requestLocationUpdates(locationRequest, manufactureCallBack(), Looper.getMainLooper())


       @SuppressLint("SetTextI18n")
        override fun onLocationResult(locationResult: LocationResult) 
            locationResult.locations.forEach  location ->
                previousTimestamp = if (this@MainActivity::previousLocation.isInitialized) 
                    val dist: Double = HaversineAlgorithm.distanceMiles(previousLocation.latitude, previousLocation.longitude, location.latitude, location.longitude)

                    val currentTime = System.nanoTime()
                    val time_s: Double = (currentTime - previousTimestamp) / (1_000_000_000.0 * 60.0 * 60.0)

                    Timber.i("time_s = $time_s :: dist = $dist")

                    if (dist > 0.0 && time_s > 0.0) 
                        val speed_mps: Double = dist / time_s
                        Timber.i("$location.time speed_mps = $speed_mps")
                        val speed_mph: Double = speed_mps * something
                        milesPerHourTV.text = "$speed_mph MPH"
                    
                    currentTime
                 else 
                    System.nanoTime()
                

                previousLocation = location
            
        

我的Haversine计算(Km)如下:-

fun distance(departureLatitude: Double, departureLongitude: Double, destinationLatitude: Double, destinationLongitude: Double): Double 
    val latitudeDelta = Math.toRadians(destinationLatitude - departureLatitude)
    val longitudeDelta = Math.toRadians(destinationLongitude - departureLongitude)
    val radiusDepartureLatitude = Math.toRadians(departureLatitude)
    val radiusDestinationLatitude = Math.toRadians(destinationLatitude)
    val a = sin(latitudeDelta / 2).pow(2.0) + sin(longitudeDelta / 2).pow(2.0) * cos(radiusDepartureLatitude) * cos(radiusDestinationLatitude)
    val c = 2 * asin(sqrt(a))
    return EARTH_RADIUS * c

到英里:-

fun distanceMiles(departureLatitude: Double, departureLongitude: Double, destinationLatitude: Double, destinationLongitude: Double): Double 
    val distanceInKm = distance(departureLatitude, departureLongitude, destinationLatitude, destinationLongitude)
    return distanceInKm * 0.621371

由于我在计算中只使用了两个点,因此我预计会出现“紧张”的结果,但是我看到的数字非常奇怪。

我正在考虑使用 Kotlin Flow 将我的位置更新发送到平均函数以平均位置并获得更准确的速度值。

我可以采取什么方法来获得更准确的速度?

我的计算有误吗?

【问题讨论】:

***.com/q/15570542/8942811 可以帮助您。 【参考方案1】:

我认为问题出在这里

 val currentTime = System.nanoTime()
 val time_s: Double = (currentTime - previousTimestamp) / (1_000_000_000.0 * 60.0 * 60.0)

你使用System.nanoTime(),它以纳秒为单位返回当前时间。

1 秒 = 10^9 纳秒

所以正确的解决方案是:

val time_s: Double = (currentTime - previousTimestamp) / 1_000_000_000.0

【讨论】:

以上是关于使用 Android GPS 位置纬度/经度准确计算车速 (MPH)的主要内容,如果未能解决你的问题,请参考以下文章

我想在 Android Studio 中给出经度和纬度,我手机的 gps 会跳到那个位置

Android GPS 需要一段时间才能准确

Android:无法获得准确的经纬度值

给定 GPS 的地理位置,如何在给定的 x 米半径内找到纬度和经度

使用gps从纬度和经度获取当前位置

如何从我的 android 应用程序中尽快获得准确的纬度/经度?