Commit 3ebc9c25 authored by p x's avatar p x
Browse files

添加在线地图网联车

parent a0061ae5
......@@ -39,6 +39,9 @@
android:supportsRtl="true"
android:theme="@style/Theme.MapMultiEngine"
tools:targetApi="31">
<activity
android:name=".ui.OnLineMapActivity"
android:exported="false" />
<activity
android:name=".ui.ControlActivity"
android:exported="false" />
......
......@@ -14,6 +14,7 @@ import com.sd.demo.ui.ChangeMapCenterAct
import com.sd.demo.ui.ControlActivity
import com.sd.demo.ui.DisplayMapActivity
import com.sd.demo.ui.GestureDemo
import com.sd.demo.ui.OnLineMapActivity
import com.sd.demo.ui.PartRoadActivity
import com.sd.demo.ui.TCircelActivity
import com.sd.demo.ui.TDriveRouteActivity
......@@ -71,9 +72,10 @@ class MainActivity : AppCompatActivity() {
DemoDetails("加载wms", WmsActivity::class.java),
DemoDetails("驾车路线规划(导航)", TDriveRouteActivity::class.java),
DemoDetails("测试业务类相关", null),
DemoDetails("局部地图", PartRoadActivity::class.java),
// DemoDetails("加载局部地图", null),
DemoDetails("高精地图", THighMapActivity::class.java),
DemoDetails("在线地图", OnLineMapActivity::class.java),
// DemoDetails("业务相关", null),
// DemoDetails("在线地图显示小车", ShowCarOnlineActivity::class.java),
......@@ -152,6 +154,4 @@ class MainActivity : AppCompatActivity() {
}
}
\ No newline at end of file
package com.sd.demo.ui
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.lifecycleScope
import com.google.gson.Gson
import com.sd.api.maps.MSCalcuMapUtil
import com.sd.api.maps.MethodAdv
import com.sd.api.maps.cdata.MSLatLng
import com.sd.api.scenario.CucsVehicle
import com.sd.api.scenario.VehicleModel
import com.sd.api.scenario.VehiclePos
import com.sd.api.ui.MapMultiView.OnMapReadyLis
import com.sd.api.ui.MapReadyView
import com.sd.demo.bean.mock.MRoutes
import com.sd.demo.databinding.ActivityOnLineMapBinding
import com.sd.demo.ui.PartRoadActivity
import com.sd.demo.utils.FileIoUtils
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import kotlin.coroutines.cancellation.CancellationException
import kotlin.math.absoluteValue
//测试在线地图业务
class OnLineMapActivity : AppCompatActivity() {
private lateinit var binding: ActivityOnLineMapBinding
var mapReadView: MapReadyView? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityOnLineMapBinding.inflate(layoutInflater)
setContentView(binding.root)
binding.mapMultiView.addMapRenderCallback(object : OnMapReadyLis {
override fun onMapReady(mapReadyView: MapReadyView) {
this@OnLineMapActivity.mapReadView = mapReadyView
}
})
setListener()
}
private fun setListener() {
binding.bt1.setOnClickListener {
// //移动网联车
mockFzLine()
}
}
fun mockFzLine() {
lifecycleScope.launch {
try {
var gson = Gson()
var str = FileIoUtils.getAsset(this@OnLineMapActivity, "mock/Car_fangzhen1.txt")
//获取车辆位姿
val mRoutes = gson.fromJson<MRoutes>(str, MRoutes::class.java)
var head = 0.0
var oldHead = 0.0
mRoutes.rs.forEachIndexed { index, it ->
// println("---------it[0] = ${it[0]} it[1] = ${it[1]} index = ${index}")
if (index > 0) {
var p1 = mRoutes.rs.get(index - 1)
var pc = mRoutes.rs.get(index)
head = MSCalcuMapUtil.calculateBearing(
MSLatLng(p1[1], p1[0]),
MSLatLng(pc[1], pc[0])
)
VehiclePos.instance.apply {
lat = pc[1]
lng = pc[0]
if ((head - oldHead).absoluteValue < 45) {
heading = head
}
}
CucsVehicle.moveCar(VehiclePos.instance, 3)
MethodAdv.setMapCenter(VehiclePos.instance.lat, VehiclePos.instance.lng)
oldHead = head
delay(600)
}
}
} catch (e: CancellationException) {
}
}
}
}
\ No newline at end of file
......@@ -149,16 +149,6 @@ class PartRoadActivity : AppCompatActivity() {
// evel = 20.80189
}
// RoadPos.instance.apply {
// lat = it[1]
// lng = it[0]
// if ((head - oldHead).absoluteValue < 45) {
// bearing = head.toFloat()
// }
// // println("-----bearing = ${bearing}")
// //高程
//// altitude = 20.802828
// }
CucsVehicle.moveCar(VehiclePos.instance, 2)
//更新车辆位置.主车是否添加回调
// MsParkRoad.updateMainCar(RoadPos.instance, object : OnPrAddCar {
......
......@@ -6,7 +6,7 @@ import androidx.lifecycle.lifecycleScope
import com.google.gson.Gson
import com.sd.api.highmap.AllLine
import com.sd.api.highmap.CarNavPath
import com.sd.api.highmap.HighMapApi
import com.sd.api.highmap.HighMap
import com.sd.api.highmap.UnityPtc
import com.sd.api.highmap.WarnPtc
import com.sd.api.maps.MSCalcuMapUtil
......@@ -41,7 +41,7 @@ class THighMapActivity : AppCompatActivity() {
override fun onMapReady(mapReadyView: MapReadyView) {
this@THighMapActivity.mapReadView = mapReadyView
//传入3d tile加载地图 1= 亦庄示范区
HighMapApi.setTileInit(1)
HighMap.setTileInit(1)
}
})
......@@ -71,6 +71,7 @@ class THighMapActivity : AppCompatActivity() {
var carNavPath = CarNavPath().apply {
this.lines = lines
}
//设置全局路径
CucsVehicle.setCarNaiPath(carNavPath)
//模拟车辆移动
var head = 0.0
......@@ -94,6 +95,9 @@ class THighMapActivity : AppCompatActivity() {
evel = 20.80189
}
}
if (index>10){
CucsVehicle.clearCarNaiPath()
}
// HighMapApi.setCarPosition(head, it[1], it[0], 20.80189)
CucsVehicle.moveCar(VehiclePos.instance, 1)
oldHead = head
......@@ -125,7 +129,7 @@ class THighMapActivity : AppCompatActivity() {
heading = it.heading
}
}
HighMapApi.setPtcData(pres)
HighMap.setPtcData(pres)
delay(1000)
}
......@@ -152,10 +156,10 @@ class THighMapActivity : AppCompatActivity() {
isRed = true
}
var warns = listOf(warnPtc)
HighMapApi.setWarnPtc(warns)
HighMap.setWarnPtc(warns)
delay(5000)
warnPtc.isRed = false
HighMapApi.setWarnPtc(warns)
HighMap.setWarnPtc(warns)
}
toggleCircleRadar(2)
}
......@@ -165,12 +169,12 @@ class THighMapActivity : AppCompatActivity() {
* @param dirent 0=关闭 1=左前 2=正前 3=右前 4=右后 5=正后 6=左后
* */
fun toggleCircleRadar(dirent: Int) {
HighMapApi.setCarBottomCircle(true)
HighMapApi.setCarRadarDirection(dirent)
HighMap.setCarBottomCircle(true)
HighMap.setCarRadarDirection(dirent)
lifecycleScope.launch {
delay(5000)
HighMapApi.setCarBottomCircle(false)
HighMapApi.setCarRadarDirection(0)
HighMap.setCarBottomCircle(false)
HighMap.setCarRadarDirection(0)
}
}
......
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<Button
android:id="@+id/bt1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="车辆移动" />
</LinearLayout>
<com.sd.api.ui.MapMultiView
android:id="@+id/mapMultiView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
\ No newline at end of file
......@@ -8,9 +8,9 @@ import com.unity3d.player.UnityPlayer
/**
* 四维高精地图Api
* 四维高精地图操作
*/
object HighMapApi :MsOperationParent() {
object HighMap :MsOperationParent() {
private var gson = Gson()
......
......@@ -65,6 +65,19 @@ object MSNavi {
}
}
/**结束导航**/
fun endNavi() {
when (MSDKInitializer.getMapType()) {
MAP_TYPE.MINE -> {
}
MAP_TYPE.AMAP -> {
}
}
}
fun startSimNavi(
mapReadView: MapReadyView?,
......
......@@ -131,6 +131,14 @@ class AmapRoutePlans {
}
/***删除路径*/
fun deleteRoute() {
if (routeOverlay != null) {
routeOverlay?.removeFromMap()
routeOverlay = null
}
}
// private fun drawRoutes(
// routeId: Int,
// path: AMapNaviPath,
......
......@@ -113,8 +113,6 @@ object MineNai {
context?.startActivity(inten)
}
//是否正在导航
private var mIsInNavigation = false
/**
* 直接使用RouteBase开启导航
......@@ -132,12 +130,10 @@ object MineNai {
// mNaviSession?.addMineNaviListener(myMineNaviListener)
val starPoint = Tools.latLngToPoint(LatLng(mStartPoint.lat, mStartPoint.lng))
drawNavingCar(starPoint)
mIsInNavigation = true
mNaviSession?.takeRoute(routeBase)
}
fun stopNavi() {
mIsInNavigation = false
mNaviSession?.removeRoute()
}
......
......@@ -16,6 +16,7 @@ import com.minedata.minenavi.util.Tools
import com.sd.api.bean.DriverRouteBean
import com.sd.api.bean.WayPoi
import com.sd.api.intfaces.MyMineNaviListener
import com.sd.api.maps.MsOperationParent
import com.sd.api.maps.cdata.MSLatLng
import com.sd.api.maps.inters.OnDriveRoute
import com.sd.api.ui.MapReadyView
......@@ -152,6 +153,13 @@ object MineRoutePlans {
// mapReadView?.mMineMap?.setElevation(0f)
}
/***删除路径*/
fun deleteRoute() {
if (mRoute != null) {
mapReadView?.mMineMap?.removeOverlay(mRoute)
mRoute = null
}
}
// /**自定义驾车路线返回*/
// interface OnDriveRoute {
......
package com.sd.api.scenario
import androidx.lifecycle.viewModelScope
import com.minedata.minenavi.mapdal.LatLng
import com.sd.api.highmap.CarNavPath
import com.sd.api.highmap.HighMapApi
import com.sd.api.highmap.HighMap
import com.sd.api.highmap.HighPos
import com.sd.api.parkroad.MsParkRoad
import com.sd.api.parkroad.RoadPos
import com.sd.api.utils.SmoothMoveUtils
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
......@@ -14,36 +17,111 @@ object CucsVehicle {
private var stopCar = false
//动画是否开始
private var isAniStart = false
//前一次位置
private var fromLoc: VehiclePos? = null
//当前位置
private var cvPos: VehiclePos? = null
//保存上一次位置的时间
private var oldTime = 0L
//2次定位的时间差,默认1000毫秒
private var vehTimeDiff = 1000L
/**
* 移动车辆
* @param carPos 车辆位置
* @param moveType 1=高精地图 2= 局部地图 -1=两者都包括
* @param vPos 车辆位置
* @param moveType 1=高精地图 2= 局部地图 3=在线地图
*/
fun moveCar(vehiclePos: VehiclePos, moveType: Int) {
fun moveCar(vPos: VehiclePos, moveType: Int) {
cvPos = vPos
var highPos = HighPos.instance.apply {
heading = vehiclePos.heading
lat = vehiclePos.lat
lon = vehiclePos.lng
evel = vehiclePos.evel
heading = vPos.heading
lat = vPos.lat
lon = vPos.lng
evel = vPos.evel
}
var roadPos = RoadPos.instance.apply {
lat = vehiclePos.lat
lng = vehiclePos.lng
bearing = vehiclePos.heading.toFloat()
lat = vPos.lat
lng = vPos.lng
bearing = vPos.heading.toFloat()
}
if (moveType == 1) {
HighMapApi.setCarPosition(highPos)
HighMap.setCarPosition(highPos)
} else if (moveType == 2) {
MsParkRoad.updateMainCar(roadPos, null)
} else if (moveType == -1) {
} else if (moveType == 3) {
if (fromLoc == null || fromLoc?.lng == 0.0) {
setFromMyLoc(vPos)//设置起始位置
}
//计算2次定位时间差
calTimeDiff()
if (isAniStart == false) {
isAniStart = true
SmoothMoveUtils.startSmoothMove(
LatLng(fromLoc!!.lat, fromLoc!!.lng),
LatLng(vPos.lat, vPos.lng),
vehTimeDiff,
sCarSmooth
)
}
}
}
//在线地图主车平滑移动
private var sCarSmooth = object : SmoothMoveUtils.OnPositionUpdateListener {
override fun onUpdate(
iLatLng: LatLng,
bearing: Float
) {
//在线地图主车平滑移动
VehicleModel.upMyLocCarModel(
iLatLng.latitude,
iLatLng.longitude,
cvPos?.heading?.toFloat() ?: 0f
)
}
override fun onFinish() {
// println("--------------动画完成")
setFromMyLoc(cvPos!!)
isAniStart = false
}
}
//计算2次拿到车辆定位的时间差
fun calTimeDiff() {
CoroutineScope(Dispatchers.Default).launch {
HighMapApi.setCarPosition(highPos)
MsParkRoad.updateMainCar(roadPos, null)
if (oldTime != 0L) {
vehTimeDiff = System.currentTimeMillis() - oldTime
// println("-------定位时间差 = ${vehTimeDiff}")
}
oldTime = System.currentTimeMillis()
}
}
//设置前一个点
private fun setFromMyLoc(myloc: VehiclePos) {
if (fromLoc == null) {
fromLoc = VehiclePos()
}
fromLoc!!.run {
this.lat = myloc.lat
this.lng = myloc.lng
this.heading = myloc.heading
this.evel = myloc.evel
}
}
/**
* 停止车辆移动
*/
fun stopCar() {
stopCar = true
}
......@@ -54,7 +132,7 @@ object CucsVehicle {
* @param carNavPath
*/
fun setCarNaiPath(carNavPath: CarNavPath) {
HighMapApi.setCarNavPath(carNavPath)
HighMap.setCarNavPath(carNavPath)
}
/**
......@@ -62,7 +140,7 @@ object CucsVehicle {
*/
fun clearCarNaiPath() {
var carNavPath = CarNavPath()
HighMapApi.setCarNavPath(carNavPath)
HighMap.setCarNavPath(carNavPath)
}
}
\ No newline at end of file
package com.sd.api.scenario
import android.util.Log
import androidx.lifecycle.viewModelScope
import com.minedata.minenavi.map.Model
import com.minedata.minenavi.map.ModelOptions
import com.minedata.minenavi.map.Overlay
import com.minedata.minenavi.mapdal.LatLng
import com.sd.api.MAP_TYPE
import com.sd.api.MSDKInitializer
import com.sd.api.UserCtx
import com.sd.api.maps.MsOperationParent
import com.sd.api.utils.FileIoUtils
import com.unity3d.player.UnityPlayer
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import java.io.File
import java.io.IOException
/**网联车模型**/
object VehicleModel : MsOperationParent() {
//在线地图用户当前位置模型
private var mainCarMo: Model? = null
//主车obj模型
private var objPath = ""
//在线地图小车是否加载完毕
private var loadAddCar = false
/****加载主车特斯拉模型***/
suspend fun loadMainCar() {
var context = UserCtx.instance.mContext
// CoroutineScope(Dispatchers.IO).launch {
try {
var parentFileDir = File(context?.filesDir, "models/car_model")
if (!parentFileDir.exists())
parentFileDir.mkdirs()
objPath = FileIoUtils.assetFilePath(context!!, "models/car_model/gszh_xyz.obj")
// Log.d("-----", "✅ OBJ文件复制成功: " + objPath)
var path = FileIoUtils.assetFilePath(context, "models/car_model/gszh_xyz.mtl")
// Log.d("-----", "✅ 纹理文件复制成功: " + path)
path = FileIoUtils.assetFilePath(context, "models/car_model/Binary_0.jpeg")
// Log.d("-----", "✅ 材质文件复制成功: " + path)
} catch (e: IOException) {
e.printStackTrace()
}
// }
}
/****更新模型位置**/
fun upMyLocCarModel(
lat: Double,
lng: Double,
heading: Float
) {
when (MSDKInitializer.getMapType()) {
MAP_TYPE.MINE -> {
CoroutineScope(Dispatchers.Default).launch {
loadMainCar()
if (!loadAddCar) {
loadAddCar= true
addMyLocCarModel(lat, lng, heading)
}
var cHeading = 0f - 180f - heading
mainCarMo?.setPosition(LatLng(lat, lng))
mainCarMo?.setHeading(cHeading)
}
}
MAP_TYPE.AMAP -> {
}
}
}
/****添加我的定位小车模型
* 这小车模型航向角0是冲下的
* ***/
suspend fun addMyLocCarModel(
lat: Double,
lng: Double,
heading: Float
) {
when (MSDKInitializer.getMapType()) {
MAP_TYPE.MINE -> {
if (objPath.isEmpty() || lat == 0.0 || lng == 0.0)
return
if (mainCarMo != null)
return
var mMineMap = getMapReadView()?.mMineMap
// 模型文件相对路径
var modelOptions = ModelOptions()
.objFile(objPath)
.position(LatLng(lat, lng))
.layer(Overlay.Layer.aboveMarker)
.heading(heading)
.keepScaleSize(8f) // 保持尺寸的比例尺
.scaleFactor(0.007f) // 缩放因子
.visible(true)
mainCarMo = mMineMap?.addModel(modelOptions)
}
MAP_TYPE.AMAP -> {
}
}
}
//删除互联网地图上的车模型
fun deleteMyLocModel() {
if (mainCarMo != null) {
var mMineMap = getMapReadView()?.mMineMap
mMineMap?.removeOverlay(mainCarMo)
mainCarMo = null
}
}
}
\ No newline at end of file
......@@ -35,7 +35,7 @@ public class SmoothMoveUtils {
animator.setDuration(durationMillis);
animator.setInterpolator(new LinearInterpolator());
float bearing = calculateBearing(from, to);
// float bearing = calculateBearing(from, to);
animator.addUpdateListener(animation -> {
float fraction = (float) animation.getAnimatedValue();
......@@ -44,7 +44,7 @@ public class SmoothMoveUtils {
double lng = from.longitude + (to.longitude - from.longitude) * fraction;
LatLng interpolated = new LatLng(lat, lng);
listener.onUpdate(interpolated, bearing); // 实时位置 + 朝向角
listener.onUpdate(interpolated, 0); // 实时位置 + 朝向角
});
animator.addListener(new AnimatorListenerAdapter() {
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment