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