重构测量工具代码,修改代码逻辑和展现形式。

增加面积,角度测量
修改地图渲染面会崩溃的问题
This commit is contained in:
squallzhjch
2023-08-10 11:18:14 +08:00
parent 8578ea0afd
commit 4baa137ad6
14 changed files with 679 additions and 284 deletions

View File

@@ -9,6 +9,7 @@ import android.util.Log
import android.view.MotionEvent
import android.view.View
import android.widget.EditText
import android.widget.TextView
import android.widget.Toast
import androidx.activity.result.contract.ActivityResultContracts
import androidx.activity.viewModels
@@ -20,7 +21,7 @@ import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.navinfo.collect.library.map.NIMapController
import com.navinfo.collect.library.map.NIMapOptions
import com.navinfo.collect.library.map.handler.MeasureLayerHandler
import com.navinfo.omqs.Constant
import com.navinfo.omqs.R
import com.navinfo.omqs.bean.ImportConfig
@@ -397,9 +398,124 @@ class MainActivity : BaseActivity() {
supportFragmentManager.beginTransaction()
.add(R.id.console_fragment_layout, ConsoleFragment()).commit()
}
initMeasuringTool()
}
//根据输入的经纬度跳转坐标
/**
*初始化测量工具栏的点击事件
*/
private fun initMeasuringTool() {
val root = binding.mainActivityMeasuringTool.root
root.findViewById<View>(R.id.measuring_tool_select_point)
.setOnClickListener(measuringToolClickListener)
root.findViewById<View>(R.id.measuring_tool_close)
.setOnClickListener(measuringToolClickListener)
root.findViewById<View>(R.id.measuring_tool_backspace)
.setOnClickListener(measuringToolClickListener)
root.findViewById<View>(R.id.measuring_tool_reset)
.setOnClickListener(measuringToolClickListener)
root.findViewById<View>(R.id.measuring_tool_distance)
.setOnClickListener(measuringToolClickListener)
root.findViewById<View>(R.id.measuring_tool_area)
.setOnClickListener(measuringToolClickListener)
root.findViewById<View>(R.id.measuring_tool_angle)
.setOnClickListener(measuringToolClickListener)
}
/**
* 测量工具点击事件
*/
private val measuringToolClickListener = View.OnClickListener {
when (it.id) {
//选点
R.id.measuring_tool_select_point -> {
viewModel.addPointForMeasuringTool()
}
//关闭
R.id.measuring_tool_close -> {
measuringToolOff()
}
//上一步
R.id.measuring_tool_backspace -> {
viewModel.backPointForMeasuringTool()
}
//重绘
R.id.measuring_tool_reset -> {
viewModel.resetMeasuringTool()
}
//测距
R.id.measuring_tool_distance -> {
it.isSelected = true
viewModel.setMeasuringToolType(MeasureLayerHandler.MEASURE_TYPE.DISTANCE)
val root = binding.mainActivityMeasuringTool.root
root.findViewById<View>(R.id.measuring_tool_area).isSelected = false
root.findViewById<View>(R.id.measuring_tool_angle).isSelected = false
}
//测面积
R.id.measuring_tool_area -> {
it.isSelected = true
viewModel.setMeasuringToolType(MeasureLayerHandler.MEASURE_TYPE.AREA)
val root = binding.mainActivityMeasuringTool.root
root.findViewById<View>(R.id.measuring_tool_distance).isSelected = false
root.findViewById<View>(R.id.measuring_tool_angle).isSelected = false
}
//测角度
R.id.measuring_tool_angle -> {
it.isSelected = true
viewModel.setMeasuringToolType(MeasureLayerHandler.MEASURE_TYPE.ANGLE)
val root = binding.mainActivityMeasuringTool.root
root.findViewById<View>(R.id.measuring_tool_distance).isSelected = false
root.findViewById<View>(R.id.measuring_tool_area).isSelected = false
}
}
}
/**
* 开始测量
*/
private fun measuringToolOn() {
val root = binding.mainActivityMeasuringTool.root
val valueView = root.findViewById<TextView>(R.id.measuring_tool_value)
val unitView = root.findViewById<TextView>(R.id.measuring_tool_value_unit)
val centerTextView = binding.mainActivityHomeCenterText
//监听测距值
mapController.measureLayerHandler.measureValueLiveData.observe(this) {
valueView.text = it.valueString
unitView.text = it.unit
}
mapController.measureLayerHandler.tempMeasureValueLiveData.observe(this)
{
centerTextView.text = "${it.valueString}${it.unit}"
}
viewModel.setMeasuringToolEnable(true)
binding.mainActivityHomeCenter.visibility = View.VISIBLE
binding.mainActivityHomeCenterText.visibility = View.VISIBLE
viewModel.setMeasuringToolType(MeasureLayerHandler.MEASURE_TYPE.DISTANCE)
root.visibility = View.VISIBLE
root.findViewById<View>(R.id.measuring_tool_distance).isSelected = true
root.findViewById<View>(R.id.measuring_tool_area).isSelected = false
root.findViewById<View>(R.id.measuring_tool_angle).isSelected = false
}
/**
* 结束测量
*/
private fun measuringToolOff() {
//监听测距值
mapController.measureLayerHandler.measureValueLiveData.removeObservers(this)
mapController.measureLayerHandler.tempMeasureValueLiveData.removeObservers(this)
viewModel.setMeasuringToolEnable(false)
binding.mainActivityHomeCenter.visibility = View.GONE
binding.mainActivityHomeCenterText.visibility = View.GONE
binding.mainActivityMeasuringTool.root.visibility = View.GONE
}
/**
* 根据输入的经纬度跳转坐标
*/
fun jumpPosition() {
val view = this.layoutInflater.inflate(R.layout.dialog_view_edittext, null)
val inputDialog = MaterialAlertDialogBuilder(
@@ -488,10 +604,10 @@ class MainActivity : BaseActivity() {
}
/**
* 点击计算
* 点击测速
*/
fun onClickCalcDisance() {
fun onClickCalcDistance() {
measuringToolOn()
}
/**
@@ -825,7 +941,7 @@ class MainActivity : BaseActivity() {
}
}
private fun showMainActivityBottomSheetGroup(){
private fun showMainActivityBottomSheetGroup() {
binding.mainActivityBottomSheetGroup.visibility = View.VISIBLE
mapController.mMapView.setScaleBarLayer(GLViewport.Position.BOTTOM_CENTER, 128, 65)
mapController.mMapView.vtmMap.animator().animateTo(
@@ -836,7 +952,7 @@ class MainActivity : BaseActivity() {
)
}
private fun hideMainActivityBottomSheetGroup(){
private fun hideMainActivityBottomSheetGroup() {
binding.mainActivityBottomSheetGroup.visibility = View.GONE
mapController.mMapView.setScaleBarLayer(GLViewport.Position.BOTTOM_CENTER, 128, 5)
mapController.mMapView.vtmMap.animator().animateTo(

View File

@@ -22,16 +22,12 @@ import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import androidx.navigation.findNavController
import com.blankj.utilcode.util.ToastUtils
import com.blankj.utilcode.util.ViewUtils.runOnUiThread
import com.navinfo.collect.library.data.dao.impl.TraceDataBase
import com.navinfo.collect.library.data.entity.*
import com.navinfo.collect.library.garminvirbxe.HostBean
import com.navinfo.collect.library.map.NIMapController
import com.navinfo.collect.library.map.OnGeoPointClickListener
import com.navinfo.collect.library.map.handler.ONNoteItemClickListener
import com.navinfo.collect.library.map.handler.OnNiLocationItemListener
import com.navinfo.collect.library.map.handler.OnQsRecordItemClickListener
import com.navinfo.collect.library.map.handler.OnTaskLinkItemClickListener
import com.navinfo.collect.library.map.handler.*
import com.navinfo.collect.library.utils.GeometryTools
import com.navinfo.collect.library.utils.GeometryToolsKt
import com.navinfo.omqs.Constant
@@ -59,10 +55,8 @@ import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import org.locationtech.jts.geom.Point
import org.oscim.core.GeoPoint
import org.oscim.core.MapPosition
import org.oscim.layers.marker.MarkerItem
import org.oscim.map.Map
import org.videolan.libvlc.LibVlcUtil
import java.io.File
@@ -174,6 +168,17 @@ class MainViewModel @Inject constructor(
*/
private var bSelectPauseTrace = false
/**
* 是不是开启测距
*/
private var bMeasuringTool = false
/**
* 测量类型
*/
var measuringType: MeasureLayerHandler.MEASURE_TYPE =
MeasureLayerHandler.MEASURE_TYPE.DISTANCE
var linkIdCache = ""
private var lastNiLocaion: NiLocation? = null
@@ -219,12 +224,16 @@ class MainViewModel @Inject constructor(
object : OnGeoPointClickListener {
override fun onMapClick(tag: String, point: GeoPoint) {
if (tag == TAG) {
viewModelScope.launch(Dispatchers.IO) {
//线选择状态
if (bSelectRoad) {
captureLink(point)
} else {
captureItem(point)
if (bMeasuringTool) {
mapController.measureLayerHandler.addPoint(measuringType, point)
} else {
viewModelScope.launch(Dispatchers.IO) {
//线选择状态
if (bSelectRoad) {
captureLink(point)
} else {
captureItem(point)
}
}
}
}
@@ -1028,12 +1037,12 @@ class MainViewModel @Inject constructor(
val nextNiLocation =
mapController.markerHandle.getNILocation(currentIndexNiLocation + 1)
if (nextNiLocation != null && niLocation != null) {
var nilocationDisTime =
var niLocationDisTime =
nextNiLocation.timeStamp.toLong() - niLocation.timeStamp.toLong()
disTime = if (nilocationDisTime < 1000) {
disTime = if (niLocationDisTime < 1000) {
1000
} else {
nilocationDisTime
niLocationDisTime
}
showMarker(mapController.mMapView.context, nextNiLocation)
currentIndexNiLocation += 1
@@ -1053,5 +1062,45 @@ class MainViewModel @Inject constructor(
fun cancelTrace() {
timer?.cancel()
}
/**
* 开启测量工具
*/
fun setMeasuringToolEnable(b: Boolean) {
bMeasuringTool = b
mapController.measureLayerHandler.clear()
}
/**
* 测量打点
*/
fun addPointForMeasuringTool() {
mapController.measureLayerHandler.addPoint(measuringType)
}
/**
* 测距回退点
*/
fun backPointForMeasuringTool() {
mapController.measureLayerHandler.backspacePoint()
}
/**
* 重绘
*/
fun resetMeasuringTool() {
mapController.measureLayerHandler.clear()
}
/**
* 设置测量类型 0距离 2面积 3角度
*/
fun setMeasuringToolType(type: MeasureLayerHandler.MEASURE_TYPE) {
if(measuringType != type) {
measuringType = type
mapController.measureLayerHandler.clear()
}
}
}

View File

@@ -1,6 +1,5 @@
package com.navinfo.omqs.ui.fragment.tasklink
import android.os.Build
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
@@ -38,7 +37,7 @@ class TaskLinkFragment : BaseFragment(), View.OnClickListener {
arguments?.let {
val id = it.getString("TaskLinkId")
if (id != null && id.isNotEmpty()){
if (id != null && id.isNotEmpty()) {
viewModel.initData(id)
}
}
@@ -97,11 +96,11 @@ class TaskLinkFragment : BaseFragment(), View.OnClickListener {
/**
* 线长度
*/
mapController.measureLayerHandler.lineLengthLiveData.observe(viewLifecycleOwner) {
mapController.measureLayerHandler.measureValueLiveData.observe(viewLifecycleOwner) {
binding.taskLinkLength.text = "${it}"
}
mapController.measureLayerHandler.tempLineDistanceLiveData.observe(viewLifecycleOwner) {
(activity as MainActivity).setHomeCenterText(it)
mapController.measureLayerHandler.tempMeasureValueLiveData.observe(viewLifecycleOwner) {
(activity as MainActivity).setHomeCenterText("${it.valueString}${it.unit}")
}
}
@@ -159,7 +158,7 @@ class TaskLinkFragment : BaseFragment(), View.OnClickListener {
binding.taskLinkClear -> {
viewModel.clearLink()
}
binding.taskLinkBarDelete ->{
binding.taskLinkBarDelete -> {
viewModel.deleteData(requireContext())
}
}

View File

@@ -1,10 +1,7 @@
package com.navinfo.omqs.ui.fragment.tasklink
import android.app.Dialog
import android.content.Context
import android.content.SharedPreferences
import android.os.Build
import androidx.annotation.RequiresApi
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
@@ -13,18 +10,15 @@ import com.navinfo.collect.library.data.entity.LinkInfoBean
import com.navinfo.collect.library.data.entity.QsRecordBean
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.collect.library.utils.GeometryTools
import com.navinfo.omqs.Constant
import com.navinfo.omqs.ui.dialog.FirstDialog
import dagger.hilt.android.lifecycle.HiltViewModel
import io.realm.Realm
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import org.bson.codecs.UuidCodec
import org.bson.internal.UuidHelper
import org.oscim.core.GeoPoint
import java.util.UUID
import javax.inject.Inject
@@ -136,7 +130,7 @@ class TaskLinkViewModel @Inject constructor(
* 编辑点
*/
fun addPoint() {
mapController.measureLayerHandler.drawLineOrPolygon(false)
mapController.measureLayerHandler.addPoint(MeasureLayerHandler.MEASURE_TYPE.DISTANCE)
}
/**
@@ -198,7 +192,7 @@ class TaskLinkViewModel @Inject constructor(
if (hadLinkDvoBean != null) {
hadLinkDvoBean!!.taskId = liveDataTaskBean.value!!.id
hadLinkDvoBean!!.length =
mapController.measureLayerHandler.lineLengthLiveData.value!!
mapController.measureLayerHandler.measureValueLiveData.value!!.value
hadLinkDvoBean!!.geometry =
GeometryTools.getLineString(mapController.measureLayerHandler.mPathLayer.points)
hadLinkDvoBean!!.linkInfo = LinkInfoBean(
@@ -218,7 +212,7 @@ class TaskLinkViewModel @Inject constructor(
taskId = liveDataTaskBean.value!!.id,
linkPid = UUID.randomUUID().toString(),
linkStatus = 3,
length = mapController.measureLayerHandler.lineLengthLiveData.value!!,
length = mapController.measureLayerHandler.measureValueLiveData.value!!.value,
geometry = GeometryTools.getLineString(mapController.measureLayerHandler.mPathLayer.points),
linkInfo = LinkInfoBean(
kind = liveDataSelectKind.value!!.type,
@@ -256,7 +250,7 @@ class TaskLinkViewModel @Inject constructor(
* 绘制线的时候回退点
*/
fun removeLinkLastPoint() {
mapController.measureLayerHandler.drawLineBackspace()
mapController.measureLayerHandler.backspacePoint()
}
/**