diff --git a/app/src/main/java/com/navinfo/omqs/Constant.kt b/app/src/main/java/com/navinfo/omqs/Constant.kt index 27fb6278..f67ca0a6 100644 --- a/app/src/main/java/com/navinfo/omqs/Constant.kt +++ b/app/src/main/java/com/navinfo/omqs/Constant.kt @@ -55,7 +55,7 @@ class Constant { /** * 室内整理工具IP */ - lateinit var INDOOR_IP: String + var INDOOR_IP: String = "" const val DEBUG = true 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 9602f8d2..f2e296c2 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 @@ -106,6 +106,7 @@ class MainActivity : BaseActivity() { } //点击详细信息 + @RequiresApi(Build.VERSION_CODES.N) override fun onMoreInfoClick(selectTag: String, tag: String, signBean: SignBean) { viewModel.showSignMoreInfo(signBean.renderEntity) val fragment = @@ -146,7 +147,7 @@ class MainActivity : BaseActivity() { } - @RequiresApi(Build.VERSION_CODES.M) + @RequiresApi(Build.VERSION_CODES.N) override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -175,7 +176,7 @@ class MainActivity : BaseActivity() { //给xml传递viewModel对象 binding.viewModel = viewModel - binding.mainActivityVoice.setOnTouchListener { v, event -> + binding.mainActivityVoice.setOnTouchListener { v, event -> when (event?.action) { MotionEvent.ACTION_DOWN -> { voiceOnTouchStart()//Do Something @@ -225,7 +226,9 @@ class MainActivity : BaseActivity() { //捕捉列表变化回调 viewModel.liveDataNILocationList.observe(this) { - Toast.makeText(this,"轨迹被点击了",Toast.LENGTH_LONG).show() + if(viewModel.isSelectTrace()){ + Toast.makeText(this,"轨迹被点击了",Toast.LENGTH_LONG).show() + } } //右上角菜单是否被点击 @@ -372,7 +375,7 @@ class MainActivity : BaseActivity() { mapController.mMapView.onPause() } - @RequiresApi(Build.VERSION_CODES.M) + @RequiresApi(Build.VERSION_CODES.N) override fun onDestroy() { super.onDestroy() viewModel.speakMode?.shutdown() @@ -403,7 +406,7 @@ class MainActivity : BaseActivity() { /** * 打开相机预览 */ - @RequiresApi(Build.VERSION_CODES.M) + @RequiresApi(Build.VERSION_CODES.N) fun openCamera() { //显示轨迹图层 viewModel.onClickCameraButton(this) @@ -412,7 +415,7 @@ class MainActivity : BaseActivity() { /** * 开关菜单 */ - @RequiresApi(Build.VERSION_CODES.M) + @RequiresApi(Build.VERSION_CODES.N) fun onClickMenu() { //显示菜单图层 viewModel.onClickMenu() @@ -520,11 +523,82 @@ class MainActivity : BaseActivity() { /** * 点击线选择 */ + @RequiresApi(Build.VERSION_CODES.N) fun selectLineOnclick() { viewModel.setSelectRoad(!viewModel.isSelectRoad()) binding.mainActivitySelectLine.isSelected = viewModel.isSelectRoad() } + /** + * 点击线选择 + */ + @RequiresApi(Build.VERSION_CODES.N) + fun tracePointsOnclick() { + viewModel.setSelectTrace(!viewModel.isSelectTrace()) + if(viewModel.isSelectTrace()){ + Toast.makeText(this,"请选择轨迹点!",Toast.LENGTH_LONG).show() + } + binding.mainActivityTraceSnapshotPoints.isSelected = viewModel.isSelectTrace() + } + + /** + * 点击结束轨迹操作 + */ + @RequiresApi(Build.VERSION_CODES.N) + fun finishTraceOnclick() { + setIndoorGroupEnable(false) + viewModel.setSelectTrace(false) + viewModel.setMediaFlag(false) + viewModel.setSelectPauseTrace(false) + binding.mainActivityTraceSnapshotPoints.isSelected = viewModel.isSelectTrace() + binding.mainActivitySnapshotMediaFlag.isSelected = viewModel.isMediaFlag() + binding.mainActivitySnapshotPause.isSelected = viewModel.isSelectPauseTrace() + } + + /** + * 点击结束轨迹操作 + */ + @RequiresApi(Build.VERSION_CODES.N) + fun mediaFlagOnclick() { + viewModel.setMediaFlag(!viewModel.isMediaFlag()) + binding.mainActivitySnapshotMediaFlag.isSelected = viewModel.isMediaFlag() + } + + /** + * 点击上一个轨迹点播放操作 + */ + @RequiresApi(Build.VERSION_CODES.N) + fun rewindTraceOnclick() { + pasePlayTrace() + } + + /** + * 点击暂停播放轨迹操作 + */ + @RequiresApi(Build.VERSION_CODES.N) + fun pauseTraceOnclick() { + viewModel.setSelectPauseTrace(!viewModel.isSelectPauseTrace()) + binding.mainActivitySnapshotPause.isSelected = viewModel.isSelectPauseTrace() + viewModel.setSelectTrace(false) + binding.mainActivityTraceSnapshotPoints.isSelected = viewModel.isSelectTrace() + } + + /** + * 点击下一个轨迹点 + */ + @RequiresApi(Build.VERSION_CODES.N) + fun nextTraceOnclick() { + pasePlayTrace() + } + + @RequiresApi(Build.VERSION_CODES.N) + fun pasePlayTrace() { + viewModel.setSelectTrace(false) + binding.mainActivityTraceSnapshotPoints.isSelected = viewModel.isSelectTrace() + viewModel.setSelectPauseTrace(false) + binding.mainActivitySnapshotPause.isSelected = viewModel.isSelectPauseTrace() + } + /** * 打开或关闭底部导航栏 @@ -548,7 +622,7 @@ class MainActivity : BaseActivity() { .animateTo(GeoPoint( mapController.mMapView.vtmMap.mapPosition.geoPoint.latitude,mapController.mMapView.vtmMap.mapPosition.geoPoint.longitude)) } - @RequiresApi(Build.VERSION_CODES.M) + @RequiresApi(Build.VERSION_CODES.N) private fun voiceOnTouchStart() { viewModel.startSoundMetter(this, binding.mainActivityVoice) } @@ -606,6 +680,20 @@ class MainActivity : BaseActivity() { */ fun showIndoorDataLayout() { binding.mainActivityMenuIndoorGroup.visibility = View.VISIBLE + if(Constant.INDOOR_IP.isNotEmpty()){ + setIndoorGroupEnable(true) + }else{ + setIndoorGroupEnable(false) + } + } + + private fun setIndoorGroupEnable(enable: Boolean){ + binding.mainActivitySnapshotFinish.isEnabled = enable + binding.mainActivityTraceSnapshotPoints.isEnabled = enable + binding.mainActivitySnapshotMediaFlag.isEnabled = enable + binding.mainActivitySnapshotRewind.isEnabled = enable + binding.mainActivitySnapshotPause.isEnabled = enable + binding.mainActivitySnapshotNext.isEnabled = enable } /** @@ -638,7 +726,7 @@ class MainActivity : BaseActivity() { /** * 打开道路名称属性看板,选择的道路在viewmodel里记录,不用 */ - @RequiresApi(Build.VERSION_CODES.M) + @RequiresApi(Build.VERSION_CODES.N) fun openRoadNameFragment() { if (viewModel.liveDataRoadName.value != null) { viewModel.showSignMoreInfo(viewModel.liveDataRoadName.value!!) 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 7ceac270..39421580 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 @@ -63,6 +63,7 @@ import javax.inject.Inject * 创建Activity全局viewmode */ +@RequiresApi(Build.VERSION_CODES.N) @HiltViewModel class MainViewModel @Inject constructor( private val mapController: NIMapController, @@ -113,6 +114,7 @@ class MainViewModel @Inject constructor( var menuState: Boolean = false + var captureLinkState: Boolean = false val liveDataMenuState = MutableLiveData() @@ -123,6 +125,21 @@ class MainViewModel @Inject constructor( */ private var bSelectRoad = false + /** + * 是不是选择轨迹点 + */ + private var bSelectTrace = false + + /** + * 是不是选择标题标识 + */ + private var isMediaFlag = false + + /** + * 是不是暂停 + */ + private var bSelectPauseTrace = false + private var linkIdCache = "" private var lastNiLocaion: NiLocation? = null @@ -158,11 +175,11 @@ class MainViewModel @Inject constructor( mapController.onMapClickFlow.collectLatest { // testPoint = it //线选择状态 - if (bSelectRoad) { +/* if (bSelectRoad) { captureLink(it) } else { captureItem(it) - } + }*/ } } viewModelScope.launch(Dispatchers.IO) { @@ -235,59 +252,64 @@ class MainViewModel @Inject constructor( /** * 初始化定位信息 */ + @RequiresApi(Build.VERSION_CODES.N) private fun initLocation() { //用于定位点存储到数据库 viewModelScope.launch(Dispatchers.Default) { mapController.locationLayerHandler.niLocationFlow.collect { location -> - val geometry = GeometryTools.createGeometry( - GeoPoint( - location.latitude, location.longitude + + //过滤掉无效点 + if(!GeometryTools.isCheckError(location.longitude,location.latitude)){ + val geometry = GeometryTools.createGeometry( + GeoPoint( + location.latitude, location.longitude + ) ) - ) - val tileX = RealmSet() - GeometryToolsKt.getTileXByGeometry(geometry.toString(), tileX) - val tileY = RealmSet() - GeometryToolsKt.getTileYByGeometry(geometry.toString(), tileY) + val tileX = RealmSet() + GeometryToolsKt.getTileXByGeometry(geometry.toString(), tileX) + val tileY = RealmSet() + GeometryToolsKt.getTileYByGeometry(geometry.toString(), tileY) - //遍历存储tile对应的x与y的值 - tileX.forEach { x -> - tileY.forEach { y -> - location.tilex = x - location.tiley = y + //遍历存储tile对应的x与y的值 + tileX.forEach { x -> + tileY.forEach { y -> + location.tilex = x + location.tiley = y + } } - } - location.groupId = uuid - try { - location.timeStamp = DateTimeUtil.getTime(location.time).toString() - } catch (e: Exception) { + location.groupId = uuid + try { + location.timeStamp = DateTimeUtil.getTime(location.time).toString() + } catch (e: Exception) { - } - val id = sharedPreferences.getInt(Constant.SELECT_TASK_ID, -1) - location.taskId = id.toString() - //增加间距判断 - if (lastNiLocaion != null) { - val disance = GeometryTools.getDistance( - location.latitude, location.longitude, - lastNiLocaion!!.latitude, lastNiLocaion!!.longitude) - //相距差距大于2.5米以上进行存储 - if (disance > 2.5) { + } + val id = sharedPreferences.getInt(Constant.SELECT_TASK_ID, -1) + location.taskId = id.toString() + //增加间距判断 + if (lastNiLocaion != null) { + val disance = GeometryTools.getDistance( + location.latitude, location.longitude, + lastNiLocaion!!.latitude, lastNiLocaion!!.longitude) + //相距差距大于2.5米以上进行存储 + if (disance > 2.5) { + traceDataBase.niLocationDao.insert(location) +/* mapController.markerHandle.addNiLocationMarkerItem(location) + mapController.mMapView.vtmMap.updateMap(true)*/ + lastNiLocaion = location + } + } else { traceDataBase.niLocationDao.insert(location) - mapController.markerHandle.addNiLocationMarkerItem(location) - mapController.mMapView.vtmMap.updateMap(true) +/* mapController.markerHandle.addNiLocationMarkerItem(location) + mapController.mMapView.vtmMap.updateMap(true)*/ + lastNiLocaion = location } - } else { - traceDataBase.niLocationDao.insert(location) - mapController.markerHandle.addNiLocationMarkerItem(location) - mapController.mMapView.vtmMap.updateMap(true) } - - lastNiLocaion = location } } //用于定位点捕捉道路 viewModelScope.launch(Dispatchers.Default) { mapController.locationLayerHandler.niLocationFlow.collectLatest { location -> - if (!isSelectRoad()) captureLink( + if (!isSelectRoad()&&!GeometryTools.isCheckError(location.longitude,location.latitude)) captureLink( GeoPoint( location.latitude, location.longitude @@ -311,101 +333,114 @@ class MainViewModel @Inject constructor( /** * 捕获道路和面板 */ + @RequiresApi(Build.VERSION_CODES.N) private suspend fun captureLink(point: GeoPoint) { - - val linkList = realmOperateHelper.queryLink( - point = point, - ) - var hisRoadName = false - if (linkList.isNotEmpty()) { - //看板数据 - 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 == 2011) { - hisRoadName = true - liveDataRoadName.postValue(element) - continue - } - - val distance = GeometryTools.distanceToDouble( - point, GeometryTools.createGeoPoint(element.geometry) - ) - - val signBean = SignBean( - iconId = SignUtil.getSignIcon(element), - iconText = SignUtil.getSignIconText(element), - distance = distance.toInt(), - linkId = linkId, - name = SignUtil.getSignNameText(element), - bottomRightText = SignUtil.getSignBottomRightText(element), - renderEntity = element, - isMoreInfo = SignUtil.isMoreInfo(element), - index = SignUtil.getRoadInfoIndex(element) - ) - Log.e("jingo", "捕捉到的数据code ${element.code}") - when (element.code) { - //车道数,种别,功能等级,线限速,道路方向 - 2041, 2008, 2002, 2019, 2010 -> topSignList.add( - signBean - ) - - 4002, 4003, 4004, 4010, 4022, 4601 -> signList.add( - signBean - ) - } - - } - - val realm = Realm.getDefaultInstance() - val entity = realm.where(RenderEntity::class.java) - .equalTo("table", "OMDB_RESTRICTION").and().equalTo( - "properties['linkIn']", it - ).findFirst() - if (entity != null) { - val outLink = entity.properties["linkOut"] - val linkOutEntity = realm.where(RenderEntity::class.java) - .equalTo("table", "OMDB_RD_LINK").and().equalTo( - "properties['${RenderEntity.Companion.LinkTable.linkPid}']", - outLink - ).findFirst() - if (linkOutEntity != null) { - mapController.lineHandler.linksLayer.addLine( - linkOutEntity.geometry, 0x7DFF0000 - ) - } - } - } - - liveDataTopSignList.postValue(topSignList.distinctBy { it.name } - .sortedBy { it.index }) - - liveDataSignList.postValue(signList.sortedBy { it.distance }) - val speechText = SignUtil.getRoadSpeechText(topSignList) - withContext(Dispatchers.Main) { - speakMode?.speakText(speechText) - } - linkIdCache = linkId ?: "" - } - } else { - mapController.lineHandler.removeLine() - linkIdCache = "" + if(captureLinkState){ + return } - //如果没有捕捉到道路名 - if (!hisRoadName) { - liveDataRoadName.postValue(null) + + try{ + captureLinkState = true + + val linkList = realmOperateHelper.queryLink( + point = point, + ) + var hisRoadName = false + if (linkList.isNotEmpty()) { + //看板数据 + 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 == 2011) { + hisRoadName = true + liveDataRoadName.postValue(element) + continue + } + + val distance = GeometryTools.distanceToDouble( + point, GeometryTools.createGeoPoint(element.geometry) + ) + + val signBean = SignBean( + iconId = SignUtil.getSignIcon(element), + iconText = SignUtil.getSignIconText(element), + distance = distance.toInt(), + linkId = linkId, + name = SignUtil.getSignNameText(element), + bottomRightText = SignUtil.getSignBottomRightText(element), + renderEntity = element, + isMoreInfo = SignUtil.isMoreInfo(element), + index = SignUtil.getRoadInfoIndex(element) + ) + Log.e("jingo", "捕捉到的数据code ${element.code}") + when (element.code) { + //车道数,种别,功能等级,线限速,道路方向 + 2041, 2008, 2002, 2019, 2010 -> topSignList.add( + signBean + ) + + 4002, 4003, 4004, 4010, 4022, 4601 -> signList.add( + signBean + ) + } + + } + + val realm = Realm.getDefaultInstance() + val entity = realm.where(RenderEntity::class.java) + .equalTo("table", "OMDB_RESTRICTION").and().equalTo( + "properties['linkIn']", it + ).findFirst() + if (entity != null) { + val outLink = entity.properties["linkOut"] + val linkOutEntity = realm.where(RenderEntity::class.java) + .equalTo("table", "OMDB_RD_LINK").and().equalTo( + "properties['${RenderEntity.Companion.LinkTable.linkPid}']", + outLink + ).findFirst() + if (linkOutEntity != null) { + mapController.lineHandler.linksLayer.addLine( + linkOutEntity.geometry, 0x7DFF0000 + ) + } + } + } + + liveDataTopSignList.postValue(topSignList.distinctBy { it.name } + .sortedBy { it.index }) + + liveDataSignList.postValue(signList.sortedBy { it.distance }) + val speechText = SignUtil.getRoadSpeechText(topSignList) + withContext(Dispatchers.Main) { + speakMode?.speakText(speechText) + } + linkIdCache = linkId ?: "" + } + } else { + mapController.lineHandler.removeLine() + linkIdCache = "" + } + //如果没有捕捉到道路名 + if (!hisRoadName) { + liveDataRoadName.postValue(null) + } + + }catch (e:Exception){ + + }finally { + captureLinkState = false } } @@ -588,6 +623,48 @@ class MainViewModel @Inject constructor( return bSelectRoad } + /** + * 开启轨迹选择 + */ + fun setSelectTrace(select: Boolean) { + bSelectTrace = select + } + + /** + * 是否开启了轨迹选择 + */ + fun isSelectTrace(): Boolean { + return bSelectTrace + } + + /** + * 开启媒体标识 + */ + fun setMediaFlag(select: Boolean) { + isMediaFlag = select + } + + /** + * 是否开启了媒体标识 + */ + fun isMediaFlag(): Boolean { + return isMediaFlag + } + + /** + * 开启轨迹选择 + */ + fun setSelectPauseTrace(select: Boolean) { + bSelectPauseTrace = select + } + + /** + * 是否开启了轨迹选择 + */ + fun isSelectPauseTrace(): Boolean { + return bSelectPauseTrace + } + /** * 要展示的要素详细信息 */ diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index a0c3c0ee..cdc5c529 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -350,43 +350,36 @@ 180 || lon < -180 || lat > 90 || lat < -90) { return true;