Conflicts:
	app/src/main/java/com/navinfo/omqs/ui/activity/map/MainActivity.kt
This commit is contained in:
qiji4215
2023-09-26 17:23:38 +08:00
24 changed files with 781 additions and 289 deletions

View File

@@ -100,6 +100,7 @@
"code": 2017, "code": 2017,
"name": "道路施工", "name": "道路施工",
"catch":true, "catch":true,
"checkLinkId": false,
"zoomMin": 15, "zoomMin": 15,
"zoomMax": 17 "zoomMax": 17
}, },

View File

@@ -53,16 +53,16 @@ class Constant {
/** /**
* 当前安装的任务文件 * 当前安装的任务文件
*/ */
lateinit var currentInstallTaskFolder:File lateinit var currentInstallTaskFolder: File
lateinit var currentInstallTaskConfig:RealmConfiguration lateinit var currentInstallTaskConfig: RealmConfiguration
/** /**
* 当前选择的任务 * 当前选择的任务
*/ */
lateinit var currentSelectTaskFolder:File lateinit var currentSelectTaskFolder: File
lateinit var currentSelectTaskConfig:RealmConfiguration lateinit var currentSelectTaskConfig: RealmConfiguration
/** /**
* 用户附件数据目录 * 用户附件数据目录
@@ -90,7 +90,6 @@ class Constant {
var INDOOR_IP: String = "" var INDOOR_IP: String = ""
const val DEBUG = true const val DEBUG = true
/** /**
@@ -160,6 +159,21 @@ class Constant {
const val SELECT_TASK_ID = "select_task_id" //选中的任务ID const val SELECT_TASK_ID = "select_task_id" //选中的任务ID
const val SHARED_SYNC_TASK_LINK_ID = "shared_sync_task_link_id"//利用shared通知任务页面更新 const val SHARED_SYNC_TASK_LINK_ID = "shared_sync_task_link_id"//利用shared通知任务页面更新
/**
* 偏离距离 单位:米
*/
const val NAVI_DEVIATION_DISTANCE = "navi_deviation_distance"
/**
* 偏离次数上限
*/
const val NAVI_DEVIATION_COUNT = "navi_deviation_count"
/**
* 最远显示距离 米
*/
const val NAVI_FARTHEST_DISPLAY_DISTANCE = "navi_farthest_display_distance"
} }

View File

@@ -0,0 +1,26 @@
package com.navinfo.omqs.bean
import android.os.Parcelable
import androidx.room.ColumnInfo
import androidx.room.Entity
import androidx.room.PrimaryKey
import kotlinx.parcelize.Parcelize
@Entity(tableName = "ScWarningCode")
@Parcelize
data class ScWarningCodeBean(
@PrimaryKey(autoGenerate = true)
var id: Long = 0,
/**
* code
* 编码
*/
@ColumnInfo("CODE")
val code: String = "",
/**
* 描述
*/
@ColumnInfo("DESCRIBE")
val describe: String = "",
) : Parcelable

View File

@@ -9,7 +9,7 @@ data class SignBean(
//图标ID //图标ID
var iconId: Int = 0, var iconId: Int = 0,
//定位点到目标距离 //定位点到目标距离
val distance: Int = 0, var distance: Int = 0,
//左上图标中的文字 //左上图标中的文字
val iconText: String = "", val iconText: String = "",
//绑定的linkid //绑定的linkid

View File

@@ -6,17 +6,20 @@ import com.navinfo.collect.library.data.entity.NiLocation
import com.navinfo.omqs.bean.OfflineMapCityBean import com.navinfo.omqs.bean.OfflineMapCityBean
import com.navinfo.omqs.bean.ScProblemTypeBean import com.navinfo.omqs.bean.ScProblemTypeBean
import com.navinfo.omqs.bean.ScRootCauseAnalysisBean import com.navinfo.omqs.bean.ScRootCauseAnalysisBean
import com.navinfo.omqs.bean.ScWarningCodeBean
import com.navinfo.omqs.db.dao.OfflineMapDao import com.navinfo.omqs.db.dao.OfflineMapDao
import com.navinfo.omqs.db.dao.ScProblemTypeDao import com.navinfo.omqs.db.dao.ScProblemTypeDao
import com.navinfo.omqs.db.dao.ScRootCauseAnalysisDao import com.navinfo.omqs.db.dao.ScRootCauseAnalysisDao
import com.navinfo.omqs.db.dao.ScWarningCodeDao
@Database( @Database(
entities = [OfflineMapCityBean::class, ScProblemTypeBean::class, ScRootCauseAnalysisBean::class], entities = [OfflineMapCityBean::class, ScProblemTypeBean::class, ScRootCauseAnalysisBean::class, ScWarningCodeBean::class],
version = 1, version = 2,
exportSchema = false exportSchema = false
) )
abstract class RoomAppDatabase : RoomDatabase() { abstract class RoomAppDatabase : RoomDatabase() {
abstract fun getOfflineMapDao(): OfflineMapDao abstract fun getOfflineMapDao(): OfflineMapDao
abstract fun getScProblemTypeDao(): ScProblemTypeDao abstract fun getScProblemTypeDao(): ScProblemTypeDao
abstract fun getScRootCauseAnalysisDao(): ScRootCauseAnalysisDao abstract fun getScRootCauseAnalysisDao(): ScRootCauseAnalysisDao
abstract fun getScWarningCodeDao(): ScWarningCodeDao
} }

View File

@@ -0,0 +1,32 @@
package com.navinfo.omqs.db.dao
import androidx.room.*
import com.navinfo.omqs.bean.ScProblemTypeBean
import com.navinfo.omqs.bean.ScWarningCodeBean
@Dao
interface ScWarningCodeDao {
@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insertList(list: List<ScWarningCodeBean>)
@Query("delete from ScWarningCode")
suspend fun deleteAll()
/**
* 更新整个数据库表,由于没有
*/
@Transaction
suspend fun insertOrUpdateList(list: List<ScWarningCodeBean>) {
//先删除
deleteAll()
//后插入
insertList(list)
}
@Query("select DESCRIBE from ScWarningCode where CODE=:code")
suspend fun findScWarningDescribe(code: String): String?
}

View File

@@ -13,7 +13,12 @@ class MetadataUtils {
object ScRootCauseAnalysisTitle { object ScRootCauseAnalysisTitle {
const val TITLE_PROBLEM_LINK = "问题环节" const val TITLE_PROBLEM_LINK = "问题环节"
const val TITLE_PROBLEM_CAUSE = "初步问题原因" const val TITLE_PROBLEM_CAUSE = "初步分析"
}
object ScWarningCodeTitle{
const val TITLE_CODE = "编码"
const val TITLE_DESCRIBE = "描述"
} }
} }
} }

View File

@@ -37,6 +37,7 @@ import com.navinfo.omqs.Constant
import com.navinfo.omqs.R import com.navinfo.omqs.R
import com.navinfo.omqs.bean.* import com.navinfo.omqs.bean.*
import com.navinfo.omqs.db.RealmOperateHelper import com.navinfo.omqs.db.RealmOperateHelper
import com.navinfo.omqs.db.RoomAppDatabase
import com.navinfo.omqs.http.NetResult import com.navinfo.omqs.http.NetResult
import com.navinfo.omqs.http.NetworkService import com.navinfo.omqs.http.NetworkService
import com.navinfo.omqs.tools.FileManager import com.navinfo.omqs.tools.FileManager
@@ -56,8 +57,10 @@ import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.Mutex
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import org.locationtech.jts.geom.Envelope
import org.locationtech.jts.geom.Geometry import org.locationtech.jts.geom.Geometry
import org.locationtech.jts.geom.LineString import org.locationtech.jts.geom.LineString
import org.locationtech.spatial4j.shape.Rectangle
import org.oscim.core.GeoPoint import org.oscim.core.GeoPoint
import org.oscim.core.MapPosition import org.oscim.core.MapPosition
import org.oscim.map.Map import org.oscim.map.Map
@@ -78,7 +81,8 @@ class MainViewModel @Inject constructor(
private val traceDataBase: TraceDataBase, private val traceDataBase: TraceDataBase,
private val realmOperateHelper: RealmOperateHelper, private val realmOperateHelper: RealmOperateHelper,
private val networkService: NetworkService, private val networkService: NetworkService,
private val sharedPreferences: SharedPreferences private val sharedPreferences: SharedPreferences,
val roomAppDatabase: RoomAppDatabase
) : ViewModel(), SocketServer.OnConnectSinsListener, ) : ViewModel(), SocketServer.OnConnectSinsListener,
SharedPreferences.OnSharedPreferenceChangeListener { SharedPreferences.OnSharedPreferenceChangeListener {
@@ -113,7 +117,7 @@ class MainViewModel @Inject constructor(
/** /**
* 当前选中的要展示的详细信息的要素 * 当前选中的要展示的详细信息的要素
*/ */
val liveDataSignMoreInfo = MutableLiveData<RenderEntity>() val liveDataSignMoreInfo = MutableLiveData<SignBean>()
/** /**
* 捕捉到的itemList * 捕捉到的itemList
@@ -384,8 +388,23 @@ class MainViewModel @Inject constructor(
naviMutex.lock() naviMutex.lock()
getTaskBean() getTaskBean()
if (currentTaskBean != null && currentTaskBean!!.status == FileManager.Companion.FileDownloadStatus.DONE) { if (currentTaskBean != null && currentTaskBean!!.status == FileManager.Companion.FileDownloadStatus.DONE) {
val naviOption = NaviOption(
deviationCount = sharedPreferences.getInt(
Constant.NAVI_DEVIATION_COUNT,
3
),
deviationDistance = sharedPreferences.getInt(
Constant.NAVI_DEVIATION_DISTANCE,
15
),
farthestDisplayDistance = sharedPreferences.getInt(
Constant.NAVI_FARTHEST_DISPLAY_DISTANCE,
500
)
)
naviEngine = NaviEngine(niMapController = mapController, naviEngine = NaviEngine(niMapController = mapController,
realmOperateHelper = realmOperateHelper, realmOperateHelper = realmOperateHelper,
naviOption = naviOption,
callback = object : OnNaviEngineCallbackListener { callback = object : OnNaviEngineCallbackListener {
override fun planningPathStatus(status: NaviStatus) { override fun planningPathStatus(status: NaviStatus) {
@@ -408,20 +427,12 @@ class MainViewModel @Inject constructor(
) { ) {
val signList = mutableListOf<SignBean>() val signList = mutableListOf<SignBean>()
for (naviRouteItem in list) { for (naviRouteItem in list) {
val signBean = SignUtil.createSignBean(
val signBean = SignBean( viewModelScope,
iconId = SignUtil.getSignIcon(naviRouteItem.data), roomAppDatabase,
iconText = SignUtil.getSignIconText(naviRouteItem.data), naviRouteItem.data
linkId = naviRouteItem.linkId,
distance = naviRouteItem.distance,
name = SignUtil.getSignNameText(naviRouteItem.data),
bottomRightText = SignUtil.getSignBottomRightText(
naviRouteItem.data
),
renderEntity = naviRouteItem.data,
isMoreInfo = SignUtil.isMoreInfo(naviRouteItem.data),
index = SignUtil.getRoadInfoIndex(naviRouteItem.data)
) )
signBean.distance = naviRouteItem.distance
signList.add(signBean) signList.add(signBean)
} }
if (route != null) { if (route != null) {
@@ -441,13 +452,36 @@ class MainViewModel @Inject constructor(
override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences, key: String) { override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences, key: String) {
if (key == Constant.SELECT_TASK_ID) { when (key) {
viewModelScope.launch(Dispatchers.IO) { Constant.SELECT_TASK_ID -> {
naviMutex.lock() viewModelScope.launch(Dispatchers.IO) {
naviEngineStatus = 0 naviMutex.lock()
getTaskBean() naviEngineStatus = 0
initQsRecordData() getTaskBean()
naviMutex.unlock() initQsRecordData()
naviMutex.unlock()
}
}
Constant.NAVI_DEVIATION_COUNT,
Constant.NAVI_FARTHEST_DISPLAY_DISTANCE,
Constant.NAVI_DEVIATION_DISTANCE -> {
if (naviEngine != null) {
val naviOption = NaviOption(
deviationCount = sharedPreferences.getInt(
Constant.NAVI_DEVIATION_COUNT,
3
),
deviationDistance = sharedPreferences.getInt(
Constant.NAVI_DEVIATION_DISTANCE,
15
),
farthestDisplayDistance = sharedPreferences.getInt(
Constant.NAVI_FARTHEST_DISPLAY_DISTANCE,
500
)
)
naviEngine!!.naviOption = naviOption
}
} }
} }
} }
@@ -622,7 +656,8 @@ class MainViewModel @Inject constructor(
} }
}.toList() }.toList()
if (filterResult.size == 1) { if (filterResult.size == 1) {
liveDataSignMoreInfo.postValue(filterResult[0]) val bean = SignUtil.createSignBean(viewModelScope, roomAppDatabase, filterResult[0])
liveDataSignMoreInfo.postValue(bean)
} else { } else {
liveDataItemList.postValue(filterResult) liveDataItemList.postValue(filterResult)
} }
@@ -651,15 +686,10 @@ class MainViewModel @Inject constructor(
DataCodeEnum.OMDB_MULTI_DIGITIZED.code,//上下线分离 DataCodeEnum.OMDB_MULTI_DIGITIZED.code,//上下线分离
DataCodeEnum.OMDB_CON_ACCESS.code,//全封闭 DataCodeEnum.OMDB_CON_ACCESS.code,//全封闭
-> { -> {
val signBean = SignBean( val signBean = SignUtil.createSignBean(
iconId = SignUtil.getSignIcon(element), viewModelScope,
iconText = SignUtil.getSignIconText(element), roomAppDatabase,
linkId = route.linkId, element
name = SignUtil.getSignNameText(element),
bottomRightText = SignUtil.getSignBottomRightText(element),
renderEntity = element,
isMoreInfo = SignUtil.isMoreInfo(element),
index = SignUtil.getRoadInfoIndex(element)
) )
if (signBean.iconText != "") { if (signBean.iconText != "") {
topSignList.add( topSignList.add(
@@ -699,17 +729,11 @@ class MainViewModel @Inject constructor(
DataCodeEnum.OMDB_LINK_FORM2_13.code, DataCodeEnum.OMDB_LINK_FORM2_13.code,
DataCodeEnum.OMDB_VIADUCT.code, DataCodeEnum.OMDB_VIADUCT.code,
-> { -> {
val signBean = SignBean( val signBean = SignUtil.createSignBean(
iconId = SignUtil.getSignIcon(element), viewModelScope,
iconText = SignUtil.getSignIconText(element), roomAppDatabase,
linkId = route.linkId, element
name = SignUtil.getSignNameText(element), )
bottomRightText = SignUtil.getSignBottomRightText(element),
renderEntity = element,
isMoreInfo = SignUtil.isMoreInfo(element),
index = SignUtil.getRoadInfoIndex(element),
)
topSignList.add( topSignList.add(
signBean signBean
) )
@@ -765,11 +789,14 @@ class MainViewModel @Inject constructor(
val linePoints = GeometryTools.getGeoPoints(link.geometry) val linePoints = GeometryTools.getGeoPoints(link.geometry)
val direct = link.properties["direct"] val direct = link.properties["direct"]
if(direct == "3"){ if (direct == "3") {
linePoints.reverse() linePoints.reverse()
} }
val footAndDistance = GeometryTools.pointToLineDistance(point, GeometryTools.createLineString(linePoints)) val footAndDistance = GeometryTools.pointToLineDistance(
point,
GeometryTools.createLineString(linePoints)
)
linePoints.add( linePoints.add(
footAndDistance.footIndex + 1, footAndDistance.footIndex + 1,
GeoPoint( GeoPoint(
@@ -787,21 +814,15 @@ class MainViewModel @Inject constructor(
liveDataRoadName.postValue(element) liveDataRoadName.postValue(element)
continue continue
} }
val signBean = SignUtil.createSignBean(
val signBean = SignBean( viewModelScope,
iconId = SignUtil.getSignIcon(element), roomAppDatabase,
iconText = SignUtil.getSignIconText(element), element
linkId = linkId, )
name = SignUtil.getSignNameText(element), signBean.distance = SignUtil.getDistance(
bottomRightText = SignUtil.getSignBottomRightText(element), footAndDistance,
renderEntity = element, newLineString,
isMoreInfo = SignUtil.isMoreInfo(element), element
index = SignUtil.getRoadInfoIndex(element),
distance = SignUtil.getDistance(
footAndDistance,
newLineString,
element
)
) )
// Log.e("jingo", "捕捉到的数据code ${element.code}") // Log.e("jingo", "捕捉到的数据code ${element.code}")
when (element.code) { when (element.code) {
@@ -819,6 +840,7 @@ class MainViewModel @Inject constructor(
DataCodeEnum.OMDB_RD_LINK_KIND.code,//种别, DataCodeEnum.OMDB_RD_LINK_KIND.code,//种别,
DataCodeEnum.OMDB_RD_LINK_FUNCTION_CLASS.code, // 功能等级, DataCodeEnum.OMDB_RD_LINK_FUNCTION_CLASS.code, // 功能等级,
DataCodeEnum.OMDB_LINK_SPEEDLIMIT.code, //线限速, DataCodeEnum.OMDB_LINK_SPEEDLIMIT.code, //线限速,
DataCodeEnum.OMDB_LINK_SPEEDLIMIT_COND.code,//条件线限速
DataCodeEnum.OMDB_LINK_DIRECT.code,//道路方向, DataCodeEnum.OMDB_LINK_DIRECT.code,//道路方向,
DataCodeEnum.OMDB_RAMP.code, //匝道 DataCodeEnum.OMDB_RAMP.code, //匝道
DataCodeEnum.OMDB_BRIDGE.code,//桥 DataCodeEnum.OMDB_BRIDGE.code,//桥
@@ -1196,7 +1218,16 @@ class MainViewModel @Inject constructor(
*/ */
fun showSignMoreInfo(data: RenderEntity) { fun showSignMoreInfo(data: RenderEntity) {
liveDataSignMoreInfo.value = data viewModelScope.launch(Dispatchers.IO) {
liveDataSignMoreInfo.postValue(
SignUtil.createSignBean(
viewModelScope,
roomAppDatabase,
data
)
)
}
if (data.wkt != null) { if (data.wkt != null) {
mapController.markerHandle.removeMarker("moreInfo") mapController.markerHandle.removeMarker("moreInfo")
mapController.lineHandler.removeLine() mapController.lineHandler.removeLine()
@@ -1511,10 +1542,20 @@ class MainViewModel @Inject constructor(
when (searchEnum) { when (searchEnum) {
SearchEnum.LINK -> { SearchEnum.LINK -> {
viewModelScope.launch(Dispatchers.IO) { viewModelScope.launch(Dispatchers.IO) {
Log.e("jingo", "查询link $msg")
val link = realmOperateHelper.queryLink(linkPid = msg) val link = realmOperateHelper.queryLink(linkPid = msg)
if (link != null) { if (link != null) {
link?.let { l -> Log.e("jingo", "查询link ${link.geometry}")
mapController.lineHandler.showLine(l.geometry) val lineString = GeometryTools.createGeometry(link.geometry)
val envelope = lineString.envelopeInternal
withContext(Dispatchers.Main) {
mapController.animationHandler.animateToBox(
envelope.maxX,
envelope.maxY,
envelope.minX,
envelope.minY
)
mapController.lineHandler.showLine(link.geometry)
dialog.dismiss() dialog.dismiss()
} }
} else { } else {
@@ -1531,15 +1572,13 @@ class MainViewModel @Inject constructor(
viewModelScope.launch(Dispatchers.IO) { viewModelScope.launch(Dispatchers.IO) {
val qsRecordBean = realmOperateHelper.queryQcRecordBean(markId = msg) val qsRecordBean = realmOperateHelper.queryQcRecordBean(markId = msg)
if (qsRecordBean != null) { if (qsRecordBean != null) {
qsRecordBean?.let { l -> val naviController =
val naviController = (mapController.mMapView.context as Activity).findNavController(R.id.main_activity_right_fragment)
(mapController.mMapView.context as Activity).findNavController(R.id.main_activity_right_fragment) val bundle = Bundle()
val bundle = Bundle() bundle.putString("QsId", qsRecordBean.id)
bundle.putString("QsId", l.id) naviController.navigate(R.id.EvaluationResultFragment, bundle)
naviController.navigate(R.id.EvaluationResultFragment, bundle) ToastUtils.showLong(qsRecordBean.classType)
ToastUtils.showLong(l.classType) dialog.dismiss()
dialog.dismiss()
}
} else { } else {
withContext(Dispatchers.Main) { withContext(Dispatchers.Main) {
Toast.makeText( Toast.makeText(

View File

@@ -18,6 +18,7 @@ import com.navinfo.omqs.databinding.FragmentConsoleBinding
import com.navinfo.omqs.ui.activity.map.MainActivity import com.navinfo.omqs.ui.activity.map.MainActivity
import com.navinfo.omqs.ui.fragment.BaseFragment import com.navinfo.omqs.ui.fragment.BaseFragment
import com.navinfo.omqs.ui.fragment.layermanager.LayerManagerFragment import com.navinfo.omqs.ui.fragment.layermanager.LayerManagerFragment
import com.navinfo.omqs.ui.fragment.navi.NaviSettingFragment
import com.navinfo.omqs.ui.fragment.personalcenter.PersonalCenterFragment import com.navinfo.omqs.ui.fragment.personalcenter.PersonalCenterFragment
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
@@ -290,7 +291,23 @@ class ConsoleFragment : BaseFragment(), OnClickListener {
* 路径规划 * 路径规划
*/ */
R.id.console_route_bg, R.id.console_route_icon_bg -> { R.id.console_route_bg, R.id.console_route_icon_bg -> {
Toast.makeText(requireContext(), "功能开发中", Toast.LENGTH_SHORT).show() // Toast.makeText(requireContext(), "功能开发中", Toast.LENGTH_SHORT).show()
if (sceneFlag) {
mFragment = NaviSettingFragment {
TransitionManager.go(aScene, aTransition)
}
sceneFlag = false
TransitionManager.go(bScene, bTransition)
} else {
if (mFragment !is NaviSettingFragment) {
mFragment = NaviSettingFragment {
TransitionManager.go(aScene, aTransition)
}
childFragmentManager.beginTransaction().replace(fragmentId, mFragment!!)
.commit()
}
return
}
} }
else -> {} else -> {}
} }

View File

@@ -89,6 +89,7 @@ class EvaluationResultFragment : BaseFragment(), View.OnClickListener {
//返回按钮点击 //返回按钮点击
binding.evaluationBar.setOnClickListener { binding.evaluationBar.setOnClickListener {
it.isEnabled = false
val mDialog = FirstDialog(context) val mDialog = FirstDialog(context)
mDialog.setTitle("提示?") mDialog.setTitle("提示?")
mDialog.setMessage("是否退出,请确认!") mDialog.setMessage("是否退出,请确认!")
@@ -98,7 +99,10 @@ class EvaluationResultFragment : BaseFragment(), View.OnClickListener {
mDialog.dismiss() mDialog.dismiss()
onBackPressed() onBackPressed()
} }
mDialog.setNegativeButton("取消", null) mDialog.setNegativeButton("取消") { _, _ ->
mDialog.dismiss()
it.isEnabled = true
}
mDialog.show() mDialog.show()
} }
@@ -199,7 +203,7 @@ class EvaluationResultFragment : BaseFragment(), View.OnClickListener {
viewModel.liveDataToastMessage.observe(viewLifecycleOwner) { viewModel.liveDataToastMessage.observe(viewLifecycleOwner) {
Toast.makeText(requireContext(), it, Toast.LENGTH_SHORT).show() Toast.makeText(requireContext(), it, Toast.LENGTH_SHORT).show()
} }
viewModel.liveDataQsRecordBean.observe(viewLifecycleOwner){ viewModel.liveDataQsRecordBean.observe(viewLifecycleOwner) {
binding.evaluationId.text = it.id binding.evaluationId.text = it.id
} }

View File

@@ -184,8 +184,8 @@ class EvaluationResultViewModel @Inject constructor(
if (linkId.isNotEmpty()) { if (linkId.isNotEmpty()) {
viewModelScope.launch { viewModelScope.launch {
val link = realmOperateHelper.queryLink(linkId) val link = realmOperateHelper.queryLink(linkId)
link?.let { l -> if(link != null){
mapController.lineHandler.showLine(l.geometry) mapController.lineHandler.showLine(link.geometry)
} }
} }
} }

View File

@@ -0,0 +1,59 @@
package com.navinfo.omqs.ui.fragment.navi
import android.content.SharedPreferences
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.viewModels
import com.navinfo.omqs.Constant
import com.navinfo.omqs.databinding.FragmentNaviSettingBinding
import com.navinfo.omqs.ui.fragment.BaseFragment
import dagger.hilt.android.AndroidEntryPoint
import javax.inject.Inject
@AndroidEntryPoint
class NaviSettingFragment(private var backListener: (() -> Unit?)? = null) : BaseFragment() {
private var _binding: FragmentNaviSettingBinding? = null
@Inject
lateinit var sharedPreferences: SharedPreferences
private val binding get() = _binding!!
private val viewModel by viewModels<NaviSettingViewModel>()
// private val viewModel by lazy { viewModels<EvaluationResultViewModel>().value}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View {
_binding = FragmentNaviSettingBinding.inflate(inflater, container, false)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding.offCount.setValue(sharedPreferences.getInt(Constant.NAVI_DEVIATION_COUNT,3))
binding.offDistance.setValue(sharedPreferences.getInt(Constant.NAVI_DEVIATION_DISTANCE,15))
binding.tipsDistance.setValue(sharedPreferences.getInt(Constant.NAVI_FARTHEST_DISPLAY_DISTANCE,500))
binding.imgConfirm.setOnClickListener{
sharedPreferences.edit()
.putInt(Constant.NAVI_DEVIATION_DISTANCE,binding.offDistance.getValue())
.putInt(Constant.NAVI_DEVIATION_COUNT,binding.offCount.getValue())
.putInt(Constant.NAVI_FARTHEST_DISPLAY_DISTANCE,binding.tipsDistance.getValue())
.commit()
backListener?.invoke()
}
binding.imgBack.setOnClickListener {
backListener?.invoke()
}
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
}

View File

@@ -0,0 +1,6 @@
package com.navinfo.omqs.ui.fragment.navi
import androidx.lifecycle.ViewModel
class NaviSettingViewModel : ViewModel() {
}

View File

@@ -14,11 +14,11 @@ import com.google.gson.Gson
import com.navinfo.collect.library.data.entity.* import com.navinfo.collect.library.data.entity.*
import com.navinfo.omqs.bean.ScProblemTypeBean import com.navinfo.omqs.bean.ScProblemTypeBean
import com.navinfo.omqs.bean.ScRootCauseAnalysisBean import com.navinfo.omqs.bean.ScRootCauseAnalysisBean
import com.navinfo.omqs.bean.ScWarningCodeBean
import com.navinfo.omqs.db.ImportOMDBHelper import com.navinfo.omqs.db.ImportOMDBHelper
import com.navinfo.omqs.db.RealmOperateHelper import com.navinfo.omqs.db.RealmOperateHelper
import com.navinfo.omqs.db.RoomAppDatabase import com.navinfo.omqs.db.RoomAppDatabase
import com.navinfo.omqs.tools.MetadataUtils.Companion.ScProblemTypeTitle import com.navinfo.omqs.tools.MetadataUtils
import com.navinfo.omqs.tools.MetadataUtils.Companion.ScRootCauseAnalysisTitle
import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
@@ -134,7 +134,7 @@ class PersonalCenterViewModel @Inject constructor(
hadSpeedLimitVarFile, gson.toJson(hadSpeedlimitVar) + "\r", true hadSpeedLimitVarFile, gson.toJson(hadSpeedlimitVar) + "\r", true
) )
} }
} }
} }
} }
ZipUtils.zipFiles( ZipUtils.zipFiles(
@@ -154,7 +154,7 @@ class PersonalCenterViewModel @Inject constructor(
/** /**
* 导入OMDB数据 * 导入OMDB数据
* */ * */
fun importOMDBData(importOMDBHelper: ImportOMDBHelper, task: TaskBean? =null) { fun importOMDBData(importOMDBHelper: ImportOMDBHelper, task: TaskBean? = null) {
viewModelScope.launch(Dispatchers.IO) { viewModelScope.launch(Dispatchers.IO) {
Log.d("OMQSApplication", "开始导入数据") Log.d("OMQSApplication", "开始导入数据")
if (task != null) { if (task != null) {
@@ -192,35 +192,45 @@ class PersonalCenterViewModel @Inject constructor(
var phenomenonIndex = -1 var phenomenonIndex = -1
var problemLinkIndex = -1 var problemLinkIndex = -1
var problemCauseIndex = -1 var problemCauseIndex = -1
var warningCodeIndex = -1
var warningDescribeIndex = -1
val list = mutableListOf<ScProblemTypeBean>() val list = mutableListOf<ScProblemTypeBean>()
val list2 = mutableListOf<ScRootCauseAnalysisBean>() val list2 = mutableListOf<ScRootCauseAnalysisBean>()
val list3 = mutableListOf<ScWarningCodeBean>()
while (bufferedReader.readLine()?.also { line = it } != null) { // 处理 CSV 文件中的每一行数据 while (bufferedReader.readLine()?.also { line = it } != null) { // 处理 CSV 文件中的每一行数据
val data = val data =
line!!.split(",".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray() line!!.split(",".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray()
if (index == 0) { if (index == 0) {
for (i in data.indices) { for (i in data.indices) {
when (data[i]) { when (data[i]) {
ScProblemTypeTitle.TITLE_ELEMENT_TYPE -> { MetadataUtils.Companion.ScProblemTypeTitle.TITLE_ELEMENT_TYPE -> {
elementTypeIndex = i elementTypeIndex = i
} }
ScProblemTypeTitle.TITLE_ELEMENT_CODE -> { MetadataUtils.Companion.ScProblemTypeTitle.TITLE_ELEMENT_CODE -> {
elementCodeIndex = i elementCodeIndex = i
} }
ScProblemTypeTitle.TITLE_CLASS_TYPE -> { MetadataUtils.Companion.ScProblemTypeTitle.TITLE_CLASS_TYPE -> {
classTypeIndex = i classTypeIndex = i
} }
ScProblemTypeTitle.TITLE_PROBLEM_TYPE -> { MetadataUtils.Companion.ScProblemTypeTitle.TITLE_PROBLEM_TYPE -> {
problemTypeIndex = i problemTypeIndex = i
} }
ScProblemTypeTitle.TITLE_PHENOMENON -> { MetadataUtils.Companion.ScProblemTypeTitle.TITLE_PHENOMENON -> {
phenomenonIndex = i phenomenonIndex = i
} }
ScRootCauseAnalysisTitle.TITLE_PROBLEM_LINK -> { MetadataUtils.Companion.ScRootCauseAnalysisTitle.TITLE_PROBLEM_LINK -> {
problemLinkIndex = i problemLinkIndex = i
} }
ScRootCauseAnalysisTitle.TITLE_PROBLEM_CAUSE -> { MetadataUtils.Companion.ScRootCauseAnalysisTitle.TITLE_PROBLEM_CAUSE -> {
problemCauseIndex = i problemCauseIndex = i
} }
MetadataUtils.Companion.ScWarningCodeTitle.TITLE_CODE -> {
warningCodeIndex = i
}
MetadataUtils.Companion.ScWarningCodeTitle.TITLE_DESCRIBE -> {
warningDescribeIndex = i
}
} }
} }
} else { } else {
@@ -244,6 +254,12 @@ class PersonalCenterViewModel @Inject constructor(
problemCause = data[problemCauseIndex], problemCause = data[problemCauseIndex],
) )
list2.add(bean) list2.add(bean)
} else if (warningDescribeIndex > -1 && warningCodeIndex > -1) {
val bean = ScWarningCodeBean(
code = data[warningCodeIndex],
describe = data[warningDescribeIndex]
)
list3.add(bean)
} else { } else {
liveDataMessage.postValue("元数据表规格不正确,请仔细核对") liveDataMessage.postValue("元数据表规格不正确,请仔细核对")
break break
@@ -259,49 +275,14 @@ class PersonalCenterViewModel @Inject constructor(
liveDataMessage.postValue("元数据表导入成功") liveDataMessage.postValue("元数据表导入成功")
roomAppDatabase.getScRootCauseAnalysisDao().insertOrUpdateList(list2) roomAppDatabase.getScRootCauseAnalysisDao().insertOrUpdateList(list2)
} }
if(list3.isNotEmpty()){
liveDataMessage.postValue("标牌对照表导入成功")
roomAppDatabase.getScWarningCodeDao().insertList(list3)
}
bufferedReader.close() bufferedReader.close()
inputStreamReader.close() inputStreamReader.close()
inputStream.close() inputStream.close()
// val workbook = WorkbookFactory.create(inputStream)
// //获取所有sheet
// val sheet1 = workbook.getSheet("SC_PROBLEM_TYPE")
// sheet1?.let {
// val rowCount: Int = it.physicalNumberOfRows // 获取行数
// val list = mutableListOf<ScProblemTypeBean>()
// for (i in 1 until rowCount) {
// val row: Row = it.getRow(i) // 获取行
//// val cellCount: Int = row.physicalNumberOfCells // 获取列数
// val bean = ScProblemTypeBean(
// elementType = row.getCell(0).stringCellValue,
// elementCode = row.getCell(1).numericCellValue.toString(),
// classType = row.getCell(2).stringCellValue,
// problemType = row.getCell(3).stringCellValue,
// phenomenon = row.getCell(4).stringCellValue
// )
// list.add(bean)
// Log.e("jingo", bean.toString())
// }
// roomAppDatabase.getScProblemTypeDao().insertOrUpdateList(list)
// }
// val sheet2 = workbook.getSheet("SC_ROOT_CAUSE_ANALYSIS")
// sheet2?.let {
// val rowCount: Int = it.physicalNumberOfRows // 获取行数
// val list = mutableListOf<ScRootCauseAnalysisBean>()
// for (i in 1 until rowCount) {
// val row: Row = it.getRow(i) // 获取行
// val cellCount: Int = row.physicalNumberOfCells // 获取列数
// if (cellCount == 2) {
// val bean = ScRootCauseAnalysisBean()
// bean.problemLink = row.getCell(0).stringCellValue
// bean.problemCause = row.getCell(1).stringCellValue
// list.add(bean)
// Log.e("jingo", bean.toString())
// }
// }
// roomAppDatabase.getScRootCauseAnalysisDao().insertOrUpdateList(list)
// }
// workbook.close()
} catch (e: IOException) { } catch (e: IOException) {
e.printStackTrace() e.printStackTrace()

View File

@@ -5,6 +5,7 @@ import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.fragment.app.activityViewModels import androidx.fragment.app.activityViewModels
import androidx.lifecycle.lifecycleScope
import androidx.navigation.findNavController import androidx.navigation.findNavController
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import com.navinfo.collect.library.data.entity.RenderEntity import com.navinfo.collect.library.data.entity.RenderEntity
@@ -56,29 +57,29 @@ class SignMoreInfoFragment : BaseFragment() {
drawableLeft, null, drawableRight, null drawableLeft, null, drawableRight, null
) )
when (it.code) { when (it.renderEntity.code) {
//道路名 //道路名
DataCodeEnum.OMDB_LINK_NAME.code -> { DataCodeEnum.OMDB_LINK_NAME.code -> {
val adapter = RoadNameInfoAdapter() val adapter = RoadNameInfoAdapter()
binding.signInfoRecyclerview.adapter = adapter binding.signInfoRecyclerview.adapter = adapter
adapter.refreshData(SignUtil.getRoadNameList(it)) adapter.refreshData(SignUtil.getRoadNameList(it.renderEntity))
} }
//车道边界类型 //车道边界类型
DataCodeEnum.OMDB_LANE_MARK_BOUNDARYTYPE.code -> { DataCodeEnum.OMDB_LANE_MARK_BOUNDARYTYPE.code -> {
val adapter = LaneBoundaryAdapter() val adapter = LaneBoundaryAdapter()
binding.signInfoRecyclerview.adapter = adapter binding.signInfoRecyclerview.adapter = adapter
adapter.refreshData(SignUtil.getLaneBoundaryTypeInfo(it)) adapter.refreshData(SignUtil.getLaneBoundaryTypeInfo(it.renderEntity))
} }
DataCodeEnum.OMDB_INTERSECTION.code -> { DataCodeEnum.OMDB_INTERSECTION.code -> {
val adapter = LaneBoundaryAdapter() val adapter = LaneBoundaryAdapter()
binding.signInfoRecyclerview.adapter = adapter binding.signInfoRecyclerview.adapter = adapter
adapter.refreshData(SignUtil.getIntersectionInfo(it)) adapter.refreshData(SignUtil.getIntersectionInfo(it.renderEntity))
} }
//收费站 //收费站
DataCodeEnum.OMDB_TOLLGATE.code -> { DataCodeEnum.OMDB_TOLLGATE.code -> {
val adapter = LaneBoundaryAdapter() val adapter = LaneBoundaryAdapter()
binding.signInfoRecyclerview.adapter = adapter binding.signInfoRecyclerview.adapter = adapter
adapter.refreshData(SignUtil.getTollgateInfo(it)) adapter.refreshData(SignUtil.getTollgateInfo(it.renderEntity))
} }
//电子眼 //电子眼
DataCodeEnum.OMDB_ELECTRONICEYE.code -> { DataCodeEnum.OMDB_ELECTRONICEYE.code -> {
@@ -94,7 +95,7 @@ class SignMoreInfoFragment : BaseFragment() {
) )
val adapter = TwoItemAdapter() val adapter = TwoItemAdapter()
binding.signInfoRecyclerview.adapter = adapter binding.signInfoRecyclerview.adapter = adapter
adapter.refreshData(SignUtil.getElectronicEyeMoreInfo(it)) adapter.refreshData(SignUtil.getElectronicEyeMoreInfo(it.renderEntity))
} }
//交通标牌 //交通标牌
DataCodeEnum.OMDB_TRAFFIC_SIGN.code -> { DataCodeEnum.OMDB_TRAFFIC_SIGN.code -> {
@@ -103,7 +104,7 @@ class SignMoreInfoFragment : BaseFragment() {
adapter.refreshData(SignUtil.getTrafficSignMoreInfo(it)) adapter.refreshData(SignUtil.getTrafficSignMoreInfo(it))
} }
else -> { else -> {
val adapter = SignUtil.getMoreInfoAdapter(it) val adapter = SignUtil.getMoreInfoAdapter(it.renderEntity)
binding.signInfoRecyclerview.adapter = adapter binding.signInfoRecyclerview.adapter = adapter
} }
} }
@@ -123,18 +124,7 @@ class SignMoreInfoFragment : BaseFragment() {
val bundle = Bundle() val bundle = Bundle()
val element = viewModel.liveDataSignMoreInfo.value val element = viewModel.liveDataSignMoreInfo.value
if (element != null) { if (element != null) {
val signBean = SignBean( bundle.putParcelable("SignBean", element)
iconId = SignUtil.getSignIcon(element),
iconText = SignUtil.getSignIconText(element),
linkId = element.properties[RenderEntity.Companion.LinkTable.linkPid]
?: "",
name = SignUtil.getSignNameText(element),
bottomRightText = SignUtil.getSignBottomRightText(element),
renderEntity = element,
isMoreInfo = SignUtil.isMoreInfo(element),
index = SignUtil.getRoadInfoIndex(element)
)
bundle.putParcelable("SignBean", signBean)
bundle.putBoolean("AutoSave", false) bundle.putBoolean("AutoSave", false)
rightController.navigate(R.id.EvaluationResultFragment, bundle) rightController.navigate(R.id.EvaluationResultFragment, bundle)
} }

View File

@@ -0,0 +1,70 @@
package com.navinfo.omqs.ui.widget
import android.content.Context
import android.text.Editable
import android.text.TextWatcher
import android.util.AttributeSet
import android.view.LayoutInflater
import android.view.View
import android.widget.EditText
import android.widget.ImageView
import android.widget.LinearLayout
import com.navinfo.omqs.R
class AddAndSubEditView @JvmOverloads constructor(
context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
) : LinearLayout(context, attrs, defStyleAttr), View.OnClickListener {
private var valueText: Int = 0
private val editView: EditText
init {
val inflater = LayoutInflater.from(context)
val view = inflater.inflate(R.layout.view_add_del_editview, this)
val typedArray = context.obtainStyledAttributes(attrs, R.styleable.AddAndSubEditView)
valueText = typedArray.getInteger(R.styleable.AddAndSubEditView_textValue, 0)
editView = view.findViewById(R.id.edit_text)
editView.setText("$valueText")
editView.addTextChangedListener(object : TextWatcher {
override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) {
}
override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) {
}
override fun afterTextChanged(s: Editable) {
try {
valueText = s.toString().toInt()
} catch (e: java.lang.Exception) {
}
}
})
view.findViewById<ImageView>(R.id.del).setOnClickListener(this)
view.findViewById<ImageView>(R.id.add).setOnClickListener(this)
}
override fun onClick(v: View) {
when (v.id) {
R.id.del -> {
valueText--
editView.setText("$valueText")
}
R.id.add -> {
valueText++
editView.setText("$valueText")
}
}
}
fun getValue(): Int {
return valueText
}
fun setValue(value:Int) {
valueText = value
editView.setText("$valueText")
}
}

View File

@@ -15,7 +15,7 @@ import org.locationtech.jts.geom.LineString
import org.locationtech.jts.geom.Point import org.locationtech.jts.geom.Point
import org.oscim.core.GeoPoint import org.oscim.core.GeoPoint
public interface OnNaviEngineCallbackListener { interface OnNaviEngineCallbackListener {
fun planningPathStatus(code: NaviStatus) fun planningPathStatus(code: NaviStatus)
// fun planningPathError(errorCode: NaviStatus, errorMessage: String) // fun planningPathError(errorCode: NaviStatus, errorMessage: String)
@@ -33,10 +33,33 @@ enum class NaviStatus {
} }
data class NaviOption(
/**
* 偏离距离 单位:米
*/
var deviationDistance: Int = 15,
/**
* 偏离次数上限
*/
var deviationCount: Int = 5,
// /**
// * 局部匹配时没走过的路段还记录1000米
// */
// var nextRouteDistance: Int = 1000,
/**
* 最远显示距离 米
*/
var farthestDisplayDistance: Int = 550,
)
class NaviEngine( class NaviEngine(
private val niMapController: NIMapController, private val niMapController: NIMapController,
private val realmOperateHelper: RealmOperateHelper, private val realmOperateHelper: RealmOperateHelper,
val callback: OnNaviEngineCallbackListener val callback: OnNaviEngineCallbackListener,
var naviOption: NaviOption = NaviOption()
) { ) {
/** /**
@@ -64,30 +87,30 @@ class NaviEngine(
DataCodeEnum.OMDB_LINK_NAME.name, DataCodeEnum.OMDB_LINK_NAME.name,
) )
/** // /**
* 偏离距离 单位:米 // * 偏离距离 单位:米
*/ // */
private val DEVIATION_DISTANCE = 15 // private val DEVIATION_DISTANCE = 15
//
/** // /**
* 偏离次数上限 // * 偏离次数上限
*/ // */
private val DEVIATION_COUNT = 5 // private val DEVIATION_COUNT = 5
//
/** /**
* 局部匹配时走过的路段还记录100米 * 局部匹配时走过的路段还记录100米
*/ */
private val PASSED_ROUTE_DISTANCE = 100 private val PASSED_ROUTE_DISTANCE = 100
//
/** // /**
* 局部匹配时没走过的路段还记录1000米 // * 局部匹配时没走过的路段还记录1000米
*/ // */
private val NEXT_ROUTE_DISTANCE = 1000 // private val NEXT_ROUTE_DISTANCE = 1000
//
/** // /**
* 最远显示距离 米 // * 最远显示距离 米
*/ // */
private val FARTHEST_DISPLAY_DISTANCE = 550 // private val FARTHEST_DISPLAY_DISTANCE = 550
/** /**
* 绑定失败次数 * 绑定失败次数
@@ -144,32 +167,34 @@ class NaviEngine(
} }
set(value) { set(value) {
val list = mutableListOf<GeoPoint>() val list = mutableListOf<GeoPoint>()
val fRoute = value[0] if (value.size > 0) {
//第一个路段加入 val fRoute = value[0]
list.addAll(fRoute.pointList) //第一个路段加入
//起始点位置 list.addAll(fRoute.pointList)
fRoute.startIndexInPath = 0 //起始点位置
var startPoint = fRoute.pointList.size - 1 fRoute.startIndexInPath = 0
//终点位置 var startPoint = fRoute.pointList.size - 1
fRoute.endIndexIntPath = startPoint //终点位置
fRoute.indexInPath = 0 fRoute.endIndexIntPath = startPoint
fRoute.indexInPath = 0
for (i in 1 until value.size) { for (i in 1 until value.size) {
val route = value[i] val route = value[i]
route.startIndexInPath = startPoint route.startIndexInPath = startPoint
if (route.itemList != null) { if (route.itemList != null) {
for (naviItem in route.itemList!!) { for (naviItem in route.itemList!!) {
naviItem.index += startPoint naviItem.index += startPoint
}
} }
startPoint += route.pointList.size - 1
route.endIndexIntPath = startPoint
route.indexInPath = i
val list2 = ArrayList(route.pointList.toList())
list2.removeAt(0)
list.addAll(list2)
} }
startPoint += route.pointList.size - 1 geometry = GeometryTools.createLineString(list)
route.endIndexIntPath = startPoint
route.indexInPath = i
val list2 = ArrayList(route.pointList.toList())
list2.removeAt(0)
list.addAll(list2)
} }
geometry = GeometryTools.createLineString(list)
field = value field = value
} }
@@ -257,73 +282,78 @@ class NaviEngine(
break break
} }
} }
if (routeStart != null) {
var sNode = "" if (routeStart == null) {
var eNode = "" routeStart = tempRouteList[0]
//如果sNodeeNode是顺方向geometry 不动,否则反转 tempRouteList.removeAt(0)
if (routeStart.direct == 3) { }
routeStart.pointList.reverse()
sNode = routeStart.eNode var sNode = ""
eNode = routeStart.sNode var eNode = ""
} else { //如果sNodeeNode是顺方向geometry 不动,否则反转
sNode = routeStart.sNode if (routeStart.direct == 3) {
eNode = routeStart.eNode routeStart.pointList.reverse()
sNode = routeStart.eNode
eNode = routeStart.sNode
} else {
sNode = routeStart.sNode
eNode = routeStart.eNode
}
newRouteList.add(routeStart)
var bBreak = true
while (bBreak) {
//先找其实link的后续link
var bHasNext = false
for (route in tempRouteList) {
//如果是link 的e 对下个link的s方向不用动否则下个link的geometry反转
if (route.sNode != "" && eNode == route.sNode) {
newRouteList.add(route)
tempRouteList.remove(route)
eNode = route.eNode
bHasNext = true
break
} else if (route.eNode != "" && eNode == route.eNode) {
route.pointList.reverse()
newRouteList.add(route)
tempRouteList.remove(route)
eNode = route.sNode
bHasNext = true
break
}
} }
newRouteList.add(routeStart) //先找其实link的起始link
var bBreak = true var bHasLast = false
while (bBreak) { for (route in tempRouteList) {
//先找其实link的后续link //如果是link 的s 对上个link的e方向不用动否则下个link的geometry反转
var bHasNext = false if (route.eNode != "" && sNode == route.eNode) {
for (route in tempRouteList) { newRouteList.add(0, route)
//如果是link 的e 对下个link的s方向不用动否则下个link的geometry反转 tempRouteList.remove(route)
if (route.sNode != "" && eNode == route.sNode) { sNode = route.sNode
newRouteList.add(route) bHasLast = true
tempRouteList.remove(route) break
eNode = route.eNode } else if (route.sNode != "" && sNode == route.sNode) {
bHasNext = true route.pointList.reverse()
break newRouteList.add(0, route)
} else if (route.eNode != "" && eNode == route.eNode) { tempRouteList.remove(route)
route.pointList.reverse() sNode = route.eNode
newRouteList.add(route) bHasLast = true
tempRouteList.remove(route) break
eNode = route.sNode
bHasNext = true
break
}
} }
//先找其实link的起始link }
var bHasLast = false if (tempRouteList.size == 0) {
for (route in tempRouteList) { bBreak = false
//如果是link 的s 对上个link的e方向不用动否则下个link的geometry反转 } else {
if (route.eNode != "" && sNode == route.eNode) { if (!bHasLast && !bHasNext) {
newRouteList.add(0, route)
tempRouteList.remove(route)
sNode = route.sNode
bHasLast = true
break
} else if (route.sNode != "" && sNode == route.sNode) {
route.pointList.reverse()
newRouteList.add(0, route)
tempRouteList.remove(route)
sNode = route.eNode
bHasLast = true
break
}
}
if (tempRouteList.size == 0) {
bBreak = false bBreak = false
} else { callback.planningPathStatus(
if (!bHasLast && !bHasNext) { NaviStatus.NAVI_STATUS_PATH_ERROR_BLOCKED
bBreak = false )
callback.planningPathStatus( realm.close()
NaviStatus.NAVI_STATUS_PATH_ERROR_BLOCKED return
)
realm.close()
return
}
} }
} }
} }
val itemMap: MutableMap<GeoPoint, MutableList<RenderEntity>> = mutableMapOf() val itemMap: MutableMap<GeoPoint, MutableList<RenderEntity>> = mutableMapOf()
//查询每根link上的关联要素 //查询每根link上的关联要素
for (route in newRouteList) { for (route in newRouteList) {
@@ -415,7 +445,7 @@ class NaviEngine(
val pointPairDistance = GeometryTools.pointToLineDistance(point, geometry) val pointPairDistance = GeometryTools.pointToLineDistance(point, geometry)
//定义垂线 //定义垂线
//定位点到垂足距离不超过30米 //定位点到垂足距离不超过30米
if (pointPairDistance.getMeterDistance() < DEVIATION_DISTANCE) { if (pointPairDistance.getMeterDistance() < naviOption.deviationDistance) {
footIndex = pointPairDistance.footIndex footIndex = pointPairDistance.footIndex
// Log.e( // Log.e(
// "jingo", // "jingo",
@@ -453,7 +483,7 @@ class NaviEngine(
val pointPairDistance = GeometryTools.pointToLineDistance(point, tempGeometry) val pointPairDistance = GeometryTools.pointToLineDistance(point, tempGeometry)
//定义垂线 //定义垂线
//定位点到垂足距离不超过30米 //定位点到垂足距离不超过30米
if (pointPairDistance.getMeterDistance() < DEVIATION_DISTANCE) { if (pointPairDistance.getMeterDistance() < naviOption.deviationDistance) {
footIndex = pointPairDistance.footIndex + tempRoutList[0].startIndexInPath footIndex = pointPairDistance.footIndex + tempRoutList[0].startIndexInPath
// Log.e("jingo", "局部 当前绑定到了整条路线的第 $footIndex 点") // Log.e("jingo", "局部 当前绑定到了整条路线的第 $footIndex 点")
val lastRouteIndex = routeIndex val lastRouteIndex = routeIndex
@@ -531,7 +561,7 @@ class NaviEngine(
tempIndex = rightI + 1 tempIndex = rightI + 1
distance = GeometryTools.getDistance(disPoints) distance = GeometryTools.getDistance(disPoints)
// Log.e("jingo", "我的距离${distance} 下一个${tempIndex} 位置${rightI}") // Log.e("jingo", "我的距离${distance} 下一个${tempIndex} 位置${rightI}")
if (distance < FARTHEST_DISPLAY_DISTANCE && distance > -1) { if (distance < naviOption.farthestDisplayDistance && distance > -1) {
naviItem.distance = distance.toInt() naviItem.distance = distance.toInt()
bindingItemList.add(naviItem) bindingItemList.add(naviItem)
} else { } else {
@@ -539,7 +569,7 @@ class NaviEngine(
} }
} }
} }
if (distance >= FARTHEST_DISPLAY_DISTANCE) { if (distance >= naviOption.farthestDisplayDistance) {
break break
} }
} }
@@ -570,7 +600,8 @@ class NaviEngine(
distance = 0.0 distance = 0.0
//没走过的路是否有1000米 //没走过的路是否有1000米
var j = routeIndex + 1 var j = routeIndex + 1
while (j < routeList.size && distance < NEXT_ROUTE_DISTANCE) { val nextDis = naviOption.farthestDisplayDistance + 500
while (j < routeList.size && distance < nextDis) {
val routeT = routeList[j] val routeT = routeList[j]
tempRoutList.add(routeT) tempRoutList.add(routeT)
distance += routeT.length distance += routeT.length
@@ -596,7 +627,7 @@ class NaviEngine(
*/ */
private fun deviationUp() { private fun deviationUp() {
errorCount++ errorCount++
if (errorCount >= DEVIATION_COUNT) { if (errorCount >= naviOption.deviationCount) {
callback.planningPathStatus(NaviStatus.NAVI_STATUS_DISTANCE_OFF) callback.planningPathStatus(NaviStatus.NAVI_STATUS_DISTANCE_OFF)
bindingReset() bindingReset()
} }

View File

@@ -1,6 +1,7 @@
package com.navinfo.omqs.util package com.navinfo.omqs.util
import android.util.Log import android.util.Log
import androidx.lifecycle.lifecycleScope
import com.navinfo.collect.library.data.entity.RenderEntity import com.navinfo.collect.library.data.entity.RenderEntity
import com.navinfo.collect.library.enums.DataCodeEnum import com.navinfo.collect.library.enums.DataCodeEnum
import com.navinfo.collect.library.utils.FootAndDistance import com.navinfo.collect.library.utils.FootAndDistance
@@ -8,10 +9,15 @@ import com.navinfo.collect.library.utils.GeometryTools
import com.navinfo.omqs.R import com.navinfo.omqs.R
import com.navinfo.omqs.bean.RoadNameBean import com.navinfo.omqs.bean.RoadNameBean
import com.navinfo.omqs.bean.SignBean import com.navinfo.omqs.bean.SignBean
import com.navinfo.omqs.db.RoomAppDatabase
import com.navinfo.omqs.ui.activity.map.LaneInfoItem import com.navinfo.omqs.ui.activity.map.LaneInfoItem
import com.navinfo.omqs.ui.fragment.signMoreInfo.LaneBoundaryItem import com.navinfo.omqs.ui.fragment.signMoreInfo.LaneBoundaryItem
import com.navinfo.omqs.ui.fragment.signMoreInfo.TwoItemAdapter import com.navinfo.omqs.ui.fragment.signMoreInfo.TwoItemAdapter
import com.navinfo.omqs.ui.fragment.signMoreInfo.TwoItemAdapterItem import com.navinfo.omqs.ui.fragment.signMoreInfo.TwoItemAdapterItem
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import org.json.JSONArray import org.json.JSONArray
import org.json.JSONObject import org.json.JSONObject
import org.locationtech.jts.geom.Geometry import org.locationtech.jts.geom.Geometry
@@ -23,6 +29,28 @@ import java.lang.reflect.Field
class SignUtil { class SignUtil {
companion object { companion object {
suspend fun createSignBean(
scope: CoroutineScope,
roomAppDatabase: RoomAppDatabase,
element: RenderEntity
): SignBean {
return SignBean(
iconId = getSignIcon(element),
iconText = getSignIconText(element),
linkId = element.properties[RenderEntity.Companion.LinkTable.linkPid]
?: "",
name = getSignNameText(element),
bottomRightText = getSignBottomRightText(
scope,
roomAppDatabase,
element
),
renderEntity = element,
isMoreInfo = isMoreInfo(element),
index = getRoadInfoIndex(element)
)
}
/** /**
* 获取面板上的文字 * 获取面板上的文字
*/ */
@@ -50,6 +78,10 @@ class SignUtil {
DataCodeEnum.OMDB_LINK_SPEEDLIMIT.code -> { DataCodeEnum.OMDB_LINK_SPEEDLIMIT.code -> {
"${data.properties["maxSpeed"]}" "${data.properties["maxSpeed"]}"
} }
//条件线限速
DataCodeEnum.OMDB_LINK_SPEEDLIMIT_COND.code -> {
"${data.properties["maxSpeed"]}"
}
//全封闭 //全封闭
DataCodeEnum.OMDB_CON_ACCESS.code -> { DataCodeEnum.OMDB_CON_ACCESS.code -> {
if (data.properties["conAccess"] === "1") "全封闭" else "" if (data.properties["conAccess"] === "1") "全封闭" else ""
@@ -130,6 +162,8 @@ class SignUtil {
DataCodeEnum.OMDB_LINK_DIRECT.code -> "方向" DataCodeEnum.OMDB_LINK_DIRECT.code -> "方向"
//常规线限速 //常规线限速
DataCodeEnum.OMDB_LINK_SPEEDLIMIT.code -> "线限速" DataCodeEnum.OMDB_LINK_SPEEDLIMIT.code -> "线限速"
//条件线限速
DataCodeEnum.OMDB_LINK_SPEEDLIMIT_COND.code -> "条件限速"
DataCodeEnum.OMDB_LINK_ATTRIBUTE_MAIN_SIDE_ACCESS.code, DataCodeEnum.OMDB_LINK_ATTRIBUTE_FORNTAGE.code, DataCodeEnum.OMDB_LINK_ATTRIBUTE_SA.code, DataCodeEnum.OMDB_LINK_ATTRIBUTE_PA.code -> "道路属性" DataCodeEnum.OMDB_LINK_ATTRIBUTE_MAIN_SIDE_ACCESS.code, DataCodeEnum.OMDB_LINK_ATTRIBUTE_FORNTAGE.code, DataCodeEnum.OMDB_LINK_ATTRIBUTE_SA.code, DataCodeEnum.OMDB_LINK_ATTRIBUTE_PA.code -> "道路属性"
@@ -197,7 +231,6 @@ class SignUtil {
} catch (e: Throwable) { } catch (e: Throwable) {
} }
} }
//道路方向 //道路方向
DataCodeEnum.OMDB_LINK_DIRECT.code -> { DataCodeEnum.OMDB_LINK_DIRECT.code -> {
@@ -793,9 +826,25 @@ class SignUtil {
/** /**
* 右下角文字 * 右下角文字
*/ */
fun getSignBottomRightText(data: RenderEntity): String { suspend fun getSignBottomRightText(
scope: CoroutineScope,
roomAppDatabase: RoomAppDatabase,
data: RenderEntity
): String {
return when (data.code) { return when (data.code) {
//警示信息
DataCodeEnum.OMDB_WARNINGSIGN.code -> {
var describe = ""
val job = scope.launch(Dispatchers.IO) {
val typeCode = data.properties["typeCode"]
if (typeCode != null) {
describe = roomAppDatabase.getScWarningCodeDao().findScWarningDescribe(typeCode).toString()
}
}
job.join()
Log.e("jingo", "警示信息 类型: $describe")
return describe
}
//条件点限速 //条件点限速
DataCodeEnum.OMDB_SPEEDLIMIT_COND.code -> getConditionLimitText(data) DataCodeEnum.OMDB_SPEEDLIMIT_COND.code -> getConditionLimitText(data)
//电子眼 //电子眼
@@ -870,13 +919,11 @@ class SignUtil {
) )
) )
val carType = renderEntity.properties["vehicleType"] val carType = renderEntity.properties["vehicleType"]
if (carType != "0") { list.add(
list.add( TwoItemAdapterItem(
TwoItemAdapterItem( title = "车辆类型", text = getElectronicEyeVehicleType(carType!!.toInt())
title = "车辆类型", text = getElectronicEyeVehicleType(carType!!.toInt())
)
) )
} )
val time = renderEntity.properties["validPeriod"] val time = renderEntity.properties["validPeriod"]
if (time?.isNotEmpty() == true) { if (time?.isNotEmpty() == true) {
list.add( list.add(
@@ -893,7 +940,7 @@ class SignUtil {
* 条件点限速文字 * 条件点限速文字
*/ */
private fun getConditionLimitText(data: RenderEntity): String { private fun getConditionLimitText(data: RenderEntity): String {
var stringBuffer = StringBuffer() val stringBuffer = StringBuffer()
try { try {
val dependent = data.properties["speedDependent"] val dependent = data.properties["speedDependent"]
dependent?.let { dependent?.let {
@@ -1515,7 +1562,8 @@ class SignUtil {
DataCodeEnum.OMDB_RD_LINK_KIND.code -> 1 DataCodeEnum.OMDB_RD_LINK_KIND.code -> 1
DataCodeEnum.OMDB_RD_LINK_FUNCTION_CLASS.code -> 2 DataCodeEnum.OMDB_RD_LINK_FUNCTION_CLASS.code -> 2
DataCodeEnum.OMDB_LINK_SPEEDLIMIT.code -> 3 DataCodeEnum.OMDB_LINK_SPEEDLIMIT.code -> 3
DataCodeEnum.OMDB_LINK_DIRECT.code -> 4 DataCodeEnum.OMDB_LINK_SPEEDLIMIT_COND.code -> 4
DataCodeEnum.OMDB_LINK_DIRECT.code -> 5
else -> 999 else -> 999
} }
} }
@@ -1680,8 +1728,8 @@ class SignUtil {
} else if (itemGeometry is LineString) { } else if (itemGeometry is LineString) {
val itemFoot = GeometryTools.pointToLineDistance( val itemFoot = GeometryTools.pointToLineDistance(
GeoPoint( GeoPoint(
lineString.coordinates[lineString.coordinates.size-1].y, lineString.coordinates[lineString.coordinates.size - 1].y,
lineString.coordinates[lineString.coordinates.size-1].x lineString.coordinates[lineString.coordinates.size - 1].x
), lineString ), lineString
) )
var dis = GeometryTools.getDistance( var dis = GeometryTools.getDistance(
@@ -1698,7 +1746,5 @@ class SignUtil {
} }
return 0 return 0
} }
} }
} }

View File

@@ -0,0 +1,124 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
style="@style/left_pannel_title_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/bg_left_pannel"
android:padding="5dp">
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/img_back"
style="@style/btn_round"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:background="@drawable/selector_bg_round_button"
android:foreground="@drawable/ripple_btn_press"
android:src="@drawable/ic_baseline_keyboard_arrow_left_24"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/img_confirm"
style="@style/btn_round"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:background="@drawable/selector_bg_round_button"
android:foreground="@drawable/ripple_btn_press"
android:src="@drawable/ic_baseline_check_24"
app:layout_constraintBottom_toBottomOf="@id/img_back"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="@id/img_back" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/tv_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="导航设置"
android:textColor="@color/highFontColor"
android:textSize="@dimen/left_pannel_title_font"
app:layout_constraintBottom_toBottomOf="@id/img_back"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="@id/img_back" />
<LinearLayout
style="@style/default_card_view"
android:layout_width="match_parent"
android:layout_height="0dp"
android:orientation="vertical"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toBottomOf="@id/img_back">
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:paddingTop="5dp"
android:paddingBottom="5dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="left|center_vertical"
android:textSize="16sp"
android:text="偏离距离(米)" />
<com.navinfo.omqs.ui.widget.AddAndSubEditView
android:id="@+id/off_distance"
android:layout_width="150dp"
android:layout_height="wrap_content"
android:layout_gravity="right|center_vertical"
app:textValue="15" />
</FrameLayout>
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:paddingTop="5dp"
android:paddingBottom="5dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="left|center_vertical"
android:textSize="16sp"
android:text="提示范围(米)" />
<com.navinfo.omqs.ui.widget.AddAndSubEditView
android:id="@+id/tips_distance"
android:layout_width="150dp"
android:layout_height="wrap_content"
android:layout_gravity="right|center_vertical"
app:textValue="500" />
</FrameLayout>
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:paddingTop="5dp"
android:paddingBottom="5dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="left|center_vertical"
android:textSize="16sp"
android:text="偏离次数" />
<com.navinfo.omqs.ui.widget.AddAndSubEditView
android:id="@+id/off_count"
android:layout_width="150dp"
android:layout_height="wrap_content"
android:layout_gravity="right|center_vertical"
app:textValue="3" />
</FrameLayout>
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -0,0 +1,34 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<ImageView
android:id="@+id/del"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/shape_bg_blue_bg_4_radius"
android:src="@drawable/ic_baseline_keyboard_arrow_left_24" />
<EditText
android:id="@+id/edit_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="@null"
android:focusable="false"
android:gravity="center"
android:inputType="number"
android:maxLines="1"
android:paddingLeft="3dp"
android:textSize="15sp" />
<ImageView
android:id="@+id/add"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/shape_bg_blue_bg_4_radius"
android:src="@drawable/ic_baseline_keyboard_arrow_right_24" />
</LinearLayout>

View File

@@ -44,4 +44,12 @@
tools:layout="@layout/fragment_qs_record_list"> tools:layout="@layout/fragment_qs_record_list">
</fragment> </fragment>
<fragment
android:id="@+id/QsNaviSettingFragment"
android:name="com.navinfo.omqs.ui.fragment.navi.NaviSettingFragment"
android:label="导航设置"
tools:layout="@layout/fragment_navi_setting">
</fragment>
</navigation> </navigation>

View File

@@ -15,4 +15,13 @@
<attr name="deleteBtnWidth" format="float"/> <attr name="deleteBtnWidth" format="float"/>
</declare-styleable> </declare-styleable>
<declare-styleable name="CanvasView">
<attr name="isSavePoint" format="boolean" />
</declare-styleable>
<declare-styleable name="AddAndSubEditView">
<attr name="textValue" format="integer" />
</declare-styleable>
</resources> </resources>

View File

@@ -1,7 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="CanvasView">
<attr name="isSavePoint" format="boolean" />
</declare-styleable>
</resources>

2
vtm

Submodule vtm updated: 271e7b2278...39b9993b1c