From 894732ee45bca09bbb44e08d7a8aea90f3c99c32 Mon Sep 17 00:00:00 2001 From: squallzhjch Date: Fri, 28 Apr 2023 16:03:40 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=AE=9A=E4=BD=8D=EF=BC=8C?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=8F=90=E5=89=8D=E7=9C=8B=E6=9D=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/navinfo/omqs/db/RealmOperateHelper.kt | 6 +- .../com/navinfo/omqs/hilt/GlobalModule.kt | 12 +- .../omqs/ui/activity/map/MainActivity.kt | 25 ++- .../omqs/ui/activity/map/MainViewModel.kt | 206 ++++++++++++++---- .../omqs/ui/activity/map/SignAdapter.kt | 28 +++ .../navinfo/omqs/ui/activity/map/SignBean.kt | 8 + .../EvaluationResultViewModel.kt | 85 ++++---- .../evaluationresult/MiddleAdapter.kt | 3 + .../main/res/drawable/icon_speed_limit.xml | 12 + app/src/main/res/layout/activity_main.xml | 21 +- app/src/main/res/layout/adapter_sign.xml | 20 ++ app/src/main/res/mipmap-xxhdpi/bg_sign.png | Bin 0 -> 11622 bytes .../navinfo/collect/library/map/GeoPoint.kt | 28 +-- .../collect/library/map/NIMapController.kt | 36 ++- .../collect/library/map/NIMapOptions.kt | 2 + .../collect/library/map/NIMapView.java | 10 +- .../library/map/handler/BaseHandler.kt | 14 +- .../map/handler/LayerManagerHandler.kt | 2 +- .../library/map/handler/LineHandler.kt | 7 +- .../map/handler/LocationLayerHandler.kt | 54 +++-- .../library/map/handler/MarkHandler.kt | 9 +- .../map/handler/MeasureLayerHandler.kt | 9 +- .../collect/library/utils/GeometryTools.java | 2 +- 23 files changed, 435 insertions(+), 164 deletions(-) create mode 100644 app/src/main/java/com/navinfo/omqs/ui/activity/map/SignAdapter.kt create mode 100644 app/src/main/java/com/navinfo/omqs/ui/activity/map/SignBean.kt create mode 100644 app/src/main/res/drawable/icon_speed_limit.xml create mode 100644 app/src/main/res/layout/adapter_sign.xml create mode 100644 app/src/main/res/mipmap-xxhdpi/bg_sign.png 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 56ea0bd8..9bb6be80 100644 --- a/app/src/main/java/com/navinfo/omqs/db/RealmOperateHelper.kt +++ b/app/src/main/java/com/navinfo/omqs/db/RealmOperateHelper.kt @@ -79,16 +79,14 @@ class RealmOperateHelper() { } - suspend fun queryLink( - linkPid: String, - ): RenderEntity? { + suspend fun queryLink(linkPid: String): RenderEntity? { var link: RenderEntity? = null withContext(Dispatchers.IO) { val realm = Realm.getDefaultInstance() val realmR = realm.where(RenderEntity::class.java) .equalTo("table", "OMDB_RD_LINK") .and() - .rawPredicate("properties['${LinkTable.linkPid}']=$linkPid") + .equalTo("properties['${LinkTable.linkPid}']", linkPid) .findFirst() if (realmR != null) { link = realm.copyFromRealm(realmR) diff --git a/app/src/main/java/com/navinfo/omqs/hilt/GlobalModule.kt b/app/src/main/java/com/navinfo/omqs/hilt/GlobalModule.kt index 25cc9516..180e720f 100644 --- a/app/src/main/java/com/navinfo/omqs/hilt/GlobalModule.kt +++ b/app/src/main/java/com/navinfo/omqs/hilt/GlobalModule.kt @@ -6,6 +6,7 @@ import androidx.room.Room import com.google.gson.Gson import com.google.gson.GsonBuilder import com.google.gson.reflect.TypeToken +import com.navinfo.collect.library.data.dao.impl.TraceDataBase import com.navinfo.omqs.Constant import com.navinfo.omqs.OMQSApplication import com.navinfo.omqs.db.RoomAppDatabase @@ -90,7 +91,7 @@ class GlobalModule { @Provides @Singleton fun provideGson(): Gson = GsonBuilder() - // 解决解析Json时将int类型自动转换为Double的问题 + // 解决解析Json时将int类型自动转换为Double的问题 .registerTypeAdapter(object : TypeToken>() {}.getType(), IntTypeAdapter()) .registerTypeAdapter(object : TypeToken>() {}.getType(), IntTypeAdapter()) .registerTypeAdapter(object : TypeToken>() {}.getType(), IntTypeAdapter()) @@ -137,6 +138,15 @@ class GlobalModule { .build(); } + @Singleton + @Provides + fun provideTraceDatabase(context: Application): TraceDataBase { + return TraceDataBase.getDatabase( + context, + Constant.USER_DATA_PATH + "/trace.sqlite" + ) + } + // /** // * realm 注册 // */ 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 44732ade..35271e25 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 @@ -1,10 +1,13 @@ package com.navinfo.omqs.ui.activity.map +import android.os.Build import android.os.Bundle import androidx.activity.viewModels +import androidx.annotation.RequiresApi import androidx.core.view.WindowCompat import androidx.databinding.DataBindingUtil import androidx.navigation.findNavController +import androidx.recyclerview.widget.LinearLayoutManager import com.blankj.utilcode.util.ToastUtils import com.navinfo.collect.library.map.NIMapController import com.navinfo.collect.library.map.handler.NiLocationListener @@ -32,6 +35,7 @@ class MainActivity : BaseActivity() { @Inject lateinit var offlineMapDownloadManager: OfflineMapDownloadManager + private val signAdapter by lazy { SignAdapter() } override fun onCreate(savedInstanceState: Bundle?) { WindowCompat.setDecorFitsSystemWindows(window, false) @@ -43,7 +47,7 @@ class MainActivity : BaseActivity() { binding.mainActivityMap, null, Constant.MAP_PATH, - Constant.USER_DATA_PATH+"/trace.sqlite" + Constant.USER_DATA_PATH + "/trace.sqlite" ) //关联生命周期 binding.lifecycleOwner = this @@ -56,7 +60,11 @@ class MainActivity : BaseActivity() { //处理页面跳转 viewModel.navigation(this, it) } - + binding.mainActivitySignRecyclerview.layoutManager = LinearLayoutManager(this) + binding.mainActivitySignRecyclerview.adapter = signAdapter + viewModel.liveDataSignList.observe(this) { + signAdapter.refreshData(it) + } } override fun onStart() { @@ -64,15 +72,10 @@ class MainActivity : BaseActivity() { //开启定位 mapController.locationLayerHandler.startLocation() + //启动轨迹存储 - mapController.locationLayerHandler.setNiLocationListener(NiLocationListener { - //ToastUtils.showLong("定位${it.longitude}") - binding!!.viewModel!!.addSaveTrace(it) - binding!!.viewModel!!.startSaveTraceThread(this) - }) - //显示轨迹图层 -// mapController.layerManagerHandler.showNiLocationLayer(Constant.DATA_PATH+ SystemConstant.USER_ID+"/trace.sqlite") - mapController.layerManagerHandler.showNiLocationLayer() +// viewModel.startSaveTraceThread(this) + } override fun onPause() { @@ -103,7 +106,7 @@ class MainActivity : BaseActivity() { */ fun openCamera() { //显示轨迹图层 - binding!!.viewModel!!.onClickCameraButton(this) + viewModel.onClickCameraButton(this) } /** 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 6969cdad..f8ec8e3e 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 @@ -2,23 +2,33 @@ package com.navinfo.omqs.ui.activity.map import android.content.Context import android.content.DialogInterface +import android.os.Build import android.os.Bundle import android.util.Log +import androidx.annotation.RequiresApi import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope import androidx.navigation.findNavController import com.navinfo.collect.library.data.dao.impl.TraceDataBase import com.navinfo.collect.library.data.entity.NiLocation +import com.navinfo.collect.library.data.entity.RenderEntity import com.navinfo.collect.library.map.NIMapController +import com.navinfo.collect.library.map.handler.NiLocationListener import com.navinfo.collect.library.map.handler.OnQsRecordItemClickListener import com.navinfo.collect.library.utils.GeometryTools import com.navinfo.collect.library.utils.GeometryToolsKt import com.navinfo.omqs.Constant import com.navinfo.omqs.R +import com.navinfo.omqs.db.RealmOperateHelper import com.navinfo.omqs.ui.dialog.CommonDialog import com.navinfo.omqs.ui.manager.TakePhotoManager import dagger.hilt.android.lifecycle.HiltViewModel +import dagger.hilt.android.qualifiers.ActivityContext +import dagger.hilt.android.qualifiers.ApplicationContext import io.realm.RealmSet +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch import org.oscim.core.GeoPoint import org.videolan.libvlc.LibVlcUtil import javax.inject.Inject @@ -26,15 +36,25 @@ import javax.inject.Inject /** * 创建Activity全局viewmode */ + @HiltViewModel class MainViewModel @Inject constructor( private val mapController: NIMapController, + private val traceDataBase: TraceDataBase, + private val realmOperateHelper: RealmOperateHelper ) : ViewModel() { - val liveDataQsRecordIdList = MutableLiveData>() private var mCameraDialog: CommonDialog? = null - private var niLocationList: MutableList = ArrayList() + //地图点击捕捉到的质检数据ID列表 + val liveDataQsRecordIdList = MutableLiveData>() + + //看板数据 + val liveDataSignList = MutableLiveData>() + + + // private var niLocationList: MutableList = ArrayList() + var testPoint = GeoPoint(0, 0) init { mapController.markerHandle.setOnQsRecordItemClickListener(object : @@ -43,6 +63,93 @@ class MainViewModel @Inject constructor( liveDataQsRecordIdList.value = list } }) + initLocation() + viewModelScope.launch { + mapController.onMapClickFlow.collect { + testPoint = it + } + } + + } + + private fun initLocation() { + // mapController.locationLayerHandler.setNiLocationListener(NiLocationListener { +// addSaveTrace(it) +// +// }) + //用于定位点存储到数据库 + viewModelScope.launch(Dispatchers.Default) { + mapController.locationLayerHandler.niLocationFlow.collect { location -> + location.longitude = testPoint.longitude + location.latitude = testPoint.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) + + //遍历存储tile对应的x与y的值 + tileX.forEach { x -> + tileY.forEach { y -> + location.tilex = x + location.tiley = y + } + } + Log.e("jingo", "定位点插入 ${Thread.currentThread().name}") + traceDataBase.niLocationDao.insert(location) + } + } + //用于定位点捕捉道路 + viewModelScope.launch(Dispatchers.Default) { + mapController.locationLayerHandler.niLocationFlow.collect { location -> + Log.e("jingo", "定位点绑定道路 ${Thread.currentThread().name}") + location.longitude = testPoint.longitude + location.latitude = testPoint.latitude + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + val linkList = realmOperateHelper.queryLink( + point = GeometryTools.createPoint( + location.longitude, + location.latitude + ), + ) + //看板数据 + val signList = mutableListOf() + if (linkList.isNotEmpty()) { + val link = linkList[0] + val linkId = link.properties[RenderEntity.Companion.LinkTable.linkPid] + mapController.lineHandler.showLine(link.geometry) + linkId?.let { + var elementList = realmOperateHelper.queryLinkByLinkPid(it) + for (element in elementList) { + val distance = GeometryTools.distanceToDouble( + GeoPoint( + location.latitude, location.longitude, + ), + GeometryTools.createGeoPoint(element.geometry) + ) + signList.add( + SignBean( + iconId = R.drawable.icon_speed_limit, + iconText = element.name, + distance = distance.toInt(), + ) + ) + } + liveDataSignList.postValue(signList) + Log.e("jingo", "自动捕捉数据 共${elementList.size}条") + } + } + } + } + } + + //显示轨迹图层 + mapController.layerManagerHandler.showNiLocationLayer() } /** @@ -54,6 +161,9 @@ class MainViewModel @Inject constructor( override fun onCleared() { super.onCleared() + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + mapController.lineHandler.removeLine() + } } //点击相机按钮 @@ -96,49 +206,61 @@ class MainViewModel @Inject constructor( }) } - fun startSaveTraceThread(context: Context) { - Thread(Runnable { - try { - while (true) { - if (niLocationList != null && niLocationList.size > 0) { +// fun startSaveTraceThread(context: Context) { +// Thread(Runnable { +// try { +// while (true) { +// +// if (niLocationList != null && niLocationList.size > 0) { +// +// var niLocation = niLocationList[0] +// val geometry = GeometryTools.createGeometry( +// GeoPoint( +// niLocation.latitude, +// niLocation.longitude +// ) +// ) +// 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 -> +// niLocation.tilex = x +// niLocation.tiley = y +// } +// } +// +// TraceDataBase.getDatabase( +// context, +// Constant.USER_DATA_PATH + "/trace.sqlite" +// ).niLocationDao.insert(niLocation) +// niLocationList.remove(niLocation) +// +// Log.e("qj", "saveTrace==${niLocationList.size}") +// } +// Thread.sleep(30) +// } +// } catch (e: InterruptedException) { +// e.printStackTrace() +// Log.e("qj", "异常==${e.message}") +// } +// }).start() +// } - var niLocation = niLocationList[0] - val geometry = GeometryTools.createGeometry(GeoPoint(niLocation.latitude,niLocation.longitude)) - 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 -> - niLocation.tilex = x - niLocation.tiley = y - } - } - - TraceDataBase.getDatabase(context, Constant.USER_DATA_PATH + "/trace.sqlite").niLocationDao.insert(niLocation) - niLocationList.remove(niLocation) - - Log.e("qj", "saveTrace==${niLocationList.size}") - } - Thread.sleep(30) - } - } catch (e: InterruptedException) { - e.printStackTrace() - Log.e("qj", "异常==${e.message}") - } - }).start() - } - - //增加轨迹存储 - fun addSaveTrace(niLocation: NiLocation) { - if (niLocation != null && niLocationList != null) { - niLocationList.add(niLocation) - } - } +// //增加轨迹存储 +// fun addSaveTrace(niLocation: NiLocation) { +// if (niLocation != null && niLocationList != null) { +// niLocationList.add(niLocation) +// } +// } + /** + * 处理页面调转 + */ fun navigation(activity: MainActivity, list: List) { //获取右侧fragment容器 val naviController = activity.findNavController(R.id.main_activity_right_fragment) 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 new file mode 100644 index 00000000..e024ba5d --- /dev/null +++ b/app/src/main/java/com/navinfo/omqs/ui/activity/map/SignAdapter.kt @@ -0,0 +1,28 @@ +package com.navinfo.omqs.ui.activity.map + +import android.view.LayoutInflater +import android.view.ViewGroup +import com.navinfo.omqs.R +import com.navinfo.omqs.databinding.AdapterSignBinding +import com.navinfo.omqs.ui.other.BaseRecyclerViewAdapter +import com.navinfo.omqs.ui.other.BaseViewHolder + +class SignAdapter : BaseRecyclerViewAdapter() { + override fun getItemViewRes(position: Int): Int { + return R.layout.adapter_sign + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseViewHolder { + val viewBinding = + AdapterSignBinding.inflate(LayoutInflater.from(parent.context), parent, false) + return BaseViewHolder(viewBinding) + } + + override fun onBindViewHolder(holder: BaseViewHolder, position: Int) { + val bd = holder.viewBinding as AdapterSignBinding + val item = data[position] + bd.signMainIcon.background = holder.viewBinding.root.context.getDrawable(item.iconId) + bd.signMainIcon.text = item.iconText + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/ui/activity/map/SignBean.kt b/app/src/main/java/com/navinfo/omqs/ui/activity/map/SignBean.kt new file mode 100644 index 00000000..9ee45b97 --- /dev/null +++ b/app/src/main/java/com/navinfo/omqs/ui/activity/map/SignBean.kt @@ -0,0 +1,8 @@ +package com.navinfo.omqs.ui.activity.map + +data class SignBean( + //图标ID + val iconId: Int, + val distance: Int = 0, + val iconText: String = "" +) \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultViewModel.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultViewModel.kt index e059f3e5..053e3fe6 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultViewModel.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultViewModel.kt @@ -8,7 +8,6 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.navinfo.collect.library.data.entity.QsRecordBean import com.navinfo.collect.library.data.entity.RenderEntity.Companion.LinkTable -import com.navinfo.collect.library.map.GeoPoint import com.navinfo.collect.library.map.NIMapController import com.navinfo.collect.library.utils.GeometryTools import com.navinfo.omqs.db.RealmOperateHelper @@ -18,10 +17,10 @@ import io.realm.Realm import io.realm.kotlin.where import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch +import org.oscim.core.GeoPoint import java.util.* import javax.inject.Inject -@RequiresApi(Build.VERSION_CODES.N) @HiltViewModel class EvaluationResultViewModel @Inject constructor( private val roomAppDatabase: RoomAppDatabase, @@ -59,24 +58,24 @@ class EvaluationResultViewModel @Inject constructor( init { liveDataQsRecordBean.value = QsRecordBean(id = UUID.randomUUID().toString()) Log.e("jingo", "EvaluationResultViewModel 创建了 ${hashCode()}") - mapController.markerHandle.run { - setOnMapClickListener { - liveDataQsRecordBean.value!!.geometry = it.toGeometry() - addMarker(it, markerTitle) + viewModelScope.launch { + mapController.onMapClickFlow.collect { + liveDataQsRecordBean.value!!.geometry = GeometryTools.createGeometry(it).toText() + mapController.markerHandle.addMarker(it, markerTitle) viewModelScope.launch { captureLink(it.longitude, it.latitude) } } } - } override fun onCleared() { super.onCleared() Log.e("jingo", "EvaluationResultViewModel 销毁了 ${hashCode()}") mapController.markerHandle.removeMarker(markerTitle) - mapController.markerHandle.removeOnMapClickListener() - mapController.lineHandler.removeLine() + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + mapController.lineHandler.removeLine() + } } @@ -90,7 +89,7 @@ class EvaluationResultViewModel @Inject constructor( } val geoPoint = mapController.locationLayerHandler.getCurrentGeoPoint() geoPoint?.let { - liveDataQsRecordBean.value!!.geometry = it.toGeometry() + liveDataQsRecordBean.value!!.geometry = GeometryTools.createGeometry(it).toText() mapController.markerHandle.addMarker(geoPoint, markerTitle) viewModelScope.launch { captureLink(geoPoint.longitude, geoPoint.latitude) @@ -102,20 +101,23 @@ class EvaluationResultViewModel @Inject constructor( * 捕捉到路 */ private suspend fun captureLink(longitude: Double, latitude: Double) { - val linkList = realmOperateHelper.queryLink( - point = GeometryTools.createPoint( - longitude, - latitude - ), - ) - liveDataQsRecordBean.value?.let { - if (linkList.isNotEmpty()) { - it.linkId = - linkList[0].properties[LinkTable.linkPid] ?: "" - mapController.lineHandler.showLine(linkList[0].geometry) - } else { - it.linkId = "" - mapController.lineHandler.removeLine() + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + val linkList = realmOperateHelper.queryLink( + point = GeometryTools.createPoint( + longitude, + latitude + ), + ) + + liveDataQsRecordBean.value?.let { + if (linkList.isNotEmpty()) { + it.linkId = + linkList[0].properties[LinkTable.linkPid] ?: "" + mapController.lineHandler.showLine(linkList[0].geometry) + } else { + it.linkId = "" + mapController.lineHandler.removeLine() + } } } } @@ -276,23 +278,26 @@ class EvaluationResultViewModel @Inject constructor( */ fun initData(id: String) { - viewModelScope.launch(Dispatchers.IO) { - val realm = Realm.getDefaultInstance() - val objects = realm.where().equalTo("id", id).findFirst() + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + viewModelScope.launch(Dispatchers.IO) { + val realm = Realm.getDefaultInstance() + val objects = realm.where().equalTo("id", id).findFirst() - if (objects != null) { - oldBean = realm.copyFromRealm(objects) - oldBean?.let { - liveDataQsRecordBean.postValue(it.copy()) - val p = GeometryTools.createGeoPoint(it.geometry) - mapController.markerHandle.addMarker( - GeoPoint(p.longitude, p.latitude), - markerTitle - ) - if (it.linkId.isNotEmpty()) { - val link = realmOperateHelper.queryLink(it.linkId) - link?.let { l -> - mapController.lineHandler.showLine(l.geometry) + if (objects != null) { + oldBean = realm.copyFromRealm(objects) + oldBean?.let { + liveDataQsRecordBean.postValue(it.copy()) + val p = GeometryTools.createGeoPoint(it.geometry) + mapController.markerHandle.addMarker( + GeoPoint(p.latitude, p.longitude), + markerTitle + ) + + if (it.linkId.isNotEmpty()) { + val link = realmOperateHelper.queryLink(it.linkId) + link?.let { l -> + mapController.lineHandler.showLine(l.geometry) + } } } } diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/MiddleAdapter.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/MiddleAdapter.kt index d3020c80..034d5787 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/MiddleAdapter.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/MiddleAdapter.kt @@ -1,7 +1,9 @@ package com.navinfo.omqs.ui.fragment.evaluationresult +import android.os.Build import android.view.LayoutInflater import android.view.ViewGroup +import androidx.annotation.RequiresApi import com.navinfo.omqs.R import com.navinfo.omqs.databinding.TextItemSelectBinding import com.navinfo.omqs.ui.other.BaseRecyclerViewAdapter @@ -21,6 +23,7 @@ class MiddleAdapter(private var itemListener: ((Int, String) -> Unit?)? = null) return BaseViewHolder(viewBinding) } + @RequiresApi(Build.VERSION_CODES.M) override fun onBindViewHolder(holder: BaseViewHolder, position: Int) { val bd = holder.viewBinding as TextItemSelectBinding val title = data[position] diff --git a/app/src/main/res/drawable/icon_speed_limit.xml b/app/src/main/res/drawable/icon_speed_limit.xml new file mode 100644 index 00000000..e6ac7102 --- /dev/null +++ b/app/src/main/res/drawable/icon_speed_limit.xml @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 40393b4f..1a869281 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -35,6 +35,7 @@ app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" /> + + + + + diff --git a/app/src/main/res/layout/adapter_sign.xml b/app/src/main/res/layout/adapter_sign.xml new file mode 100644 index 00000000..8e1a9042 --- /dev/null +++ b/app/src/main/res/layout/adapter_sign.xml @@ -0,0 +1,20 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-xxhdpi/bg_sign.png b/app/src/main/res/mipmap-xxhdpi/bg_sign.png new file mode 100644 index 0000000000000000000000000000000000000000..5ba9099815dda6588496994d0ae5a7cb71cbefb4 GIT binary patch literal 11622 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 + + fun init( + context: AppCompatActivity, + mapView: NIMapView, + options: NIMapOptions? = null, + mapPath: String, + tracePath: String + ) { Constant.MAP_PATH = mapPath layerManagerHandler = LayerManagerHandler(context, mapView, tracePath) locationLayerHandler = LocationLayerHandler(context, mapView) animationHandler = AnimationHandler(context, mapView) markerHandle = MarkHandler(context, mapView) - lineHandler = LineHandler(context, mapView) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + lineHandler = LineHandler(context, mapView) + } polygonHandler = PolygonHandler(context, mapView) viewportHandler = ViewportHandler(context, mapView) - measureLayerHandler = MeasureLayerHandler(context, mapView) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + measureLayerHandler = MeasureLayerHandler(context, mapView) + } mMapView = mapView + mMapView.setOnMapClickListener { + context.lifecycleScope.launch { + onMapClickFlow.emit(it) + } + } mapView.setOptions(options) - mMapView.vtmMap.viewport().maxZoomLevel = Constant.MAX_ZOOM // 设置地图的最大级别 } diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/NIMapOptions.kt b/collect-library/src/main/java/com/navinfo/collect/library/map/NIMapOptions.kt index 796ac2bc..8231bbfa 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/map/NIMapOptions.kt +++ b/collect-library/src/main/java/com/navinfo/collect/library/map/NIMapOptions.kt @@ -1,5 +1,6 @@ package com.navinfo.collect.library.map +import com.navinfo.collect.library.system.Constant import org.json.JSONObject @@ -8,6 +9,7 @@ data class NIMapOptions( val showZoomControl: Boolean = true, //是否显示zoom按钮 val zoomLevel: Double = 13.0, /// 地图比例尺初始级别 val coordinate: NICoordinate = NICoordinate(39.907375, 116.391349), + val maxZoom: Int = Constant.MAX_ZOOM ) { companion object { fun fromJson(json: String): NIMapOptions { diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/NIMapView.java b/collect-library/src/main/java/com/navinfo/collect/library/map/NIMapView.java index fb115dd4..e9c64238 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/map/NIMapView.java +++ b/collect-library/src/main/java/com/navinfo/collect/library/map/NIMapView.java @@ -1,6 +1,7 @@ package com.navinfo.collect.library.map; import android.content.Context; +import android.os.Build; import android.os.Bundle; import android.util.AttributeSet; import android.view.LayoutInflater; @@ -121,7 +122,7 @@ public final class NIMapView extends RelativeLayout { * * @param point */ - void onMapClick(com.navinfo.collect.library.map.GeoPoint point); + void onMapClick(GeoPoint point); /** * 地图内 Poi 单击事件回调函数 @@ -358,6 +359,7 @@ public final class NIMapView extends RelativeLayout { } MapPosition mapPosition = getVtmMap().getMapPosition(); mapPosition.setZoom(options.getZoomLevel()); + getVtmMap().viewport().setMaxZoomLevel(options.getMaxZoom()); mapPosition.setPosition(options.getCoordinate().getLatitude(), options.getCoordinate().getLongitude()); getVtmMap().animator().animateTo(100, mapPosition); } @@ -819,7 +821,9 @@ public final class NIMapView extends RelativeLayout { LayoutParams layoutParams = (LayoutParams) view.getLayoutParams(); if (layoutParams.getRules() != null) { for (int i = 0; i < layoutParams.getRules().length; i++) { - layoutParams.removeRule(i); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { + layoutParams.removeRule(i); + } } } switch (position) { @@ -926,7 +930,7 @@ public final class NIMapView extends RelativeLayout { GeoPoint geoPoint = mMap.viewport().fromScreenPoint(e.getX(), e.getY()); if (g instanceof Gesture.Tap) { // 单击事件 if (mapClickListener != null) { - mapClickListener.onMapClick(new com.navinfo.collect.library.map.GeoPoint(geoPoint.getLatitude(), geoPoint.getLongitude())); + mapClickListener.onMapClick(geoPoint); } } else if (g instanceof Gesture.DoubleTap) { // 双击 if (mapDoubleClickListener != null) { diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/BaseHandler.kt b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/BaseHandler.kt index 2d5bf2e5..4f3d1274 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/BaseHandler.kt +++ b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/BaseHandler.kt @@ -20,11 +20,11 @@ abstract class BaseHandler(context: AppCompatActivity, mapView: NIMapView) { mMapView.vtmMap.layers().remove(layer) } - fun setOnMapClickListener(listener: NIMapView.OnMapClickListener) { - mMapView.setOnMapClickListener(listener) - } - - fun removeOnMapClickListener() { - mMapView.setOnMapClickListener(null) - } +// fun setOnMapClickListener(listener: NIMapView.OnMapClickListener) { +// mMapView.setOnMapClickListener(listener) +// } +// +// fun removeOnMapClickListener() { +// mMapView.setOnMapClickListener(null) +// } } \ No newline at end of file diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LayerManagerHandler.kt b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LayerManagerHandler.kt index aafad60d..7e5ab8b8 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LayerManagerHandler.kt +++ b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LayerManagerHandler.kt @@ -24,7 +24,7 @@ import java.io.File class LayerManagerHandler(context: AppCompatActivity, mapView: NIMapView,tracePath: String) : BaseHandler(context, mapView) { private var baseGroupLayer // 用于盛放所有基础底图的图层组,便于统一管理 : GroupLayer? = null - protected val mTracePath:String = tracePath + private val mTracePath:String = tracePath /** * 轨迹渲染图层 diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LineHandler.kt b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LineHandler.kt index ca3ed0b9..8d0af45a 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LineHandler.kt +++ b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LineHandler.kt @@ -137,13 +137,12 @@ class LineHandler(context: AppCompatActivity, mapView: NIMapView) : BaseHandler( fun showLine(geometry: String) { try { - + mDefaultPathLayer.clearPath() + mDefaultPathLayer.setPoints(GeometryTools.getGeoPoints(geometry)) + mDefaultPathLayer.isEnabled = true } catch (e: Exception) { Toast.makeText(mContext, "高亮路线失败 ${e.message}", Toast.LENGTH_SHORT).show() } - val g = GeometryTools.getGeoPoints(geometry) - mDefaultPathLayer.setPoints(g) - mDefaultPathLayer.isEnabled = true } fun removeLine() { diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LocationLayerHandler.kt b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LocationLayerHandler.kt index 4b18e5b2..823510f8 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LocationLayerHandler.kt +++ b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LocationLayerHandler.kt @@ -1,27 +1,34 @@ package com.navinfo.collect.library.map.handler -import android.content.Context import android.util.Log import android.widget.Toast import androidx.appcompat.app.AppCompatActivity +import androidx.lifecycle.lifecycleScope import com.baidu.location.BDAbstractLocationListener import com.baidu.location.BDLocation import com.baidu.location.LocationClient import com.baidu.location.LocationClientOption import com.baidu.location.LocationClientOption.LocationMode import com.navinfo.collect.library.data.entity.NiLocation -import com.navinfo.collect.library.map.GeoPoint import com.navinfo.collect.library.map.NIMapView +import kotlinx.coroutines.flow.MutableSharedFlow +import kotlinx.coroutines.launch +import org.oscim.core.GeoPoint import org.oscim.layers.LocationLayer -class LocationLayerHandler(context: AppCompatActivity, mapView: NIMapView) : BaseHandler(context, mapView) { +class LocationLayerHandler(context: AppCompatActivity, mapView: NIMapView) : + BaseHandler(context, mapView) { private var mCurrentLocation: BDLocation? = null private var bFirst = true private val mLocationLayer: LocationLayer = LocationLayer(mMapView.vtmMap) private lateinit var locationClient: LocationClient - private lateinit var niLocationListener: NiLocationListener +// private var niLocationListener: NiLocationListener by lazy{ +// +// } + + val niLocationFlow = MutableSharedFlow(5) init { ///添加定位图层到地图,[NIMapView.LAYER_GROUPS.NAVIGATION] 是最上层layer组 @@ -47,20 +54,29 @@ class LocationLayerHandler(context: AppCompatActivity, mapView: NIMapView) : Bas //更多结果信息获取说明,请参照类参考中BDLocation类中的说明 //获取纬度信息 - val latitude = it.latitude +// val latitude = it.latitude //获取经度信息 - val longitude = it.longitude +// val longitude = it.longitude //获取定位精度,默认值为0.0f - val radius = it.radius +// val radius = it.radius //获取经纬度坐标类型,以LocationClientOption中设置过的坐标类型为准 - val coorType = it.coorType +// val coorType = it.coorType //获取定位类型、定位错误返回码,具体信息可参照类参考中BDLocation类中的说明 val errorCode = it.locType mCurrentLocation = it mLocationLayer.setPosition(it.latitude, it.longitude, it.radius) - Log.e("qj","location==${it.longitude}==errorCode===$errorCode===${it.locTypeDescription}") - if(niLocationListener!=null){ - getCurrentNiLocation()?.let { it1 -> niLocationListener.call(it1) } +// Log.e( +// "qj", +// "location==${it.longitude}==errorCode===$errorCode===${it.locTypeDescription}" +// ) + +// if (niLocationListener != null) { + getCurrentNiLocation()?.let { it1 -> + mContext.lifecycleScope.launch { + niLocationFlow.emit(it1) + } + +// }// niLocationListener.call(it1) } } //第一次定位成功显示当前位置 if (this.bFirst) { @@ -107,7 +123,7 @@ class LocationLayerHandler(context: AppCompatActivity, mapView: NIMapView) : Bas locationClient.locOption = locationOption } catch (e: Throwable) { Toast.makeText(mContext, "定位初始化失败 $e", Toast.LENGTH_SHORT) - Log.e("qj","定位初始化失败$e") + Log.e("qj", "定位初始化失败$e") } } @@ -160,8 +176,8 @@ class LocationLayerHandler(context: AppCompatActivity, mapView: NIMapView) : Bas //获取当前定位对象 fun getCurrentNiLocation(): NiLocation? { - if(mCurrentLocation!=null){ - val niLocation:NiLocation = NiLocation() + if (mCurrentLocation != null) { + val niLocation: NiLocation = NiLocation() niLocation.longitude = mCurrentLocation!!.longitude niLocation.latitude = mCurrentLocation!!.latitude niLocation.direction = mCurrentLocation!!.direction.toDouble() @@ -186,10 +202,10 @@ class LocationLayerHandler(context: AppCompatActivity, mapView: NIMapView) : Bas return null } - //设置定位回调 - fun setNiLocationListener(listener: NiLocationListener){ - niLocationListener = listener - } +// //设置定位回调 +// fun setNiLocationListener(listener: NiLocationListener) { +// niLocationListener = listener +// } } /** @@ -205,7 +221,7 @@ private class MyLocationListener(callback: (BDLocation) -> Unit) : BDAbstractLoc /** * 实现定位回调 */ -public class NiLocationListener(callback: (NiLocation) -> Unit){ +class NiLocationListener(callback: (NiLocation) -> Unit) { val call = callback; fun onReceiveLocation(location: NiLocation) { call(location) diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MarkHandler.kt b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MarkHandler.kt index 240b6ef5..2c8528c4 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MarkHandler.kt +++ b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MarkHandler.kt @@ -10,7 +10,6 @@ import androidx.core.content.res.ResourcesCompat import androidx.lifecycle.lifecycleScope import com.navinfo.collect.library.R import com.navinfo.collect.library.data.entity.QsRecordBean -import com.navinfo.collect.library.map.GeoPoint import com.navinfo.collect.library.map.NIMapView import com.navinfo.collect.library.map.cluster.ClusterMarkerItem import com.navinfo.collect.library.map.cluster.ClusterMarkerRenderer @@ -27,6 +26,7 @@ import org.oscim.android.canvas.AndroidBitmap import org.oscim.backend.CanvasAdapter import org.oscim.backend.canvas.Bitmap import org.oscim.backend.canvas.Paint +import org.oscim.core.GeoPoint import org.oscim.layers.marker.* import org.oscim.layers.marker.ItemizedLayer.OnItemGestureListener import org.oscim.map.Map @@ -90,9 +90,10 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : } ) - addLayer(mDefaultMarkerLayer, NIMapView.LAYER_GROUPS.OPERATE); + //初始化之间数据图层 initQsRecordDataLayer() + addLayer(mDefaultMarkerLayer, NIMapView.LAYER_GROUPS.OPERATE); // 设置矢量图层均在12级以上才显示 mMapView.vtmMap.events.bind(Map.UpdateListener { e, mapPosition -> if (e == Map.SCALE_EVENT) { @@ -127,13 +128,13 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : val marker = MarkerItem( tempTitle, description, - org.oscim.core.GeoPoint(geoPoint.latitude, geoPoint.longitude) + geoPoint ) mDefaultMarkerLayer.addItem(marker); mMapView.vtmMap.updateMap(true) } else { marker.description = description - marker.geoPoint = org.oscim.core.GeoPoint(geoPoint.latitude, geoPoint.longitude) + marker.geoPoint = geoPoint mDefaultMarkerLayer.removeItem(marker) mDefaultMarkerLayer.addItem(marker) mMapView.vtmMap.updateMap(true) diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MeasureLayerHandler.kt b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MeasureLayerHandler.kt index 41c0cf41..e6b99078 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MeasureLayerHandler.kt +++ b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MeasureLayerHandler.kt @@ -1,19 +1,17 @@ -package com.navinfo.collect.library.map.maphandler +package com.navinfo.collect.library.map.handler -import android.content.Context import android.graphics.BitmapFactory import android.graphics.Canvas import android.graphics.Color +import android.os.Build import android.text.TextPaint -import android.widget.Toast +import androidx.annotation.RequiresApi import androidx.appcompat.app.AppCompatActivity import com.navinfo.collect.library.R import com.navinfo.collect.library.map.NIMapView -import com.navinfo.collect.library.map.handler.BaseHandler import com.navinfo.collect.library.map.layers.NIPolygonLayer import com.navinfo.collect.library.utils.DistanceUtil import com.navinfo.collect.library.utils.GeometryTools -import com.navinfo.collect.library.utils.StringUtil.Companion.createUUID import org.oscim.android.canvas.AndroidBitmap import org.oscim.backend.CanvasAdapter import org.oscim.backend.canvas.Bitmap @@ -30,6 +28,7 @@ import org.oscim.layers.vector.geometries.Style import org.oscim.map.Map import java.math.BigDecimal +@RequiresApi(Build.VERSION_CODES.M) open class MeasureLayerHandler(context: AppCompatActivity, mapView: NIMapView) : BaseHandler(context, mapView), Map.UpdateListener { diff --git a/collect-library/src/main/java/com/navinfo/collect/library/utils/GeometryTools.java b/collect-library/src/main/java/com/navinfo/collect/library/utils/GeometryTools.java index e9cd2426..e0855bb1 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/utils/GeometryTools.java +++ b/collect-library/src/main/java/com/navinfo/collect/library/utils/GeometryTools.java @@ -418,7 +418,7 @@ public class GeometryTools { Geometry startGeo = createGeometry(startGeoPoint); Geometry endGeo = createGeometry(endGeoPoint); double d = startGeo.distance(endGeo); - return d * 100000; + return convertDistanceToDegree(d,startGeoPoint.getLatitude()); } return 0;