diff --git a/app/build.gradle b/app/build.gradle index 03268d5c..ca4fa52f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -131,6 +131,8 @@ dependencies { //图片加载 implementation 'com.github.bumptech.glide:glide:4.15.1' annotationProcessor 'com.github.bumptech.glide:compiler:4.15.1' +// implementation "io.realm:realm-kotlin-extensions:6.1.0" + } //允许引用生成的代码 kapt { diff --git a/app/src/main/java/com/navinfo/omqs/Constant.kt b/app/src/main/java/com/navinfo/omqs/Constant.kt index 3e194ff9..27fb6278 100644 --- a/app/src/main/java/com/navinfo/omqs/Constant.kt +++ b/app/src/main/java/com/navinfo/omqs/Constant.kt @@ -94,6 +94,8 @@ class Constant { const val EVENT_LAYER_MANAGER_CHANGE = "EVENT_LAYER_MANAGER_CHANGE" // 图层管理中的配置修改 const val SELECT_TASK_ID = "select_task_id" //选中的任务ID + + const val SHARED_SYNC_TASK_LINK_ID = "shared_sync_task_link_id"//利用shared通知任务页面更新 } 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 eb5ada1d..3237ee9d 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 @@ -18,11 +18,14 @@ import android.widget.PopupWindow import androidx.annotation.RequiresApi import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel +import androidx.lifecycle.lifecycleScope import androidx.lifecycle.viewModelScope import androidx.navigation.findNavController import com.blankj.utilcode.util.ToastUtils import com.navinfo.collect.library.data.dao.impl.TraceDataBase import com.navinfo.collect.library.data.entity.NiLocation +import com.navinfo.collect.library.data.entity.NoteBean +import com.navinfo.collect.library.data.entity.QsRecordBean import com.navinfo.collect.library.data.entity.RenderEntity import com.navinfo.collect.library.data.entity.TaskBean import com.navinfo.collect.library.map.NIMapController @@ -43,6 +46,7 @@ import com.navinfo.omqs.util.SpeakMode import dagger.hilt.android.lifecycle.HiltViewModel import io.realm.Realm import io.realm.RealmSet +import io.realm.kotlin.where import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.launch @@ -65,7 +69,7 @@ class MainViewModel @Inject constructor( private val mapController: NIMapController, private val traceDataBase: TraceDataBase, private val realmOperateHelper: RealmOperateHelper, - private val sharedPreferences: SharedPreferences, + private val sharedPreferences: SharedPreferences ) : ViewModel() { private var mCameraDialog: CommonDialog? = null @@ -158,12 +162,15 @@ class MainViewModel @Inject constructor( } } } - - initTaskData() + viewModelScope.launch(Dispatchers.IO) { + initTaskData() + initQsRecordData() + initNoteData() + } } /** - * 初始话任务高亮高亮 + * 初始化选中的任务高亮高亮 */ @RequiresApi(Build.VERSION_CODES.M) private fun initTaskData() { @@ -182,11 +189,54 @@ class MainViewModel @Inject constructor( for (item in list) { mapController.lineHandler.omdbTaskLinkLayer.addLineList(item.hadLinkDvoList) } + private suspend fun initTaskData() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + val id = sharedPreferences.getInt(Constant.SELECT_TASK_ID, -1) + val realm = Realm.getDefaultInstance() + val res = realm.where(TaskBean::class.java).equalTo("id", id).findFirst() + if (res != null) { + val taskBean = realm.copyFromRealm(res) + mapController.lineHandler.omdbTaskLinkLayer.addLineList(taskBean.hadLinkDvoList) + } + } + } + + /** + * 初始化渲染质检数据 + */ + private suspend fun initQsRecordData() { + var list = mutableListOf() + val realm = Realm.getDefaultInstance() + realm.executeTransaction { + val objects = realm.where().findAll() + list = realm.copyFromRealm(objects) + } + for (item in list) { + mapController.markerHandle.addOrUpdateQsRecordMark(item) + } + } + + /** + * 初始化渲染便签数据 + */ + private suspend fun initNoteData() { + var list = mutableListOf() + val realm = Realm.getDefaultInstance() + realm.executeTransaction { + val objects = realm.where().findAll() + list = realm.copyFromRealm(objects) } + + for (item in list) { + mapController.markerHandle.addOrUpdateNoteMark(item) + } } + /** + * 初始化定位信息 + */ private fun initLocation() { //用于定位点存储到数据库 viewModelScope.launch(Dispatchers.Default) { diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklink/TaskLinkFragment.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklink/TaskLinkFragment.kt index 703e0d85..f259415d 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklink/TaskLinkFragment.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklink/TaskLinkFragment.kt @@ -6,7 +6,6 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.Toast -import androidx.fragment.app.viewModels import androidx.navigation.findNavController import androidx.navigation.fragment.findNavController import com.navinfo.collect.library.map.NIMapController @@ -14,7 +13,6 @@ import com.navinfo.omqs.R import com.navinfo.omqs.databinding.FragmentTaskLinkBinding import com.navinfo.omqs.ui.activity.map.MainActivity import com.navinfo.omqs.ui.fragment.BaseFragment -import com.navinfo.omqs.ui.other.BaseToast import com.navinfo.omqs.ui.other.shareViewModels import dagger.hilt.android.AndroidEntryPoint import javax.inject.Inject @@ -144,7 +142,9 @@ class TaskLinkFragment : BaseFragment(), View.OnClickListener { onBackPressed() } binding.taskLinkBarSave -> { - viewModel.saveData() + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + viewModel.saveData() + } } } } diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklink/TaskLinkViewModel.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklink/TaskLinkViewModel.kt index 88778e8e..1ccd5587 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklink/TaskLinkViewModel.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklink/TaskLinkViewModel.kt @@ -2,12 +2,14 @@ package com.navinfo.omqs.ui.fragment.tasklink import android.content.SharedPreferences import android.os.Build +import androidx.annotation.RequiresApi import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.navinfo.collect.library.data.entity.HadLinkDvoBean import com.navinfo.collect.library.data.entity.TaskBean import com.navinfo.collect.library.map.NIMapController +import com.navinfo.collect.library.utils.GeometryTools import com.navinfo.omqs.Constant import dagger.hilt.android.lifecycle.HiltViewModel import io.realm.Realm @@ -22,14 +24,14 @@ import javax.inject.Inject @HiltViewModel class TaskLinkViewModel @Inject constructor( - val mapController: NIMapController, - val sharedPreferences: SharedPreferences + private val mapController: NIMapController, + private val sharedPreferences: SharedPreferences ) : ViewModel(), SharedPreferences.OnSharedPreferenceChangeListener { /** * 种别 */ - private val kindList = listOf( + private val kindList = listOf( TaskLinkInfoAdapterItem("高速道路", "1"), TaskLinkInfoAdapterItem("城市高速", "2"), TaskLinkInfoAdapterItem("国道", "3"), @@ -47,7 +49,7 @@ class TaskLinkViewModel @Inject constructor( /** * FunctionGrade 功能等级 */ - private val functionLevelList = listOf( + private val functionLevelList = listOf( TaskLinkInfoAdapterItem("等级1", "1"), TaskLinkInfoAdapterItem("等级2", "2"), TaskLinkInfoAdapterItem("等级3", "3"), @@ -58,7 +60,7 @@ class TaskLinkViewModel @Inject constructor( /** * 数据级别 */ - private val dataLevelList = listOf( + private val dataLevelList = listOf( TaskLinkInfoAdapterItem("Pro lane model(有高精车道模型覆盖的高速和城高link)", "1"), TaskLinkInfoAdapterItem("Lite lane model(有高精车道模型覆盖的普通路link)", "2"), TaskLinkInfoAdapterItem("Standard road model(其他link)", "3"), @@ -115,7 +117,7 @@ class TaskLinkViewModel @Inject constructor( val id = sharedPreferences.getInt(Constant.SELECT_TASK_ID, -1) val realm = Realm.getDefaultInstance() val res = realm.where(TaskBean::class.java).equalTo("id", id).findFirst() - liveDataTaskBean.postValue(realm.copyFromRealm(res)) + liveDataTaskBean.postValue(res?.let { realm.copyFromRealm(it) }) } } @@ -162,18 +164,17 @@ class TaskLinkViewModel @Inject constructor( /** * 保存数据 */ + @RequiresApi(Build.VERSION_CODES.M) fun saveData() { viewModelScope.launch(Dispatchers.Default) { if (liveDataTaskBean.value == null) { liveDataToastMessage.postValue("还没有选择任何一条任务!") return@launch } - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - if (mapController.measureLayerHandler.mPathLayer.points.size < 2) { - liveDataToastMessage.postValue("道路点少于2个!") - return@launch - } + if (mapController.measureLayerHandler.mPathLayer.points.size < 2) { + liveDataToastMessage.postValue("道路点少于2个!") + return@launch } if (liveDataSelectKind.value == null) { liveDataToastMessage.postValue("请选择种别!") @@ -187,7 +188,21 @@ class TaskLinkViewModel @Inject constructor( liveDataToastMessage.postValue("请选择数据等级!") return@launch } - val linkBean = HadLinkDvoBean(linkPid = UUID.randomUUID().toString()) + val linkBean = HadLinkDvoBean( + linkPid = UUID.randomUUID().toString(), + linkStatus = 3, + geometry = GeometryTools.getLineString(mapController.measureLayerHandler.mPathLayer.points), + linkLength = mapController.measureLayerHandler.lineLenghtLiveData.value!!, + ) + val task: TaskBean = liveDataTaskBean.value!! + task.hadLinkDvoList.add(linkBean) + val realm = Realm.getDefaultInstance() + realm.executeTransaction { + it.copyToRealmOrUpdate(task) + } + sharedPreferences.edit().putString(Constant.SHARED_SYNC_TASK_LINK_ID, linkBean.linkPid) + .apply() + liveDataFinish.postValue(true) } } diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskViewModel.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskViewModel.kt index 64df50fb..e0d9876e 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskViewModel.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskViewModel.kt @@ -1,9 +1,8 @@ package com.navinfo.omqs.ui.fragment.tasklist -import android.app.Dialog import android.content.Context import android.content.SharedPreferences -import android.graphics.Color +import android.content.SharedPreferences.OnSharedPreferenceChangeListener import android.os.Build import android.widget.Toast import androidx.annotation.RequiresApi @@ -51,6 +50,8 @@ class TaskViewModel @Inject constructor( */ val liveDataTaskUpload = MutableLiveData>() +// private val colors = +// arrayOf(Color.RED, Color.YELLOW, Color.BLUE, Color.MAGENTA, Color.GREEN, Color.CYAN) /** * 用来确定是否关闭 */ @@ -72,13 +73,16 @@ class TaskViewModel @Inject constructor( private var filterTaskJob: Job? = null + init { + sharedPreferences.registerOnSharedPreferenceChangeListener(this) + } + /** * 下载任务列表 */ fun getTaskList(context: Context) { viewModelScope.launch(Dispatchers.IO) { - var taskList: List = mutableListOf() when (val result = networkService.getTaskList(Constant.USER_ID)) { is NetResult.Success -> { if (result.data != null) { @@ -94,6 +98,7 @@ class TaskViewModel @Inject constructor( task.fileSize = item.fileSize task.status = item.status task.currentSize = item.currentSize + task.hadLinkDvoList = item.hadLinkDvoList //已上传后不在更新操作时间 if (task.syncStatus != FileManager.Companion.FileUploadStatus.DONE) { //赋值时间,用于查询过滤 @@ -127,27 +132,40 @@ class TaskViewModel @Inject constructor( is NetResult.Loading -> {} } - val realm = Realm.getDefaultInstance() - //过滤掉已上传的超过90天的数据 - var nowTime: Long = DateTimeUtil.getNowDate().time - var beginNowTime: Long = nowTime - 90 * 3600 * 24 * 1000L - var syncUpload: Int = FileManager.Companion.FileUploadStatus.DONE - val objects = - realm.where(TaskBean::class.java).notEqualTo("syncStatus", syncUpload).or() - .between("operationTime", beginNowTime, nowTime) - .equalTo("syncStatus", syncUpload).findAll() - taskList = realm.copyFromRealm(objects) + getLocalTaskList() + } + } + + /** + * 获取任务列表 + */ + private suspend fun getLocalTaskList() { + val realm = Realm.getDefaultInstance() + //过滤掉已上传的超过90天的数据 + val nowTime: Long = DateTimeUtil.getNowDate().time + val beginNowTime: Long = nowTime - 90 * 3600 * 24 * 1000L + val syncUpload: Int = FileManager.Companion.FileUploadStatus.DONE + val objects = + realm.where(TaskBean::class.java).notEqualTo("syncStatus", syncUpload).or() + .between("operationTime", beginNowTime, nowTime) + .equalTo("syncStatus", syncUpload).findAll() + val taskList = realm.copyFromRealm(objects) + for (item in taskList) { + FileManager.checkOMDBFileInfo(item) + } + liveDataTaskList.postValue(taskList) + val id = sharedPreferences.getInt(Constant.SELECT_TASK_ID, -1) + if (id > -1) { for (item in taskList) { - FileManager.checkOMDBFileInfo(item) - } - liveDataTaskList.postValue(taskList) - val id = sharedPreferences.getInt(Constant.SELECT_TASK_ID, -1) - if (id > -1) { - for(item in taskList){ - if(item.id == id){ - currentSelectTaskBean = item - liveDataTaskLinks.postValue(currentSelectTaskBean!!.hadLinkDvoList) + if (item.id == id) { + currentSelectTaskBean = item + liveDataTaskLinks.postValue(currentSelectTaskBean!!.hadLinkDvoList) + withContext(Dispatchers.Main) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + showTaskLinks(currentSelectTaskBean!!) + } } + break } } } @@ -156,14 +174,21 @@ class TaskViewModel @Inject constructor( /** * 设置当前选择的任务,并高亮当前任务的所有link */ - @RequiresApi(Build.VERSION_CODES.M) + fun setSelectTaskBean(taskBean: TaskBean) { - sharedPreferences.edit().putInt(Constant.SELECT_TASK_ID, taskBean.id).commit() + sharedPreferences.edit().putInt(Constant.SELECT_TASK_ID, taskBean.id).apply() currentSelectTaskBean = taskBean liveDataTaskLinks.value = taskBean.hadLinkDvoList + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + showTaskLinks(taskBean) + } + } + + @RequiresApi(Build.VERSION_CODES.M) + private fun showTaskLinks(taskBean: TaskBean) { mapController.lineHandler.omdbTaskLinkLayer.removeAll() mapController.markerHandle.clearNiLocationLayer() @@ -238,7 +263,9 @@ class TaskViewModel @Inject constructor( super.onCleared() } - + /** + * 保存link补作业原因 + */ suspend fun saveLinkReason(bean: HadLinkDvoBean, text: String) { withContext(Dispatchers.IO) { currentSelectTaskBean?.let { @@ -247,11 +274,12 @@ class TaskViewModel @Inject constructor( item.reason = text } } + val realm = Realm.getDefaultInstance() + realm.executeTransaction { r -> + r.copyToRealmOrUpdate(it) + } } - val realm = Realm.getDefaultInstance() - realm.executeTransaction { - realm.copyToRealmOrUpdate(currentSelectTaskBean) - } + } } @@ -275,6 +303,9 @@ class TaskViewModel @Inject constructor( } } + /** + * 筛选link + */ fun filterTask(pidKey: String) { if (currentSelectTaskBean == null) return @@ -292,6 +323,9 @@ class TaskViewModel @Inject constructor( } } + /** + * 关闭任务 + */ fun removeTask(context: Context, taskBean: TaskBean) { if (taskBean != null) { val mDialog = FirstDialog(context) @@ -345,6 +379,50 @@ class TaskViewModel @Inject constructor( }) mDialog.show() } + val mDialog = FirstDialog(context) + mDialog.setTitle("提示?") + mDialog.setMessage("是否关闭,请确认!") + mDialog.setPositiveButton( + "确定" + ) { _, _ -> + mDialog.dismiss() + viewModelScope.launch(Dispatchers.IO) { + val realm = Realm.getDefaultInstance() + realm.executeTransaction { + val objects = it.where(TaskBean::class.java) + .equalTo("id", taskBean.id).findFirst() + objects?.deleteFromRealm() + } + //遍历删除对应的数据 + taskBean.hadLinkDvoList.forEach { hadLinkDvoBean -> + val qsRecordList = realm.where(QsRecordBean::class.java) + .equalTo("linkId", hadLinkDvoBean.linkPid).findAll() + if (qsRecordList != null && qsRecordList.size > 0) { + val copyList = realm.copyFromRealm(qsRecordList) + copyList.forEach { + it.deleteFromRealm() + mapController.markerHandle.removeQsRecordMark(it) + mapController.mMapView.vtmMap.updateMap(true) + } + } + } + //过滤掉已上传的超过90天的数据 + val nowTime: Long = DateTimeUtil.getNowDate().time + val beginNowTime: Long = nowTime - 90 * 3600 * 24 * 1000L + val syncUpload: Int = FileManager.Companion.FileUploadStatus.DONE + val objects = realm.where(TaskBean::class.java) + .notEqualTo("syncStatus", syncUpload).or() + .between("operationTime", beginNowTime, nowTime) + .equalTo("syncStatus", syncUpload).findAll() + val taskList = realm.copyFromRealm(objects) + for (item in taskList) { + FileManager.checkOMDBFileInfo(item) + } + liveDataTaskList.postValue(taskList) + } + } + mDialog.setNegativeButton("取消", null) + mDialog.show() } fun checkUploadTask(context: Context, taskBean: TaskBean) { @@ -361,19 +439,15 @@ class TaskViewModel @Inject constructor( mDialog.setTitle("提示?") mDialog.setMessage("此任务中存在未测评link,请确认!") mDialog.setPositiveButton( - "确定", - object : FirstDialog.OnClickListener { - override fun onClick(dialog: Dialog?, which: Int) { - mDialog.dismiss() - map[taskBean] = true - liveDataTaskUpload.postValue(map) - } - }) - mDialog.setNegativeButton("取消", object : FirstDialog.OnClickListener { - override fun onClick(dialog: Dialog?, which: Int) { - mDialog.dismiss() - } - }) + "确定" + ) { _, _ -> + mDialog.dismiss() + map[taskBean] = true + liveDataTaskUpload.postValue(map) + } + mDialog.setNegativeButton( + "取消" + ) { _, _ -> mDialog.dismiss() } mDialog.show() } return@launch @@ -383,4 +457,15 @@ class TaskViewModel @Inject constructor( } } } + + /** + * 监听新增的评测link + */ + override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) { + if (key == Constant.SHARED_SYNC_TASK_LINK_ID) { + viewModelScope.launch(Dispatchers.IO) { + getLocalTaskList() + } + } + } } 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 45eff38c..a5637f28 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 @@ -64,12 +64,52 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : /** * 文字画笔 */ + private val paint: Paint by lazy { + val p = CanvasAdapter.newPaint() + p.setTypeface(Paint.FontFamily.DEFAULT, Paint.FontStyle.NORMAL) + p.setTextSize(NUM_13 * CanvasAdapter.getScale()) + p.strokeWidth = 2 * CanvasAdapter.getScale() + p.color = Color.parseColor(mDefaultTextColor) + p + } - private lateinit var paint: Paint + /** + * 画布 + */ + private val canvas: org.oscim.backend.canvas.Canvas by lazy { + CanvasAdapter.newCanvas() + } - //画布 - private lateinit var canvas: org.oscim.backend.canvas.Canvas - private lateinit var itemizedLayer: MyItemizedLayer + /** + * 默认marker图层 + */ + private val mDefaultMarkerLayer: ItemizedLayer by lazy { + //新增marker图标样式 + val mDefaultBitmap = + AndroidBitmap(BitmapFactory.decodeResource(context.resources, R.mipmap.marker)) + + val markerSymbol = MarkerSymbol( + mDefaultBitmap, + MarkerSymbol.HotspotPlace.BOTTOM_CENTER + ) + val layer = ItemizedLayer( + mapView.vtmMap, + ArrayList(), + markerSymbol, + object : OnItemGestureListener { + override fun onItemSingleTapUp(index: Int, item: MarkerInterface?): Boolean { + return false + } + + override fun onItemLongPress(index: Int, item: MarkerInterface?): Boolean { + return false + } + + } + ) + addLayer(layer, NIMapView.LAYER_GROUPS.OPERATE_MARKER) + layer + } private lateinit var niLocationItemizedLayer: MyItemizedLayer @@ -83,9 +123,45 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : private var niLocationBitmap3: Bitmap? = null /** - * 文字大小 + * 评测数据marker 图层 */ - private val NUM_13 = 13 + private val qsRecordItemizedLayer: MyItemizedLayer by lazy { + val layer = MyItemizedLayer( + mMapView.vtmMap, + mutableListOf(), + markerRendererFactory, + object : MyItemizedLayer.OnItemGestureListener { + override fun onItemSingleTapUp( + list: MutableList, + nearest: Int + ): Boolean { + itemListener?.let { + val idList = mutableListOf() + if (list.size == 0) { + } else { + for (i in list) { + val markerInterface: MarkerInterface = + qsRecordItemizedLayer.itemList[i] + if (markerInterface is MarkerItem) { + idList.add(markerInterface.title) + } + } + it.onQsRecordList(idList.distinct().toMutableList()) + } + } + return true + } + + override fun onItemLongPress( + list: MutableList?, + nearest: Int + ): Boolean { + return true + } + }) + addLayer(layer, NIMapView.LAYER_GROUPS.OPERATE_MARKER) + layer + } /** * 便签线图层 @@ -96,7 +172,9 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : layer } - + /** + * 便签图标图层 + */ private val noteLayer: MyItemizedLayer by lazy { val layer = MyItemizedLayer( @@ -111,6 +189,7 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : itemListener?.let { val idList = mutableListOf() if (list.size == 0) { + } else { for (i in list) { val markerInterface: MarkerInterface = @@ -137,6 +216,41 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : layer } + + private val markerRendererFactory: MarkerRendererFactory by lazy { + val bitmapPoi: Bitmap = AndroidBitmap( + BitmapFactory.decodeResource( + mContext.resources, + R.mipmap.map_icon_blue2 + ) + ) + val symbol = MarkerSymbol(bitmapPoi, MarkerSymbol.HotspotPlace.BOTTOM_CENTER) + MarkerRendererFactory { markerLayer -> + object : ClusterMarkerRenderer( + mContext, + markerLayer, + symbol, + ClusterStyle( + org.oscim.backend.canvas.Color.WHITE, + org.oscim.backend.canvas.Color.BLUE + ) + ) { +// override fun getClusterBitmap(size: Int): Bitmap? { +// return super.getclusterbitmap(size) +// } + } + } + } + private val resId = R.mipmap.map_icon_report + private val noteResId = R.drawable.icon_note_marker + private var itemListener: OnQsRecordItemClickListener? = null + + /** + * 文字大小 + */ + private val NUM_13 = 13 + + init { //新增marker图标样式 val mDefaultBitmap = @@ -173,7 +287,7 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : // 设置矢量图层均在12级以上才显示 mMapView.vtmMap.events.bind(Map.UpdateListener { e, mapPosition -> if (e == Map.SCALE_EVENT) { - itemizedLayer.isEnabled = mapPosition.getZoomLevel() >= 12 + qsRecordItemizedLayer.isEnabled = mapPosition.getZoomLevel() >= 12 } }) initNoteData() @@ -182,11 +296,17 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : mMapView.updateMap() } + /** + * 设置marker 点击回调 + */ fun setOnQsRecordItemClickListener(listener: OnQsRecordItemClickListener?) { itemListener = listener } - //增加marker + /** + * 增加marker + */ + fun addMarker( geoPoint: GeoPoint, title: String?, @@ -200,16 +320,16 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : } } if (marker == null) { - var tempTitle = title; + var tempTitle = title if (tempTitle.isNullOrBlank()) { - tempTitle = StringUtil.createUUID(); + tempTitle = StringUtil.createUUID() } val marker = MarkerItem( tempTitle, description, geoPoint ) - mDefaultMarkerLayer.addItem(marker); + mDefaultMarkerLayer.addItem(marker) mMapView.vtmMap.updateMap(true) } else { marker.description = description @@ -237,29 +357,28 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : } } + /** * 增加或更新marker */ - suspend fun addOrUpdateQsRecordMark(data: QsRecordBean) { - for (item in itemizedLayer.itemList) { + fun addOrUpdateQsRecordMark(data: QsRecordBean) { + for (item in qsRecordItemizedLayer.itemList) { if (item is MarkerItem) { if (item.title == data.id) { - itemizedLayer.itemList.remove(item) + qsRecordItemizedLayer.itemList.remove(item) break } } } - createMarkerItem(data) - withContext(Dispatchers.Main) { - mMapView.updateMap(true) - } + createQsRecordMarker(data) + mMapView.updateMap(true) } /** * 增加或更新便签 */ - suspend fun addOrUpdateNoteMark(data: NoteBean) { + fun addOrUpdateNoteMark(data: NoteBean) { for (item in noteLayer.itemList) { if (item is MarkerItem) { if (item.title == data.id) { @@ -270,9 +389,7 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : } noteLineLayer.removeNoteBeanLines(data) createNoteMarkerItem(data) - withContext(Dispatchers.Main) { - mMapView.updateMap(true) - } + mMapView.updateMap(true) } @@ -280,19 +397,13 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : var resultDrawable: Drawable? = null if ("POINT" == geometry.geometryType.uppercase(Locale.getDefault())) { val geoPoint = GeoPoint(geometry.coordinate.y, geometry.coordinate.x) - if (geoPoint != null) { - resultDrawable = PointDrawable(geoPoint, vectorLayerStyle) - } + resultDrawable = PointDrawable(geoPoint, vectorLayerStyle) } else if ("LINESTRING" == geometry.geometryType.uppercase(Locale.getDefault())) { val lineString = geometry as LineString - if (lineString != null) { - resultDrawable = LineDrawable(lineString, vectorLayerStyle) - } + resultDrawable = LineDrawable(lineString, vectorLayerStyle) } else if ("POLYGON" == geometry.geometryType.uppercase(Locale.getDefault())) { val polygon = geometry as Polygon - if (polygon != null) { - resultDrawable = PolygonDrawable(polygon, vectorLayerStyle) - } + resultDrawable = PolygonDrawable(polygon, vectorLayerStyle) } return resultDrawable } @@ -301,12 +412,12 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : /** * 删除质检数据 */ - suspend fun removeQsRecordMark(data: QsRecordBean) { - for (item in itemizedLayer.itemList) { + fun removeQsRecordMark(data: QsRecordBean) { + for (item in qsRecordItemizedLayer.itemList) { if (item is MarkerItem) { if (item.title == data.id) { - itemizedLayer.itemList.remove(item) - itemizedLayer.populate() + qsRecordItemizedLayer.itemList.remove(item) + qsRecordItemizedLayer.populate() return } } @@ -316,124 +427,39 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : /** * 删除标签 */ - suspend fun removeNoteMark(data: NoteBean) { + fun removeNoteMark(data: NoteBean) { for (item in noteLayer.itemList) { if (item is MarkerItem) { if (item.title == data.id) { noteLayer.itemList.remove(item) noteLineLayer.removeNoteBeanLines(data) noteLayer.populate() - withContext(Dispatchers.Main) { - mMapView.updateMap(true) - } + mMapView.updateMap(true) return } } } } - /** - * 初始化便签 - */ - private fun initNoteData() { - mContext.lifecycleScope.launch(Dispatchers.IO) { - var list = mutableListOf() - val realm = Realm.getDefaultInstance() - realm.executeTransaction { - val objects = realm.where().findAll() - list = realm.copyFromRealm(objects) - } - for (item in list) { - createNoteMarkerItem(item) - } - } - } - - /** - * 初始话质检数据图层 - */ - private fun initQsRecordDataLayer() { - - canvas = CanvasAdapter.newCanvas() - paint = CanvasAdapter.newPaint() - paint.setTypeface(Paint.FontFamily.DEFAULT, Paint.FontStyle.NORMAL) - paint.setTextSize(NUM_13 * CanvasAdapter.getScale()) - paint.strokeWidth = 2 * CanvasAdapter.getScale() - paint.color = Color.parseColor(mDefaultTextColor) - val bitmapPoi: Bitmap = AndroidBitmap( - BitmapFactory.decodeResource( - mContext.resources, - R.mipmap.map_icon_blue2 - ) - ) - val symbol = MarkerSymbol(bitmapPoi, MarkerSymbol.HotspotPlace.BOTTOM_CENTER) - markerRendererFactory = MarkerRendererFactory { markerLayer -> - object : ClusterMarkerRenderer( - mContext, - markerLayer, - symbol, - ClusterStyle( - org.oscim.backend.canvas.Color.WHITE, - org.oscim.backend.canvas.Color.BLUE - ) - ) { -// override fun getClusterBitmap(size: Int): Bitmap? { -// return super.getclusterbitmap(size) -// } - } - } - - itemizedLayer = - MyItemizedLayer( - mMapView.vtmMap, - mutableListOf(), - markerRendererFactory, - object : MyItemizedLayer.OnItemGestureListener { - override fun onItemSingleTapUp( - list: MutableList, - nearest: Int - ): Boolean { - itemListener?.let { - val idList = mutableListOf() - if (list.size == 0) { - } else { - for (i in list) { - val markerInterface: MarkerInterface = - itemizedLayer.itemList[i] - if (markerInterface is MarkerItem) { - idList.add(markerInterface.title) - } - } - it.onQsRecordList(idList.distinct().toMutableList()) - } - } - return true - } - - override fun onItemLongPress( - list: MutableList?, - nearest: Int - ): Boolean { - return true - } - }) - addLayer(itemizedLayer, NIMapView.LAYER_GROUPS.OPERATE_MARKER) - mContext.lifecycleScope.launch(Dispatchers.IO) { - var list = mutableListOf() - val realm = Realm.getDefaultInstance() - realm.executeTransaction { - val objects = realm.where().findAll() - list = realm.copyFromRealm(objects) - } -// realm.close() - - for (item in list) { - createMarkerItem(item) - } - } - - } +// /** +// * 初始话质检数据图层 +// */ +// private fun initQsRecordDataLayer() { +// +// mContext.lifecycleScope.launch(Dispatchers.IO) { +// var list = mutableListOf() +// val realm = Realm.getDefaultInstance() +// realm.executeTransaction { +// val objects = realm.where().findAll() +// list = realm.copyFromRealm(objects) +// } +// for (item in list) { +// createMarkerItem(item) +// } +// } +// +// } /** * 初始化定位图层 @@ -479,19 +505,19 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : /** * 添加质检数据marker */ - private suspend fun createNoteMarkerItem(item: NoteBean) { + private fun createNoteMarkerItem(item: NoteBean) { val bitmap: Bitmap = createTextMarkerBitmap(mContext, item.description, noteResId) val geometry: Geometry? = GeometryTools.createGeometry(item.guideGeometry) if (geometry != null) { - var geoPoint: org.oscim.core.GeoPoint? = null + var geoPoint: GeoPoint? = null if (geometry.geometryType != null) { when (geometry.geometryType.uppercase(Locale.getDefault())) { "POINT" -> geoPoint = - org.oscim.core.GeoPoint(geometry.coordinate.y, geometry.coordinate.x) + GeoPoint(geometry.coordinate.y, geometry.coordinate.x) } } if (geoPoint != null) { - var geoMarkerItem: MarkerItem + val geoMarkerItem: MarkerItem geoMarkerItem = ClusterMarkerItem( 1, item.id, item.description, geoPoint ) @@ -509,32 +535,69 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : /** * 添加质检数据marker */ - private suspend fun createMarkerItem(item: QsRecordBean) { + private fun createQsRecordMarker(item: QsRecordBean) { val bitmap: Bitmap = createTextMarkerBitmap(mContext, item.description, resId) if (item.t_lifecycle != 2) { val geometry: Geometry? = GeometryTools.createGeometry(item.geometry) if (geometry != null) { - var geoPoint: org.oscim.core.GeoPoint? = null + var geoPoint: GeoPoint? = null if (geometry.geometryType != null) { when (geometry.geometryType.uppercase(Locale.getDefault())) { "POINT" -> geoPoint = + GeoPoint(geometry.coordinate.y, geometry.coordinate.x) +// "LINESTRING" -> { +// val lineString = geometry as LineString +// if (lineString != null && lineString.coordinates.size > 0) { +// geoPoint = GeoPoint( +// lineString.coordinates[0].y, +// lineString.coordinates[0].x +// ) +// } +// val drawableLine: Drawable = +// convertGeometry2Drawable(geometry, lineStyle) +// if (drawableLine != null) { +// dataVectorLayer.add(drawableLine) +// } +// } +// "POLYGON" -> { +// val polygon = geometry as Polygon +// if (polygon != null && polygon.coordinates.size > 0) { +// geoPoint = GeoPoint( +// polygon.coordinates[0].y, +// polygon.coordinates[0].x +// ) +// } +// val drawablePolygon: Drawable = +// convertGeometry2Drawable(geometry, polygonStyle) +// if (drawablePolygon != null) { +// dataVectorLayer.add(drawablePolygon) +// } +// } org.oscim.core.GeoPoint(geometry.coordinate.y, geometry.coordinate.x) } } if (geoPoint != null) { - var geoMarkerItem: MarkerItem + val geoMarkerItem: MarkerItem // if (item.getType() === 1) { geoMarkerItem = ClusterMarkerItem( 1, item.id, item.description, geoPoint ) +// } else { +// geoMarkerItem = MarkerItem( +// ePointTemp.getType(), +// ePointTemp.getId(), +// ePointTemp.getStyleText(), +// geoPoint +// ) +// } val markerSymbol = MarkerSymbol(bitmap, MarkerSymbol.HotspotPlace.CENTER) geoMarkerItem.marker = markerSymbol - itemizedLayer.itemList.add(geoMarkerItem) + qsRecordItemizedLayer.itemList.add(geoMarkerItem) } } } - itemizedLayer.populate() + qsRecordItemizedLayer.populate() } /** @@ -774,7 +837,7 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : val originBitmap = android.graphics.Bitmap.createBitmap( if (drawable.intrinsicWidth > maxWidth) drawable.intrinsicWidth else maxWidth.toInt(), drawable.intrinsicHeight * 2, - android.graphics.Bitmap.Config.ARGB_4444 + android.graphics.Bitmap.Config.ARGB_8888 ) val androidCanvas = Canvas(originBitmap) val startX = (originBitmap.width - drawable.intrinsicWidth) / 2 @@ -808,5 +871,4 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : interface OnQsRecordItemClickListener { fun onQsRecordList(list: MutableList) fun onNoteList(list: MutableList) - fun onNiLocationList(list: MutableList) }