diff --git a/app/src/main/java/com/navinfo/omqs/bean/NaviRoute.kt b/app/src/main/java/com/navinfo/omqs/bean/NaviRoute.kt index 23004845..dc1f3b72 100644 --- a/app/src/main/java/com/navinfo/omqs/bean/NaviRoute.kt +++ b/app/src/main/java/com/navinfo/omqs/bean/NaviRoute.kt @@ -16,7 +16,7 @@ data class NaviRoute( //方向 var direct: Int = 0, //道路名称 - var name: String = "", + var name: RenderEntity? = null, //路段总长 var length: Double = 0.0, //当前link在整段路径中的起点 diff --git a/app/src/main/java/com/navinfo/omqs/db/RealmOperateHelper.kt b/app/src/main/java/com/navinfo/omqs/db/RealmOperateHelper.kt index b9ba12e8..0f7f1cfe 100644 --- a/app/src/main/java/com/navinfo/omqs/db/RealmOperateHelper.kt +++ b/app/src/main/java/com/navinfo/omqs/db/RealmOperateHelper.kt @@ -200,7 +200,7 @@ class RealmOperateHelper() { var link: RenderEntity? = null val realm = getSelectTaskRealmInstance() val realmR = - getSelectTaskRealmTools(RenderEntity::class.java, true).equalTo("table", "OMDB_RD_LINK") + realm.where(RenderEntity::class.java).equalTo("table", "OMDB_RD_LINK") .equalTo("properties['${LinkTable.linkPid}']", linkPid).findFirst() if (realmR != null) { link = realm.copyFromRealm(realmR) @@ -287,14 +287,14 @@ class RealmOperateHelper() { .findAll() } else { // 查询realm中对应tile号的数据 - if(Constant.CATCH_ALL){ + if (Constant.CATCH_ALL) { realmList = getSelectTaskRealmTools(RenderEntity::class.java, false) .greaterThanOrEqualTo("tileX", xStart) .lessThanOrEqualTo("tileX", xEnd) .greaterThanOrEqualTo("tileY", yStart) .lessThanOrEqualTo("tileY", yEnd) .findAll() - }else{ + } else { realmList = getSelectTaskRealmTools(RenderEntity::class.java, false) .greaterThanOrEqualTo("tileX", xStart) .lessThanOrEqualTo("tileX", xEnd) diff --git a/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainActivity.kt b/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainActivity.kt index a8c188aa..e59700f6 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainActivity.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainActivity.kt @@ -27,6 +27,7 @@ import com.blankj.utilcode.util.ClipboardUtils import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.tabs.TabLayout import com.navinfo.collect.library.data.entity.RenderEntity +import com.navinfo.collect.library.data.entity.TaskBean import com.navinfo.collect.library.map.NIMapController import com.navinfo.collect.library.map.handler.MeasureLayerHandler import com.navinfo.omqs.Constant @@ -38,6 +39,7 @@ import com.navinfo.omqs.databinding.ActivityMainBinding import com.navinfo.omqs.http.offlinemapdownload.OfflineMapDownloadManager import com.navinfo.omqs.tools.LayerConfigUtils import com.navinfo.omqs.ui.activity.BaseActivity +import com.navinfo.omqs.ui.dialog.LoadingDialog import com.navinfo.omqs.ui.fragment.console.ConsoleFragment import com.navinfo.omqs.ui.fragment.itemlist.ItemListFragment import com.navinfo.omqs.ui.fragment.offlinemap.OfflineMapFragment @@ -47,6 +49,7 @@ import com.navinfo.omqs.ui.fragment.tasklist.TaskManagerFragment import com.navinfo.omqs.ui.other.BaseToast import com.navinfo.omqs.ui.widget.RecyclerViewSpacesItemDecoration import com.navinfo.omqs.util.FlowEventBus +import com.navinfo.omqs.util.NaviStatus import com.navinfo.omqs.util.SignUtil import com.navinfo.omqs.util.SpeakMode import dagger.hilt.android.AndroidEntryPoint @@ -66,6 +69,12 @@ class MainActivity : BaseActivity() { private lateinit var binding: ActivityMainBinding private val viewModel by viewModels() + private val loadingDialog by lazy { + MaterialAlertDialogBuilder( + this, + com.google.android.material.R.style.MaterialAlertDialog_Material3_Animation + ).setMessage("正在计算路线中...").setCancelable(false).show() + } /** * 左侧fragment @@ -280,9 +289,10 @@ class MainActivity : BaseActivity() { //道路绑定,名称变化 viewModel.liveDataRoadName.observe(this) { if (it != null) { + binding.mainActivityRoadName.visibility = View.VISIBLE binding.mainActivityRoadName.text = it.properties["name"] } else { - binding.mainActivityRoadName.text = " " + binding.mainActivityRoadName.visibility = View.INVISIBLE } } @@ -325,7 +335,7 @@ class MainActivity : BaseActivity() { 7, RoundingMode.HALF_UP ) },${BigDecimal(it.latitude).setScale(7, RoundingMode.HALF_UP)}" - if(Constant.AUTO_LOCATION){ + if (Constant.AUTO_LOCATION) { viewModel.startAutoLocationTimer() } binding.mainActivityLocation.setImageResource(R.drawable.icon_location) @@ -334,8 +344,8 @@ class MainActivity : BaseActivity() { Log.e("qj", "异常 $e") } } - viewModel.liveDataAutoLocation.observe(this){ - if(it==true){ + viewModel.liveDataAutoLocation.observe(this) { + if (it == true) { onClickLocation() } } @@ -418,6 +428,52 @@ class MainActivity : BaseActivity() { Toast.makeText(this, it, Toast.LENGTH_SHORT).show() } + viewModel.liveDataNaviStatus.observe(this) { + when (it) { + NaviStatus.NAVI_STATUS_PATH_ERROR_BLOCKED -> { + Toast.makeText( + this, + "路径不通,请检查", + Toast.LENGTH_SHORT + ).show() + if (loadingDialog.isShowing) + loadingDialog.dismiss() + } + NaviStatus.NAVI_STATUS_PATH_PLANNING -> { + if (!loadingDialog.isShowing) + loadingDialog.show() + } + NaviStatus.NAVI_STATUS_PATH_ERROR_NODE -> { + Toast.makeText( + this, + "查询link基本信息表失败(node表)", + Toast.LENGTH_SHORT + ).show() + loadingDialog.dismiss() + } + + NaviStatus.NAVI_STATUS_PATH_ERROR_DIRECTION -> { + Toast.makeText( + this, + "查询link基本信息表失败(方向表)", + Toast.LENGTH_SHORT + ).show() + loadingDialog.dismiss() + } + NaviStatus.NAVI_STATUS_PATH_SUCCESS -> { + loadingDialog.dismiss() + } + NaviStatus.NAVI_STATUS_DISTANCE_OFF -> { + Toast.makeText( + this, + "偏离路线", + Toast.LENGTH_SHORT + ).show() + } + NaviStatus.NAVI_STATUS_DIRECTION_OFF -> TODO() + } + } + viewModel.liveDataItemList.observe(this) { if (it.isNotEmpty()) { if (leftFragment == null || leftFragment !is ItemListFragment) { @@ -1102,7 +1158,7 @@ class MainActivity : BaseActivity() { * 路径规划 */ fun onClickRouteFragment() { - Toast.makeText(this, "功能开发中", Toast.LENGTH_SHORT).show() + viewModel.planningPath() } /** diff --git a/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainViewModel.kt b/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainViewModel.kt index 492a7f18..0d34ffbc 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainViewModel.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainViewModel.kt @@ -86,7 +86,7 @@ class MainViewModel @Inject constructor( private var mCameraDialog: CommonDialog? = null //路径计算 - val liveDataPlanningPathStatus = MutableLiveData() + val liveDataNaviStatus = MutableLiveData() //地图点击捕捉到的质检数据ID列表 val liveDataQsRecordIdList = MutableLiveData>() @@ -124,6 +124,7 @@ class MainViewModel @Inject constructor( */ val listDataMessage = MutableLiveData() + private var traceTag: String = "TRACE_TAG" /** @@ -201,9 +202,11 @@ class MainViewModel @Inject constructor( /** * 测量类型 */ - var measuringType: MeasureLayerHandler.MEASURE_TYPE = - MeasureLayerHandler.MEASURE_TYPE.DISTANCE + var measuringType: MeasureLayerHandler.MEASURE_TYPE = MeasureLayerHandler.MEASURE_TYPE.DISTANCE + /** + * 捕捉到的上一条link + */ var linkIdCache = "" private var lastNiLocaion: NiLocation? = null @@ -230,8 +233,8 @@ class MainViewModel @Inject constructor( //导航信息 private var naviEngine: NaviEngine? = null - //规划成功 - private var naviPathSuccess = false + // 0:不导航 1:导航 2:暂停 + private var naviEngineStatus = 0 // 定义一个互斥锁 private val naviMutex = Mutex() @@ -257,8 +260,7 @@ class MainViewModel @Inject constructor( /** * 处理点击道路捕捉回调功能 */ - mapController.mMapView.addOnNIMapClickListener( - TAG, + mapController.mMapView.addOnNIMapClickListener(TAG, //处理地图点击操作 object : OnGeoPointClickListener { override fun onMapClick(tag: String, point: GeoPoint) { @@ -283,8 +285,7 @@ class MainViewModel @Inject constructor( */ object : OnQsRecordItemClickListener { override fun onQsRecordList(tag: String, list: MutableList) { - if (tag == TAG) - liveDataQsRecordIdList.value = list + if (tag == TAG) liveDataQsRecordIdList.value = list } }, /** @@ -292,8 +293,7 @@ class MainViewModel @Inject constructor( */ object : OnTaskLinkItemClickListener { override fun onTaskLink(tag: String, taskLinkId: String) { - if (tag == TAG) - liveDataTaskLink.value = taskLinkId + if (tag == TAG) liveDataTaskLink.value = taskLinkId } }, /** @@ -301,8 +301,7 @@ class MainViewModel @Inject constructor( */ object : ONNoteItemClickListener { override fun onNote(tag: String, noteId: String) { - if (tag == TAG) - liveDataNoteId.value = noteId + if (tag == TAG) liveDataNoteId.value = noteId } }, @@ -311,11 +310,9 @@ class MainViewModel @Inject constructor( */ object : OnNiLocationItemListener { override fun onNiLocation(tag: String, index: Int, it: NiLocation) { - if (tag == TAG) - liveDataNILocationList.value = it + if (tag == TAG) liveDataNILocationList.value = it } - } - ) + }) viewModelScope.launch(Dispatchers.IO) { getTaskBean() @@ -339,26 +336,26 @@ class MainViewModel @Inject constructor( socketServer = SocketServer(mapController, traceDataBase, sharedPreferences) viewModelScope.launch(Dispatchers.Default) { -// naviTestFlow().collect { point -> -// if (naviPathSuccess) { -// naviEngine?.let { -// naviMutex.lock() -// it.bindingRoute(null, point) -// naviMutex.unlock() -// } -// } -// } + naviTestFlow().collect { point -> + if (naviEngineStatus == 1) { + naviEngine?.let { + naviMutex.lock() + it.bindingRoute(null, point) + naviMutex.unlock() + } + } + } } } -// fun naviTestFlow(): Flow = flow { -// -// while (true) { -// emit(mapController.mMapView.vtmMap.mapPosition.geoPoint) -// delay(1000) -// } -// } + fun naviTestFlow(): Flow = flow { + + while (true) { + emit(mapController.mMapView.vtmMap.mapPosition.geoPoint) + delay(1000) + } + } /** * 获取当前任务 @@ -369,55 +366,68 @@ class MainViewModel @Inject constructor( val res = realm.where(TaskBean::class.java).equalTo("id", id).findFirst() if (res != null) { currentTaskBean = realm.copyFromRealm(res) -// planningPath(currentTaskBean!!) } realm.close() } - - private fun planningPath(taskBean: TaskBean) { - if (taskBean.status == FileManager.Companion.FileDownloadStatus.DONE) { -// Toast.makeText(context, "正在计算导航路径", Toast.LENGTH_SHORT).show() - viewModelScope.launch(Dispatchers.Default) { - naviMutex.lock() - naviEngine = NaviEngine( - niMapController = mapController, + /** + * 规划路径 + */ + fun planningPath() { + viewModelScope.launch(Dispatchers.Default) { + naviMutex.lock() + getTaskBean() + if (currentTaskBean != null && currentTaskBean!!.status == FileManager.Companion.FileDownloadStatus.DONE) { + naviEngine = NaviEngine(niMapController = mapController, + realmOperateHelper = realmOperateHelper, callback = object : OnNaviEngineCallbackListener { - override fun planningPathSuccess() { - naviPathSuccess = true - listDataMessage.postValue("导航路径规划完成") + + override fun planningPathStatus(status: NaviStatus) { + when (status) { + NaviStatus.NAVI_STATUS_PATH_PLANNING -> naviEngineStatus = 0 + NaviStatus.NAVI_STATUS_PATH_ERROR_NODE -> naviEngineStatus = 0 + NaviStatus.NAVI_STATUS_PATH_ERROR_DIRECTION -> naviEngineStatus = 0 + NaviStatus.NAVI_STATUS_PATH_ERROR_BLOCKED -> naviEngineStatus = 0 + NaviStatus.NAVI_STATUS_PATH_SUCCESS -> naviEngineStatus = 1 + NaviStatus.NAVI_STATUS_DISTANCE_OFF -> { + } + NaviStatus.NAVI_STATUS_DIRECTION_OFF -> {} + } + liveDataNaviStatus.postValue(status) } - override fun planningPathError(errorCode: Int, errorMessage: String) { - naviPathSuccess = false - listDataMessage.postValue(errorMessage) - } - - override fun bindingResults(list: List) { + override suspend fun bindingResults( + route: NaviRoute?, + list: List + ) { val signList = mutableListOf() for (naviRouteItem in list) { + val signBean = SignBean( iconId = SignUtil.getSignIcon(naviRouteItem.data), iconText = SignUtil.getSignIconText(naviRouteItem.data), linkId = naviRouteItem.linkId, distance = naviRouteItem.distance, name = SignUtil.getSignNameText(naviRouteItem.data), - bottomRightText = SignUtil.getSignBottomRightText(naviRouteItem.data), + bottomRightText = SignUtil.getSignBottomRightText( + naviRouteItem.data + ), renderEntity = naviRouteItem.data, isMoreInfo = SignUtil.isMoreInfo(naviRouteItem.data), index = SignUtil.getRoadInfoIndex(naviRouteItem.data) ) signList.add(signBean) } + if (route != null) { + liveDataRoadName.postValue(route.name) + captureTopSign(route) + } liveDataSignList.postValue(signList) } }) - listDataMessage.postValue("开始导航路径规划") - naviEngine!!.planningPath(taskBean) + naviEngine!!.planningPath(currentTaskBean!!) naviMutex.unlock() } - } else { - listDataMessage.postValue("数据未安装,无法计算导航路径") } } @@ -439,8 +449,7 @@ class MainViewModel @Inject constructor( var list = mutableListOf() val realm = realmOperateHelper.getRealmDefaultInstance() realm.executeTransaction { - val objects = - realmOperateHelper.getRealmTools(QsRecordBean::class.java).findAll() + val objects = realmOperateHelper.getRealmTools(QsRecordBean::class.java).findAll() list = realm.copyFromRealm(objects) } realm.close() @@ -529,8 +538,10 @@ class MainViewModel @Inject constructor( //增加间距判断 if (lastNiLocaion != null) { disance = GeometryTools.getDistance( - location.latitude, location.longitude, - lastNiLocaion!!.latitude, lastNiLocaion!!.longitude + location.latitude, + location.longitude, + lastNiLocaion!!.latitude, + lastNiLocaion!!.longitude ) } //室内整理工具时不能进行轨迹存储,判断轨迹间隔要超过2.5并小于60米 @@ -570,18 +581,17 @@ class MainViewModel @Inject constructor( if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { val itemList = realmOperateHelper.queryElement( GeometryTools.createPoint( - point.longitude, - point.latitude + point.longitude, point.latitude ), buffer = 2.4, catchAll = false, ) //增加道路线过滤原则 val filterResult = itemList.filter { - if(isHighRoad()){ - mapController.mMapView.mapLevel>=it.zoomMin&&mapController.mMapView.mapLevel<=it.zoomMax - }else{ + if (isHighRoad()) { + mapController.mMapView.mapLevel >= it.zoomMin && mapController.mMapView.mapLevel <= it.zoomMax + } else { //关闭时过滤道路线捕捉s - mapController.mMapView.mapLevel>=it.zoomMin&&mapController.mMapView.mapLevel<=it.zoomMax&&it.code!=DataCodeEnum.OMDB_RD_LINK.code + mapController.mMapView.mapLevel >= it.zoomMin && mapController.mMapView.mapLevel <= it.zoomMax && it.code != DataCodeEnum.OMDB_RD_LINK.code } }.toList() if (filterResult.size == 1) { @@ -592,6 +602,108 @@ class MainViewModel @Inject constructor( } } + /** + * 获取道路属性 + */ + private suspend fun captureTopSign(route: NaviRoute) { + try { + captureLinkState = true + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + //看板数据 + val signList = mutableListOf() + val topSignList = mutableListOf() + mapController.lineHandler.linksLayer.clear() + if (linkIdCache != route.linkId) { + + mapController.lineHandler.showLine(route.pointList) + var elementList = realmOperateHelper.queryLinkByLinkPid(route.linkId) + for (element in elementList) { + + when (element.code) { + DataCodeEnum.OMDB_MULTI_DIGITIZED.code,//上下线分离 + DataCodeEnum.OMDB_CON_ACCESS.code,//全封闭 + -> { + val signBean = SignBean( + iconId = SignUtil.getSignIcon(element), + iconText = SignUtil.getSignIconText(element), + linkId = route.linkId, + name = SignUtil.getSignNameText(element), + bottomRightText = SignUtil.getSignBottomRightText(element), + renderEntity = element, + isMoreInfo = SignUtil.isMoreInfo(element), + index = SignUtil.getRoadInfoIndex(element) + ) + if (signBean.iconText != "") { + topSignList.add( + signBean + ) + } + } + + DataCodeEnum.OMDB_LANE_NUM.code, //车道数 + DataCodeEnum.OMDB_RD_LINK_KIND.code,//种别, + DataCodeEnum.OMDB_RD_LINK_FUNCTION_CLASS.code, // 功能等级, + DataCodeEnum.OMDB_LINK_SPEEDLIMIT.code, //线限速, + DataCodeEnum.OMDB_LINK_DIRECT.code,//道路方向, + DataCodeEnum.OMDB_RAMP.code, //匝道 + DataCodeEnum.OMDB_BRIDGE.code,//桥 + DataCodeEnum.OMDB_TUNNEL.code,//隧道 + DataCodeEnum.OMDB_ROUNDABOUT.code,//环岛 + DataCodeEnum.OMDB_LINK_ATTRIBUTE_MAIN_SIDE_ACCESS.code,//出入口 + DataCodeEnum.OMDB_LINK_ATTRIBUTE_FORNTAGE.code,//辅路 + DataCodeEnum.OMDB_LINK_ATTRIBUTE_SA.code,//SA + DataCodeEnum.OMDB_LINK_ATTRIBUTE_PA.code,//PA + DataCodeEnum.OMDB_LINK_FORM1_1.code, + DataCodeEnum.OMDB_LINK_FORM1_2.code, + DataCodeEnum.OMDB_LINK_FORM1_3.code, + DataCodeEnum.OMDB_LINK_FORM2_1.code, + DataCodeEnum.OMDB_LINK_FORM2_2.code, + DataCodeEnum.OMDB_LINK_FORM2_3.code, + DataCodeEnum.OMDB_LINK_FORM2_4.code, + DataCodeEnum.OMDB_LINK_FORM2_5.code, + DataCodeEnum.OMDB_LINK_FORM2_6.code, + DataCodeEnum.OMDB_LINK_FORM2_7.code, + DataCodeEnum.OMDB_LINK_FORM2_8.code, + DataCodeEnum.OMDB_LINK_FORM2_9.code, + DataCodeEnum.OMDB_LINK_FORM2_10.code, + DataCodeEnum.OMDB_LINK_FORM2_11.code, + DataCodeEnum.OMDB_LINK_FORM2_12.code, + DataCodeEnum.OMDB_LINK_FORM2_13.code, + DataCodeEnum.OMDB_VIADUCT.code, + -> { + val signBean = SignBean( + iconId = SignUtil.getSignIcon(element), + iconText = SignUtil.getSignIconText(element), + linkId = route.linkId, + name = SignUtil.getSignNameText(element), + bottomRightText = SignUtil.getSignBottomRightText(element), + renderEntity = element, + isMoreInfo = SignUtil.isMoreInfo(element), + index = SignUtil.getRoadInfoIndex(element) + ) + topSignList.add( + signBean + ) + } + } + } + + liveDataTopSignList.postValue(topSignList.distinctBy { it.name } + .sortedBy { it.index }) + + val speechText = SignUtil.getRoadSpeechText(topSignList) + withContext(Dispatchers.Main) { + speakMode?.speakText(speechText) + } + linkIdCache = route.linkId ?: "" + } + } + } catch (e: Exception) { + + } + } + /** * 捕获道路和面板 */ @@ -616,22 +728,18 @@ class MainViewModel @Inject constructor( var hisRoadName = false if (linkList.isNotEmpty()) { + val link = linkList[0] + val linkId = link.properties[RenderEntity.Companion.LinkTable.linkPid] //看板数据 val signList = mutableListOf() val topSignList = mutableListOf() mapController.lineHandler.linksLayer.clear() - - val link = linkList[0] - - val linkId = link.properties[RenderEntity.Companion.LinkTable.linkPid] - if (linkIdCache != linkId) { mapController.lineHandler.showLine(link.geometry) linkId?.let { var elementList = realmOperateHelper.queryLinkByLinkPid(it) for (element in elementList) { - if (element.code == DataCodeEnum.OMDB_LINK_NAME.code) { hisRoadName = true liveDataRoadName.postValue(element) @@ -693,7 +801,6 @@ class MainViewModel @Inject constructor( -> topSignList.add( signBean ) - DataCodeEnum.OMDB_SPEEDLIMIT.code,//常规点限速 DataCodeEnum.OMDB_SPEEDLIMIT_COND.code,//条件点限速 DataCodeEnum.OMDB_SPEEDLIMIT_VAR.code,//可变点限速 @@ -702,40 +809,34 @@ class MainViewModel @Inject constructor( DataCodeEnum.OMDB_LANEINFO.code,//车信 DataCodeEnum.OMDB_WARNINGSIGN.code,//危险信息 DataCodeEnum.OMDB_TOLLGATE.code,//收费站 - -> signList.add( - signBean - ) + -> { + signList.add( + signBean + ) + } } } val realm = realmOperateHelper.getSelectTaskRealmInstance() - val entityList = - realmOperateHelper.getSelectTaskRealmTools( - RenderEntity::class.java, - true - ) - .and() - .equalTo("table", DataCodeEnum.OMDB_RESTRICTION.name) - .and() - .equalTo( - "properties['linkIn']", it - ).findAll() + val entityList = realmOperateHelper.getSelectTaskRealmTools( + RenderEntity::class.java, true + ).and().equalTo("table", DataCodeEnum.OMDB_RESTRICTION.name).and() + .equalTo( + "properties['linkIn']", it + ).findAll() if (entityList.isNotEmpty()) { val outList = entityList.distinct() for (i in outList.indices) { val outLink = outList[i].properties["linkOut"] - val linkOutEntity = - realmOperateHelper.getSelectTaskRealmTools( - RenderEntity::class.java, - true - ) - .equalTo("table", DataCodeEnum.OMDB_RD_LINK.name).and() - .equalTo( - "properties['${RenderEntity.Companion.LinkTable.linkPid}']", - outLink - ).findFirst() + val linkOutEntity = realmOperateHelper.getSelectTaskRealmTools( + RenderEntity::class.java, true + ).equalTo("table", DataCodeEnum.OMDB_RD_LINK.name).and() + .equalTo( + "properties['${RenderEntity.Companion.LinkTable.linkPid}']", + outLink + ).findFirst() if (linkOutEntity != null) { mapController.lineHandler.linksLayer.addLine( linkOutEntity.geometry, 0x7DFF0000 @@ -743,8 +844,7 @@ class MainViewModel @Inject constructor( } } mapController.lineHandler.linksLayer.addLine( - link.geometry, - Color.BLUE + link.geometry, Color.BLUE ) realm.close() } @@ -785,7 +885,6 @@ class MainViewModel @Inject constructor( mapPosition.setBearing(0f) // 锁定角度,自动将地图旋转到正北方向 mapController.mMapView.vtmMap.setMapPosition(mapPosition) mapController.locationLayerHandler.animateToCurrentPosition() - planningPath(currentTaskBean!!) } /** @@ -794,7 +893,7 @@ class MainViewModel @Inject constructor( fun onClickMenu() { menuState = !menuState liveDataMenuState.postValue(menuState) - naviEngine!!.bindingRoute(null, mapController.mMapView.vtmMap.mapPosition.geoPoint) +// naviEngine!!.bindingRoute(null, mapController.mMapView.vtmMap.mapPosition.geoPoint) } override fun onCleared() { @@ -955,6 +1054,11 @@ class MainViewModel @Inject constructor( linkIdCache = "" mapController.lineHandler.removeLine() liveDataSignList.value = mutableListOf() + if (bSelectRoad && naviEngineStatus == 1) { + naviEngineStatus = 2 + } else if (naviEngineStatus == 2) { + naviEngineStatus = 1 + } } /** @@ -1044,9 +1148,7 @@ class MainViewModel @Inject constructor( } fun sendServerCommand( - context: Context, - traceVideoBean: TraceVideoBean, - indoorToolsCommand: IndoorToolsCommand + context: Context, traceVideoBean: TraceVideoBean, indoorToolsCommand: IndoorToolsCommand ) { if (TextUtils.isEmpty(Constant.INDOOR_IP)) { @@ -1060,8 +1162,7 @@ class MainViewModel @Inject constructor( val url = "http://${Constant.INDOOR_IP}:8080/sensor/service/${traceVideoBean.command}?" when (val result = networkService.sendServerCommand( - url = url, - traceVideoBean = traceVideoBean + url = url, traceVideoBean = traceVideoBean )) { is NetResult.Success<*> -> { @@ -1074,9 +1175,7 @@ class MainViewModel @Inject constructor( withContext(Dispatchers.Main) { Toast.makeText( - context, - "命令成功。", - Toast.LENGTH_LONG + context, "命令成功。", Toast.LENGTH_LONG ).show() liveIndoorToolsResp.postValue(IndoorToolsResp.QR_CODE_STATUS_UPDATE_VIDEO_INFO_SUCCESS) @@ -1086,8 +1185,7 @@ class MainViewModel @Inject constructor( //启动双向控制服务 if (socketServer != null && socketServer!!.isServerClose) { socketServer!!.connect( - Constant.INDOOR_IP, - this@MainViewModel + Constant.INDOOR_IP, this@MainViewModel ) } @@ -1098,8 +1196,7 @@ class MainViewModel @Inject constructor( context, "命令无效${defaultUserResponse.errmsg}", Toast.LENGTH_SHORT - ) - .show() + ).show() } liveIndoorToolsResp.postValue(IndoorToolsResp.QR_CODE_STATUS_UPDATE_VIDEO_INFO_FAILURE) } @@ -1107,9 +1204,7 @@ class MainViewModel @Inject constructor( } catch (e: IOException) { withContext(Dispatchers.Main) { Toast.makeText( - context, - "${e.message}", - Toast.LENGTH_SHORT + context, "${e.message}", Toast.LENGTH_SHORT ).show() } } @@ -1119,11 +1214,8 @@ class MainViewModel @Inject constructor( is NetResult.Error<*> -> { withContext(Dispatchers.Main) { Toast.makeText( - context, - "${result.exception.message}", - Toast.LENGTH_SHORT - ) - .show() + context, "${result.exception.message}", Toast.LENGTH_SHORT + ).show() } liveIndoorToolsResp.postValue(IndoorToolsResp.QR_CODE_STATUS_UPDATE_VIDEO_INFO_FAILURE) } @@ -1131,11 +1223,8 @@ class MainViewModel @Inject constructor( is NetResult.Failure<*> -> { withContext(Dispatchers.Main) { Toast.makeText( - context, - "${result.code}:${result.msg}", - Toast.LENGTH_SHORT - ) - .show() + context, "${result.code}:${result.msg}", Toast.LENGTH_SHORT + ).show() } liveIndoorToolsResp.postValue(IndoorToolsResp.QR_CODE_STATUS_UPDATE_VIDEO_INFO_FAILURE) } @@ -1158,8 +1247,7 @@ class MainViewModel @Inject constructor( if (niLocation != null) { mapController.markerHandle.addMarker( GeoPoint( - niLocation.latitude, - niLocation.longitude + niLocation.latitude, niLocation.longitude ), traceTag, "", niLocation as java.lang.Object ) } @@ -1197,9 +1285,7 @@ class MainViewModel @Inject constructor( override fun onConnect(success: Boolean) { if (!success && socketServer != null) { BaseToast.makeText( - mapController.mMapView.context, - "轨迹反向控制服务失败,请确认连接是否正常!", - Toast.LENGTH_SHORT + mapController.mMapView.context, "轨迹反向控制服务失败,请确认连接是否正常!", Toast.LENGTH_SHORT ).show() } } @@ -1228,9 +1314,7 @@ class MainViewModel @Inject constructor( Log.e("qj", "反向控制$currentIndexNiLocation") } else { BaseToast.makeText( - mapController.mMapView.context, - "没有找到对应轨迹点!", - Toast.LENGTH_SHORT + mapController.mMapView.context, "没有找到对应轨迹点!", Toast.LENGTH_SHORT ).show() } } @@ -1274,8 +1358,7 @@ class MainViewModel @Inject constructor( startTimer() } } else { - Toast.makeText(mapController.mMapView.context, "无数据了!", Toast.LENGTH_LONG) - .show() + Toast.makeText(mapController.mMapView.context, "无数据了!", Toast.LENGTH_LONG).show() cancelTrace() } } @@ -1292,13 +1375,13 @@ class MainViewModel @Inject constructor( /** * 开启自动定位 */ - fun startAutoLocationTimer(){ + fun startAutoLocationTimer() { if (autoLocationTimer != null) { cancelAutoLocation() } autoLocationTimer = fixedRateTimer("", false, disAutoLocationTime, disAutoLocationTime) { liveDataAutoLocation.postValue(true) - Log.e("qj","自动定位开始执行") + Log.e("qj", "自动定位开始执行") startAutoLocationTimer() } } @@ -1371,9 +1454,7 @@ class MainViewModel @Inject constructor( } else { withContext(Dispatchers.Main) { Toast.makeText( - mapController.mMapView.context, - "未查询到数据", - Toast.LENGTH_SHORT + mapController.mMapView.context, "未查询到数据", Toast.LENGTH_SHORT ).show() } } @@ -1396,9 +1477,7 @@ class MainViewModel @Inject constructor( } else { withContext(Dispatchers.Main) { Toast.makeText( - mapController.mMapView.context, - "未查询到数据", - Toast.LENGTH_SHORT + mapController.mMapView.context, "未查询到数据", Toast.LENGTH_SHORT ).show() } } @@ -1415,9 +1494,7 @@ class MainViewModel @Inject constructor( dialog.dismiss() } else { Toast.makeText( - mapController.mMapView.context, - "输入格式不正确", - Toast.LENGTH_SHORT + mapController.mMapView.context, "输入格式不正确", Toast.LENGTH_SHORT ).show() } } diff --git a/app/src/main/java/com/navinfo/omqs/ui/activity/map/SignAdapter.kt b/app/src/main/java/com/navinfo/omqs/ui/activity/map/SignAdapter.kt index f8023e57..a12f81a1 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/activity/map/SignAdapter.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/activity/map/SignAdapter.kt @@ -79,6 +79,7 @@ class SignAdapter(private var listener: OnSignAdapterClickListener?) : val bd = holder.viewBinding if (item.iconId != 0) { + bd.signMainIconBg.visibility = View.VISIBLE if (item.renderEntity.code == DataCodeEnum.OMDB_WARNINGSIGN.code) { try { var typeCode = "${item.iconId}" @@ -110,6 +111,8 @@ class SignAdapter(private var listener: OnSignAdapterClickListener?) : } else { bd.signMainIconBg.setImageResource(item.iconId) } + }else{ + bd.signMainIconBg.visibility = View.INVISIBLE } bd.signMainIcon.text = item.iconText @@ -144,7 +147,7 @@ class SignAdapter(private var listener: OnSignAdapterClickListener?) : val bd = holder.viewBinding bd.signMoreIconsLayout.removeAllViews() bd.signBottomText.text = item.name - bd.signBottomRightText.text = item.distance.toString() + bd.signBottomRightText.text = "${item.distance}米" val list = SignUtil.getLineInfoIcons(item.renderEntity) val lineViewS = View(context) lineViewS.layoutParams = ViewGroup.LayoutParams(24, 80) @@ -216,13 +219,13 @@ class SignAdapter(private var listener: OnSignAdapterClickListener?) : holder.tag = item.name + position } - override fun refreshData(newData: List) { - super.refreshData(newData) - for (i in newData.indices) { - if (selectMoreInfoTag == newData[i].name + i) { - return - } - } - } +// override fun refreshData(newData: List) { +// super.refreshData(newData) +//// ?这是要干嘛 for (i in newData.indices) { +//// if (selectMoreInfoTag == newData[i].name + i) { +//// return +//// } +//// } +// } } \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListAdapter.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListAdapter.kt index 3467b7f3..ccc564c4 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListAdapter.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListAdapter.kt @@ -152,6 +152,7 @@ class TaskListAdapter( if (taskBean.status == FileDownloadStatus.DONE) { binding.taskDownloadBtn.visibility = View.INVISIBLE binding.taskUploadBtn.visibility = View.VISIBLE + } else { binding.taskDownloadBtn.visibility = View.VISIBLE binding.taskUploadBtn.visibility = View.INVISIBLE diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListFragment.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListFragment.kt index ff2d30cd..2c390aef 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListFragment.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListFragment.kt @@ -7,6 +7,7 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.Toast +import androidx.fragment.app.activityViewModels import androidx.recyclerview.widget.LinearLayoutManager import androidx.swiperefreshlayout.widget.SwipeRefreshLayout import com.navinfo.omqs.R @@ -14,6 +15,8 @@ import com.navinfo.omqs.databinding.FragmentTaskListBinding import com.navinfo.omqs.http.taskdownload.TaskDownloadManager import com.navinfo.omqs.http.taskupload.TaskUploadManager import com.navinfo.omqs.tools.FileManager +import com.navinfo.omqs.ui.activity.map.MainActivity +import com.navinfo.omqs.ui.activity.map.MainViewModel import com.navinfo.omqs.ui.fragment.BaseFragment import com.navinfo.omqs.ui.other.shareViewModels import com.yanzhenjie.recyclerview.SwipeMenuCreator @@ -58,9 +61,6 @@ class TaskListFragment : BaseFragment() { Toast.makeText(context, "正在校验", Toast.LENGTH_SHORT).show() viewModel.checkUploadTask(binding.root.context, taskBean) } - else -> { - - } } } } diff --git a/app/src/main/java/com/navinfo/omqs/util/NaviEngine.kt b/app/src/main/java/com/navinfo/omqs/util/NaviEngine.kt index 178c1735..e3e10f4f 100644 --- a/app/src/main/java/com/navinfo/omqs/util/NaviEngine.kt +++ b/app/src/main/java/com/navinfo/omqs/util/NaviEngine.kt @@ -9,43 +9,70 @@ import com.navinfo.collect.library.map.NIMapController import com.navinfo.collect.library.utils.GeometryTools import com.navinfo.omqs.bean.NaviRoute import com.navinfo.omqs.bean.NaviRouteItem +import com.navinfo.omqs.db.RealmOperateHelper import io.realm.Realm -import io.realm.RealmQuery import org.locationtech.jts.geom.LineString import org.locationtech.jts.geom.Point import org.oscim.core.GeoPoint public interface OnNaviEngineCallbackListener { - fun planningPathSuccess() - fun planningPathError(errorCode: Int, errorMessage: String) - fun bindingResults(list: List) + fun planningPathStatus(code: NaviStatus) + + // fun planningPathError(errorCode: NaviStatus, errorMessage: String) + suspend fun bindingResults(route: NaviRoute?, list: List) +} + +enum class NaviStatus { + NAVI_STATUS_PATH_PLANNING, //路径规划中 + NAVI_STATUS_PATH_ERROR_NODE,//node点缺失 + NAVI_STATUS_PATH_ERROR_DIRECTION,//缺少方向 + NAVI_STATUS_PATH_ERROR_BLOCKED,//路径不通 + NAVI_STATUS_PATH_SUCCESS,//路径规划成功 + NAVI_STATUS_DISTANCE_OFF,//距离偏离 + NAVI_STATUS_DIRECTION_OFF,//方向偏离 } -class NaviEngine(val niMapController: NIMapController, val callback: OnNaviEngineCallbackListener) { +class NaviEngine( + private val niMapController: NIMapController, + private val realmOperateHelper: RealmOperateHelper, + val callback: OnNaviEngineCallbackListener +) { - - private val QUERY_KEY_LIST = arrayOf( + /** + * 要查询的要素列表 + */ + private val QUERY_KEY_ITEM_LIST = arrayOf( + DataCodeEnum.OMDB_ELECTRONICEYE.name, DataCodeEnum.OMDB_SPEEDLIMIT.name, DataCodeEnum.OMDB_SPEEDLIMIT_COND.name, DataCodeEnum.OMDB_SPEEDLIMIT_VAR.name, DataCodeEnum.OMDB_TRAFFICLIGHT.name, - DataCodeEnum.OMDB_RESTRICTION.name, +// DataCodeEnum.OMDB_RESTRICTION.name, DataCodeEnum.OMDB_LANEINFO.name, DataCodeEnum.OMDB_TRAFFIC_SIGN.name, DataCodeEnum.OMDB_WARNINGSIGN.name, DataCodeEnum.OMDB_TOLLGATE.name ) + /** + * 要查询的link基本信息列表 + */ + private val QUERY_KEY_LINK_INFO_LIST = arrayOf( + DataCodeEnum.OMDB_RD_LINK.name, + DataCodeEnum.OMDB_LINK_DIRECT.name, + DataCodeEnum.OMDB_LINK_NAME.name, + ) + /** * 偏离距离 单位:米 */ - private val DEVIATION_DISTANCE = 150000 + private val DEVIATION_DISTANCE = 15 /** * 偏离次数上限 */ - private val DEVIATION_COUNT = 3 + private val DEVIATION_COUNT = 5 /** * 局部匹配时,走过的路段还记录100米 @@ -107,6 +134,7 @@ class NaviEngine(val niMapController: NIMapController, val callback: OnNaviEngin */ var tempRoutList = mutableListOf() + /** * 所有路段集合 */ @@ -149,9 +177,9 @@ class NaviEngine(val niMapController: NIMapController, val callback: OnNaviEngin * 计算路径 */ suspend fun planningPath(taskBean: TaskBean) { - + callback.planningPathStatus(NaviStatus.NAVI_STATUS_PATH_PLANNING) val pathList = mutableListOf() - val realm = Realm.getDefaultInstance() + val realm = realmOperateHelper.getSelectTaskRealmInstance() for (link in taskBean.hadLinkDvoList) { //测线不参与导航 if (link.linkStatus == 3) { @@ -162,37 +190,55 @@ class NaviEngine(val niMapController: NIMapController, val callback: OnNaviEngin ) route.pointList = GeometryTools.getGeoPoints(link.geometry) - //查询每条link的snode,enode - val res1 = realm.where(RenderEntity::class.java) - .equalTo("table", DataCodeEnum.OMDB_RD_LINK.name).and() - .equalTo("properties['linkPid']", link.linkPid).findFirst() - res1?.let { - val snodePid = it.properties["snodePid"] - if (snodePid != null) { - route.sNode = snodePid - } - val enodePid = it.properties["enodePid"] - if (enodePid != null) { - route.eNode = enodePid + val res = realm.where(RenderEntity::class.java).`in`("table", QUERY_KEY_LINK_INFO_LIST) + .equalTo("properties['linkPid']", link.linkPid).findAll() + var bHasNode = false + var bHasDir = false + var bHasName = false + if (res != null) { + for (entity in res) { + when (entity.code) { + DataCodeEnum.OMDB_RD_LINK.code -> { + bHasNode = true + val snodePid = entity.properties["snodePid"] + if (snodePid != null) { + route.sNode = snodePid + } else { + bHasNode = false + } + val enodePid = entity.properties["enodePid"] + if (enodePid != null) { + route.eNode = enodePid + } else { + bHasNode = false + } + } + DataCodeEnum.OMDB_LINK_DIRECT.code -> { + val direct = entity.properties["direct"] + if (direct != null) { + bHasDir = true + route.direct = direct.toInt() + } + } + DataCodeEnum.OMDB_LINK_NAME.code -> { + bHasName = true + route.name = realm.copyFromRealm(entity) + } + } } } - //查询每条link的方向 - val res2 = realm.where(RenderEntity::class.java) - .equalTo("table", DataCodeEnum.OMDB_LINK_DIRECT.name).and() - .equalTo("properties['linkPid']", link.linkPid).findFirst() - res2?.let { - val direct = it.properties["direct"] - if (direct != null) { - route.direct = direct.toInt() - } + if (!bHasNode) { + callback.planningPathStatus( + NaviStatus.NAVI_STATUS_PATH_ERROR_NODE + ) + return } - //查询每条link的名称 - val res3 = realm.where(RenderEntity::class.java) - .equalTo("table", DataCodeEnum.OMDB_LINK_NAME.name).and() - .equalTo("properties['linkPid']", link.linkPid).findFirst() - res3?.let { - route.name = "${it.properties["name"]}" + if (!bHasDir) { + callback.planningPathStatus( + NaviStatus.NAVI_STATUS_PATH_ERROR_DIRECTION + ) + return } pathList.add(route) } @@ -269,7 +315,9 @@ class NaviEngine(val niMapController: NIMapController, val callback: OnNaviEngin } else { if (!bHasLast && !bHasNext) { bBreak = false - callback.planningPathError(1, "路径不连通!") + callback.planningPathStatus( + NaviStatus.NAVI_STATUS_PATH_ERROR_BLOCKED + ) realm.close() return } @@ -279,83 +327,20 @@ class NaviEngine(val niMapController: NIMapController, val callback: OnNaviEngin val itemMap: MutableMap> = mutableMapOf() //查询每根link上的关联要素 for (route in newRouteList) { + itemMap.clear() //常规点限速 - var res = realm.where(RenderEntity::class.java) + val res = realm.where(RenderEntity::class.java) .equalTo("properties['linkPid']", route.linkId).and().`in`( "table", - QUERY_KEY_LIST + QUERY_KEY_ITEM_LIST ).findAll() - if (res != null) { - Log.e("jingo", "道路查询预警要素 ${route.linkId} ${res.size}条数据") + if (res.isNotEmpty()) { +// Log.e("jingo", "道路查询预警要素 ${route.linkId} ${res.size}条数据") for (r in res) { - Log.e("jingo", "道路查询预警要素 ${r.name}") +// Log.e("jingo", "道路查询预警要素 ${r.name}") insertItemToRoute(realm, route, r, itemMap) } } -// //条件点限速 -// res = realm.where(RenderEntity::class.java) -// .equalTo("table", DataCodeEnum.OMDB_SPEEDLIMIT_COND.name).and() -// .equalTo("properties['linkPid']", route.linkId).findAll() -// if(res != null){ -// for(r in res) -// insertItemToRoute(realm, route, r, itemMap) -// } -// //可变点限速 -// res = realm.where(RenderEntity::class.java) -// .equalTo("table", DataCodeEnum.OMDB_SPEEDLIMIT_VAR.name).and() -// .equalTo("properties['linkPid']", route.linkId).findAll() -// if(res != null){ -// for(r in res) -// insertItemToRoute(realm, route, r, itemMap) -// } -// //交通灯 -// res = realm.where(RenderEntity::class.java) -// .equalTo("table", DataCodeEnum.OMDB_TRAFFICLIGHT.name).and() -// .equalTo("properties['linkPid']", route.linkId).findAll() -// if(res != null){ -// for(r in res) -// insertItemToRoute(realm, route, r, itemMap) -// } -// //普通交限 -// res = realm.where(RenderEntity::class.java) -// .equalTo("table", DataCodeEnum.OMDB_RESTRICTION.name).and() -// .equalTo("properties['linkPid']", route.linkId).findAll() -// if(res != null){ -// for(r in res) -// insertItemToRoute(realm, route, r, itemMap) -// } -// //车信 -// res = realm.where(RenderEntity::class.java) -// .equalTo("table", DataCodeEnum.OMDB_LANEINFO.name).and() -// .equalTo("properties['linkPid']", route.linkId).findAll() -// if(res != null){ -// for(r in res) -// insertItemToRoute(realm, route, r, itemMap) -// } -// //交通标牌 -// res = realm.where(RenderEntity::class.java) -// .equalTo("table", DataCodeEnum.OMDB_TRAFFIC_SIGN.name).and() -// .equalTo("properties['linkPid']", route.linkId).findAll() -// if(res != null){ -// for(r in res) -// insertItemToRoute(realm, route, r, itemMap) -// } -// //警示信息 -// res = realm.where(RenderEntity::class.java) -// .equalTo("table", DataCodeEnum.OMDB_WARNINGSIGN.name).and() -// .equalTo("properties['linkPid']", route.linkId).findAll() -// if(res != null){ -// for(r in res) -// insertItemToRoute(realm, route, r, itemMap) -// } -// //OMDB_TOLLGATE -// res = realm.where(RenderEntity::class.java) -// .equalTo("table", DataCodeEnum.OMDB_TOLLGATE.name).and() -// .equalTo("properties['linkPid']", route.linkId).findAll() -// if(res != null){ -// for(r in res) -// insertItemToRoute(realm, route, r, itemMap) -// } //对路径上的要素进行排序 if (itemMap.isNotEmpty()) { route.itemList = mutableListOf() @@ -367,6 +352,7 @@ class NaviEngine(val niMapController: NIMapController, val callback: OnNaviEngin val naviRouteItem = NaviRouteItem(i, item, route.linkId) route.itemList!!.add(naviRouteItem) } + itemMap.remove(point) } } route.itemList!!.sortBy { it.index } @@ -374,8 +360,8 @@ class NaviEngine(val niMapController: NIMapController, val callback: OnNaviEngin } realm.close() routeList = newRouteList - callback.planningPathSuccess() - niMapController.lineHandler.showLine(geometry!!.toText()) + callback.planningPathStatus(NaviStatus.NAVI_STATUS_PATH_SUCCESS) + } /** @@ -399,7 +385,8 @@ class NaviEngine(val niMapController: NIMapController, val callback: OnNaviEngin val point = GeoPoint( footAndDistance.getCoordinate(0).y, footAndDistance.getCoordinate(0).x ) - niMapController.markerHandle.addMarker(point, res.id, res.name) + //测试marker +// niMapController.markerHandle.addMarker(point, res.id, res.name) route.pointList.add(footAndDistance.footIndex + 1, point) if (itemMap.containsKey(point)) { itemMap[point]!!.add(realm.copyFromRealm(res)) @@ -421,7 +408,7 @@ class NaviEngine(val niMapController: NIMapController, val callback: OnNaviEngin /** * 绑定道路 */ - fun bindingRoute(location: NiLocation?, point: GeoPoint) { + suspend fun bindingRoute(location: NiLocation?, point: GeoPoint) { if (geometry != null) { //还没有绑定到路径的时候 if (routeIndex < 0) { @@ -430,33 +417,31 @@ class NaviEngine(val niMapController: NIMapController, val callback: OnNaviEngin //定位点到垂足距离不超过30米 if (pointPairDistance.getMeterDistance() < DEVIATION_DISTANCE) { footIndex = pointPairDistance.footIndex - Log.e( - "jingo", - "当前绑定到了整条路线的第 $footIndex 点 ${pointPairDistance.getMeterDistance()} " - ) +// Log.e( +// "jingo", +// "当前绑定到了整条路线的第 ${footIndex} 点 ${pointPairDistance.getMeterDistance()} " +// ) val lastRouteIndex = routeIndex for (i in routeList.indices) { val route = routeList[i] if (route.startIndexInPath <= footIndex && route.endIndexIntPath >= footIndex) { routeIndex = route.indexInPath - Log.e( - "jingo", - "当前绑定到了整条路线id ${route.linkId} " - ) - niMapController.lineHandler.showLine(route.pointList) +// Log.e( +// "jingo", +// "当前绑定到了整条路线id ${route.linkId} " +// ) +// niMapController.lineHandler.showLine(route.pointList) footPoint = GeoPoint( pointPairDistance.getCoordinate(0).y, pointPairDistance.getCoordinate(0).x ) - val listPoint = mutableListOf(point, footPoint!!) - niMapController.lineHandler.showLine( - listPoint - ) - +// val listPoint = mutableListOf(point, footPoint!!) +// niMapController.lineHandler.showLine( +// listPoint +// ) if (lastRouteIndex != routeIndex) { createTempPath() } - matchingItem() errorCount = 0 break } @@ -470,31 +455,30 @@ class NaviEngine(val niMapController: NIMapController, val callback: OnNaviEngin //定位点到垂足距离不超过30米 if (pointPairDistance.getMeterDistance() < DEVIATION_DISTANCE) { footIndex = pointPairDistance.footIndex + tempRoutList[0].startIndexInPath - Log.e("jingo", "局部 当前绑定到了整条路线的第 $footIndex 点") +// Log.e("jingo", "局部 当前绑定到了整条路线的第 $footIndex 点") val lastRouteIndex = routeIndex for (i in tempRoutList.indices) { val route = tempRoutList[i] if (route.startIndexInPath <= footIndex && route.endIndexIntPath >= footIndex) { routeIndex = route.indexInPath - Log.e( - "jingo", - "局部 当前绑定到了整条路线id ${route.linkId} " - ) - niMapController.lineHandler.showLine(route.pointList) +// Log.e( +// "jingo", +// "局部 当前绑定到了整条路线id ${route.linkId} " +// ) +// niMapController.lineHandler.showLine(route.pointList) footPoint = GeoPoint( pointPairDistance.getCoordinate(0).y, pointPairDistance.getCoordinate(0).x ) - val listPoint = mutableListOf(point, footPoint!!) - niMapController.lineHandler.showLine( - listPoint - ) - +// val listPoint = mutableListOf(point, footPoint!!) +// niMapController.lineHandler.showLine( +// listPoint +// ) + matchingItem() if (lastRouteIndex != routeIndex) { createTempPath() } - matchingItem() errorCount = 0 break } @@ -510,31 +494,43 @@ class NaviEngine(val niMapController: NIMapController, val callback: OnNaviEngin * 匹配要素 * @point:定位点 */ - private fun matchingItem() { + private suspend fun matchingItem() { + if (routeIndex > -1 && tempRoutList.isNotEmpty() && tempGeometry != null) { + Log.e("jingo", "当前${routeIndex} ${tempRoutList[0].startIndexInPath} $footIndex") //道路前方一定距离范围内的要素信息 val bindingItemList = mutableListOf() - //临时局部路径的游标对应整条路径的游标 - val tempFootIndex = footIndex + tempRoutList[0].startIndexInPath //定位点到要素的路径距离 var distance = 0.0 //计算要素路径距离的点集合 val disPoints = mutableListOf(footPoint!!) //下一个要素的起点游标 - var tempIndex = footIndex + 1 - for(route in tempRoutList) { - if( route.indexInPath < routeIndex) + var tempIndex = footIndex - tempRoutList[0].startIndexInPath + 1 + var currentRoute: NaviRoute? = null + for (route in tempRoutList) { +// if (route.itemList != null) { +// Log.e("jingo", "${route.linkId}我有${route.itemList!!.size}个要素 ") +// } + if (route.indexInPath < routeIndex) continue + if (route.indexInPath == routeIndex) { + currentRoute = route + } if (route.itemList != null && route.itemList!!.isNotEmpty()) { for (naviItem in route.itemList!!) { - if (naviItem.index > tempFootIndex) { +// Log.e( +// "jingo", +// "我是:${naviItem.data.name} 我的点位 ${naviItem.index} 垂足点位 $footIndex" +// ) + if (naviItem.index > footIndex) { val rightI = naviItem.index - tempRoutList[0].startIndexInPath + 1 for (i in tempIndex until rightI) { val geo = tempGeometry!!.coordinates[i] disPoints.add(GeoPoint(geo.y, geo.x)) } - tempIndex = rightI + tempIndex = rightI + 1 distance = GeometryTools.getDistance(disPoints) +// Log.e("jingo", "我的距离${distance} 下一个${tempIndex} 位置${rightI}") if (distance < FARTHEST_DISPLAY_DISTANCE && distance > -1) { naviItem.distance = distance.toInt() bindingItemList.add(naviItem) @@ -543,12 +539,12 @@ class NaviEngine(val niMapController: NIMapController, val callback: OnNaviEngin } } } - if(distance >= FARTHEST_DISPLAY_DISTANCE){ + if (distance >= FARTHEST_DISPLAY_DISTANCE) { break } } } - callback.bindingResults(bindingItemList) + callback.bindingResults(currentRoute, bindingItemList) } } @@ -601,6 +597,7 @@ class NaviEngine(val niMapController: NIMapController, val callback: OnNaviEngin private fun deviationUp() { errorCount++ if (errorCount >= DEVIATION_COUNT) { + callback.planningPathStatus(NaviStatus.NAVI_STATUS_DISTANCE_OFF) bindingReset() } } diff --git a/vtm b/vtm index d31e10f1..39b9993b 160000 --- a/vtm +++ b/vtm @@ -1 +1 @@ -Subproject commit d31e10f1483d49ecec361b79497394c9b7983687 +Subproject commit 39b9993b1cc5257d11c872161812ffe890e44bd9