GLDriver/app/src/main/java/com/dahe/gldriver/utils/LocationUtils.kt

205 lines
6.9 KiB
Kotlin
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package com.dahe.gldriver.utils
import android.content.Context
import com.amap.api.maps.AMap
import com.amap.api.maps.AMapException
import com.amap.api.maps.CameraUpdateFactory
import com.amap.api.maps.model.BitmapDescriptorFactory
import com.amap.api.maps.model.CameraPosition
import com.amap.api.maps.model.LatLng
import com.amap.api.maps.model.MarkerOptions
import com.amap.api.maps.model.Poi
import com.amap.api.navi.AmapNaviPage
import com.amap.api.navi.AmapNaviParams
import com.amap.api.navi.AmapNaviType
import com.amap.api.services.core.AMapException.CODE_AMAP_SUCCESS
import com.amap.api.services.core.LatLonPoint
import com.amap.api.services.route.DrivePath
import com.amap.api.services.route.DriveRouteResult
import com.amap.api.services.route.RouteSearch
import com.dahe.gldriver.R
import com.dahe.gldriver.callback.MyINaviInfoCallback
import com.dahe.gldriver.callback.MyOnRouteSerach
import com.dahe.gldriver.weight.overlay.DrivingRouteOverlay
import com.dahe.mylibrary.base.SingletonNoPHolder
/**
* @ClassName LocationUtils
* @Author john
* @Date 2024/3/4 15:53
* @Description TODO
*/
class LocationUtils private constructor() {
companion object : SingletonNoPHolder<LocationUtils>(::LocationUtils)
fun getDistance(var0: LatLng?, var1: LatLng?): String {
return if (var0 != null && var1 != null) {
try {
var var2: Double = var0.longitude
var var4: Double = var0.latitude
var var6: Double = var1.longitude
var var8: Double = var1.latitude
var2 *= 0.01745329251994329
var4 *= 0.01745329251994329
var6 *= 0.01745329251994329
var8 *= 0.01745329251994329
val var10 = Math.sin(var2)
val var12 = Math.sin(var4)
val var14 = Math.cos(var2)
val var16 = Math.cos(var4)
val var18 = Math.sin(var6)
val var20 = Math.sin(var8)
val var22 = Math.cos(var6)
val var24 = Math.cos(var8)
val var28 = DoubleArray(3)
val var29 = DoubleArray(3)
var28[0] = var16 * var14
var28[1] = var16 * var10
var28[2] = var12
var29[0] = var24 * var22
var29[1] = var24 * var18
var29[2] = var20
String.format(
"%.2f", (Math.asin(
Math.sqrt(
(var28[0] - var29[0]) * (var28[0] - var29[0]) +
(var28[1] - var29[1]) * (var28[1] - var29[1]) + (var28[2] - var29[2]) * (var28[2] - var29[2])
) / 2.0
)
* 1.27420015798544E7).toFloat() / 1000
)
} catch (var26: Throwable) {
var26.printStackTrace()
"0.00"
}
} else {
try {
throw AMapException("非法坐标值")
} catch (var27: AMapException) {
var27.printStackTrace()
"0.00"
}
}
}
/**
* 改变地图中心点
* @param latLng LatLng
* @param aMap AMap
*/
fun changeCamera(latLng: LatLng, aMap: AMap) {
aMap.moveCamera(
CameraUpdateFactory.newCameraPosition(
CameraPosition(
latLng,
12f,
30f,
30f
)
)
)
aMap.clear()
aMap.addMarker(
MarkerOptions().position(latLng)
.icon(
BitmapDescriptorFactory.fromResource(R.drawable.icon_loca_load)
)
)
}
/**
* 地图添加mark
* @param latLng LatLng
* @param resource Int
* @param aMap AMap
*/
fun addMarker(latLng: LatLng, aMap: AMap, resource: Int) {
aMap.addMarker(
MarkerOptions().position(latLng)
.icon(
BitmapDescriptorFactory.fromResource(resource)
)
)
}
/**
* 开始搜索路径规划方案
* @param context Context
* @param load LatLng
* @param unload LatLng
* @param aMap AMap
*/
fun searchRouteResult(context: Context, load: LatLng, unload: LatLng, aMap: AMap) {
try {
var mRouteSearch = RouteSearch(context)
mRouteSearch.setRouteSearchListener(object : MyOnRouteSerach() {
override fun onDriveRouteSearched(p0: DriveRouteResult?, p1: Int) {
super.onDriveRouteSearched(p0, p1)
if (p1 == CODE_AMAP_SUCCESS) {
if (p0 != null && p0.getPaths() != null && p0.paths.size > 0) {
val drivePath: DrivePath = p0.paths[0] ?: return
val drivingRouteOverlay = DrivingRouteOverlay(
context, aMap, drivePath,
p0.startPos,
p0.targetPos, null
).apply {
setNodeIconVisibility(false) //设置节点marker是否显示
setIsColorfulline(true) //是否用颜色展示交通拥堵情况默认true
removeFromMap()
addToMap()
zoomToSpan()
}
}
}
}
})
val fromAndTo = RouteSearch.FromAndTo(
LatLonPoint(load.latitude, load.longitude),
LatLonPoint(unload.latitude, unload.longitude)
)
val query = RouteSearch.DriveRouteQuery(
fromAndTo, RouteSearch.DrivingDefault, null,
null, ""
) // 第一个参数表示路径规划的起点和终点,第二个参数表示驾车模式,第三个参数表示途经点,第四个参数表示避让区域,第五个参数表示避让道路
mRouteSearch.calculateDriveRouteAsyn(query) // 异步路径规划驾车模式查询
} catch (e: Exception) {
}
}
/**
* 规划路径
* @param context Context
* @param load LatLng
* @param unload LatLng
* @param startAddress String
* @param endAddress String
*/
fun getRoutes(
context: Context,
load: LatLng,
unload: LatLng,
startAddress: String = "",
endAddress: String = ""
) {
val params = AmapNaviParams(
Poi(startAddress, load, ""),
null,
Poi(endAddress, unload, ""),
AmapNaviType.DRIVER
)
params.setUseInnerVoice(true)
AmapNaviPage.getInstance()
.showRouteActivity(context, params, object : MyINaviInfoCallback() {})
}
}