205 lines
6.9 KiB
Kotlin
205 lines
6.9 KiB
Kotlin
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() {})
|
||
}
|
||
} |