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) 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() {}) } }