运单起始点路径规划
This commit is contained in:
parent
e432812ce4
commit
70b6d2a40d
@ -0,0 +1,31 @@
|
|||||||
|
package com.dahe.gldriver.callback
|
||||||
|
|
||||||
|
import android.view.View
|
||||||
|
import com.amap.api.navi.INaviInfoCallback
|
||||||
|
import com.amap.api.navi.model.AMapNaviLocation
|
||||||
|
import com.amap.api.services.route.BusRouteResult
|
||||||
|
import com.amap.api.services.route.DriveRouteResult
|
||||||
|
import com.amap.api.services.route.RideRouteResult
|
||||||
|
import com.amap.api.services.route.RouteSearch
|
||||||
|
import com.amap.api.services.route.RouteSearchV2.OnRouteSearchListener
|
||||||
|
import com.amap.api.services.route.WalkRouteResult
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @ClassName MyOnInitNaviFailure
|
||||||
|
* @Author john
|
||||||
|
* @Date 2024/3/21 16:12
|
||||||
|
* @Description TODO
|
||||||
|
*/
|
||||||
|
open class MyOnRouteSerach : RouteSearch.OnRouteSearchListener {
|
||||||
|
override fun onBusRouteSearched(p0: BusRouteResult?, p1: Int) {
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onDriveRouteSearched(p0: DriveRouteResult?, p1: Int) {
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onWalkRouteSearched(p0: WalkRouteResult?, p1: Int) {
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onRideRouteSearched(p0: RideRouteResult?, p1: Int) {
|
||||||
|
}
|
||||||
|
}
|
@ -25,6 +25,7 @@ import com.dahe.gldriver.net.DataManager
|
|||||||
import com.dahe.gldriver.net.RxHttpCallBack
|
import com.dahe.gldriver.net.RxHttpCallBack
|
||||||
import com.dahe.gldriver.utils.GDLocationUtils
|
import com.dahe.gldriver.utils.GDLocationUtils
|
||||||
import com.dahe.gldriver.utils.LocationUtils
|
import com.dahe.gldriver.utils.LocationUtils
|
||||||
|
import com.dahe.gldriver.utils.NaviUtils
|
||||||
import com.dahe.gldriver.utils.OrderUtils
|
import com.dahe.gldriver.utils.OrderUtils
|
||||||
import com.dahe.mylibrary.base.BaseActivity
|
import com.dahe.mylibrary.base.BaseActivity
|
||||||
import com.dahe.mylibrary.net.CommonResponseBean
|
import com.dahe.mylibrary.net.CommonResponseBean
|
||||||
@ -73,14 +74,12 @@ class WaybillLoadActivity : BaseActivity<ActivityWaybillLoadBinding>() {
|
|||||||
uiSettings.run { isZoomControlsEnabled = false }
|
uiSettings.run { isZoomControlsEnabled = false }
|
||||||
}
|
}
|
||||||
llGoStart.setOnClickListener {
|
llGoStart.setOnClickListener {
|
||||||
if (!::loadPos.isInitialized)
|
if (!::loadPos.isInitialized){
|
||||||
showToast("请等待定位成功")
|
showToast("请等待定位成功")
|
||||||
return@setOnClickListener
|
return@setOnClickListener
|
||||||
AmapNaviPage.getInstance().showRouteActivity(
|
}
|
||||||
applicationContext,
|
|
||||||
AmapNaviParams(null, null, Poi("天安门", loadPos, ""), AmapNaviType.DRIVER),
|
NaviUtils.getInstance().goNextPoint(mContext,loadPos,loadAddress)
|
||||||
object : MyINaviInfoCallback() {}
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
btnRight.setOnClickListener {
|
btnRight.setOnClickListener {
|
||||||
@ -109,6 +108,7 @@ class WaybillLoadActivity : BaseActivity<ActivityWaybillLoadBinding>() {
|
|||||||
val load = orderBean.orderChildList.first { it.type == "1" }
|
val load = orderBean.orderChildList.first { it.type == "1" }
|
||||||
var distance = ""
|
var distance = ""
|
||||||
loadPos = LatLng(load.latitude.toDouble(), load.longitude.toDouble())
|
loadPos = LatLng(load.latitude.toDouble(), load.longitude.toDouble())
|
||||||
|
loadAddress = load.address
|
||||||
LocationUtils.getInstance().changeCamera(loadPos, aMap!!)
|
LocationUtils.getInstance().changeCamera(loadPos, aMap!!)
|
||||||
if (::gdLatLng.isInitialized) {
|
if (::gdLatLng.isInitialized) {
|
||||||
distance = LocationUtils.getInstance().getDistance(
|
distance = LocationUtils.getInstance().getDistance(
|
||||||
@ -225,6 +225,7 @@ class WaybillLoadActivity : BaseActivity<ActivityWaybillLoadBinding>() {
|
|||||||
|
|
||||||
lateinit var gdLatLng: LatLng
|
lateinit var gdLatLng: LatLng
|
||||||
lateinit var loadPos: LatLng
|
lateinit var loadPos: LatLng
|
||||||
|
lateinit var loadAddress: String
|
||||||
fun getLocation() {
|
fun getLocation() {
|
||||||
GDLocationUtils.instance.getLocation(mContext) {
|
GDLocationUtils.instance.getLocation(mContext) {
|
||||||
//errCode等于0代表定位成功,其他的为定位失败,具体的可以参照官网定位错误码说明
|
//errCode等于0代表定位成功,其他的为定位失败,具体的可以参照官网定位错误码说明
|
||||||
|
@ -1,27 +1,18 @@
|
|||||||
package com.dahe.gldriver.ui.waybill.activity
|
package com.dahe.gldriver.ui.waybill.activity
|
||||||
|
|
||||||
import android.Manifest
|
import android.Manifest
|
||||||
import android.content.res.Resources
|
|
||||||
import android.graphics.Color
|
import android.graphics.Color
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.view.View
|
|
||||||
import android.widget.LinearLayout
|
import android.widget.LinearLayout
|
||||||
import android.widget.Toast
|
import android.widget.Toast
|
||||||
import androidx.recyclerview.widget.LinearLayoutManager
|
import androidx.recyclerview.widget.LinearLayoutManager
|
||||||
import androidx.recyclerview.widget.RecyclerView
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
import com.amap.api.maps.AMap
|
import com.amap.api.maps.AMap
|
||||||
import com.amap.api.maps.model.LatLng
|
import com.amap.api.maps.model.LatLng
|
||||||
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.navi.INaviInfoCallback
|
|
||||||
import com.amap.api.navi.model.AMapNaviLocation
|
|
||||||
import com.dahe.gldriver.R
|
import com.dahe.gldriver.R
|
||||||
import com.dahe.gldriver.adapter.WaybillNodeAdapter
|
import com.dahe.gldriver.adapter.WaybillNodeAdapter
|
||||||
import com.dahe.gldriver.base.AppConfig
|
import com.dahe.gldriver.base.AppConfig
|
||||||
import com.dahe.gldriver.bean.OrderDetailBean
|
import com.dahe.gldriver.bean.OrderDetailBean
|
||||||
import com.dahe.gldriver.callback.MyINaviInfoCallback
|
|
||||||
import com.dahe.gldriver.databinding.ActivityWaybillUnloadBinding
|
import com.dahe.gldriver.databinding.ActivityWaybillUnloadBinding
|
||||||
import com.dahe.gldriver.net.BaseObserver
|
import com.dahe.gldriver.net.BaseObserver
|
||||||
import com.dahe.gldriver.net.DataManager
|
import com.dahe.gldriver.net.DataManager
|
||||||
@ -79,7 +70,16 @@ class WaybillUnlLoadActivity : BaseActivity<ActivityWaybillUnloadBinding>() {
|
|||||||
return@setOnClickListener
|
return@setOnClickListener
|
||||||
}
|
}
|
||||||
|
|
||||||
NaviUtils.getInstance().goNextPoint(mContext,loadPos)
|
NaviUtils.getInstance().goNextPoint(mContext,loadPos,loadAddress)
|
||||||
|
}
|
||||||
|
|
||||||
|
llRoutes.setOnClickListener {
|
||||||
|
|
||||||
|
if (!::unLoadPos.isInitialized||!::loadPos.isInitialized) {
|
||||||
|
showToast("缺少起始点定位信息,请返回重试")
|
||||||
|
return@setOnClickListener
|
||||||
|
}
|
||||||
|
NaviUtils.getInstance().getRoute(mContext,loadPos,unLoadPos,loadAddress,unLoadAddress)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -105,9 +105,14 @@ class WaybillUnlLoadActivity : BaseActivity<ActivityWaybillUnloadBinding>() {
|
|||||||
super.onSuccess(t)
|
super.onSuccess(t)
|
||||||
orderBean = t.data
|
orderBean = t.data
|
||||||
val load = orderBean.orderChildList.first { it.type == "1" }
|
val load = orderBean.orderChildList.first { it.type == "1" }
|
||||||
|
val unLoad = orderBean.orderChildList.last { it.type == "2" }
|
||||||
var distance = ""
|
var distance = ""
|
||||||
loadPos = LatLng(load.latitude.toDouble(), load.longitude.toDouble())
|
loadPos = LatLng(load.latitude.toDouble(), load.longitude.toDouble())
|
||||||
LocationUtils.getInstance().changeCamera(loadPos, aMap!!)
|
unLoadPos = LatLng(unLoad.latitude.toDouble(), unLoad.longitude.toDouble())
|
||||||
|
loadAddress = load.address
|
||||||
|
unLoadAddress = unLoad.address
|
||||||
|
|
||||||
|
LocationUtils.getInstance().searchRouteResult(mContext,loadPos,unLoadPos,aMap)
|
||||||
if (::gdLatLng.isInitialized) {
|
if (::gdLatLng.isInitialized) {
|
||||||
distance = LocationUtils.getInstance().getDistance(
|
distance = LocationUtils.getInstance().getDistance(
|
||||||
gdLatLng,
|
gdLatLng,
|
||||||
@ -219,6 +224,9 @@ class WaybillUnlLoadActivity : BaseActivity<ActivityWaybillUnloadBinding>() {
|
|||||||
|
|
||||||
lateinit var gdLatLng: LatLng
|
lateinit var gdLatLng: LatLng
|
||||||
lateinit var loadPos: LatLng
|
lateinit var loadPos: LatLng
|
||||||
|
lateinit var unLoadPos: LatLng
|
||||||
|
lateinit var loadAddress: String
|
||||||
|
lateinit var unLoadAddress: String
|
||||||
fun getLocation() {
|
fun getLocation() {
|
||||||
GDLocationUtils.instance.getLocation(mContext) {
|
GDLocationUtils.instance.getLocation(mContext) {
|
||||||
//errCode等于0代表定位成功,其他的为定位失败,具体的可以参照官网定位错误码说明
|
//errCode等于0代表定位成功,其他的为定位失败,具体的可以参照官网定位错误码说明
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
package com.dahe.gldriver.utils
|
package com.dahe.gldriver.utils
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
import com.amap.api.maps.AMap
|
import com.amap.api.maps.AMap
|
||||||
import com.amap.api.maps.AMapException
|
import com.amap.api.maps.AMapException
|
||||||
import com.amap.api.maps.CameraUpdateFactory
|
import com.amap.api.maps.CameraUpdateFactory
|
||||||
@ -7,7 +8,19 @@ import com.amap.api.maps.model.BitmapDescriptorFactory
|
|||||||
import com.amap.api.maps.model.CameraPosition
|
import com.amap.api.maps.model.CameraPosition
|
||||||
import com.amap.api.maps.model.LatLng
|
import com.amap.api.maps.model.LatLng
|
||||||
import com.amap.api.maps.model.MarkerOptions
|
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.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
|
import com.dahe.mylibrary.base.SingletonNoPHolder
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -71,8 +84,23 @@ class LocationUtils private constructor() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 改变地图中心点
|
||||||
|
* @param latLng LatLng
|
||||||
|
* @param aMap AMap
|
||||||
|
*/
|
||||||
fun changeCamera(latLng: LatLng, aMap: AMap) {
|
fun changeCamera(latLng: LatLng, aMap: AMap) {
|
||||||
aMap.moveCamera(CameraUpdateFactory.newCameraPosition(CameraPosition(latLng,12f,30f,30f)))
|
aMap.moveCamera(
|
||||||
|
CameraUpdateFactory.newCameraPosition(
|
||||||
|
CameraPosition(
|
||||||
|
latLng,
|
||||||
|
12f,
|
||||||
|
30f,
|
||||||
|
30f
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
aMap.clear()
|
aMap.clear()
|
||||||
aMap.addMarker(
|
aMap.addMarker(
|
||||||
MarkerOptions().position(latLng)
|
MarkerOptions().position(latLng)
|
||||||
@ -81,4 +109,75 @@ class LocationUtils private constructor() {
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 开始搜索路径规划方案
|
||||||
|
* @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() {})
|
||||||
|
}
|
||||||
}
|
}
|
@ -7,6 +7,7 @@ import com.amap.api.navi.AmapNaviPage
|
|||||||
import com.amap.api.navi.AmapNaviParams
|
import com.amap.api.navi.AmapNaviParams
|
||||||
import com.amap.api.navi.AmapNaviType
|
import com.amap.api.navi.AmapNaviType
|
||||||
import com.dahe.gldriver.callback.MyINaviInfoCallback
|
import com.dahe.gldriver.callback.MyINaviInfoCallback
|
||||||
|
import com.dahe.gldriver.weight.overlay.CustomAmapRouteActivity
|
||||||
import com.dahe.mylibrary.base.SingletonNoPHolder
|
import com.dahe.mylibrary.base.SingletonNoPHolder
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -24,6 +25,20 @@ class NaviUtils private constructor(){
|
|||||||
AmapNaviParams(null, null, Poi(startName, latLng, ""), AmapNaviType.DRIVER),
|
AmapNaviParams(null, null, Poi(startName, latLng, ""), AmapNaviType.DRIVER),
|
||||||
object : MyINaviInfoCallback() {}
|
object : MyINaviInfoCallback() {}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
// val params = AmapNaviParams(
|
||||||
|
// Poi("北京站", latLng, ""),
|
||||||
|
// null,
|
||||||
|
// Poi("故宫博物院", LatLng(39.917337, 116.397056), ""),
|
||||||
|
// AmapNaviType.DRIVER
|
||||||
|
// )
|
||||||
|
// params.setUseInnerVoice(true)
|
||||||
|
// AmapNaviPage.getInstance().showRouteActivity(
|
||||||
|
// context, params, object : MyINaviInfoCallback() {},
|
||||||
|
// CustomAmapRouteActivity::class.java
|
||||||
|
// )
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fun getRoute(context: Context,startLatLng: LatLng,endLatLng: LatLng,startName:String = "",endName:String = ""){
|
fun getRoute(context: Context,startLatLng: LatLng,endLatLng: LatLng,startName:String = "",endName:String = ""){
|
||||||
|
@ -164,7 +164,7 @@ class OrderUtils private constructor() {
|
|||||||
.subscribe(BaseObserver(context, object : RxHttpCallBack<OrderDetailBean>() {
|
.subscribe(BaseObserver(context, object : RxHttpCallBack<OrderDetailBean>() {
|
||||||
override fun onSuccess(t: CommonResponseBean<OrderDetailBean>) {
|
override fun onSuccess(t: CommonResponseBean<OrderDetailBean>) {
|
||||||
super.onSuccess(t)
|
super.onSuccess(t)
|
||||||
if (t.data != null) {
|
if (t.data != null&&!t.data.orderId.isNullOrEmpty()) {
|
||||||
BaseSPUtils.put(context, NEED_UP_ORDER, Gson().toJson(t.data))
|
BaseSPUtils.put(context, NEED_UP_ORDER, Gson().toJson(t.data))
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||||
context.startForegroundService(Intent(context, UpLocationService2::class.java))
|
context.startForegroundService(Intent(context, UpLocationService2::class.java))
|
||||||
|
@ -0,0 +1,28 @@
|
|||||||
|
package com.dahe.gldriver.weight.overlay
|
||||||
|
|
||||||
|
import android.os.Bundle
|
||||||
|
import android.os.PersistableBundle
|
||||||
|
import com.amap.api.navi.AmapRouteActivity
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author liqi
|
||||||
|
* @date 2019/2/22
|
||||||
|
*/
|
||||||
|
class CustomAmapRouteActivity : AmapRouteActivity() {
|
||||||
|
override fun onCreate(savedInstanceState: Bundle?, persistentState: PersistableBundle?) {
|
||||||
|
super.onCreate(savedInstanceState, persistentState)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onResume() {
|
||||||
|
super.onResume()
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onPause() {
|
||||||
|
super.onPause()
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onDestroy() {
|
||||||
|
super.onDestroy()
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,312 @@
|
|||||||
|
package com.dahe.gldriver.weight.overlay
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
|
import android.graphics.Color
|
||||||
|
import com.amap.api.maps.AMap
|
||||||
|
import com.amap.api.maps.model.BitmapDescriptorFactory
|
||||||
|
import com.amap.api.maps.model.LatLng
|
||||||
|
import com.amap.api.maps.model.LatLngBounds
|
||||||
|
import com.amap.api.maps.model.Marker
|
||||||
|
import com.amap.api.maps.model.PolylineOptions
|
||||||
|
import com.amap.api.services.core.LatLonPoint
|
||||||
|
import com.amap.api.services.route.DrivePath
|
||||||
|
import com.amap.api.services.route.TMC
|
||||||
|
import com.dahe.gldriver.R
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 导航路线图层类。
|
||||||
|
*/
|
||||||
|
class DrivingRouteOverlay(
|
||||||
|
private val mContext: Context, amap: AMap, path: DrivePath?,
|
||||||
|
start: LatLonPoint, end: LatLonPoint, throughPointList: List<LatLonPoint>?
|
||||||
|
) : RouteOverlay(
|
||||||
|
mContext
|
||||||
|
) {
|
||||||
|
private val drivePath: DrivePath?
|
||||||
|
private val throughPointList: List<LatLonPoint>?
|
||||||
|
private val throughPointMarkerList: MutableList<Marker>? = ArrayList()
|
||||||
|
private var throughPointMarkerVisible = true
|
||||||
|
private var tmcs: MutableList<TMC>? = null
|
||||||
|
private var mPolylineOptions: PolylineOptions? = null
|
||||||
|
private var mPolylineOptionscolor: PolylineOptions? = null
|
||||||
|
private var isColorfulline = true
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设置路线宽度
|
||||||
|
*
|
||||||
|
* @param mWidth 路线宽度,取值范围:大于0
|
||||||
|
*/
|
||||||
|
override var routeWidth = 25f
|
||||||
|
private var mLatLngsOfPath: MutableList<LatLng>? = null
|
||||||
|
fun setIsColorfulline(iscolorfulline: Boolean) {
|
||||||
|
isColorfulline = iscolorfulline
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据给定的参数,构造一个导航路线图层类对象。
|
||||||
|
*
|
||||||
|
* @param amap 地图对象。
|
||||||
|
* @param path 导航路线规划方案。
|
||||||
|
* @param context 当前的activity对象。
|
||||||
|
*/
|
||||||
|
init {
|
||||||
|
mAMap = amap
|
||||||
|
drivePath = path
|
||||||
|
startPoint = LatLng(start.latitude, start.longitude)
|
||||||
|
endPoint = LatLng(end.latitude, end.longitude)
|
||||||
|
this.throughPointList = throughPointList
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 添加驾车路线添加到地图上显示。
|
||||||
|
*/
|
||||||
|
fun addToMap() {
|
||||||
|
initPolylineOptions()
|
||||||
|
try {
|
||||||
|
if (mAMap == null) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if (routeWidth == 0f || drivePath == null) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
mLatLngsOfPath = ArrayList()
|
||||||
|
tmcs = ArrayList()
|
||||||
|
val drivePaths = drivePath.steps
|
||||||
|
for (step in drivePaths) {
|
||||||
|
val latlonPoints = step.polyline
|
||||||
|
val tmclist = step.tmCs
|
||||||
|
tmcs?.addAll(tmclist)
|
||||||
|
// addDrivingStationMarkers(step, convertToLatLng(latlonPoints.get(0)));
|
||||||
|
for (latlonpoint in latlonPoints) {
|
||||||
|
mPolylineOptions!!.add(convertToLatLng(latlonpoint))
|
||||||
|
mLatLngsOfPath?.add(convertToLatLng(latlonpoint))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (startMarker != null) {
|
||||||
|
startMarker!!.remove()
|
||||||
|
startMarker = null
|
||||||
|
}
|
||||||
|
if (endMarker != null) {
|
||||||
|
endMarker!!.remove()
|
||||||
|
endMarker = null
|
||||||
|
}
|
||||||
|
addStartAndEndMarker()
|
||||||
|
// addThroughPointMarker();
|
||||||
|
if (isColorfulline && tmcs?.size!! > 0) {
|
||||||
|
colorWayUpdate(tmcs)
|
||||||
|
showcolorPolyline()
|
||||||
|
} else {
|
||||||
|
showPolyline()
|
||||||
|
}
|
||||||
|
} catch (e: Throwable) {
|
||||||
|
e.printStackTrace()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 初始化线段属性
|
||||||
|
*/
|
||||||
|
private fun initPolylineOptions() {
|
||||||
|
mPolylineOptions = null
|
||||||
|
mPolylineOptions = PolylineOptions()
|
||||||
|
mPolylineOptions!!
|
||||||
|
.color(driveColor)
|
||||||
|
.setCustomTexture(BitmapDescriptorFactory.fromResource(R.drawable.icon_roud_type))
|
||||||
|
.width(routeWidth)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun showPolyline() {
|
||||||
|
addPolyLine(mPolylineOptions)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun showcolorPolyline() {
|
||||||
|
addPolyLine(mPolylineOptionscolor)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据不同的路段拥堵情况展示不同的颜色
|
||||||
|
*
|
||||||
|
* @param tmcSection
|
||||||
|
*/
|
||||||
|
private fun colorWayUpdate(tmcSection: List<TMC>?) {
|
||||||
|
if (mAMap == null) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if (tmcSection == null || tmcSection.size <= 0) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
var segmentTrafficStatus: TMC
|
||||||
|
mPolylineOptionscolor = null
|
||||||
|
mPolylineOptionscolor = PolylineOptions()
|
||||||
|
mPolylineOptionscolor!!.width(routeWidth)
|
||||||
|
val colorList: MutableList<Int> = ArrayList()
|
||||||
|
val start = tmcSection[0].polyline[0]
|
||||||
|
mPolylineOptionscolor!!.add(LatLng(start.latitude, start.longitude))
|
||||||
|
colorList.add(driveColor)
|
||||||
|
for (i in tmcSection.indices) {
|
||||||
|
segmentTrafficStatus = tmcSection[i]
|
||||||
|
val color = getcolor(segmentTrafficStatus.status)
|
||||||
|
val mployline = segmentTrafficStatus.polyline
|
||||||
|
for (j in 1 until mployline.size) {
|
||||||
|
mPolylineOptionscolor!!.add(LatLng(mployline[j].latitude, mployline[j].longitude))
|
||||||
|
colorList.add(color)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
colorList.add(driveColor)
|
||||||
|
mPolylineOptionscolor!!.colorValues(colorList)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun getcolor(status: String): Int {
|
||||||
|
return if (status == "畅通") {
|
||||||
|
Color.GREEN
|
||||||
|
} else if (status == "缓行") {
|
||||||
|
Color.YELLOW
|
||||||
|
} else if (status == "拥堵") {
|
||||||
|
Color.RED
|
||||||
|
} else if (status == "严重拥堵") {
|
||||||
|
Color.parseColor("#990033")
|
||||||
|
} else {
|
||||||
|
Color.parseColor("#537edc")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun convertToLatLng(point: LatLonPoint): LatLng {
|
||||||
|
return LatLng(point.latitude, point.longitude)
|
||||||
|
}
|
||||||
|
|
||||||
|
override val latLngBounds: LatLngBounds
|
||||||
|
// /**
|
||||||
|
protected get() {
|
||||||
|
val b = LatLngBounds.builder()
|
||||||
|
b.include(LatLng(startPoint!!.latitude, startPoint!!.longitude))
|
||||||
|
b.include(LatLng(endPoint!!.latitude, endPoint!!.longitude))
|
||||||
|
if (throughPointList != null && throughPointList.size > 0) {
|
||||||
|
for (i in throughPointList.indices) {
|
||||||
|
b.include(
|
||||||
|
LatLng(
|
||||||
|
throughPointList[i].latitude,
|
||||||
|
throughPointList[i].longitude
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return b.build()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun setThroughPointIconVisibility(visible: Boolean) {
|
||||||
|
try {
|
||||||
|
throughPointMarkerVisible = visible
|
||||||
|
if (throughPointMarkerList != null
|
||||||
|
&& throughPointMarkerList.size > 0
|
||||||
|
) {
|
||||||
|
for (i in throughPointMarkerList.indices) {
|
||||||
|
throughPointMarkerList[i].isVisible = visible
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (e: Throwable) {
|
||||||
|
e.printStackTrace()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 去掉DriveLineOverlay上的线段和标记。
|
||||||
|
*/
|
||||||
|
override fun removeFromMap() {
|
||||||
|
try {
|
||||||
|
super.removeFromMap()
|
||||||
|
if (throughPointMarkerList != null
|
||||||
|
&& throughPointMarkerList.size > 0
|
||||||
|
) {
|
||||||
|
for (i in throughPointMarkerList.indices) {
|
||||||
|
throughPointMarkerList[i].remove()
|
||||||
|
}
|
||||||
|
throughPointMarkerList.clear()
|
||||||
|
}
|
||||||
|
} catch (e: Throwable) {
|
||||||
|
e.printStackTrace()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
/**
|
||||||
|
* 途径点
|
||||||
|
*/
|
||||||
|
// private void addThroughPointMarker() {
|
||||||
|
// if (this.throughPointList != null && this.throughPointList.size() > 0) {
|
||||||
|
// LatLonPoint latLonPoint = null;
|
||||||
|
// for (int i = 0; i < this.throughPointList.size(); i++) {
|
||||||
|
// latLonPoint = this.throughPointList.get(i);
|
||||||
|
// if (latLonPoint != null) {
|
||||||
|
// throughPointMarkerList.add(mAMap
|
||||||
|
// .addMarker((new MarkerOptions())
|
||||||
|
// .position(
|
||||||
|
// new LatLng(latLonPoint
|
||||||
|
// .getLatitude(), latLonPoint
|
||||||
|
// .getLongitude()))
|
||||||
|
// .visible(throughPointMarkerVisible)
|
||||||
|
// .icon(getThroughPointBitDes())
|
||||||
|
// .title("\u9014\u7ECF\u70B9")));
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
/**
|
||||||
|
* 途径点
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
// private BitmapDescriptor getThroughPointBitDes() {
|
||||||
|
// return BitmapDescriptorFactory.fromResource(R.drawable.amap_through);
|
||||||
|
//
|
||||||
|
// }
|
||||||
|
/**
|
||||||
|
* 获取两点间距离
|
||||||
|
*
|
||||||
|
* @param start
|
||||||
|
* @param end
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
fun calculateDistance(start: LatLng, end: LatLng): Int {
|
||||||
|
val x1 = start.longitude
|
||||||
|
val y1 = start.latitude
|
||||||
|
val x2 = end.longitude
|
||||||
|
val y2 = end.latitude
|
||||||
|
return calculateDistance(x1, y1, x2, y2)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun calculateDistance(x1: Double, y1: Double, x2: Double, y2: Double): Int {
|
||||||
|
var x1 = x1
|
||||||
|
var y1 = y1
|
||||||
|
var x2 = x2
|
||||||
|
var y2 = y2
|
||||||
|
val NF_pi = 0.01745329251994329 // 弧度 PI/180
|
||||||
|
x1 *= NF_pi
|
||||||
|
y1 *= NF_pi
|
||||||
|
x2 *= NF_pi
|
||||||
|
y2 *= NF_pi
|
||||||
|
val sinx1 = Math.sin(x1)
|
||||||
|
val siny1 = Math.sin(y1)
|
||||||
|
val cosx1 = Math.cos(x1)
|
||||||
|
val cosy1 = Math.cos(y1)
|
||||||
|
val sinx2 = Math.sin(x2)
|
||||||
|
val siny2 = Math.sin(y2)
|
||||||
|
val cosx2 = Math.cos(x2)
|
||||||
|
val cosy2 = Math.cos(y2)
|
||||||
|
val v1 = DoubleArray(3)
|
||||||
|
v1[0] = cosy1 * cosx1 - cosy2 * cosx2
|
||||||
|
v1[1] = cosy1 * sinx1 - cosy2 * sinx2
|
||||||
|
v1[2] = siny1 - siny2
|
||||||
|
val dist = Math.sqrt(v1[0] * v1[0] + v1[1] * v1[1] + v1[2] * v1[2])
|
||||||
|
return (Math.asin(dist / 2) * 12742001.5798544).toInt()
|
||||||
|
}
|
||||||
|
|
||||||
|
//获取指定两点之间固定距离点
|
||||||
|
fun getPointForDis(sPt: LatLng, ePt: LatLng, dis: Double): LatLng {
|
||||||
|
val lSegLength = calculateDistance(sPt, ePt).toDouble()
|
||||||
|
val preResult = dis / lSegLength
|
||||||
|
return LatLng(
|
||||||
|
(ePt.latitude - sPt.latitude) * preResult + sPt.latitude,
|
||||||
|
(ePt.longitude - sPt.longitude) * preResult + sPt.longitude
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,206 @@
|
|||||||
|
package com.dahe.gldriver.weight.overlay
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
|
import android.graphics.Bitmap
|
||||||
|
import android.graphics.Color
|
||||||
|
import com.amap.api.maps.AMap
|
||||||
|
import com.amap.api.maps.CameraUpdateFactory
|
||||||
|
import com.amap.api.maps.model.BitmapDescriptor
|
||||||
|
import com.amap.api.maps.model.BitmapDescriptorFactory
|
||||||
|
import com.amap.api.maps.model.LatLng
|
||||||
|
import com.amap.api.maps.model.LatLngBounds
|
||||||
|
import com.amap.api.maps.model.Marker
|
||||||
|
import com.amap.api.maps.model.MarkerOptions
|
||||||
|
import com.amap.api.maps.model.Polyline
|
||||||
|
import com.amap.api.maps.model.PolylineOptions
|
||||||
|
import com.dahe.gldriver.R
|
||||||
|
|
||||||
|
open class RouteOverlay(private val mContext: Context) {
|
||||||
|
protected var stationMarkers: MutableList<Marker>? = ArrayList()
|
||||||
|
protected var allPolyLines: MutableList<Polyline> = ArrayList()
|
||||||
|
protected var startMarker: Marker? = null
|
||||||
|
protected var endMarker: Marker? = null
|
||||||
|
protected var startPoint: LatLng? = null
|
||||||
|
protected var endPoint: LatLng? = null
|
||||||
|
protected var mAMap: AMap? = null
|
||||||
|
private var startBit: Bitmap? = null
|
||||||
|
private var endBit: Bitmap? = null
|
||||||
|
private var busBit: Bitmap? = null
|
||||||
|
private var walkBit: Bitmap? = null
|
||||||
|
private var driveBit: Bitmap? = null
|
||||||
|
protected var nodeIconVisible = true
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 去掉BusRouteOverlay上所有的Marker。
|
||||||
|
* @since V2.1.0
|
||||||
|
*/
|
||||||
|
open fun removeFromMap() {
|
||||||
|
if (startMarker != null) {
|
||||||
|
startMarker!!.remove()
|
||||||
|
}
|
||||||
|
if (endMarker != null) {
|
||||||
|
endMarker!!.remove()
|
||||||
|
}
|
||||||
|
for (marker in stationMarkers!!) {
|
||||||
|
marker.remove()
|
||||||
|
}
|
||||||
|
for (line in allPolyLines) {
|
||||||
|
line.remove()
|
||||||
|
}
|
||||||
|
destroyBit()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun destroyBit() {
|
||||||
|
if (startBit != null) {
|
||||||
|
startBit!!.recycle()
|
||||||
|
startBit = null
|
||||||
|
}
|
||||||
|
if (endBit != null) {
|
||||||
|
endBit!!.recycle()
|
||||||
|
endBit = null
|
||||||
|
}
|
||||||
|
if (busBit != null) {
|
||||||
|
busBit!!.recycle()
|
||||||
|
busBit = null
|
||||||
|
}
|
||||||
|
if (walkBit != null) {
|
||||||
|
walkBit!!.recycle()
|
||||||
|
walkBit = null
|
||||||
|
}
|
||||||
|
if (driveBit != null) {
|
||||||
|
driveBit!!.recycle()
|
||||||
|
driveBit = null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected val startBitmapDescriptor: BitmapDescriptor
|
||||||
|
/**
|
||||||
|
* 给起点Marker设置图标,并返回更换图标的图片。如不用默认图片,需要重写此方法。
|
||||||
|
* @return 更换的Marker图片。
|
||||||
|
* @since V2.1.0
|
||||||
|
*/
|
||||||
|
protected get() = BitmapDescriptorFactory.fromResource(R.drawable.icon_loca_load)
|
||||||
|
protected val endBitmapDescriptor: BitmapDescriptor
|
||||||
|
/**
|
||||||
|
* 给终点Marker设置图标,并返回更换图标的图片。如不用默认图片,需要重写此方法。
|
||||||
|
* @return 更换的Marker图片。
|
||||||
|
* @since V2.1.0
|
||||||
|
*/
|
||||||
|
protected get() = BitmapDescriptorFactory.fromResource(R.drawable.icon_loca_unload)
|
||||||
|
/**
|
||||||
|
* 给公交Marker设置图标,并返回更换图标的图片。如不用默认图片,需要重写此方法。
|
||||||
|
* @return 更换的Marker图片。
|
||||||
|
* @since V2.1.0
|
||||||
|
*/
|
||||||
|
// protected BitmapDescriptor getBusBitmapDescriptor() {
|
||||||
|
// return BitmapDescriptorFactory.fromResource(R.drawable.amap_bus);
|
||||||
|
// }
|
||||||
|
/**
|
||||||
|
* 给步行Marker设置图标,并返回更换图标的图片。如不用默认图片,需要重写此方法。
|
||||||
|
* @return 更换的Marker图片。
|
||||||
|
* @since V2.1.0
|
||||||
|
*/
|
||||||
|
// protected BitmapDescriptor getWalkBitmapDescriptor() {
|
||||||
|
// return BitmapDescriptorFactory.fromResource(R.drawable.amap_man);
|
||||||
|
// }
|
||||||
|
// protected BitmapDescriptor getDriveBitmapDescriptor() {
|
||||||
|
// return BitmapDescriptorFactory.fromResource(R.drawable.amap_car);
|
||||||
|
// }
|
||||||
|
protected fun addStartAndEndMarker() {
|
||||||
|
startMarker = mAMap!!.addMarker(
|
||||||
|
MarkerOptions()
|
||||||
|
.position(startPoint).icon(startBitmapDescriptor)
|
||||||
|
.title("\u8D77\u70B9")
|
||||||
|
)
|
||||||
|
// startMarker.showInfoWindow();
|
||||||
|
endMarker = mAMap!!.addMarker(
|
||||||
|
MarkerOptions().position(endPoint)
|
||||||
|
.icon(endBitmapDescriptor).title("\u7EC8\u70B9")
|
||||||
|
)
|
||||||
|
// mAMap.moveCamera(CameraUpdateFactory.newLatLngZoom(startPoint,
|
||||||
|
// getShowRouteZoom()));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 移动镜头到当前的视角。
|
||||||
|
* @since V2.1.0
|
||||||
|
*/
|
||||||
|
fun zoomToSpan() {
|
||||||
|
if (startPoint != null) {
|
||||||
|
if (mAMap == null) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
val bounds = latLngBounds
|
||||||
|
mAMap!!.animateCamera(
|
||||||
|
CameraUpdateFactory
|
||||||
|
.newLatLngBounds(bounds, 100)
|
||||||
|
)
|
||||||
|
} catch (e: Throwable) {
|
||||||
|
e.printStackTrace()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected open val latLngBounds: LatLngBounds
|
||||||
|
protected get() {
|
||||||
|
val b = LatLngBounds.builder()
|
||||||
|
b.include(LatLng(startPoint!!.latitude, startPoint!!.longitude))
|
||||||
|
b.include(LatLng(endPoint!!.latitude, endPoint!!.longitude))
|
||||||
|
return b.build()
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 路段节点图标控制显示接口。
|
||||||
|
* @param visible true为显示节点图标,false为不显示。
|
||||||
|
* @since V2.3.1
|
||||||
|
*/
|
||||||
|
fun setNodeIconVisibility(visible: Boolean) {
|
||||||
|
try {
|
||||||
|
nodeIconVisible = visible
|
||||||
|
if (stationMarkers != null && stationMarkers!!.size > 0) {
|
||||||
|
for (i in stationMarkers!!.indices) {
|
||||||
|
stationMarkers!![i].isVisible = visible
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (e: Throwable) {
|
||||||
|
e.printStackTrace()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected fun addStationMarker(options: MarkerOptions?) {
|
||||||
|
if (options == null) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
val marker = mAMap!!.addMarker(options)
|
||||||
|
if (marker != null) {
|
||||||
|
stationMarkers!!.add(marker)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected fun addPolyLine(options: PolylineOptions?) {
|
||||||
|
if (options == null) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
val polyline = mAMap!!.addPolyline(options)
|
||||||
|
if (polyline != null) {
|
||||||
|
allPolyLines.add(polyline)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected open val routeWidth: Float
|
||||||
|
protected get() = 18f
|
||||||
|
protected val walkColor: Int
|
||||||
|
protected get() = Color.parseColor("#6db74d")
|
||||||
|
protected val busColor: Int
|
||||||
|
/**
|
||||||
|
* 自定义路线颜色。
|
||||||
|
* return 自定义路线颜色。
|
||||||
|
* @since V2.2.1
|
||||||
|
*/
|
||||||
|
protected get() = Color.parseColor("#537edc")
|
||||||
|
protected val driveColor: Int
|
||||||
|
protected get() = Color.parseColor("#537edc") // protected int getShowRouteZoom() {
|
||||||
|
// return 15;
|
||||||
|
// }
|
||||||
|
}
|
BIN
app/src/main/res/drawable-xxhdpi/icon_loca_unload.png
Normal file
BIN
app/src/main/res/drawable-xxhdpi/icon_loca_unload.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 7.0 KiB |
BIN
app/src/main/res/drawable-xxhdpi/icon_roud_type.png
Normal file
BIN
app/src/main/res/drawable-xxhdpi/icon_roud_type.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.2 KiB |
@ -313,6 +313,7 @@
|
|||||||
android:textStyle="bold" />
|
android:textStyle="bold" />
|
||||||
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
|
android:id="@+id/llRoutes"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_centerVertical="true"
|
android:layout_centerVertical="true"
|
||||||
|
Loading…
Reference in New Issue
Block a user