在网上找了很久都没有找到有用的,后来拿我经理发给我的,说这也是他在百度提供的代码复制过来的.所以附上源码和翻译成kotlin的代码,方便大家使用,也防止以后自己再遇到这样的问题不知如何是好.
这是js代码
/**
*在每个点的真实步骤中设置小车转动的角度(车载图标)
*@param{BMap.Point} curPos 起点
*@param{BMap.Point} targetPos 终点
*@return deg 角度值
*/
this.setRotation = function (curPos, targetPos) {
var me = this;
var deg = 0;
//这个方法安卓api没有,但根据方法名称可以推断出是将经纬度进行一样倍数的放大或缩小,也忘了
//拿小数位比较多的double来计算对精度影响大不大,所以自己写了一个方法,直接将经纬度放大一百万倍
curPos = map.pointToPixel(curPos);
targetPos = map.pointToPixel(targetPos);
if (targetPos.x != curPos.x) {
var tan = (targetPos.y - curPos.y) / (targetPos.x - curPos.x),
atan = Math.atan(tan);
deg = atan * 360 / (2 * Math.PI);
if (targetPos.x < curPos.x) {
deg = -deg + 90 + 90;
} else {
deg = -deg;
}
deg=-deg;
} else {
var disy = targetPos.y - curPos.y;
var bias = 0;
if (disy > 0)
bias = -1
else
bias = 1
deg = -bias * 90;
}
return deg;
}
这是kotlin代码,需要java的自行翻译
private fun rotation(start: LatLng, end: LatLng): Float {
val bigStart = latlngLarger(start)
val bigEnd = latlngLarger(end)
return if (bigEnd.longitude != bigStart.longitude) {
val tan = (bigEnd.latitude - bigStart.latitude) / (bigEnd.longitude - bigStart.longitude)
val atan = Math.atan(tan)
var deg = atan * 360 / (2 * Math.PI)
if (bigEnd.longitude < bigStart.longitude) {
deg = -deg + 90 + 90
} else {
deg = -deg
}
-deg.toFloat()
/*deg = -deg
deg.toFloat()*/
} else {
val disy = bigEnd.latitude - bigStart.latitude
var bias = 1
if (disy > 0) {
bias = -1
}
-bias * 90f
/*val deg = -bias * 90
deg.toFloat()*/
}
}
private val MUL = 100_0000
private fun latlngLarger(latLng: LatLng): LatLng =
LatLng(latLng.latitude * MUL, latLng.longitude * MUL)
效果图就不上了,自己试一下就知道了