Android 高速获取用户位置

Android 高速获取用户位置,android,gps,mapbox,Android,Gps,Mapbox,我一直在使用MapBox绘制地图,并在地图上标出用户的位置。同时使用位置引擎,我订阅位置更改。位置变化的问题是,它们每秒(最多)发生一次,而我的用户大多是开车的,所以记录的位置往往落后 我意识到,即使记录的位置在后面,显示用户当前位置的标记似乎总是准确的。我想知道是否有可能获得当前位置标记的“估计”位置 另外,根据mapbox的文档,我可以使用ProgressChangeListener获得更准确的位置(也更频繁)。我试着用这种方式设置,但没有成功 val nav = MapboxNavigat

我一直在使用MapBox绘制地图,并在地图上标出用户的位置。同时使用位置引擎,我订阅位置更改。位置变化的问题是,它们每秒(最多)发生一次,而我的用户大多是开车的,所以记录的位置往往落后

我意识到,即使记录的位置在后面,显示用户当前位置的标记似乎总是准确的。我想知道是否有可能获得当前位置标记的“估计”位置

另外,根据mapbox的文档,我可以使用
ProgressChangeListener
获得更准确的位置(也更频繁)。我试着用这种方式设置,但没有成功

val nav = MapboxNavigation(this,getString(R.string.access_token))
    nav.addProgressChangeListener { location, routeProgress ->
        Timber.tag("GPSDEBUG").d("GOT LOC UPDATE on ${System.currentTimeMillis()} with ${location.longitude},${location.latitude}")
    }
    nav.startNavigation(DirectionsRoute.fromJson(""))
显然,MapBox不喜欢有一条空的道路或一个假的导航

在我尝试其他建议之前,如使用卡尔曼算法“估计”缺失位置,如果能得到反馈,我将不胜感激


最终:主要目标是即使在高速下也能检索到准确的GPS坐标。

我的解决方案是计算点A和点B之间缺失的位置,知道GPS更新的最大速率是1s。在现实生活中,当人们在高速公路上高速行驶时,我不得不扣3到4分

private fun processMissingPoints() {
    val stepInMeters = lastUsedLocation.distanceTo(lastKnownLocation) / (numberOfMissingPoints).toDouble()
    val bearing = lastUsedLocation.bearingTo(lastKnownLocation)
    missingPoints.forEach{ point ->
        val newCoordinates = getNewCoordinates(lastUsedLocation.latitude , lastUsedLocation.longitude,stepInMeters*(index+1), bearing.toDouble())
    }
}


/**
 * http://www.movable-type.co.uk/scripts/latlong.html#dest-point
 * Given a start point, initial bearing, and distance, this will calculate the destination
 * point and final bearing travelling along a (shortest distance) great circle arc.
 */
private fun getNewCoordinates(latitude: Double,longitude: Double,distanceInMetres: Double,bearing: Double) : LatLng{
    val brngRad = toRadians(bearing)
    val latRad = toRadians(latitude)
    val lonRad = toRadians(longitude)
    val earthRadiusInMetres = 6371000
    val distFrac = distanceInMetres / earthRadiusInMetres

    val latitudeResult = asin(sin(latRad) * cos(distFrac) + cos(latRad) * sin(distFrac) * cos(brngRad))
    val a = atan2(sin(brngRad) * sin(distFrac) * cos(latRad), cos(distFrac) - sin(latRad) * sin(latitudeResult))
    val longitudeResult = (lonRad + a + 3 * PI) % (2 * PI) - PI

    return LatLng(toDegrees(latitudeResult),toDegrees(longitudeResult))
}

你想得到用户的准确位置,就是这样,对吗?@GunduBandgar是的,速度非常快。你看了吗?@Yeheshuah更快的路线允许用户检测一条比最初计算的路线更快(流量更少)的新路线。这与移动时获取当前的准确位置无关faster@113408你找到解决办法了吗?