From 7b4229d756374477acae79eba9030e47dc1ba1b5 Mon Sep 17 00:00:00 2001 From: squallzhjch Date: Wed, 21 Jun 2023 10:10:21 +0800 Subject: [PATCH 1/6] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E9=81=93=E8=B7=AF?= =?UTF-8?q?=E5=90=8D=E6=98=BE=E7=A4=BA=E5=92=8C=E8=AF=A6=E7=BB=86=E4=BF=A1?= =?UTF-8?q?=E6=81=AF=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/assets/omdb_config.json | 5 ++ .../com/navinfo/omqs/bean/RoadNameBean.kt | 49 ++++++++++++++++ .../com/navinfo/omqs/db/RealmOperateHelper.kt | 2 +- .../omqs/ui/activity/map/MainActivity.kt | 33 +++++++++-- .../omqs/ui/activity/map/MainViewModel.kt | 37 +++++++----- .../navinfo/omqs/ui/fragment/BaseFragment.kt | 2 +- .../ui/fragment/sign/RoadNameInfoAdapter.kt | 30 ++++++++++ .../ui/fragment/sign/RoadNameInfoFragment.kt | 57 +++++++++++++++++++ .../fragment/tasklist/TaskManagerFragment.kt | 3 +- .../navinfo/omqs/ui/other/ShareViewModel2.kt | 54 ++++++++++++++++++ .../com/navinfo/omqs/ui/widget/SignUtil.kt | 41 +++++++++++++ .../main/res/drawable/baseline_cancel_24.xml | 11 ++++ .../main/res/drawable/shape_road_name_bg.xml | 10 ++++ app/src/main/res/layout/activity_main.xml | 50 ++++++++++++---- app/src/main/res/layout/adapter_road_name.xml | 26 +++++++++ .../res/layout/fragment_sign_roadname.xml | 36 ++++++++++++ 16 files changed, 413 insertions(+), 33 deletions(-) create mode 100644 app/src/main/java/com/navinfo/omqs/bean/RoadNameBean.kt create mode 100644 app/src/main/java/com/navinfo/omqs/ui/fragment/sign/RoadNameInfoAdapter.kt create mode 100644 app/src/main/java/com/navinfo/omqs/ui/fragment/sign/RoadNameInfoFragment.kt create mode 100644 app/src/main/java/com/navinfo/omqs/ui/other/ShareViewModel2.kt create mode 100644 app/src/main/res/drawable/baseline_cancel_24.xml create mode 100644 app/src/main/res/drawable/shape_road_name_bg.xml create mode 100644 app/src/main/res/layout/adapter_road_name.xml create mode 100644 app/src/main/res/layout/fragment_sign_roadname.xml diff --git a/app/src/main/assets/omdb_config.json b/app/src/main/assets/omdb_config.json index 1060acc8..6d19017d 100644 --- a/app/src/main/assets/omdb_config.json +++ b/app/src/main/assets/omdb_config.json @@ -20,6 +20,11 @@ "code": 2010, "name": "道路方向" }, + "2011": { + "table": "OMDB_LINK_NAME", + "code": 2011, + "name": "道路名" + }, "2013": { "table": "OMDB_LANE_MARK_BOUNDARYTYPE", "code": 2013, diff --git a/app/src/main/java/com/navinfo/omqs/bean/RoadNameBean.kt b/app/src/main/java/com/navinfo/omqs/bean/RoadNameBean.kt new file mode 100644 index 00000000..db19a444 --- /dev/null +++ b/app/src/main/java/com/navinfo/omqs/bean/RoadNameBean.kt @@ -0,0 +1,49 @@ +package com.navinfo.omqs.bean + +data class RoadNameBean( + /** + * 道路名称 + */ + val name: String = "", + /** + * 0 普通 + * 1 立交桥名(连接路) + * 2 立交桥名 (主路) + * 3 风景线路 + * 5 隧道 + * 6 虚拟名称 + */ + val type: Int = 0, + /** + * 1 不论“名称分类”是官方名,别名还是曾用名都统一从1开始递增 + * 2 若取第一官方名时,需判断“名称”分类 [nameClass]=="官方名",且[seqNum] 最小的 + */ + val seqNum: Int = 1, + /** + * 1 官方名 + * 2 别名 + * 3 曾用名 + */ + val nameClass: Int = 1, +) { + fun getNameClassStr(): String { + when (nameClass) { + 1 -> return "官方名" + 2 -> return "别名" + 3 -> return "曾用名" + } + return "" + } + + fun getTypeStr(): String { + when (type) { + 0 -> return "普通" + 1 -> return "立交桥名(连接路)" + 2 -> return "立交桥名(主路)" + 3 -> return "风景线路" + 5 -> return "隧道" + 6 -> return "虚拟名称" + } + return "" + } +} \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/db/RealmOperateHelper.kt b/app/src/main/java/com/navinfo/omqs/db/RealmOperateHelper.kt index 30aef395..8edb79c4 100644 --- a/app/src/main/java/com/navinfo/omqs/db/RealmOperateHelper.kt +++ b/app/src/main/java/com/navinfo/omqs/db/RealmOperateHelper.kt @@ -44,7 +44,7 @@ class RealmOperateHelper() { ) // 根据polygon查询相交的tile号 val tileXSet = mutableSetOf() - tileXSet.toString() + GeometryToolsKt.getTileXByGeometry(polygon.toString(), tileXSet) val tileYSet = mutableSetOf() GeometryToolsKt.getTileYByGeometry(polygon.toString(), tileYSet) diff --git a/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainActivity.kt b/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainActivity.kt index c46932f7..96ef7c51 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainActivity.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainActivity.kt @@ -31,6 +31,7 @@ import com.navinfo.omqs.ui.activity.BaseActivity import com.navinfo.omqs.ui.fragment.console.ConsoleFragment import com.navinfo.omqs.ui.fragment.offlinemap.OfflineMapFragment import com.navinfo.omqs.ui.fragment.qsrecordlist.QsRecordListFragment +import com.navinfo.omqs.ui.fragment.sign.RoadNameInfoFragment import com.navinfo.omqs.ui.fragment.tasklist.TaskManagerFragment import com.navinfo.omqs.ui.widget.RecyclerViewSpacesItemDecoration import com.navinfo.omqs.util.FlowEventBus @@ -56,6 +57,7 @@ class MainActivity : BaseActivity() { */ private var leftFragment: Fragment? = null + /** * 是否开启右侧面板 */ @@ -150,8 +152,6 @@ class MainActivity : BaseActivity() { checkIntent.action = TextToSpeech.Engine.ACTION_CHECK_TTS_DATA someActivityResultLauncher.launch(checkIntent) - - binding = DataBindingUtil.setContentView(this, R.layout.activity_main) //初始化地图 @@ -184,12 +184,12 @@ class MainActivity : BaseActivity() { } v?.onTouchEvent(event) ?: true } - + //捕捉列表变化回调 viewModel.liveDataQsRecordIdList.observe(this) { //处理页面跳转 viewModel.navigationRightFragment(this, it) } - + //右上角菜单是否被点击 viewModel.liveDataMenuState.observe(this) { binding.mainActivityMenu.isSelected = it if (it == true) { @@ -198,6 +198,17 @@ class MainActivity : BaseActivity() { binding.mainActivityMenuGroup.visibility = View.INVISIBLE } } + //道路绑定,名称变化 + viewModel.liveDataRoadName.observe(this) { + if (it != null && it.isNotEmpty()) { + binding.mainActivityRoadName.text = it[0].name + if (binding.mainActivityRoadName.visibility != View.VISIBLE) + binding.mainActivityRoadName.visibility = View.VISIBLE + } else { + if (binding.mainActivityRoadName.visibility != View.GONE) + binding.mainActivityRoadName.visibility = View.GONE + } + } //道路属性面板 binding.mainActivityTopSignRecyclerview.layoutManager = LinearLayoutManager( @@ -228,6 +239,7 @@ class MainActivity : BaseActivity() { viewModel.liveDataTopSignList.observe(this) { topSignAdapter.refreshData(it) } + //监听地图中点变化 viewModel.liveDataCenterPoint.observe(this) { Log.e("qj", "${it.longitude}") @@ -533,4 +545,17 @@ class MainActivity : BaseActivity() { .replace(R.id.main_activity_left_fragment, leftFragment!!).commit() } } + + /** + * 打开道路名称属性看板 + */ + fun openRoadNameFragment() { + val fragment = + supportFragmentManager.findFragmentById(R.id.main_activity_sign_more_info_fragment) + if (fragment !is RoadNameInfoFragment) { + supportFragmentManager.beginTransaction() + .replace(R.id.main_activity_sign_more_info_fragment, RoadNameInfoFragment()) + .commit() + } + } } \ No newline at end of file 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 78e29e3f..65b232d4 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 @@ -31,6 +31,7 @@ import com.navinfo.collect.library.utils.GeometryToolsKt import com.navinfo.omqs.Constant import com.navinfo.omqs.R import com.navinfo.omqs.bean.ImportConfig +import com.navinfo.omqs.bean.RoadNameBean import com.navinfo.omqs.bean.SignBean import com.navinfo.omqs.db.RealmOperateHelper import com.navinfo.omqs.ui.dialog.CommonDialog @@ -76,6 +77,8 @@ class MainViewModel @Inject constructor( //顶部看板数据 val liveDataTopSignList = MutableLiveData>() + //道路名 + val liveDataRoadName = MutableLiveData?>() // var testPoint = GeoPoint(0, 0) //uuid标识,用于记录轨迹组 @@ -107,8 +110,8 @@ class MainViewModel @Inject constructor( init { mapController.mMapView.vtmMap.events.bind(Map.UpdateListener { e, mapPosition -> when (e) { - Map.SCALE_EVENT, Map.MOVE_EVENT, Map.ROTATE_EVENT -> - liveDataCenterPoint.value = mapPosition + Map.SCALE_EVENT, Map.MOVE_EVENT, Map.ROTATE_EVENT -> liveDataCenterPoint.value = + mapPosition } }) @@ -213,6 +216,7 @@ class MainViewModel @Inject constructor( val linkList = realmOperateHelper.queryLink( point = point, ) + var hisRoadName = false if (linkList.isNotEmpty()) { //看板数据 val signList = mutableListOf() @@ -225,11 +229,17 @@ class MainViewModel @Inject constructor( if (linkIdCache != linkId) { - Log.e("jingo", "捕捉到的linkid $linkId ${link.geometry}") mapController.lineHandler.showLine(link.geometry) linkId?.let { var elementList = realmOperateHelper.queryLinkByLinkPid(it) for (element in elementList) { + + if (element.code == 2011) { + hisRoadName = true + liveDataRoadName.postValue(SignUtil.getRoadNameList(element)) + continue + } + val distance = GeometryTools.distanceToDouble( point, GeometryTools.createGeoPoint(element.geometry) ) @@ -246,7 +256,7 @@ class MainViewModel @Inject constructor( elementCode = element.code, moreText = SignUtil.getMoreInfoText(element) ) - + Log.e("jingo", "捕捉到的数据code ${element.code}") when (element.code) { 2002, 2008, 2010, 2041 -> topSignList.add( signBean @@ -260,27 +270,20 @@ class MainViewModel @Inject constructor( val realm = Realm.getDefaultInstance() val entity = realm.where(RenderEntity::class.java) - .equalTo("table", "OMDB_RESTRICTION") - .and() - .equalTo( - "properties['linkIn']", - it + .equalTo("table", "OMDB_RESTRICTION").and().equalTo( + "properties['linkIn']", it ).findFirst() if (entity != null) { val outLink = entity.properties["linkOut"] val linkOutEntity = realm.where(RenderEntity::class.java) - .equalTo("table", "OMDB_RD_LINK") - .and() - .equalTo( + .equalTo("table", "OMDB_RD_LINK").and().equalTo( "properties['${RenderEntity.Companion.LinkTable.linkPid}']", outLink ).findFirst() if (linkOutEntity != null) { mapController.lineHandler.linksLayer.addLine( - linkOutEntity.geometry, - 0x7DFF0000 + linkOutEntity.geometry, 0x7DFF0000 ) - Log.e("jingo", "捕捉到的linkid $outLink ${linkOutEntity.geometry}") } } } @@ -297,6 +300,10 @@ class MainViewModel @Inject constructor( mapController.lineHandler.removeLine() linkIdCache = "" } + //如果没有捕捉到道路名 + if (!hisRoadName) { + liveDataRoadName.postValue(null) + } } } diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/BaseFragment.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/BaseFragment.kt index a0882082..1ecd8194 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/BaseFragment.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/BaseFragment.kt @@ -50,7 +50,7 @@ abstract class BaseFragment : Fragment() { // ): View fun onBackPressed(): Boolean{ - findNavController().navigateUp() +// findNavController().navigateUp() return true } diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/sign/RoadNameInfoAdapter.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/sign/RoadNameInfoAdapter.kt new file mode 100644 index 00000000..eb853924 --- /dev/null +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/sign/RoadNameInfoAdapter.kt @@ -0,0 +1,30 @@ +package com.navinfo.omqs.ui.fragment.sign + +import android.view.LayoutInflater +import android.view.ViewGroup +import com.navinfo.omqs.R +import com.navinfo.omqs.bean.RoadNameBean +import com.navinfo.omqs.databinding.AdapterRoadNameBinding +import com.navinfo.omqs.ui.other.BaseRecyclerViewAdapter +import com.navinfo.omqs.ui.other.BaseViewHolder + +class RoadNameInfoAdapter : BaseRecyclerViewAdapter() { + override fun getItemViewRes(position: Int): Int { + return R.layout.adapter_road_name + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseViewHolder { + val viewBinding = + AdapterRoadNameBinding.inflate(LayoutInflater.from(parent.context), parent, false) + return BaseViewHolder(viewBinding) + } + + override fun onBindViewHolder(holder: BaseViewHolder, position: Int) { + val binding: AdapterRoadNameBinding = + holder.viewBinding as AdapterRoadNameBinding + val bean = data[position] + binding.title.text = bean.getNameClassStr() + binding.name.text = bean.name + binding.type.text = bean.getTypeStr() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/sign/RoadNameInfoFragment.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/sign/RoadNameInfoFragment.kt new file mode 100644 index 00000000..137fa3a5 --- /dev/null +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/sign/RoadNameInfoFragment.kt @@ -0,0 +1,57 @@ +package com.navinfo.omqs.ui.fragment.sign + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.activityViewModels +import androidx.recyclerview.widget.LinearLayoutManager +import com.navinfo.omqs.databinding.FragmentSignRoadnameBinding +import com.navinfo.omqs.ui.activity.map.MainViewModel +import com.navinfo.omqs.ui.fragment.BaseFragment + + +class RoadNameInfoFragment : BaseFragment() { + private var _binding: FragmentSignRoadnameBinding? = null + private val binding get() = _binding!! + + private val viewModel by activityViewModels() + private val adapter by lazy { RoadNameInfoAdapter() } + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + ): View { + _binding = FragmentSignRoadnameBinding.inflate(inflater, container, false) + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + val layoutManager = LinearLayoutManager(context) + //// 设置 RecyclerView 的固定大小,避免在滚动时重新计算视图大小和布局,提高性能 + binding.roadnameRecyclerview.setHasFixedSize(true) + binding.roadnameRecyclerview.layoutManager = layoutManager + binding.roadnameRecyclerview.adapter = adapter + viewModel.liveDataRoadName.observe(viewLifecycleOwner) { + if (it != null && it.isNotEmpty()) { + adapter.refreshData(it) + } else { + activity?.run { + supportFragmentManager.beginTransaction().remove(this@RoadNameInfoFragment) + .commit() + } + } + } + binding.roadnameCancel.setOnClickListener { + activity?.run { + supportFragmentManager.beginTransaction().remove(this@RoadNameInfoFragment) + .commit() + } + } + } + + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskManagerFragment.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskManagerFragment.kt index ec11bd80..63285395 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskManagerFragment.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskManagerFragment.kt @@ -15,7 +15,8 @@ import dagger.hilt.android.AndroidEntryPoint * 评测任务viewpager管理页面 */ @AndroidEntryPoint -class TaskManagerFragment(private var backListener: ((TaskManagerFragment) -> Unit?)? = null) : BaseFragment() { +class TaskManagerFragment(private var backListener: ((TaskManagerFragment) -> Unit?)? = null) : + BaseFragment() { private var _binding: FragmentTaskManagerBinding? = null private val binding get() = _binding!! diff --git a/app/src/main/java/com/navinfo/omqs/ui/other/ShareViewModel2.kt b/app/src/main/java/com/navinfo/omqs/ui/other/ShareViewModel2.kt new file mode 100644 index 00000000..dbcb22d9 --- /dev/null +++ b/app/src/main/java/com/navinfo/omqs/ui/other/ShareViewModel2.kt @@ -0,0 +1,54 @@ +//package com.navinfo.omqs.ui.other +// +//import androidx.lifecycle.* +// +//val vMStoreMap = HashMap() +// +//inline fun LifecycleOwner.shareViewModels( +// scopeName: String, +// factory: ViewModelProvider.Factory? = null +//): Lazy { +// val store: VMStoreClass +// if (vMStoreMap.keys.contains(scopeName)) { +// store = vMStoreMap[scopeName]!! +// } else { +// store = VMStoreClass() +// vMStoreMap[scopeName] = store +// } +// store.register(this) +// return ViewModelLazy(VM::class, +// { store.viewModelStore }, +// { factory ?: ViewModelProvider.NewInstanceFactory() }) +//} +// +//class VMStoreClass : ViewModelStoreOwner { +// +// private val bindTargets = ArrayList() +// private var vmStore: ViewModelStore? = null +// +// fun register(host: LifecycleOwner) { +// if (!bindTargets.contains(host)) { +// bindTargets.add(host) +// host.lifecycle.addObserver(object : LifecycleEventObserver { +// override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) { +// if (event == Lifecycle.Event.ON_DESTROY) { +// host.lifecycle.removeObserver(this) +// bindTargets.remove(host) +// if (bindTargets.isEmpty()) {//如果当前商店没有关联对象,则释放资源 +// vMStoreMap.entries.find { it.value == this@VMStoreClass }?.also { +// vmStore?.clear() +// vMStoreMap.remove(it.key) +// } +// } +// } +// } +// }) +// } +// } +// +// override fun getViewModelStore(): ViewModelStore { +// if (vmStore == null) +// vmStore = ViewModelStore() +// return vmStore!! +// } +//} \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/ui/widget/SignUtil.kt b/app/src/main/java/com/navinfo/omqs/ui/widget/SignUtil.kt index 773e55e0..f4260e94 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/widget/SignUtil.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/widget/SignUtil.kt @@ -1,9 +1,12 @@ package com.navinfo.omqs.ui.widget import android.util.Log +import com.google.gson.Gson import com.navinfo.collect.library.data.entity.RenderEntity import com.navinfo.omqs.R +import com.navinfo.omqs.bean.RoadNameBean import com.navinfo.omqs.bean.SignBean +import org.json.JSONArray class SignUtil { companion object { @@ -329,5 +332,43 @@ class SignUtil { } return stringBuffer.toString() } + + + fun getRoadNameList(data: RenderEntity): MutableList { + val list = mutableListOf() + if (data.code == 2011) { + try { + val shapeStr = data.properties["shapeList"] + val array = JSONArray(shapeStr) + for (i in 0 until array.length()) { + val jsonObject = array.getJSONObject(0) + val name = jsonObject.optString("name", "") + val type = jsonObject.optInt("nameType", 0) + val seqNum = jsonObject.optInt("seqNum", 1) + val nameClass = jsonObject.optInt("nameClass", 1) + val bean = RoadNameBean( + name = name, + type = type, + seqNum = seqNum, + nameClass = nameClass + ) + list.add(bean) + } + /** + * 排序 + */ + list.sortWith { n1, n2 -> + if (n1.nameClass != n2.nameClass) { + n1.nameClass.compareTo(n2.nameClass) + } else { + n1.seqNum.compareTo(n2.seqNum) + } + } + } catch (e: Exception) { + + } + } + return list + } } } \ No newline at end of file diff --git a/app/src/main/res/drawable/baseline_cancel_24.xml b/app/src/main/res/drawable/baseline_cancel_24.xml new file mode 100644 index 00000000..082ea0a2 --- /dev/null +++ b/app/src/main/res/drawable/baseline_cancel_24.xml @@ -0,0 +1,11 @@ + + + + diff --git a/app/src/main/res/drawable/shape_road_name_bg.xml b/app/src/main/res/drawable/shape_road_name_bg.xml new file mode 100644 index 00000000..7b1a14f6 --- /dev/null +++ b/app/src/main/res/drawable/shape_road_name_bg.xml @@ -0,0 +1,10 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 77fc36a0..fc72fe88 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -44,25 +44,36 @@ app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" /> - + + + + + + + + @@ -432,10 +460,10 @@ android:id="@+id/main_bottom_route_text" android:layout_width="wrap_content" android:layout_height="wrap_content" + android:onClick="@{()->mainActivity.onClickRouteFragment()}" android:text="路径规划" android:textColor="@color/blue" android:textSize="10sp" - android:onClick="@{()->mainActivity.onClickRouteFragment()}" app:layout_constraintBottom_toBottomOf="@id/main_activity_bottom_sheet_bg" app:layout_constraintLeft_toLeftOf="@id/main_bottom_route" app:layout_constraintRight_toRightOf="@id/main_bottom_route" diff --git a/app/src/main/res/layout/adapter_road_name.xml b/app/src/main/res/layout/adapter_road_name.xml new file mode 100644 index 00000000..4a4d65dd --- /dev/null +++ b/app/src/main/res/layout/adapter_road_name.xml @@ -0,0 +1,26 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_sign_roadname.xml b/app/src/main/res/layout/fragment_sign_roadname.xml new file mode 100644 index 00000000..b657f832 --- /dev/null +++ b/app/src/main/res/layout/fragment_sign_roadname.xml @@ -0,0 +1,36 @@ + + + + + + + + + \ No newline at end of file From a5e964efbb0e0a93376187163836dd27c07d0298 Mon Sep 17 00:00:00 2001 From: xiaoyan Date: Sun, 25 Jun 2023 10:11:24 +0800 Subject: [PATCH 2/6] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=E8=B7=AF?= =?UTF-8?q?=E5=8F=A3=E6=B8=B2=E6=9F=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/assets/omdb_config.json | 71 +++++- .../com/navinfo/omqs/bean/ImportConfig.kt | 40 ++- .../java/com/navinfo/omqs/db/Code2NameMap.kt | 43 ++++ .../com/navinfo/omqs/db/ImportPreProcess.kt | 235 +++++++++++++++--- .../src/main/assets/editormarker.xml | 35 ++- .../collect/library/utils/GeometryTools.java | 2 +- vtm | 2 +- 7 files changed, 385 insertions(+), 43 deletions(-) create mode 100644 app/src/main/java/com/navinfo/omqs/db/Code2NameMap.kt diff --git a/app/src/main/assets/omdb_config.json b/app/src/main/assets/omdb_config.json index 994a1511..0800ec23 100644 --- a/app/src/main/assets/omdb_config.json +++ b/app/src/main/assets/omdb_config.json @@ -101,7 +101,12 @@ "code": 4001, "name": "路口", "transformer": [ - + { + "k": "geometry", + "v": "~", + "klib": "geometry", + "vlib": "generateIntersectionReference()" + } ] }, "4002": { @@ -170,7 +175,25 @@ "k": "geometry", "v": "~", "klib": "geometry", - "vlib": "generateRestrictionRerference()" + "vlib": "translateBack()" + }, + { + "k": "geometry", + "v": "~", + "klib": "geometry", + "vlib": "translateRight()" + }, + { + "k": "geometry", + "v": "~", + "klib": "geometry", + "vlib": "generateS2EReferenceLine()" + }, + { + "k": "geometry", + "v": "~", + "klib": "geometry", + "vlib": "generateDirectReferenceLine()" } ] }, @@ -179,7 +202,30 @@ "code": 4010, "name": "电子眼", "transformer": [ - + { + "k": "geometry", + "v": "~", + "klib": "geometry", + "vlib": "translateRight()" + }, + { + "k": "geometry", + "v": "~", + "klib": "geometry", + "vlib": "generateS2EReferenceLine()" + }, + { + "k": "geometry", + "v": "~", + "klib": "geometry", + "vlib": "generateDirectReferenceLine()" + }, + { + "k": "geometry", + "v": "~", + "klib": "geometry", + "vlib": "generateElectronName()" + } ] }, "4022": { @@ -200,7 +246,24 @@ "code": 4601, "name": "车信", "transformer": [ - + { + "k": "geometry", + "v": "~", + "klib": "geometry", + "vlib": "translateBack()" + }, + { + "k": "geometry", + "v": "~", + "klib": "geometry", + "vlib": "translateRight()" + }, + { + "k": "geometry", + "v": "~", + "klib": "geometry", + "vlib": "generateDirectReferenceLine()" + } ] }, "5001":{ diff --git a/app/src/main/java/com/navinfo/omqs/bean/ImportConfig.kt b/app/src/main/java/com/navinfo/omqs/bean/ImportConfig.kt index 1e15ce0d..5a8e099e 100644 --- a/app/src/main/java/com/navinfo/omqs/bean/ImportConfig.kt +++ b/app/src/main/java/com/navinfo/omqs/bean/ImportConfig.kt @@ -2,6 +2,8 @@ package com.navinfo.omqs.bean import com.navinfo.collect.library.data.entity.RenderEntity import com.navinfo.omqs.db.ImportPreProcess +import kotlin.reflect.KFunction +import kotlin.reflect.KParameter import kotlin.reflect.full.declaredMemberFunctions @@ -36,16 +38,46 @@ class ImportConfig { for (v in processKeyOrValue(value)) { if ("~" == v ) { // ~符可以匹配任意元素 if (valuelib.endsWith("()")) { // 以()结尾,说明该value配置是一个function,需要通过反射调用指定方法 - val method = preProcess::class.declaredMemberFunctions.first { it.name == valuelib.replace("()", "") } - method.call(preProcess, renderEntity) + // 获取方法名 + val methodName = valuelib.substringBefore("(") + // 获取参数 + val params: List = valuelib.substringAfter("(").substringBefore(")").split(",").filter{ it.isNotEmpty() }.map { it.trim() } + val method = preProcess::class.members.filter { it.name == methodName }.first() as KFunction<*> + + val methodParams = method.parameters + val callByParams = mutableMapOf( + methodParams[0] to preProcess, + methodParams[1] to renderEntity + ) + for ((index, value) in params.withIndex()) { + if (methodParams.size>index+1) { + callByParams[methodParams[index+1]] = value + } + } + method.callBy(callByParams) } else { renderEntity.properties[keylib] = valuelib } break@m } else if (renderEntity.properties[k] == v) { // 完全匹配 if (valuelib.endsWith("()")) { // 以()结尾,说明该value配置是一个function,需要通过反射调用指定方法 - val method = preProcess::class.declaredMemberFunctions.first { it.name == valuelib.replace("()", "") } - method.call(preProcess, renderEntity) + // 获取方法名 + val methodName = valuelib.substringBefore("(") + // 获取参数 + val params: List = valuelib.substringAfter("(").substringBefore(")").split(",").filter{ it.isNotEmpty() }.map { it.trim() } + val method = preProcess::class.members.filter { it.name == methodName }.first() as KFunction<*> + + val methodParams = method.parameters + val callByParams = mutableMapOf( + methodParams[0] to preProcess, + methodParams[1] to renderEntity + ) + for ((index, value) in params.withIndex()) { + if (methodParams.size>index+1) { + callByParams[methodParams[index+1]] = value + } + } + method.callBy(callByParams) } else { renderEntity.properties[keylib] = valuelib } diff --git a/app/src/main/java/com/navinfo/omqs/db/Code2NameMap.kt b/app/src/main/java/com/navinfo/omqs/db/Code2NameMap.kt new file mode 100644 index 00000000..40a09740 --- /dev/null +++ b/app/src/main/java/com/navinfo/omqs/db/Code2NameMap.kt @@ -0,0 +1,43 @@ +package com.navinfo.omqs.db + +class Code2NameMap { + val electronEyeKindMap = mapOf( + 1 to "超高", + 2 to "超低", + 3 to "移动", + 4 to "可变", + 5 to "分车道", + 6 to "分车种", + 7 to "车灯", + 8 to "占车道", + 9 to "过路口", + 10 to "闯红灯", + 11 to "路况", + 12 to "单行", + 13 to "非机动", + 14 to "出入口", + 15 to "公交", + 16 to "禁转", + 17 to "掉头", + 18 to "应急", + 19 to "标线", + 20 to "区间S", + 21 to "区间E", + 22 to "停车", + 23 to "尾号", + 24 to "环保", + 25 to "安全带", + 26 to "手机", + 27 to "行人", + 28 to "禁令", + 29 to "鸣笛", + 30 to "年检", + 31 to "尾气", + 32 to "交通灯", + 33 to "专用", + 34 to "标线", + 35 to "违章", + 36 to "卡车", + 37 to "限时长", + ) +} \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/db/ImportPreProcess.kt b/app/src/main/java/com/navinfo/omqs/db/ImportPreProcess.kt index 55b5d4b7..3f2d8749 100644 --- a/app/src/main/java/com/navinfo/omqs/db/ImportPreProcess.kt +++ b/app/src/main/java/com/navinfo/omqs/db/ImportPreProcess.kt @@ -13,29 +13,36 @@ import org.oscim.core.GeoPoint class ImportPreProcess { - /** - * 预处理所需要的函数 - * */ - fun foo(renderEntity: RenderEntity): RenderEntity { - println("foo") - renderEntity.properties["foo"] = "bar" - return renderEntity - } - + val code2NameMap = Code2NameMap() /** * 计算指定数据指定方向的坐标 + * @param direction 判断当前数据是否为逆向,给定的应该是一个a=b的表达式,a为对应的properties的key,b为对应的值 * */ - fun translateRight(renderEntity: RenderEntity): RenderEntity { + fun translateRight(renderEntity: RenderEntity, direction: String = "") { // 获取当前renderEntity的geometry val geometry = renderEntity.wkt var radian = 0.0 // geometry的角度,如果是点,获取angle,如果是线,获取最后两个点的方向 var point = Coordinate(geometry?.coordinate) + var isReverse = false // 是否为逆向 + if (direction.isNotEmpty()) { + val paramDirections = direction.split("=") + if (paramDirections.size>=2 && renderEntity.properties[paramDirections[0].trim()] == paramDirections[1].trim()) { + isReverse = true; + } + } if (Geometry.TYPENAME_POINT == geometry?.geometryType) { - val angle = if(renderEntity?.properties?.get("angle") == null) 0.0 else renderEntity?.properties?.get("angle")?.toDouble()!! + var angle = if(renderEntity?.properties?.get("angle") == null) 0.0 else renderEntity?.properties?.get("angle")?.toDouble()!! + if (isReverse) { + angle += 180 + } radian = Math.toRadians(angle) } else if (Geometry.TYPENAME_LINESTRING == geometry?.geometryType) { - val p1: Coordinate = geometry.coordinates.get(geometry.coordinates.size - 2) - val p2: Coordinate = geometry.coordinates.get(geometry.coordinates.size - 1) + var coordinates = geometry.coordinates + if (isReverse) { + coordinates = coordinates.reversedArray() + } + val p1: Coordinate = coordinates.get(coordinates.size - 2) + val p2: Coordinate = coordinates.get(coordinates.size - 1) // 计算线段的方向 radian = Angle.angle(p1, p2) point = p2 @@ -52,46 +59,126 @@ class ImportPreProcess { // 将这个点记录在数据中 val geometryTranslate: Geometry = GeometryTools.createGeometry(doubleArrayOf(coord.x, coord.y)) renderEntity.geometry = geometryTranslate.toString() - return renderEntity } /** - * 将要素按照点位角度的垂直方向右移5米,并生成一个按照垂直角度指向方向的线段,用以显示有方向的图标 + * 向方向对应的反方向偏移 * */ - fun translateRightWithAngle(renderEntity: RenderEntity): RenderEntity { + fun translateBack(renderEntity: RenderEntity, direction: String = "") { // 获取当前renderEntity的geometry val geometry = renderEntity.wkt + var isReverse = false // 是否为逆向 + if (direction.isNotEmpty()) { + val paramDirections = direction.split("=") + if (paramDirections.size>=2 && renderEntity.properties[paramDirections[0].trim()] == paramDirections[1].trim()) { + isReverse = true; + } + } var radian = 0.0 // geometry的角度,如果是点,获取angle,如果是线,获取最后两个点的方向 var point = Coordinate(geometry?.coordinate) if (Geometry.TYPENAME_POINT == geometry?.geometryType) { - // angle为正北方向夹角,需要将其转换为与正东方向夹角 var angle = if(renderEntity?.properties?.get("angle") == null) 0.0 else renderEntity?.properties?.get("angle")?.toDouble()!! - angle-=90 + if (isReverse) { + angle += 180 + } radian = Math.toRadians(angle) } else if (Geometry.TYPENAME_LINESTRING == geometry?.geometryType) { - val p1: Coordinate = geometry.coordinates.get(geometry.coordinates.size - 2) - val p2: Coordinate = geometry.coordinates.get(geometry.coordinates.size - 1) + var coordinates = geometry.coordinates + if (isReverse) { + coordinates = coordinates.reversedArray() + } + val p1: Coordinate = coordinates.get(coordinates.size - 2) + val p2: Coordinate = coordinates.get(coordinates.size - 1) // 计算线段的方向 radian = Angle.angle(p1, p2) point = p2 } - // 根据角度计算偏移距离 + // 计算偏移距离 val dx: Double = GeometryTools.convertDistanceToDegree(3.0, geometry?.coordinate?.y!!) * Math.cos(radian) val dy: Double = GeometryTools.convertDistanceToDegree(3.0, geometry?.coordinate?.y!!) * Math.sin(radian) // 计算偏移后的点 -// val coordMid = -// Coordinate(point.getX() + dy, point.getY() - dx) - // 计算指定距离外与当前位置成90度夹角的点位 - val pointStart = GeoPoint(point.getY() - dx, point.getX() + dy) -// val pointStart = GeoPoint(pointMid.latitude-dy, pointMid.longitude-dx) - val pointEnd = GeoPoint(pointStart.latitude- dx, pointStart.longitude+ dy) + val coord = + Coordinate(point.getX() - dx, point.getY() - dy) - // 将这个线记录在数据中 - val geometryTranslate: Geometry = GeometryTools.createLineString(listOf(pointStart, pointEnd)) + // 将这个点记录在数据中 + val geometryTranslate: Geometry = GeometryTools.createGeometry(doubleArrayOf(coord.x, coord.y)) renderEntity.geometry = geometryTranslate.toString() - return renderEntity + } + + /** + * 生成偏移后数据的起终点参考线 + * */ + fun generateS2EReferenceLine(renderEntity: RenderEntity) { + // 获取当前renderEntity的geometry,该坐标为偏移后坐标,即为终点 + val translateGeometry = renderEntity.wkt + val startGeometry = GeometryTools.createGeometry(renderEntity.properties["geometry"]) + + val pointEnd = translateGeometry!!.coordinates[translateGeometry.numPoints-1] // 获取这个geometry对应的结束点坐标 + val pointStart = startGeometry!!.coordinates[startGeometry.numPoints-1] // 获取这个geometry对应的结束点坐标 + + // 将这个起终点的线记录在数据中 + val startEndReference = ReferenceEntity() + startEndReference.renderEntityId = renderEntity.id + startEndReference.name = "${renderEntity.name}参考线" + startEndReference.table = renderEntity.table + // 起终点坐标组成的线 + startEndReference.geometry = GeometryTools.createLineString(arrayOf(pointStart, pointEnd)).toString() + startEndReference.properties["qi_table"] = renderEntity.table + startEndReference.properties["type"] = "s_2_e" + Realm.getDefaultInstance().insert(startEndReference) + } + + /** + * 生成与对应方向相同的方向线,用以绘制方向箭头 + * */ + fun generateDirectReferenceLine(renderEntity: RenderEntity, direction: String = "") { + // 根据数据或angle计算方向对应的角度和偏移量 + val geometry = renderEntity.wkt + var isReverse = false // 是否为逆向 + if (direction.isNotEmpty()) { + val paramDirections = direction.split("=") + if (paramDirections.size>=2 && renderEntity.properties[paramDirections[0].trim()] == paramDirections[1].trim()) { + isReverse = true; + } + } + var radian = 0.0 // geometry的角度,如果是点,获取angle,如果是线,获取最后两个点的方向 + var point = Coordinate(geometry?.coordinate) + if (Geometry.TYPENAME_POINT == geometry?.geometryType) { + point = Coordinate(geometry?.coordinate) + var angle = if(renderEntity?.properties?.get("angle") == null) 0.0 else renderEntity?.properties?.get("angle")?.toDouble()!! + if (isReverse) { + angle += 180 + } + radian = Math.toRadians(angle) + } else if (Geometry.TYPENAME_LINESTRING == geometry?.geometryType) { + var coordinates = geometry.coordinates + if (isReverse) { + coordinates = coordinates.reversedArray() + } + val p1: Coordinate = coordinates.get(coordinates.size - 2) + val p2: Coordinate = coordinates.get(coordinates.size - 1) + // 计算线段的方向 + radian = Angle.angle(p1, p2) + point = p2 + } + + // 计算偏移距离 + val dx: Double = GeometryTools.convertDistanceToDegree(3.0, geometry?.coordinate?.y!!) * Math.cos(radian) + val dy: Double = GeometryTools.convertDistanceToDegree(3.0, geometry?.coordinate?.y!!) * Math.sin(radian) + + val coorEnd = Coordinate(point.getX() + dy, point.getY() - dx) + + val angleReference = ReferenceEntity() + angleReference.renderEntityId = renderEntity.id + angleReference.name = "${renderEntity.name}参考方向" + angleReference.table = renderEntity.table + // 与原有方向指向平行的线 + angleReference.geometry = GeometryTools.createLineString(arrayOf(point, coorEnd)).toString() + angleReference.properties["qi_table"] = renderEntity.table + angleReference.properties["type"] = "angle" + Realm.getDefaultInstance().insert(angleReference) } fun addAngleFromGeometry(renderEntity: RenderEntity): String { @@ -143,6 +230,7 @@ class ImportPreProcess { } } + /** * 自动生成普通交限的参考数据 * */ @@ -191,6 +279,58 @@ class ImportPreProcess { Realm.getDefaultInstance().insert(angleReference) } + /** + * 自动生成电子眼的参考数据 + * */ + fun generateElectronicEyeRerference(renderEntity: RenderEntity) { + // 获取当前renderEntity的geometry + val geometry = renderEntity.wkt + var radian = 0.0 // geometry的角度,如果是点,获取angle,如果是线,获取最后两个点的方向 + var point = Coordinate(geometry?.coordinate) + if (Geometry.TYPENAME_POINT == geometry?.geometryType) { + var angle = if(renderEntity?.properties?.get("angle") == null) 0.0 else renderEntity?.properties?.get("angle")?.toDouble()!! + radian = Math.toRadians(angle) + } + + // 计算偏移距离 + val dx: Double = GeometryTools.convertDistanceToDegree(3.0, geometry?.coordinate?.y!!) * Math.sin(radian) + val dy: Double = GeometryTools.convertDistanceToDegree(3.0, geometry?.coordinate?.y!!) * Math.cos(radian) + + // 计算偏移后的点 + val pointTranS = + GeoPoint(point.getY() - dx, point.getX() + dy) // 向右偏移的点 + + // 计算与原有方向平行的终点坐标 + val pointTranE = GeoPoint(pointTranS.latitude + dy, pointTranS.longitude + dx) + + renderEntity.geometry = GeometryTools.createGeometry(pointTranS).toString() + + // 记录参考数据,绘制电子眼方向 + val startEndReference = ReferenceEntity() + startEndReference.renderEntityId = renderEntity.id + startEndReference.name = "电子眼参考线" + startEndReference.table = renderEntity.table + // 起终点坐标组成的线 + startEndReference.geometry = GeometryTools.createLineString(listOf(GeoPoint(point.y, point.x), pointTranS)).toString() + startEndReference.properties["qi_table"] = renderEntity.table + startEndReference.properties["type"] = "s_2_e" + Realm.getDefaultInstance().insert(startEndReference) + + val angleReference = ReferenceEntity() + angleReference.renderEntityId = renderEntity.id + angleReference.name = "电子眼参考方向" + angleReference.table = renderEntity.table + // 与原有方向指向平行的线 + angleReference.geometry = GeometryTools.createLineString(listOf(pointTranS, pointTranE)).toString() + angleReference.properties["qi_table"] = renderEntity.table + angleReference.properties["type"] = "angle" + Realm.getDefaultInstance().insert(angleReference) + } + + + /** + * 生成默认道路名数据 + * */ fun generateRoadName(renderEntity: RenderEntity) { // LinkName的真正名称数据,是保存在properties的shapeList中的,因此需要解析shapeList数据 var shape :JSONObject? = null @@ -217,4 +357,39 @@ class ImportPreProcess { renderEntity.properties["name"] = "" } } + + /** + * 生成电子眼对应的渲染名称 + * */ + fun generateElectronName(renderEntity: RenderEntity) { + // 解析电子眼的kind,将其转换为渲染的简要名称 + var shape :JSONObject? = null + if (renderEntity.properties.containsKey("kind")) { + renderEntity.properties["name"] = code2NameMap.electronEyeKindMap[renderEntity.properties["kind"].toString().toInt()] + } else { + renderEntity.properties["name"] = "" + } + } + + /** + * 生成默认路口数据的参考数据 + * */ + fun generateIntersectionReference(renderEntity: RenderEntity) { + // 路口数据的其他点位,是保存在nodeList对应的数组下 + if (renderEntity.properties.containsKey("nodeList")) { + val nodeListJsonArray: JSONArray = JSONArray(renderEntity.properties["nodeList"]) + for (i in 0 until nodeListJsonArray.length()) { + val nodeJSONObject = nodeListJsonArray.getJSONObject(i) + val intersectionReference = ReferenceEntity() + intersectionReference.renderEntityId = renderEntity.id + intersectionReference.name = "${renderEntity.name}参考点" + intersectionReference.table = renderEntity.table + // 与原有方向指向平行的线 + intersectionReference.geometry = GeometryTools.createGeometry(nodeJSONObject["geometry"].toString()).toString() + intersectionReference.properties["qi_table"] = renderEntity.table + intersectionReference.properties["type"] = "node" + Realm.getDefaultInstance().insert(intersectionReference) + } + } + } } \ No newline at end of file diff --git a/collect-library/src/main/assets/editormarker.xml b/collect-library/src/main/assets/editormarker.xml index fadfe6ab..e4be6b84 100644 --- a/collect-library/src/main/assets/editormarker.xml +++ b/collect-library/src/main/assets/editormarker.xml @@ -174,7 +174,8 @@ - + @@ -1799,13 +1800,41 @@ symbol-width="76"> - + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/java/com/navinfo/collect/library/utils/GeometryTools.java b/collect-library/src/main/java/com/navinfo/collect/library/utils/GeometryTools.java index e0855bb1..44271835 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/utils/GeometryTools.java +++ b/collect-library/src/main/java/com/navinfo/collect/library/utils/GeometryTools.java @@ -293,7 +293,7 @@ public class GeometryTools { * @param coords [] * @return Geometry */ - public LineString createLineString(Coordinate[] coords) { + public static LineString createLineString(Coordinate[] coords) { LineString lineString = null; GeometryFactory factory = new GeometryFactory(); lineString = factory.createLineString(coords); diff --git a/vtm b/vtm index 1ee201a4..c6ba77aa 160000 --- a/vtm +++ b/vtm @@ -1 +1 @@ -Subproject commit 1ee201a41f78f169873848209a3f3bdac36f185a +Subproject commit c6ba77aa0eb90a84fb19377706eb6792ec4a42b6 From e9af1785f8709fd56530f76e4e62f93b0cd8f19c Mon Sep 17 00:00:00 2001 From: xiaoyan Date: Sun, 25 Jun 2023 16:49:25 +0800 Subject: [PATCH 3/6] =?UTF-8?q?fix:=20=E4=BF=AE=E6=94=B9=E6=99=AE=E9=80=9A?= =?UTF-8?q?=E4=BA=A4=E9=99=90=E5=85=A5=E5=BA=93=E8=A7=84=E5=88=99=EF=BC=8C?= =?UTF-8?q?=E9=A6=96=E5=B0=BE=E7=9B=B8=E6=8E=A5=E6=95=B0=E6=8D=AE=E4=B8=8D?= =?UTF-8?q?=E5=85=A5=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/assets/omdb_config.json | 6 +++ .../com/navinfo/omqs/bean/ImportConfig.kt | 17 +++++-- .../com/navinfo/omqs/db/ImportOMDBHelper.kt | 51 ++++++++++--------- .../com/navinfo/omqs/db/ImportPreCacheData.kt | 5 ++ .../com/navinfo/omqs/db/ImportPreProcess.kt | 18 +++++++ .../personalcenter/PersonalCenterFragment.kt | 2 +- .../src/main/assets/editormarker.xml | 2 +- 7 files changed, 73 insertions(+), 28 deletions(-) create mode 100644 app/src/main/java/com/navinfo/omqs/db/ImportPreCacheData.kt diff --git a/app/src/main/assets/omdb_config.json b/app/src/main/assets/omdb_config.json index 0800ec23..db3273a8 100644 --- a/app/src/main/assets/omdb_config.json +++ b/app/src/main/assets/omdb_config.json @@ -171,6 +171,12 @@ "code": 4006, "name": "普通交限", "transformer": [ + { + "k": "geometry", + "v": "~", + "klib": "geometry", + "vlib": "checkCircleRoad()" + }, { "k": "geometry", "v": "~", diff --git a/app/src/main/java/com/navinfo/omqs/bean/ImportConfig.kt b/app/src/main/java/com/navinfo/omqs/bean/ImportConfig.kt index 5a8e099e..1d74d315 100644 --- a/app/src/main/java/com/navinfo/omqs/bean/ImportConfig.kt +++ b/app/src/main/java/com/navinfo/omqs/bean/ImportConfig.kt @@ -13,7 +13,7 @@ class ImportConfig { var checked : Boolean = true val preProcess: ImportPreProcess = ImportPreProcess() - fun transformProperties(renderEntity: RenderEntity): RenderEntity { + fun transformProperties(renderEntity: RenderEntity): RenderEntity? { val transformList = tableMap[renderEntity.code.toString()]?.transformer if (transformList.isNullOrEmpty()) { return renderEntity @@ -31,6 +31,7 @@ class ImportConfig { // 如果key和value都为空,说明当前数据需要增加一个新字段 if (key.isNullOrEmpty()&&value.isNullOrEmpty()&&!renderEntity.properties.containsKey(keylib)) { renderEntity.properties[keylib] = valuelib + continue } // 开始解析key和value,并对数据进行匹配 m@ for (k in processKeyOrValue(key)) { @@ -54,7 +55,12 @@ class ImportConfig { callByParams[methodParams[index+1]] = value } } - method.callBy(callByParams) + when(val result = method.callBy(callByParams)) { // 如果方法返回的数据类型是boolean,且返回为false,则该数据不处理 + is Boolean -> + if (!result) { + return null + } + } } else { renderEntity.properties[keylib] = valuelib } @@ -77,7 +83,12 @@ class ImportConfig { callByParams[methodParams[index+1]] = value } } - method.callBy(callByParams) + when(val result = method.callBy(callByParams)) { + is Boolean -> + if (!result) { + return null + } + } } else { renderEntity.properties[keylib] = valuelib } diff --git a/app/src/main/java/com/navinfo/omqs/db/ImportOMDBHelper.kt b/app/src/main/java/com/navinfo/omqs/db/ImportOMDBHelper.kt index ae976c3c..64ac2675 100644 --- a/app/src/main/java/com/navinfo/omqs/db/ImportOMDBHelper.kt +++ b/app/src/main/java/com/navinfo/omqs/db/ImportOMDBHelper.kt @@ -146,7 +146,7 @@ class ImportOMDBHelper @AssistedInject constructor( it.name == currentConfig.table } - val listResult = mutableListOf>() + val listResult = mutableListOf() currentConfig?.let { val list = FileIOUtils.readFile2List(txtFile, "UTF-8") Log.d("ImportOMDBHelper", "开始解析:${txtFile?.name}") @@ -159,33 +159,38 @@ class ImportOMDBHelper @AssistedInject constructor( map["qi_table"] = currentConfig.table map["qi_name"] = currentConfig.name map["qi_code"] = if (currentConfig.code == 0) currentConfig.code else currentEntry.key - listResult.add(map) + + // 先查询这个mesh下有没有数据,如果有则跳过即可 + // val meshEntity = Realm.getDefaultInstance().where(RenderEntity::class.java).equalTo("properties['mesh']", map["mesh"].toString()).findFirst() + val renderEntity = RenderEntity() + renderEntity.code = map["qi_code"].toString().toInt() + renderEntity.name = map["qi_name"].toString() + renderEntity.table = map["qi_table"].toString() + // 其他数据插入到Properties中 + renderEntity.geometry = map["geometry"].toString() + for ((key, value) in map) { + when (value) { + is String -> renderEntity.properties.put(key, value) + is Int -> renderEntity.properties.put(key, value.toInt().toString()) + is Double -> renderEntity.properties.put(key, value.toDouble().toString()) + else -> renderEntity.properties.put(key, value.toString()) + } + } + listResult.add(renderEntity) + // 对renderEntity做预处理后再保存 + val resultEntity = importConfig.transformProperties(renderEntity) + if (resultEntity!=null) { + Realm.getDefaultInstance().insert(renderEntity) + } } } } - for (map in listResult) { // 每一个map就是Realm的一条数据 - // 先查询这个mesh下有没有数据,如果有则跳过即可 -// val meshEntity = Realm.getDefaultInstance().where(RenderEntity::class.java).equalTo("properties['mesh']", map["mesh"].toString()).findFirst() - val renderEntity = RenderEntity() - renderEntity.code = map["qi_code"].toString().toInt() - renderEntity.name = map["qi_name"].toString() - renderEntity.table = map["qi_table"].toString() - // 其他数据插入到Properties中 - renderEntity.geometry = map["geometry"].toString() - for ((key, value) in map) { - when (value) { - is String -> renderEntity.properties.put(key, value) - is Int -> renderEntity.properties.put(key, value.toInt().toString()) - is Double -> renderEntity.properties.put(key, value.toDouble().toString()) - else -> renderEntity.properties.put(key, value.toString()) - } - } - // 对renderEntity做预处理后再保存 - importConfig.transformProperties(renderEntity) - Realm.getDefaultInstance().copyToRealm(renderEntity) - } // 1个文件发送一次flow流 emit("${index + 1}/${importConfig.tableMap.size}") + // 如果当前解析的是OMDB_RD_LINK数据,将其缓存在预处理类中,以便后续处理其他要素时使用 + if (currentConfig.table == "OMDB_RD_LINK") { + importConfig.preProcess.cacheRdLink = listResult.associateBy { it.properties["linkPid"] } + } } Realm.getDefaultInstance().commitTransaction() } catch (e: Exception) { diff --git a/app/src/main/java/com/navinfo/omqs/db/ImportPreCacheData.kt b/app/src/main/java/com/navinfo/omqs/db/ImportPreCacheData.kt new file mode 100644 index 00000000..2eacb95f --- /dev/null +++ b/app/src/main/java/com/navinfo/omqs/db/ImportPreCacheData.kt @@ -0,0 +1,5 @@ +package com.navinfo.omqs.db + +class ImportPreCacheData { + +} \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/db/ImportPreProcess.kt b/app/src/main/java/com/navinfo/omqs/db/ImportPreProcess.kt index 3f2d8749..f556e19c 100644 --- a/app/src/main/java/com/navinfo/omqs/db/ImportPreProcess.kt +++ b/app/src/main/java/com/navinfo/omqs/db/ImportPreProcess.kt @@ -1,5 +1,6 @@ package com.navinfo.omqs.db +import android.util.Log import com.navinfo.collect.library.data.entity.ReferenceEntity import com.navinfo.collect.library.data.entity.RenderEntity import com.navinfo.collect.library.utils.GeometryTools @@ -14,6 +15,23 @@ import org.oscim.core.GeoPoint class ImportPreProcess { val code2NameMap = Code2NameMap() + lateinit var cacheRdLink: Map + + fun checkCircleRoad(renderEntity: RenderEntity): Boolean { + val linkInId = renderEntity.properties["linkIn"] + val linkOutId = renderEntity.properties["linkOut"] + // 根据linkIn和linkOut获取对应的link数据 + val linkInEntity = cacheRdLink[linkInId] + val linkOutEntity = cacheRdLink[linkOutId] + Log.d("checkCircleRoad", "LinkInEntity: ${linkInId}- ${linkInEntity?.properties?.get("snodePid")},LinkOutEntity: ${linkOutId}- ${linkOutEntity?.properties?.get("enodePid")}") + // 查询linkIn的sNode和linkOut的eNode是否相同,如果相同,认为数据是环形路口,返回false + if (linkInEntity!=null&&linkOutEntity!=null) { + if ((linkInEntity.properties["snodePid"] == linkOutEntity.properties["enodePid"]) || linkInEntity.properties["enodePid"] == linkOutEntity.properties["snodePid"] + || linkInEntity.properties["snodePid"] == linkOutEntity.properties["snodePid"]|| linkInEntity.properties["enodePid"] == linkOutEntity.properties["enodePid"]) + return false + } + return true + } /** * 计算指定数据指定方向的坐标 * @param direction 判断当前数据是否为逆向,给定的应该是一个a=b的表达式,a为对应的properties的key,b为对应的值 diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/personalcenter/PersonalCenterFragment.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/personalcenter/PersonalCenterFragment.kt index df128d20..69881185 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/personalcenter/PersonalCenterFragment.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/personalcenter/PersonalCenterFragment.kt @@ -112,7 +112,7 @@ class PersonalCenterFragment(private var backListener: (() -> Unit?)? = null) : viewModel.readRealmData() // 定位到指定位置 niMapController.mMapView.vtmMap.animator() - .animateTo(GeoPoint( 39.80392140200183, 116.51446703352337 )) + .animateTo(GeoPoint( 39.80130797136839, 116.51808677349096 )) } // R.id.personal_center_menu_task_list -> { // findNavController().navigate(R.id.TaskManagerFragment) diff --git a/collect-library/src/main/assets/editormarker.xml b/collect-library/src/main/assets/editormarker.xml index e4be6b84..6348342d 100644 --- a/collect-library/src/main/assets/editormarker.xml +++ b/collect-library/src/main/assets/editormarker.xml @@ -1804,7 +1804,7 @@ - + From 3d4d6c13a7c2e8ad47831702f5faf6baa15b6d97 Mon Sep 17 00:00:00 2001 From: xiaoyan Date: Sun, 25 Jun 2023 17:12:02 +0800 Subject: [PATCH 4/6] =?UTF-8?q?fix:=20=E6=B3=A8=E9=87=8A=E6=97=A0=E7=94=A8?= =?UTF-8?q?=E6=B8=B2=E6=9F=93=E6=A0=B7=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/assets/editormarker.xml | 148 +++++++++--------- 1 file changed, 74 insertions(+), 74 deletions(-) diff --git a/collect-library/src/main/assets/editormarker.xml b/collect-library/src/main/assets/editormarker.xml index 6348342d..543f0a22 100644 --- a/collect-library/src/main/assets/editormarker.xml +++ b/collect-library/src/main/assets/editormarker.xml @@ -1479,83 +1479,83 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + + + - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + From 8551ce43a7665ffadf8dc2bf233cfa1b05808634 Mon Sep 17 00:00:00 2001 From: xiaoyan Date: Mon, 26 Jun 2023 14:56:29 +0800 Subject: [PATCH 5/6] =?UTF-8?q?fix:=20=E5=AE=8C=E5=96=84=E8=B7=AF=E5=8F=A3?= =?UTF-8?q?=E5=92=8C=E7=94=B5=E5=AD=90=E7=9C=BC=E6=B8=B2=E6=9F=93=E6=A0=B7?= =?UTF-8?q?=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/assets/omdb_config.json | 8 +- .../com/navinfo/omqs/bean/ImportConfig.kt | 14 ++- .../com/navinfo/omqs/db/ImportPreProcess.kt | 108 ++---------------- .../omqs/ui/activity/map/MainActivity.kt | 2 +- .../personalcenter/PersonalCenterFragment.kt | 2 +- .../src/main/assets/editormarker.xml | 6 +- 6 files changed, 23 insertions(+), 117 deletions(-) diff --git a/app/src/main/assets/omdb_config.json b/app/src/main/assets/omdb_config.json index db3273a8..a211f51e 100644 --- a/app/src/main/assets/omdb_config.json +++ b/app/src/main/assets/omdb_config.json @@ -224,7 +224,7 @@ "k": "geometry", "v": "~", "klib": "geometry", - "vlib": "generateDirectReferenceLine()" + "vlib": "generateDirectReferenceLine(direct=3)" }, { "k": "geometry", @@ -239,12 +239,6 @@ "code": 4022, "name": "交通灯", "transformer": [ - { - "k": "angle", - "v": "~", - "klib": "angle", - "vlib": "0" - } ] }, "4601":{ diff --git a/app/src/main/java/com/navinfo/omqs/bean/ImportConfig.kt b/app/src/main/java/com/navinfo/omqs/bean/ImportConfig.kt index 1d74d315..5c6683b2 100644 --- a/app/src/main/java/com/navinfo/omqs/bean/ImportConfig.kt +++ b/app/src/main/java/com/navinfo/omqs/bean/ImportConfig.kt @@ -38,7 +38,7 @@ class ImportConfig { if (renderEntity.properties.containsKey(k)) { // json配置的key可以匹配到数据 for (v in processKeyOrValue(value)) { if ("~" == v ) { // ~符可以匹配任意元素 - if (valuelib.endsWith("()")) { // 以()结尾,说明该value配置是一个function,需要通过反射调用指定方法 + if (valuelib.endsWith(")")) { // 以()结尾,说明该value配置是一个function,需要通过反射调用指定方法 // 获取方法名 val methodName = valuelib.substringBefore("(") // 获取参数 @@ -51,8 +51,9 @@ class ImportConfig { methodParams[1] to renderEntity ) for ((index, value) in params.withIndex()) { - if (methodParams.size>index+1) { - callByParams[methodParams[index+1]] = value + // 前2个参数确定为对象本身和RenderEntity,因此自定义参数从index+2开始设置 + if (methodParams.size>index+2) { + callByParams[methodParams[index+2]] = value } } when(val result = method.callBy(callByParams)) { // 如果方法返回的数据类型是boolean,且返回为false,则该数据不处理 @@ -66,7 +67,7 @@ class ImportConfig { } break@m } else if (renderEntity.properties[k] == v) { // 完全匹配 - if (valuelib.endsWith("()")) { // 以()结尾,说明该value配置是一个function,需要通过反射调用指定方法 + if (valuelib.endsWith(")")) { // 以()结尾,说明该value配置是一个function,需要通过反射调用指定方法 // 获取方法名 val methodName = valuelib.substringBefore("(") // 获取参数 @@ -79,8 +80,9 @@ class ImportConfig { methodParams[1] to renderEntity ) for ((index, value) in params.withIndex()) { - if (methodParams.size>index+1) { - callByParams[methodParams[index+1]] = value + // 前2个参数确定为对象本身和RenderEntity,因此自定义参数从index+2开始设置 + if (methodParams.size>index+2) { + callByParams[methodParams[index+2]] = value } } when(val result = method.callBy(callByParams)) { diff --git a/app/src/main/java/com/navinfo/omqs/db/ImportPreProcess.kt b/app/src/main/java/com/navinfo/omqs/db/ImportPreProcess.kt index f556e19c..de475584 100644 --- a/app/src/main/java/com/navinfo/omqs/db/ImportPreProcess.kt +++ b/app/src/main/java/com/navinfo/omqs/db/ImportPreProcess.kt @@ -26,7 +26,7 @@ class ImportPreProcess { Log.d("checkCircleRoad", "LinkInEntity: ${linkInId}- ${linkInEntity?.properties?.get("snodePid")},LinkOutEntity: ${linkOutId}- ${linkOutEntity?.properties?.get("enodePid")}") // 查询linkIn的sNode和linkOut的eNode是否相同,如果相同,认为数据是环形路口,返回false if (linkInEntity!=null&&linkOutEntity!=null) { - if ((linkInEntity.properties["snodePid"] == linkOutEntity.properties["enodePid"]) || linkInEntity.properties["enodePid"] == linkOutEntity.properties["snodePid"] + if (linkInEntity.properties["snodePid"] == linkOutEntity.properties["enodePid"] || linkInEntity.properties["enodePid"] == linkOutEntity.properties["snodePid"] || linkInEntity.properties["snodePid"] == linkOutEntity.properties["snodePid"]|| linkInEntity.properties["enodePid"] == linkOutEntity.properties["enodePid"]) return false } @@ -48,11 +48,13 @@ class ImportPreProcess { isReverse = true; } } - if (Geometry.TYPENAME_POINT == geometry?.geometryType) { + if (Geometry.TYPENAME_POINT == geometry?.geometryType) { // angle为与正北方向的顺时针夹角 var angle = if(renderEntity?.properties?.get("angle") == null) 0.0 else renderEntity?.properties?.get("angle")?.toDouble()!! if (isReverse) { angle += 180 } + // angle角度为与正北方向的顺时针夹角,将其转换为与X轴正方向的逆时针夹角,即为正东方向的夹角 + angle=(450-angle)%360 radian = Math.toRadians(angle) } else if (Geometry.TYPENAME_LINESTRING == geometry?.geometryType) { var coordinates = geometry.coordinates @@ -99,6 +101,8 @@ class ImportPreProcess { if (isReverse) { angle += 180 } + // angle角度为与正北方向的顺时针夹角,将其转换为与X轴正方向的逆时针夹角,即为正东方向的夹角 + angle=(450-angle)%360 radian = Math.toRadians(angle) } else if (Geometry.TYPENAME_LINESTRING == geometry?.geometryType) { var coordinates = geometry.coordinates @@ -169,6 +173,8 @@ class ImportPreProcess { if (isReverse) { angle += 180 } + // angle角度为与正北方向的顺时针夹角,将其转换为与X轴正方向的逆时针夹角,即为正东方向的夹角 + angle=(450-angle)%360 radian = Math.toRadians(angle) } else if (Geometry.TYPENAME_LINESTRING == geometry?.geometryType) { var coordinates = geometry.coordinates @@ -186,7 +192,7 @@ class ImportPreProcess { val dx: Double = GeometryTools.convertDistanceToDegree(3.0, geometry?.coordinate?.y!!) * Math.cos(radian) val dy: Double = GeometryTools.convertDistanceToDegree(3.0, geometry?.coordinate?.y!!) * Math.sin(radian) - val coorEnd = Coordinate(point.getX() + dy, point.getY() - dx) + val coorEnd = Coordinate(point.getX() + dx, point.getY() + dy) val angleReference = ReferenceEntity() angleReference.renderEntityId = renderEntity.id @@ -249,102 +255,6 @@ class ImportPreProcess { } - /** - * 自动生成普通交限的参考数据 - * */ - fun generateRestrictionRerference(renderEntity: RenderEntity) { - // 获取当前renderEntity的geometry - val geometry = renderEntity.wkt - var radian = 0.0 // geometry的角度,如果是点,获取angle,如果是线,获取最后两个点的方向 - var point = Coordinate(geometry?.coordinate) - if (Geometry.TYPENAME_POINT == geometry?.geometryType) { - var angle = if(renderEntity?.properties?.get("angle") == null) 0.0 else renderEntity?.properties?.get("angle")?.toDouble()!! - radian = Math.toRadians(angle) - } - - // 计算偏移距离 - val dx: Double = GeometryTools.convertDistanceToDegree(3.0, geometry?.coordinate?.y!!) * Math.sin(radian) - val dy: Double = GeometryTools.convertDistanceToDegree(3.0, geometry?.coordinate?.y!!) * Math.cos(radian) - - // 计算偏移后的点 - val pointTranS = - GeoPoint(point.getY() - dx, point.getX() + dy) // 向右偏移的点 - - // 计算与原有方向平行的终点坐标 - val pointTranE = GeoPoint(pointTranS.latitude + dy, pointTranS.longitude + dx) - - renderEntity.geometry = GeometryTools.createGeometry(pointTranS).toString() - - // 将这个点记录在数据中 - val startEndReference = ReferenceEntity() - startEndReference.renderEntityId = renderEntity.id - startEndReference.name = "普通交限参考线" - startEndReference.table = renderEntity.table - // 起终点坐标组成的线 - startEndReference.geometry = GeometryTools.createLineString(listOf(GeoPoint(point.y, point.x), pointTranS)).toString() - startEndReference.properties["qi_table"] = renderEntity.table - startEndReference.properties["type"] = "s_2_e" - Realm.getDefaultInstance().insert(startEndReference) - - val angleReference = ReferenceEntity() - angleReference.renderEntityId = renderEntity.id - angleReference.name = "普通交限参考方向" - angleReference.table = renderEntity.table - // 与原有方向指向平行的线 - angleReference.geometry = GeometryTools.createLineString(listOf(pointTranS, pointTranE)).toString() - angleReference.properties["qi_table"] = renderEntity.table - angleReference.properties["type"] = "angle" - Realm.getDefaultInstance().insert(angleReference) - } - - /** - * 自动生成电子眼的参考数据 - * */ - fun generateElectronicEyeRerference(renderEntity: RenderEntity) { - // 获取当前renderEntity的geometry - val geometry = renderEntity.wkt - var radian = 0.0 // geometry的角度,如果是点,获取angle,如果是线,获取最后两个点的方向 - var point = Coordinate(geometry?.coordinate) - if (Geometry.TYPENAME_POINT == geometry?.geometryType) { - var angle = if(renderEntity?.properties?.get("angle") == null) 0.0 else renderEntity?.properties?.get("angle")?.toDouble()!! - radian = Math.toRadians(angle) - } - - // 计算偏移距离 - val dx: Double = GeometryTools.convertDistanceToDegree(3.0, geometry?.coordinate?.y!!) * Math.sin(radian) - val dy: Double = GeometryTools.convertDistanceToDegree(3.0, geometry?.coordinate?.y!!) * Math.cos(radian) - - // 计算偏移后的点 - val pointTranS = - GeoPoint(point.getY() - dx, point.getX() + dy) // 向右偏移的点 - - // 计算与原有方向平行的终点坐标 - val pointTranE = GeoPoint(pointTranS.latitude + dy, pointTranS.longitude + dx) - - renderEntity.geometry = GeometryTools.createGeometry(pointTranS).toString() - - // 记录参考数据,绘制电子眼方向 - val startEndReference = ReferenceEntity() - startEndReference.renderEntityId = renderEntity.id - startEndReference.name = "电子眼参考线" - startEndReference.table = renderEntity.table - // 起终点坐标组成的线 - startEndReference.geometry = GeometryTools.createLineString(listOf(GeoPoint(point.y, point.x), pointTranS)).toString() - startEndReference.properties["qi_table"] = renderEntity.table - startEndReference.properties["type"] = "s_2_e" - Realm.getDefaultInstance().insert(startEndReference) - - val angleReference = ReferenceEntity() - angleReference.renderEntityId = renderEntity.id - angleReference.name = "电子眼参考方向" - angleReference.table = renderEntity.table - // 与原有方向指向平行的线 - angleReference.geometry = GeometryTools.createLineString(listOf(pointTranS, pointTranE)).toString() - angleReference.properties["qi_table"] = renderEntity.table - angleReference.properties["type"] = "angle" - Realm.getDefaultInstance().insert(angleReference) - } - /** * 生成默认道路名数据 diff --git a/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainActivity.kt b/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainActivity.kt index c46932f7..d1a82fbd 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainActivity.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainActivity.kt @@ -230,7 +230,7 @@ class MainActivity : BaseActivity() { } //监听地图中点变化 viewModel.liveDataCenterPoint.observe(this) { - Log.e("qj", "${it.longitude}") +// Log.e("qj", "${it.longitude}") try { if (it != null && it.longitude != null && it.latitude != null) { binding.mainActivityGeometry.text = "经纬度:${ diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/personalcenter/PersonalCenterFragment.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/personalcenter/PersonalCenterFragment.kt index 69881185..3c687be0 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/personalcenter/PersonalCenterFragment.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/personalcenter/PersonalCenterFragment.kt @@ -112,7 +112,7 @@ class PersonalCenterFragment(private var backListener: (() -> Unit?)? = null) : viewModel.readRealmData() // 定位到指定位置 niMapController.mMapView.vtmMap.animator() - .animateTo(GeoPoint( 39.80130797136839, 116.51808677349096 )) + .animateTo(GeoPoint( 39.799624915997725, 116.51407667184905 )) } // R.id.personal_center_menu_task_list -> { // findNavController().navigate(R.id.TaskManagerFragment) diff --git a/collect-library/src/main/assets/editormarker.xml b/collect-library/src/main/assets/editormarker.xml index 543f0a22..29d2d7b1 100644 --- a/collect-library/src/main/assets/editormarker.xml +++ b/collect-library/src/main/assets/editormarker.xml @@ -1809,6 +1809,7 @@ + - - - + + From 6921e4c0b04daf34c23d81e3161a13bdd39706f1 Mon Sep 17 00:00:00 2001 From: squallzhjch Date: Tue, 27 Jun 2023 16:11:11 +0800 Subject: [PATCH 6/6] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E8=BD=A6=E4=BF=A1?= =?UTF-8?q?=E6=8F=90=E5=89=8D=E7=9C=8B=E6=9D=BF=E6=98=BE=E7=A4=BA=20?= =?UTF-8?q?=E8=B0=83=E6=95=B4=E6=9D=A1=E4=BB=B6=E9=99=90=E9=80=9F=EF=BC=8C?= =?UTF-8?q?=E5=B8=B8=E8=A7=84=E9=99=90=E9=80=9F=E6=8F=90=E5=89=8D=E7=9C=8B?= =?UTF-8?q?=E6=9D=BF=EF=BC=8C=E8=AF=A6=E7=BB=86=E7=9C=8B=E6=9D=BF=20?= =?UTF-8?q?=E8=B0=83=E6=95=B4=E9=81=93=E8=B7=AF=E5=90=8D=E8=AF=A6=E7=BB=86?= =?UTF-8?q?=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/navinfo/omqs/bean/SignBean.kt | 15 +- .../omqs/ui/activity/map/MainActivity.kt | 69 ++-- .../omqs/ui/activity/map/MainViewModel.kt | 34 +- .../omqs/ui/activity/map/SignAdapter.kt | 125 ++++++-- .../omqs/ui/activity/map/TopSignAdapter.kt | 3 - .../navinfo/omqs/ui/fragment/BaseFragment.kt | 7 +- .../EvaluationResultFragment.kt | 18 +- .../EvaluationResultViewModel.kt | 6 +- .../fragment/evaluationresult/LeftAdapter.kt | 3 - .../evaluationresult/MiddleAdapter.kt | 3 - .../RightGroupHeaderAdapter.kt | 3 - .../evaluationresult/SoundtListAdapter.kt | 4 - .../offlinemap/OfflineMapCityListAdapter.kt | 4 - .../qsrecordlist/QsRecordListAdapter.kt | 3 - .../ui/fragment/sign/RoadNameInfoFragment.kt | 57 ---- .../signMoreInfo/ElectronicEyeInfoAdapter.kt | 30 ++ .../RoadNameInfoAdapter.kt | 5 +- .../signMoreInfo/SignMoreInfoFragment.kt | 100 ++++++ .../omqs/ui/fragment/tasklist/TaskAdapter.kt | 3 - .../ui/fragment/tasklist/TaskListAdapter.kt | 4 - .../omqs/ui/other/BaseRecyclerViewAdapter.kt | 13 +- .../com/navinfo/omqs/ui/widget/SignUtil.kt | 300 ++++++++++++++++-- .../res/drawable-xxhdpi/bg_sign_laneinfo.png | Bin 0 -> 2343 bytes .../drawable-xxhdpi/icon_electronic_eye.png | Bin 0 -> 9028 bytes .../icon_electronic_eye_left.png | Bin 0 -> 2516 bytes app/src/main/res/drawable/laneinfo_0.xml | 18 ++ app/src/main/res/drawable/laneinfo_1.xml | 12 + app/src/main/res/drawable/laneinfo_1_2.xml | 18 ++ app/src/main/res/drawable/laneinfo_1_2_3.xml | 24 ++ app/src/main/res/drawable/laneinfo_1_2_4.xml | 24 ++ app/src/main/res/drawable/laneinfo_1_2_5.xml | 24 ++ app/src/main/res/drawable/laneinfo_1_2_6.xml | 24 ++ app/src/main/res/drawable/laneinfo_1_3.xml | 18 ++ app/src/main/res/drawable/laneinfo_1_3_4.xml | 24 ++ app/src/main/res/drawable/laneinfo_1_3_5.xml | 24 ++ app/src/main/res/drawable/laneinfo_1_3_6.xml | 24 ++ app/src/main/res/drawable/laneinfo_1_4.xml | 18 ++ app/src/main/res/drawable/laneinfo_1_5.xml | 18 ++ app/src/main/res/drawable/laneinfo_1_6.xml | 18 ++ app/src/main/res/drawable/laneinfo_1_7.xml | 18 ++ app/src/main/res/drawable/laneinfo_2.xml | 18 ++ app/src/main/res/drawable/laneinfo_2_3.xml | 24 ++ app/src/main/res/drawable/laneinfo_2_3_4.xml | 30 ++ app/src/main/res/drawable/laneinfo_2_4.xml | 24 ++ app/src/main/res/drawable/laneinfo_2_5.xml | 24 ++ app/src/main/res/drawable/laneinfo_2_6.xml | 24 ++ app/src/main/res/drawable/laneinfo_3.xml | 18 ++ app/src/main/res/drawable/laneinfo_3_4.xml | 15 + app/src/main/res/drawable/laneinfo_3_5.xml | 24 ++ app/src/main/res/drawable/laneinfo_3_6.xml | 24 ++ app/src/main/res/drawable/laneinfo_4.xml | 12 + app/src/main/res/drawable/laneinfo_4_5.xml | 24 ++ app/src/main/res/drawable/laneinfo_4_6.xml | 15 + app/src/main/res/drawable/laneinfo_5.xml | 18 ++ app/src/main/res/drawable/laneinfo_5_6.xml | 24 ++ app/src/main/res/drawable/laneinfo_6.xml | 18 ++ app/src/main/res/drawable/laneinfo_7.xml | 12 + .../main/res/drawable/shape_dashed_line.xml | 12 + .../drawable/shape_vertical_dashed_line.xml | 10 + app/src/main/res/layout/activity_main.xml | 55 ---- .../res/layout/adapter_electronic_eye.xml | 25 ++ app/src/main/res/layout/adapter_sign.xml | 21 +- .../main/res/layout/adapter_sign_laneinfo.xml | 41 +++ ...gn_roadname.xml => fragment_sign_info.xml} | 17 +- app/src/main/res/values/colors.xml | 4 + collect-library/build.gradle | 4 +- .../library/data/entity/RenderEntity.kt | 12 +- 67 files changed, 1364 insertions(+), 300 deletions(-) delete mode 100644 app/src/main/java/com/navinfo/omqs/ui/fragment/sign/RoadNameInfoFragment.kt create mode 100644 app/src/main/java/com/navinfo/omqs/ui/fragment/signMoreInfo/ElectronicEyeInfoAdapter.kt rename app/src/main/java/com/navinfo/omqs/ui/fragment/{sign => signMoreInfo}/RoadNameInfoAdapter.kt (87%) create mode 100644 app/src/main/java/com/navinfo/omqs/ui/fragment/signMoreInfo/SignMoreInfoFragment.kt create mode 100644 app/src/main/res/drawable-xxhdpi/bg_sign_laneinfo.png create mode 100644 app/src/main/res/drawable-xxhdpi/icon_electronic_eye.png create mode 100644 app/src/main/res/drawable-xxhdpi/icon_electronic_eye_left.png create mode 100644 app/src/main/res/drawable/laneinfo_0.xml create mode 100644 app/src/main/res/drawable/laneinfo_1.xml create mode 100644 app/src/main/res/drawable/laneinfo_1_2.xml create mode 100644 app/src/main/res/drawable/laneinfo_1_2_3.xml create mode 100644 app/src/main/res/drawable/laneinfo_1_2_4.xml create mode 100644 app/src/main/res/drawable/laneinfo_1_2_5.xml create mode 100644 app/src/main/res/drawable/laneinfo_1_2_6.xml create mode 100644 app/src/main/res/drawable/laneinfo_1_3.xml create mode 100644 app/src/main/res/drawable/laneinfo_1_3_4.xml create mode 100644 app/src/main/res/drawable/laneinfo_1_3_5.xml create mode 100644 app/src/main/res/drawable/laneinfo_1_3_6.xml create mode 100644 app/src/main/res/drawable/laneinfo_1_4.xml create mode 100644 app/src/main/res/drawable/laneinfo_1_5.xml create mode 100644 app/src/main/res/drawable/laneinfo_1_6.xml create mode 100644 app/src/main/res/drawable/laneinfo_1_7.xml create mode 100644 app/src/main/res/drawable/laneinfo_2.xml create mode 100644 app/src/main/res/drawable/laneinfo_2_3.xml create mode 100644 app/src/main/res/drawable/laneinfo_2_3_4.xml create mode 100644 app/src/main/res/drawable/laneinfo_2_4.xml create mode 100644 app/src/main/res/drawable/laneinfo_2_5.xml create mode 100644 app/src/main/res/drawable/laneinfo_2_6.xml create mode 100644 app/src/main/res/drawable/laneinfo_3.xml create mode 100644 app/src/main/res/drawable/laneinfo_3_4.xml create mode 100644 app/src/main/res/drawable/laneinfo_3_5.xml create mode 100644 app/src/main/res/drawable/laneinfo_3_6.xml create mode 100644 app/src/main/res/drawable/laneinfo_4.xml create mode 100644 app/src/main/res/drawable/laneinfo_4_5.xml create mode 100644 app/src/main/res/drawable/laneinfo_4_6.xml create mode 100644 app/src/main/res/drawable/laneinfo_5.xml create mode 100644 app/src/main/res/drawable/laneinfo_5_6.xml create mode 100644 app/src/main/res/drawable/laneinfo_6.xml create mode 100644 app/src/main/res/drawable/laneinfo_7.xml create mode 100644 app/src/main/res/drawable/shape_dashed_line.xml create mode 100644 app/src/main/res/drawable/shape_vertical_dashed_line.xml create mode 100644 app/src/main/res/layout/adapter_electronic_eye.xml create mode 100644 app/src/main/res/layout/adapter_sign_laneinfo.xml rename app/src/main/res/layout/{fragment_sign_roadname.xml => fragment_sign_info.xml} (69%) diff --git a/app/src/main/java/com/navinfo/omqs/bean/SignBean.kt b/app/src/main/java/com/navinfo/omqs/bean/SignBean.kt index b5faa214..492127f3 100644 --- a/app/src/main/java/com/navinfo/omqs/bean/SignBean.kt +++ b/app/src/main/java/com/navinfo/omqs/bean/SignBean.kt @@ -1,6 +1,7 @@ package com.navinfo.omqs.bean import android.os.Parcelable +import com.navinfo.collect.library.data.entity.RenderEntity import kotlinx.parcelize.Parcelize @Parcelize @@ -11,20 +12,14 @@ data class SignBean( val distance: Int = 0, //左上图标中的文字 val iconText: String = "", - //绑定的要素id - val elementId: String = "", //绑定的linkid val linkId: String, - //坐标 - val geometry: String, //名称 val name: String, + //是否要展示详细信息 + val isMoreInfo: Boolean = false, //底部右侧文字 val bottomRightText: String = "", - //要素code类型 - val elementCode: Int, - //需要展示更多的内容 - val moreText: String = "", - //左上角信息 - val topRightText: String = "" + //捕捉数据 + val renderEntity: RenderEntity ) : Parcelable \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainActivity.kt b/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainActivity.kt index 96ef7c51..e9d14e89 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainActivity.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainActivity.kt @@ -31,7 +31,7 @@ import com.navinfo.omqs.ui.activity.BaseActivity import com.navinfo.omqs.ui.fragment.console.ConsoleFragment import com.navinfo.omqs.ui.fragment.offlinemap.OfflineMapFragment import com.navinfo.omqs.ui.fragment.qsrecordlist.QsRecordListFragment -import com.navinfo.omqs.ui.fragment.sign.RoadNameInfoFragment +import com.navinfo.omqs.ui.fragment.signMoreInfo.SignMoreInfoFragment import com.navinfo.omqs.ui.fragment.tasklist.TaskManagerFragment import com.navinfo.omqs.ui.widget.RecyclerViewSpacesItemDecoration import com.navinfo.omqs.util.FlowEventBus @@ -61,7 +61,7 @@ class MainActivity : BaseActivity() { /** * 是否开启右侧面板 */ - var switchFragment = false + private var switchFragment = false /** * 检测是否含有tts插件 @@ -90,6 +90,7 @@ class MainActivity : BaseActivity() { */ private val signAdapter by lazy { SignAdapter(object : OnSignAdapterClickListener { + //点击看板进去问题反馈面板 override fun onItemClick(signBean: SignBean) { rightController.currentDestination?.let { if (it.id == R.id.RightEmptyFragment) { @@ -101,14 +102,15 @@ class MainActivity : BaseActivity() { } } + //点击详细信息 override fun onMoreInfoClick(selectTag: String, tag: String, signBean: SignBean) { - if (binding.mainActivitySignMoreInfoGroup.visibility != View.VISIBLE || selectTag != tag) { - binding.mainActivitySignMoreInfoGroup.visibility = View.VISIBLE - binding.mainActivitySignMoreInfoTitle.text = signBean.name - binding.mainActivitySignMoreInfoText1.text = signBean.bottomRightText - binding.mainActivitySignMoreInfoText2.text = signBean.moreText - } else { - binding.mainActivitySignMoreInfoGroup.visibility = View.GONE + viewModel.showSignMoreInfo(signBean.renderEntity) + val fragment = + supportFragmentManager.findFragmentById(R.id.main_activity_sign_more_info_fragment) + if (fragment == null) { + supportFragmentManager.beginTransaction() + .replace(R.id.main_activity_sign_more_info_fragment, SignMoreInfoFragment()) + .commit() } } @@ -122,10 +124,6 @@ class MainActivity : BaseActivity() { } } } - - override fun onHideMoreInfoView() { - binding.mainActivitySignMoreInfoGroup.visibility = View.GONE - } }) } @@ -200,13 +198,13 @@ class MainActivity : BaseActivity() { } //道路绑定,名称变化 viewModel.liveDataRoadName.observe(this) { - if (it != null && it.isNotEmpty()) { - binding.mainActivityRoadName.text = it[0].name - if (binding.mainActivityRoadName.visibility != View.VISIBLE) - binding.mainActivityRoadName.visibility = View.VISIBLE + if (it != null) { + binding.mainActivityRoadName.text = it.properties["name"] + if (binding.mainActivityRoadName.visibility != View.VISIBLE) binding.mainActivityRoadName.visibility = + View.VISIBLE } else { - if (binding.mainActivityRoadName.visibility != View.GONE) - binding.mainActivityRoadName.visibility = View.GONE + if (binding.mainActivityRoadName.visibility != View.GONE) binding.mainActivityRoadName.visibility = + View.GONE } } @@ -242,13 +240,11 @@ class MainActivity : BaseActivity() { //监听地图中点变化 viewModel.liveDataCenterPoint.observe(this) { - Log.e("qj", "${it.longitude}") try { if (it != null && it.longitude != null && it.latitude != null) { binding.mainActivityGeometry.text = "经纬度:${ BigDecimal(it.longitude).setScale( - 7, - RoundingMode.HALF_UP + 7, RoundingMode.HALF_UP ) },${BigDecimal(it.latitude).setScale(7, RoundingMode.HALF_UP)}" } @@ -257,6 +253,16 @@ class MainActivity : BaseActivity() { } } + viewModel.liveDataSignMoreInfo.observe(this){ + val fragment = + supportFragmentManager.findFragmentById(R.id.main_activity_sign_more_info_fragment) + if (fragment == null) { + supportFragmentManager.beginTransaction() + .replace(R.id.main_activity_sign_more_info_fragment, SignMoreInfoFragment()) + .commit() + } + } + lifecycleScope.launch { // 初始化地图图层控制接收器 FlowEventBus.subscribe>( @@ -487,8 +493,7 @@ class MainActivity : BaseActivity() { } leftFragment = TaskManagerFragment { binding.mainActivityLeftFragment.visibility = View.GONE - supportFragmentManager.beginTransaction() - .remove(leftFragment!!).commit() + supportFragmentManager.beginTransaction().remove(leftFragment!!).commit() leftFragment = null null } @@ -508,8 +513,7 @@ class MainActivity : BaseActivity() { } leftFragment = QsRecordListFragment { binding.mainActivityLeftFragment.visibility = View.GONE - supportFragmentManager.beginTransaction() - .remove(leftFragment!!).commit() + supportFragmentManager.beginTransaction().remove(leftFragment!!).commit() leftFragment = null null } @@ -536,8 +540,7 @@ class MainActivity : BaseActivity() { } leftFragment = OfflineMapFragment { binding.mainActivityLeftFragment.visibility = View.GONE - supportFragmentManager.beginTransaction() - .remove(leftFragment!!).commit() + supportFragmentManager.beginTransaction().remove(leftFragment!!).commit() leftFragment = null null } @@ -547,15 +550,11 @@ class MainActivity : BaseActivity() { } /** - * 打开道路名称属性看板 + * 打开道路名称属性看板,选择的道路在viewmodel里记录,不用 */ fun openRoadNameFragment() { - val fragment = - supportFragmentManager.findFragmentById(R.id.main_activity_sign_more_info_fragment) - if (fragment !is RoadNameInfoFragment) { - supportFragmentManager.beginTransaction() - .replace(R.id.main_activity_sign_more_info_fragment, RoadNameInfoFragment()) - .commit() + if (viewModel.liveDataRoadName.value != null) { + viewModel.showSignMoreInfo(viewModel.liveDataRoadName.value!!) } } } \ No newline at end of file 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 65b232d4..de2fd24f 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 @@ -78,7 +78,13 @@ class MainViewModel @Inject constructor( val liveDataTopSignList = MutableLiveData>() //道路名 - val liveDataRoadName = MutableLiveData?>() + val liveDataRoadName = MutableLiveData() + + /** + * 当前选中的要展示的详细信息的要素 + */ + val liveDataSignMoreInfo = MutableLiveData() + // var testPoint = GeoPoint(0, 0) //uuid标识,用于记录轨迹组 @@ -96,6 +102,7 @@ class MainViewModel @Inject constructor( var menuState: Boolean = false + val liveDataMenuState = MutableLiveData() val liveDataCenterPoint = MutableLiveData() @@ -236,7 +243,7 @@ class MainViewModel @Inject constructor( if (element.code == 2011) { hisRoadName = true - liveDataRoadName.postValue(SignUtil.getRoadNameList(element)) + liveDataRoadName.postValue(element) continue } @@ -248,20 +255,18 @@ class MainViewModel @Inject constructor( iconId = SignUtil.getSignIcon(element), iconText = SignUtil.getSignIconText(element), distance = distance.toInt(), - elementId = element.id, linkId = linkId, - geometry = element.geometry, name = SignUtil.getSignNameText(element), bottomRightText = SignUtil.getSignBottomRightText(element), - elementCode = element.code, - moreText = SignUtil.getMoreInfoText(element) + renderEntity = element, + isMoreInfo = SignUtil.isMoreInfo(element) ) Log.e("jingo", "捕捉到的数据code ${element.code}") when (element.code) { 2002, 2008, 2010, 2041 -> topSignList.add( signBean ) - 4002, 4003, 4004, 4022 -> signList.add( + 4002, 4003, 4004, 4010, 4022, 4601 -> signList.add( signBean ) } @@ -288,8 +293,8 @@ class MainViewModel @Inject constructor( } } - liveDataTopSignList.postValue(topSignList.distinctBy { it.elementCode }) - liveDataSignList.postValue(signList.distinctBy { it.elementCode }) + liveDataTopSignList.postValue(topSignList.distinctBy { it.distance }) + liveDataSignList.postValue(signList.sortedBy { it.distance }) val speechText = SignUtil.getRoadSpeechText(topSignList) withContext(Dispatchers.Main) { speakMode?.speakText(speechText) @@ -495,8 +500,19 @@ class MainViewModel @Inject constructor( } } + /** + * 是否开启了线选择 + */ fun isSelectRoad(): Boolean { return bSelectRoad } + /** + * 要展示的要素详细信息 + */ + + fun showSignMoreInfo(data: RenderEntity) { + liveDataSignMoreInfo.value = data + } + } \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/ui/activity/map/SignAdapter.kt b/app/src/main/java/com/navinfo/omqs/ui/activity/map/SignAdapter.kt index 3bb31f38..bd932dd4 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/activity/map/SignAdapter.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/activity/map/SignAdapter.kt @@ -1,63 +1,133 @@ package com.navinfo.omqs.ui.activity.map +import android.graphics.PorterDuff +import android.graphics.PorterDuffColorFilter import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.ImageView import com.navinfo.omqs.R import com.navinfo.omqs.bean.SignBean import com.navinfo.omqs.databinding.AdapterSignBinding +import com.navinfo.omqs.databinding.AdapterSignLaneinfoBinding import com.navinfo.omqs.ui.other.BaseRecyclerViewAdapter import com.navinfo.omqs.ui.other.BaseViewHolder +import com.navinfo.omqs.ui.widget.SignUtil interface OnSignAdapterClickListener { fun onItemClick(signBean: SignBean) fun onMoreInfoClick(selectTag: String, tag: String, signBean: SignBean) fun onErrorClick(signBean: SignBean) - fun onHideMoreInfoView() } +data class LaneInfoItem(val id: Int, val type: Int) + class SignAdapter(private var listener: OnSignAdapterClickListener?) : BaseRecyclerViewAdapter() { /** * 选中的详细信息按钮的tag标签 */ private var selectMoreInfoTag: String = "" - override fun getItemViewRes(position: Int): Int { - return R.layout.adapter_sign + + override fun getItemViewType(position: Int): Int { + if (data.isNotEmpty() && data[position].renderEntity.code == 4601) { + return 4601 + } + return 0 } + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseViewHolder { - val viewBinding = - AdapterSignBinding.inflate(LayoutInflater.from(parent.context), parent, false) - return BaseViewHolder(viewBinding) + return if (viewType == 4601) { + val viewBinding = + AdapterSignLaneinfoBinding.inflate( + LayoutInflater.from(parent.context), + parent, + false + ) + BaseViewHolder(viewBinding) + } else { + val viewBinding = + AdapterSignBinding.inflate(LayoutInflater.from(parent.context), parent, false) + BaseViewHolder(viewBinding) + } } override fun onBindViewHolder(holder: BaseViewHolder, position: Int) { - val bd = holder.viewBinding as AdapterSignBinding - + val context = holder.viewBinding.root.context val item = data[position] - if (item.iconId != 0) bd.signMainIconBg.setImageResource(item.iconId) - bd.signMainIcon.text = item.iconText - bd.signBottomText.text = item.name - holder.tag = item.name + position - //点击错误按钮 - bd.signMainFastError.setOnClickListener { - listener?.onErrorClick(item) - } - bd.signBottomRightText.text = item.bottomRightText + if (holder.viewBinding is AdapterSignBinding) { + val bd = holder.viewBinding - bd.root.setOnClickListener { + if (item.iconId != 0) bd.signMainIconBg.setImageResource(item.iconId) + bd.signMainIcon.text = item.iconText + bd.signBottomText.text = item.name + //点击错误按钮 + bd.signMainFastError.setOnClickListener { + listener?.onErrorClick(item) + } + bd.signBottomRightText.text = item.bottomRightText + if (item.isMoreInfo) { + bd.signMainInfo.visibility = View.VISIBLE + bd.signMainInfo.setOnClickListener { + listener?.onMoreInfoClick(selectMoreInfoTag, holder.tag, item) + selectMoreInfoTag = holder.tag + } + } else { + bd.signMainInfo.visibility = View.GONE + } + bd.signSecondIcon.text = "" + if (item.renderEntity.code == 4002) { + val minSpeed = SignUtil.getSpeedLimitMinText(item.renderEntity) + if (minSpeed != "0") { + bd.signSecondIcon.text = minSpeed + } + } + } else if (holder.viewBinding is AdapterSignLaneinfoBinding) { + val bd = holder.viewBinding + bd.signMoreIconsLayout.removeAllViews() + bd.signBottomText.text = item.name + bd.signBottomRightText.text = item.distance.toString() + val list = SignUtil.getLineInfoIcons(item.renderEntity) + val lineViewS = View(context) + lineViewS.layoutParams = ViewGroup.LayoutParams(24, 80) + lineViewS.background = context.getDrawable(R.drawable.shape_vertical_dashed_line) + bd.signMoreIconsLayout.addView(lineViewS, lineViewS.layoutParams) + for (i in list.indices) { + val laneInfo = list[i] + val imageView = ImageView(context) + val drawable = context.getDrawable(laneInfo.id) + var color = when (laneInfo.type) { + 1 -> bd.root.resources.getColor(R.color.lane_info_1) + 2 -> bd.root.resources.getColor(R.color.lane_info_2) + else -> bd.root.resources.getColor(R.color.white) + } + // 创建 PorterDuffColorFilter 对象 + val colorFilter = PorterDuffColorFilter(color, PorterDuff.Mode.SRC_IN) + // 将 PorterDuffColorFilter 设置给 Drawable + drawable!!.colorFilter = colorFilter + // 将 Drawable 设置给 ImageView + imageView.background = drawable + // 将 ImageView 的颜色设置为红色 + imageView.setColorFilter(color, PorterDuff.Mode.SRC_IN) + imageView.layoutParams = ViewGroup.LayoutParams(35, 100) + bd.signMoreIconsLayout.addView(imageView, imageView.layoutParams) + if (i < list.size - 1) { + val lineView = View(context) + lineView.layoutParams = ViewGroup.LayoutParams(24, 80) + lineView.background = context.getDrawable(R.drawable.shape_vertical_dashed_line) + bd.signMoreIconsLayout.addView(lineView, lineView.layoutParams) + } + } + val lineViewE = View(context) + lineViewE.layoutParams = ViewGroup.LayoutParams(24, 80) + lineViewE.background = context.getDrawable(R.drawable.shape_vertical_dashed_line) + bd.signMoreIconsLayout.addView(lineViewE, lineViewE.layoutParams) + } + holder.viewBinding.root.setOnClickListener { listener?.onItemClick(item) } - if (item.moreText.isNotEmpty()) { - bd.signMainInfo.visibility = View.VISIBLE - //点击更多信息按钮 - bd.signMainInfo.setOnClickListener { - listener?.onMoreInfoClick(selectMoreInfoTag, holder.tag, item) - selectMoreInfoTag = holder.tag - } - } else bd.signMainInfo.visibility = View.GONE - + holder.tag = item.name + position } override fun refreshData(newData: List) { @@ -67,7 +137,6 @@ class SignAdapter(private var listener: OnSignAdapterClickListener?) : return } } - listener?.onHideMoreInfoView() } } \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/ui/activity/map/TopSignAdapter.kt b/app/src/main/java/com/navinfo/omqs/ui/activity/map/TopSignAdapter.kt index 0ed1ba72..1e01ed5d 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/activity/map/TopSignAdapter.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/activity/map/TopSignAdapter.kt @@ -11,9 +11,6 @@ import com.navinfo.omqs.ui.other.BaseViewHolder class TopSignAdapter(private var itemListener: ((Int, SignBean) -> Unit?)? = null) : BaseRecyclerViewAdapter() { - override fun getItemViewRes(position: Int): Int { - return R.layout.adapter_top_sign - } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseViewHolder { val viewBinding = diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/BaseFragment.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/BaseFragment.kt index 1ecd8194..93395a0b 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/BaseFragment.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/BaseFragment.kt @@ -1,13 +1,8 @@ package com.navinfo.omqs.ui.fragment import android.os.Bundle -import android.view.KeyEvent -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup import androidx.activity.OnBackPressedCallback import androidx.fragment.app.Fragment -import androidx.navigation.fragment.findNavController abstract class BaseFragment : Fragment() { // override fun onCreateView( @@ -49,7 +44,7 @@ abstract class BaseFragment : Fragment() { // savedInstanceState: Bundle? // ): View - fun onBackPressed(): Boolean{ + open fun onBackPressed(): Boolean{ // findNavController().navigateUp() return true } diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultFragment.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultFragment.kt index 87cf037d..3db57981 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultFragment.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultFragment.kt @@ -20,6 +20,7 @@ import com.navinfo.omqs.ui.fragment.BaseFragment import com.navinfo.omqs.ui.other.shareViewModels import dagger.hilt.android.AndroidEntryPoint import androidx.navigation.findNavController +import androidx.navigation.fragment.findNavController import com.navinfo.omqs.ui.dialog.FirstDialog @AndroidEntryPoint @@ -70,12 +71,12 @@ class EvaluationResultFragment : BaseFragment(), View.OnClickListener { val mDialog = FirstDialog(context) mDialog.setTitle("提示?") mDialog.setMessage("是否退出,请确认!") - mDialog.setPositiveButton("确定", object : FirstDialog.OnClickListener { - override fun onClick(dialog: Dialog?, which: Int) { - mDialog.dismiss() - onBackPressed() - } - }) + mDialog.setPositiveButton( + "确定" + ) { _, _ -> + mDialog.dismiss() + onBackPressed() + } mDialog.setNegativeButton("取消", null) mDialog.show() } @@ -315,4 +316,9 @@ class EvaluationResultFragment : BaseFragment(), View.OnClickListener { } } + override fun onBackPressed(): Boolean { + findNavController().navigateUp() + return true + } + } \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultViewModel.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultViewModel.kt index 301254cb..a415a767 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultViewModel.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultViewModel.kt @@ -137,7 +137,7 @@ class EvaluationResultViewModel @Inject constructor( } } else { liveDataQsRecordBean.value?.run { - elementId = bean.elementId + elementId = bean.renderEntity.code.toString() linkId = bean.linkId if (linkId.isNotEmpty()) { viewModelScope.launch { @@ -149,7 +149,7 @@ class EvaluationResultViewModel @Inject constructor( } } } - val point = GeometryTools.createGeoPoint(bean.geometry) + val point = GeometryTools.createGeoPoint(bean.renderEntity.geometry) this.geometry = GeometryTools.createGeometry(point).toText() mapController.animationHandler.animationByLatLon(point.latitude, point.longitude) mapController.markerHandle.addMarker(point, markerTitle) @@ -198,7 +198,7 @@ class EvaluationResultViewModel @Inject constructor( liveDataLeftTypeList.postValue(it) if (bean != null) { val classType2 = roomAppDatabase.getScProblemTypeDao() - .findClassTypeByCode(bean.elementCode) + .findClassTypeByCode(bean.renderEntity.code) if (classType2 != null) { classType = classType2 } diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/LeftAdapter.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/LeftAdapter.kt index c68b7e88..383a515c 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/LeftAdapter.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/LeftAdapter.kt @@ -13,9 +13,6 @@ class LeftAdapter(private var itemListener: ((Int, String) -> Unit?)? = null) : BaseRecyclerViewAdapter() { private var selectTitle = "" - override fun getItemViewRes(position: Int): Int { - return R.layout.text_item_select - } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseViewHolder { val viewBinding = diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/MiddleAdapter.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/MiddleAdapter.kt index e2ce025f..ee0b6044 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/MiddleAdapter.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/MiddleAdapter.kt @@ -13,9 +13,6 @@ class MiddleAdapter(private var itemListener: ((Int, String) -> Unit?)? = null) BaseRecyclerViewAdapter() { private var selectTitle = "" - override fun getItemViewRes(position: Int): Int { - return R.layout.text_item_select - } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseViewHolder { val viewBinding = diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/RightGroupHeaderAdapter.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/RightGroupHeaderAdapter.kt index d0dd4de4..2785a0df 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/RightGroupHeaderAdapter.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/RightGroupHeaderAdapter.kt @@ -11,9 +11,6 @@ class RightGroupHeaderAdapter(private var itemListener: ((Int, RightBean) -> Uni BaseRecyclerViewAdapter() { private var selectTitle = "" private var groupTitleList = mutableListOf() - override fun getItemViewRes(position: Int): Int { - return R.layout.text_item_select2 - } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseViewHolder { val viewBinding = diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/SoundtListAdapter.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/SoundtListAdapter.kt index 31a323b0..164c9405 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/SoundtListAdapter.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/SoundtListAdapter.kt @@ -224,10 +224,6 @@ class SoundtListAdapter( } } - - override fun getItemViewRes(position: Int): Int { - return R.layout.adapter_sound_list - } } diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/offlinemap/OfflineMapCityListAdapter.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/offlinemap/OfflineMapCityListAdapter.kt index dede03ce..9bf60d86 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/offlinemap/OfflineMapCityListAdapter.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/offlinemap/OfflineMapCityListAdapter.kt @@ -131,10 +131,6 @@ class OfflineMapCityListAdapter( } } } - - override fun getItemViewRes(position: Int): Int { - return R.layout.adapter_offline_map_city - } } diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/qsrecordlist/QsRecordListAdapter.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/qsrecordlist/QsRecordListAdapter.kt index 3e9f3f0d..070a4cf3 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/qsrecordlist/QsRecordListAdapter.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/qsrecordlist/QsRecordListAdapter.kt @@ -58,9 +58,6 @@ class QsRecordListAdapter( binding.qsRecordTime.text = qsRecordBean.checkTime } - override fun getItemViewRes(position: Int): Int { - return R.layout.adapter_qs_record_list - } // 提供set方法 fun setOnKotlinItemClickListener(itemClickListener: IKotlinItemClickListener) { diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/sign/RoadNameInfoFragment.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/sign/RoadNameInfoFragment.kt deleted file mode 100644 index 137fa3a5..00000000 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/sign/RoadNameInfoFragment.kt +++ /dev/null @@ -1,57 +0,0 @@ -package com.navinfo.omqs.ui.fragment.sign - -import android.os.Bundle -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import androidx.fragment.app.activityViewModels -import androidx.recyclerview.widget.LinearLayoutManager -import com.navinfo.omqs.databinding.FragmentSignRoadnameBinding -import com.navinfo.omqs.ui.activity.map.MainViewModel -import com.navinfo.omqs.ui.fragment.BaseFragment - - -class RoadNameInfoFragment : BaseFragment() { - private var _binding: FragmentSignRoadnameBinding? = null - private val binding get() = _binding!! - - private val viewModel by activityViewModels() - private val adapter by lazy { RoadNameInfoAdapter() } - override fun onCreateView( - inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? - ): View { - _binding = FragmentSignRoadnameBinding.inflate(inflater, container, false) - return binding.root - } - - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - - val layoutManager = LinearLayoutManager(context) - //// 设置 RecyclerView 的固定大小,避免在滚动时重新计算视图大小和布局,提高性能 - binding.roadnameRecyclerview.setHasFixedSize(true) - binding.roadnameRecyclerview.layoutManager = layoutManager - binding.roadnameRecyclerview.adapter = adapter - viewModel.liveDataRoadName.observe(viewLifecycleOwner) { - if (it != null && it.isNotEmpty()) { - adapter.refreshData(it) - } else { - activity?.run { - supportFragmentManager.beginTransaction().remove(this@RoadNameInfoFragment) - .commit() - } - } - } - binding.roadnameCancel.setOnClickListener { - activity?.run { - supportFragmentManager.beginTransaction().remove(this@RoadNameInfoFragment) - .commit() - } - } - } - - override fun onDestroyView() { - super.onDestroyView() - _binding = null - } -} \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/signMoreInfo/ElectronicEyeInfoAdapter.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/signMoreInfo/ElectronicEyeInfoAdapter.kt new file mode 100644 index 00000000..50a95962 --- /dev/null +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/signMoreInfo/ElectronicEyeInfoAdapter.kt @@ -0,0 +1,30 @@ +package com.navinfo.omqs.ui.fragment.signMoreInfo + +import android.view.LayoutInflater +import android.view.ViewGroup +import com.navinfo.omqs.R +import com.navinfo.omqs.databinding.AdapterElectronicEyeBinding +import com.navinfo.omqs.ui.other.BaseRecyclerViewAdapter +import com.navinfo.omqs.ui.other.BaseViewHolder + +data class ElectronicEyeMoreInfoAdapterItem( + val title: String, + val text: String +) + +class ElectronicEyeInfoAdapter : BaseRecyclerViewAdapter() { + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseViewHolder { + val viewBinding = + AdapterElectronicEyeBinding.inflate(LayoutInflater.from(parent.context), parent, false) + return BaseViewHolder(viewBinding) + } + + override fun onBindViewHolder(holder: BaseViewHolder, position: Int) { + val binding: AdapterElectronicEyeBinding = + holder.viewBinding as AdapterElectronicEyeBinding + val item = data[position] + binding.title.text = item.title + binding.text.text = item.text + } +} \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/sign/RoadNameInfoAdapter.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/signMoreInfo/RoadNameInfoAdapter.kt similarity index 87% rename from app/src/main/java/com/navinfo/omqs/ui/fragment/sign/RoadNameInfoAdapter.kt rename to app/src/main/java/com/navinfo/omqs/ui/fragment/signMoreInfo/RoadNameInfoAdapter.kt index eb853924..d768f4db 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/sign/RoadNameInfoAdapter.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/signMoreInfo/RoadNameInfoAdapter.kt @@ -1,4 +1,4 @@ -package com.navinfo.omqs.ui.fragment.sign +package com.navinfo.omqs.ui.fragment.signMoreInfo import android.view.LayoutInflater import android.view.ViewGroup @@ -9,9 +9,6 @@ import com.navinfo.omqs.ui.other.BaseRecyclerViewAdapter import com.navinfo.omqs.ui.other.BaseViewHolder class RoadNameInfoAdapter : BaseRecyclerViewAdapter() { - override fun getItemViewRes(position: Int): Int { - return R.layout.adapter_road_name - } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseViewHolder { val viewBinding = diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/signMoreInfo/SignMoreInfoFragment.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/signMoreInfo/SignMoreInfoFragment.kt new file mode 100644 index 00000000..471f39fb --- /dev/null +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/signMoreInfo/SignMoreInfoFragment.kt @@ -0,0 +1,100 @@ +package com.navinfo.omqs.ui.fragment.signMoreInfo + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.activityViewModels +import androidx.recyclerview.widget.LinearLayoutManager +import com.navinfo.omqs.R +import com.navinfo.omqs.databinding.FragmentSignInfoBinding +import com.navinfo.omqs.ui.activity.map.MainViewModel +import com.navinfo.omqs.ui.fragment.BaseFragment +import com.navinfo.omqs.ui.widget.SignUtil + + +class SignMoreInfoFragment : BaseFragment() { + private var _binding: FragmentSignInfoBinding? = null + private val binding get() = _binding!! + + private val viewModel by activityViewModels() + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + ): View { + _binding = FragmentSignInfoBinding.inflate(inflater, container, false) + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + val layoutManager = LinearLayoutManager(context) + //// 设置 RecyclerView 的固定大小,避免在滚动时重新计算视图大小和布局,提高性能 + binding.signInfoRecyclerview.setHasFixedSize(true) + binding.signInfoRecyclerview.layoutManager = layoutManager + viewModel.liveDataSignMoreInfo.observe(viewLifecycleOwner) { + binding.signInfoTitle.text = it.name + val drawable = resources.getDrawable(R.drawable.icon_main_moreinfo_text_left, null); + drawable.setBounds( + 0, + 0, + drawable.minimumWidth, + drawable.minimumHeight + );//必须设置图片大小,否则不显示 + binding.signInfoTitle.setCompoundDrawables( + drawable, null, null, null + ) + + when (it.code) { + //道路名 + 2011 -> { + val adapter = RoadNameInfoAdapter() + binding.signInfoRecyclerview.adapter = adapter + adapter.refreshData(SignUtil.getRoadNameList(it)) + } + //常规点限速 + 4002->{ + val adapter = ElectronicEyeInfoAdapter() + binding.signInfoRecyclerview.adapter = adapter + adapter.refreshData(SignUtil.getSpeedLimitMoreInfoText(it)) + } + //条件点限速 + 4003 -> { + val adapter = ElectronicEyeInfoAdapter() + binding.signInfoRecyclerview.adapter = adapter + adapter.refreshData(SignUtil.getConditionLimitMoreInfoText(it)) + } + //电子眼 + 4010 + -> { + val drawable = resources.getDrawable(R.drawable.icon_electronic_eye_left, null); + drawable.setBounds( + 0, + 0, + drawable.minimumWidth, + drawable.minimumHeight + );//必须设置图片大小,否则不显示 + binding.signInfoTitle.setCompoundDrawables( + drawable, null, null, null + ) + val adapter = ElectronicEyeInfoAdapter() + binding.signInfoRecyclerview.adapter = adapter + adapter.refreshData(SignUtil.getElectronicEyeMoreInfo(it)) + } + + } + } + + binding.signInfoCancel.setOnClickListener { + activity?.run { + supportFragmentManager.beginTransaction().remove(this@SignMoreInfoFragment) + .commit() + } + } + } + + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskAdapter.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskAdapter.kt index 86503718..ee7ec323 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskAdapter.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskAdapter.kt @@ -58,9 +58,6 @@ class TaskAdapter( } } - override fun getItemViewRes(position: Int): Int { - return R.layout.adapter_task - } fun resetSelect() { selectPosition = -1 diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListAdapter.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListAdapter.kt index 0b963619..b1dbfd5c 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListAdapter.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListAdapter.kt @@ -282,10 +282,6 @@ class TaskListAdapter( } } } - - override fun getItemViewRes(position: Int): Int { - return R.layout.adapter_task_list - } } diff --git a/app/src/main/java/com/navinfo/omqs/ui/other/BaseRecyclerViewAdapter.kt b/app/src/main/java/com/navinfo/omqs/ui/other/BaseRecyclerViewAdapter.kt index aa93a6d2..dcb22ba9 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/other/BaseRecyclerViewAdapter.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/other/BaseRecyclerViewAdapter.kt @@ -1,11 +1,6 @@ package com.navinfo.omqs.ui.other -import android.view.LayoutInflater -import android.view.View.OnClickListener -import android.view.ViewGroup -import androidx.databinding.DataBindingUtil import androidx.recyclerview.widget.RecyclerView -import com.navinfo.omqs.R /** * RecyclerView 适配器基础类 @@ -27,10 +22,10 @@ abstract class BaseRecyclerViewAdapter(var data: List = listOf()) : // ) // } - abstract fun getItemViewRes(position: Int): Int - - override fun getItemViewType(position: Int): Int { - return getItemViewRes(position) + // abstract fun getItemViewRes(position: Int): Int +// + open override fun getItemViewType(position: Int): Int { + return 0 } override fun getItemCount(): Int { diff --git a/app/src/main/java/com/navinfo/omqs/ui/widget/SignUtil.kt b/app/src/main/java/com/navinfo/omqs/ui/widget/SignUtil.kt index f4260e94..1c614a47 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/widget/SignUtil.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/widget/SignUtil.kt @@ -1,12 +1,14 @@ package com.navinfo.omqs.ui.widget import android.util.Log -import com.google.gson.Gson import com.navinfo.collect.library.data.entity.RenderEntity import com.navinfo.omqs.R import com.navinfo.omqs.bean.RoadNameBean import com.navinfo.omqs.bean.SignBean +import com.navinfo.omqs.ui.activity.map.LaneInfoItem +import com.navinfo.omqs.ui.fragment.signMoreInfo.ElectronicEyeMoreInfoAdapterItem import org.json.JSONArray +import java.lang.reflect.Field class SignUtil { companion object { @@ -25,7 +27,7 @@ class SignUtil { //车道数 2041 -> getLaneNumText(data) //常规点限速,条件点限速 - 4002, 4003 -> getSpeedLimitText(data) + 4002, 4003 -> getSpeedLimitMaxText(data) else -> "" } } @@ -79,8 +81,12 @@ class SignUtil { 4004 -> "可变点限速" //普通交限 4006 -> "普通交限" + //电子眼 + 4010 -> "电子眼" //交通灯 4022 -> "交通灯" + //交限 + 4601 -> "车信" else -> "" } } @@ -96,24 +102,45 @@ class SignUtil { } } - /** - * 更多信息展示文字 - */ - fun getMoreInfoText(data: RenderEntity): String { - return when (data.code) { - //条件点限速 - 4003 -> getConditionLimitMoreInfoText(data) - else -> "" - } - } - /** * 条件点限速更多信息 */ - private fun getConditionLimitMoreInfoText(data: RenderEntity): String { - return data.properties["validPeriod"].toString() + fun getConditionLimitMoreInfoText(renderEntity: RenderEntity): List { + + val list = mutableListOf() + val maxSpeed = renderEntity.properties["maxSpeed"] + if (maxSpeed != null) { + list.add( + ElectronicEyeMoreInfoAdapterItem( + title = "最高限速值(km/h)", text = maxSpeed + ) + ) + } + list.add( + ElectronicEyeMoreInfoAdapterItem( + title = "限速条件", text = getConditionLimitText(renderEntity) + ) + ) + val carType = renderEntity.properties["vehicleType"] + if (carType != "0") { + list.add( + ElectronicEyeMoreInfoAdapterItem( + title = "车辆类型", text = getElectronicEyeVehicleType(carType!!.toInt()) + ) + ) + } + val time = renderEntity.properties["validPeriod"] + if (time?.isNotEmpty() == true) { + list.add( + ElectronicEyeMoreInfoAdapterItem( + title = "时间段", text = time + ) + ) + } + return list } + /** * 条件点限速文字 */ @@ -163,21 +190,31 @@ class SignUtil { /** * 获取限速值文字 */ - private fun getSpeedLimitText(data: RenderEntity): String { + private fun getSpeedLimitMaxText(data: RenderEntity): String { try { //限速标志 0 限速开始 1 限速解除 val maxSpeed = data.properties["maxSpeed"] - val minSpeed = data.properties["minSpeed"] - return if (maxSpeed != "0") - maxSpeed.toString() - else - minSpeed.toString() + return maxSpeed.toString() } catch (e: Exception) { Log.e("jingo", "获取限速面板ICON出错1 $e") } return "" } + /** + * 获取限速值文字 + */ + fun getSpeedLimitMinText(data: RenderEntity): String { + try { + //限速标志 0 限速开始 1 限速解除 + val minSpeed = data.properties["minSpeed"] + return minSpeed.toString() + } catch (e: Exception) { + Log.e("jingo", "获取限速面板ICON出错1 $e") + } + return "0" + } + /** * 获取种别名称 */ @@ -185,6 +222,25 @@ class SignUtil { return data.properties["kind"].toString() } + /** + * 常规点限速更多信息 + */ + fun getSpeedLimitMoreInfoText(renderEntity: RenderEntity): List { + + val list = mutableListOf() + list.add( + ElectronicEyeMoreInfoAdapterItem( + title = "最高限速值(km/h)", text = getSpeedLimitMaxText(renderEntity) + ) + ) + list.add( + ElectronicEyeMoreInfoAdapterItem( + title = "最低限速值(km/h)", text = getSpeedLimitMinText(renderEntity) + ) + ) + return list + } + /** * 限速图标 */ @@ -235,6 +291,8 @@ class SignUtil { 4003 -> getConditionalSpeedLimitIcon(data) //可变点限速 4004 -> R.drawable.icon_change_limit + //电子眼 + 4010 -> R.drawable.icon_electronic_eye //交通灯 4022 -> R.drawable.icon_traffic_light else -> 0 @@ -318,12 +376,11 @@ class SignUtil { * 获取道路播报语音文字 */ fun getRoadSpeechText(topSignList: MutableList): String { - if (topSignList.size == 0) - return "" + if (topSignList.size == 0) return "" val stringBuffer = StringBuffer() stringBuffer.append("当前道路") for (item in topSignList) { - when (item.elementCode) { + when (item.renderEntity.code) { 2002 -> stringBuffer.append("功能等级${item.iconText.substring(2)}级,") 2008 -> stringBuffer.append("种别${item.iconText},") 2010 -> stringBuffer.append("${item.iconText},") @@ -347,10 +404,7 @@ class SignUtil { val seqNum = jsonObject.optInt("seqNum", 1) val nameClass = jsonObject.optInt("nameClass", 1) val bean = RoadNameBean( - name = name, - type = type, - seqNum = seqNum, - nameClass = nameClass + name = name, type = type, seqNum = seqNum, nameClass = nameClass ) list.add(bean) } @@ -370,5 +424,195 @@ class SignUtil { } return list } + + /** + * 是否要有详细信息需要展示 + */ + fun isMoreInfo(element: RenderEntity): Boolean { + val isMore = when (element.code) { + //常规点限速 + 4002 -> getSpeedLimitMinText(element) != "0" + //条件点限速 + 4003 -> true + //电子眼 + 4010 -> true + else -> false + } + Log.e("jingo", "更多信息:${element.code} $isMore") + return isMore + } + + + /** + * 获取电子眼详细信息 + */ + fun getElectronicEyeMoreInfo(renderEntity: RenderEntity): List { + val list = mutableListOf() + val kindCode = renderEntity.properties["kind"]!!.toInt() + val kind = ElectronicEyeMoreInfoAdapterItem( + title = "电子眼类型", text = getElectronicEyeKindType(kindCode) + ) + list.add(kind) + when (kindCode) { + 1, 2, 3, 4, 5, 6, 20, 21 -> { + list.add( + ElectronicEyeMoreInfoAdapterItem( + title = "限速值(km/h)", + text = renderEntity.properties["speedLimit"].toString() + ) + ) + } + } + val carType = renderEntity.properties["vehicleType"] + if (carType != null && carType != "0") { + list.add( + ElectronicEyeMoreInfoAdapterItem( + title = "车辆类型", + text = getElectronicEyeVehicleType(carType.toInt()) + ) + ) + } + val time = renderEntity.properties["validPeriod"] + if (time?.isNotEmpty() == true) { + list.add( + ElectronicEyeMoreInfoAdapterItem( + title = "时间段", text = time + ) + ) + } + if (kindCode == 20 || kindCode == 21) { + list.add( + ElectronicEyeMoreInfoAdapterItem( + title = "区间测试配对", text = renderEntity.properties["pairEleceyeId"].toString() + ) + ) + } + return list + } + + /** + * 获取电子眼车辆类型 + */ + private fun getElectronicEyeVehicleType(type: Int): String { + var stringBuffer = StringBuffer() + for (i in 31 downTo 0) { + val bit = (type shr i) and 1 + if (bit == 1) { + when (i) { + 0 -> stringBuffer.append("其他 ") + 1 -> stringBuffer.append("小汽车 ") + 2 -> stringBuffer.append("公交车 ") + 3 -> stringBuffer.append("多人乘坐车辆 ") + 4 -> stringBuffer.append("配送车 ") + 5 -> stringBuffer.append("摩托车 ") + 6 -> stringBuffer.append("行人 ") + 7 -> stringBuffer.append("自行车 ") + 8 -> stringBuffer.append("出租车 ") + 10 -> stringBuffer.append("紧急车辆 ") + 11 -> stringBuffer.append("运输卡车 ") + } + } + } + + return stringBuffer.toString() + } + + /** + * 获取电子眼类型 + */ + private fun getElectronicEyeKindType(kind: Int): String { + return when (kind) { + 0 -> "未调查" + 1 -> "超高速" + 2 -> "超低速" + 3 -> "移动式测速" + 4 -> "可变限速" + 5 -> "分车道限速" + 6 -> "分车种限速" + 7 -> "违规用灯" + 8 -> "违规占车道" + 9 -> "违规过路口" + 10 -> "机动车闯红灯" + 11 -> "路况监控" + 12 -> "单行线" + 13 -> "占用非机动车道" + 14 -> "出入口" + 15 -> "占用公交车专用道" + 16 -> "禁止左右转" + 17 -> "禁止掉头" + 18 -> "占用应急车道" + 19 -> "违反禁止标线" + 20 -> "区间测速开始" + 21 -> "区间测速结束" + 22 -> "违章停车" + 23 -> "尾号限行" + 24 -> "环保限行" + 25 -> "不系安全带" + 26 -> "开车打手机" + 27 -> "礼让行人" + 28 -> "违反禁令标志" + 29 -> "禁止鸣笛" + 30 -> "车辆未按规定年检" + 31 -> "车辆尾气超标" + 32 -> "ETC拍照计费电子眼" + 33 -> "专用车道电子眼预留" + 34 -> "交通标线电子眼预留" + 35 -> "违章电子眼预留" + 36 -> "卡车超限电子眼" + 37 -> "限时长停车电子眼" + else -> "无效类型" + } + } + + /** + * 获取车信图标 + */ + fun getLineInfoIcons(renderEntity: RenderEntity): List { + val list = mutableListOf() + try { + var laneinfoGroup = renderEntity.properties["laneinfoGroup"] + if (laneinfoGroup != null) { + laneinfoGroup = laneinfoGroup.substring(1, laneinfoGroup.length - 1) + laneinfoGroup = "[$laneinfoGroup]" + } + val jsonArray = JSONArray(laneinfoGroup) + if (jsonArray.length() == 2) { + val itemArray = jsonArray[0] + val typeArray = jsonArray[1] + if ((itemArray is JSONArray) && (typeArray is JSONArray) && itemArray.length() == typeArray.length()) { + for (i in 0 until itemArray.length()) { + val itemObject = itemArray[i] + val type = typeArray[i] + var laneInfo = "laneinfo_${itemObject.toString().replace(",", "_")}" + Log.e("jingo", "车信图标 $laneInfo") + list.add( + LaneInfoItem( + id = getResId( + laneInfo, R.drawable::class.java + ), type = type!!.toString().toInt() + ) + ) + } + } + } + + } catch (e: Exception) { + Log.e("jingo", "json 解析失败") + } + return list + } + + /** + * 通过字符串名称获取资源id + */ + private fun getResId(variableName: String, c: Class<*>): Int { + return try { + val idField: Field = c.getDeclaredField(variableName) + idField.getInt(idField) + } catch (e: java.lang.Exception) { + e.printStackTrace() + R.drawable.laneinfo_0 + } + } } } \ No newline at end of file diff --git a/app/src/main/res/drawable-xxhdpi/bg_sign_laneinfo.png b/app/src/main/res/drawable-xxhdpi/bg_sign_laneinfo.png new file mode 100644 index 0000000000000000000000000000000000000000..90f752e3c664a14b6caff9bca40c53a171dbcc45 GIT binary patch literal 2343 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 + + + diff --git a/app/src/main/res/drawable/laneinfo_1.xml b/app/src/main/res/drawable/laneinfo_1.xml new file mode 100644 index 00000000..b178f970 --- /dev/null +++ b/app/src/main/res/drawable/laneinfo_1.xml @@ -0,0 +1,12 @@ + + + diff --git a/app/src/main/res/drawable/laneinfo_1_2.xml b/app/src/main/res/drawable/laneinfo_1_2.xml new file mode 100644 index 00000000..afb0be5d --- /dev/null +++ b/app/src/main/res/drawable/laneinfo_1_2.xml @@ -0,0 +1,18 @@ + + + + diff --git a/app/src/main/res/drawable/laneinfo_1_2_3.xml b/app/src/main/res/drawable/laneinfo_1_2_3.xml new file mode 100644 index 00000000..fd8815a6 --- /dev/null +++ b/app/src/main/res/drawable/laneinfo_1_2_3.xml @@ -0,0 +1,24 @@ + + + + + diff --git a/app/src/main/res/drawable/laneinfo_1_2_4.xml b/app/src/main/res/drawable/laneinfo_1_2_4.xml new file mode 100644 index 00000000..95e58d21 --- /dev/null +++ b/app/src/main/res/drawable/laneinfo_1_2_4.xml @@ -0,0 +1,24 @@ + + + + + diff --git a/app/src/main/res/drawable/laneinfo_1_2_5.xml b/app/src/main/res/drawable/laneinfo_1_2_5.xml new file mode 100644 index 00000000..6c124f43 --- /dev/null +++ b/app/src/main/res/drawable/laneinfo_1_2_5.xml @@ -0,0 +1,24 @@ + + + + + diff --git a/app/src/main/res/drawable/laneinfo_1_2_6.xml b/app/src/main/res/drawable/laneinfo_1_2_6.xml new file mode 100644 index 00000000..a7016e1a --- /dev/null +++ b/app/src/main/res/drawable/laneinfo_1_2_6.xml @@ -0,0 +1,24 @@ + + + + + diff --git a/app/src/main/res/drawable/laneinfo_1_3.xml b/app/src/main/res/drawable/laneinfo_1_3.xml new file mode 100644 index 00000000..cdee0af7 --- /dev/null +++ b/app/src/main/res/drawable/laneinfo_1_3.xml @@ -0,0 +1,18 @@ + + + + diff --git a/app/src/main/res/drawable/laneinfo_1_3_4.xml b/app/src/main/res/drawable/laneinfo_1_3_4.xml new file mode 100644 index 00000000..1f63c983 --- /dev/null +++ b/app/src/main/res/drawable/laneinfo_1_3_4.xml @@ -0,0 +1,24 @@ + + + + + diff --git a/app/src/main/res/drawable/laneinfo_1_3_5.xml b/app/src/main/res/drawable/laneinfo_1_3_5.xml new file mode 100644 index 00000000..59bae6fa --- /dev/null +++ b/app/src/main/res/drawable/laneinfo_1_3_5.xml @@ -0,0 +1,24 @@ + + + + + diff --git a/app/src/main/res/drawable/laneinfo_1_3_6.xml b/app/src/main/res/drawable/laneinfo_1_3_6.xml new file mode 100644 index 00000000..ce021027 --- /dev/null +++ b/app/src/main/res/drawable/laneinfo_1_3_6.xml @@ -0,0 +1,24 @@ + + + + + diff --git a/app/src/main/res/drawable/laneinfo_1_4.xml b/app/src/main/res/drawable/laneinfo_1_4.xml new file mode 100644 index 00000000..a10bf8b1 --- /dev/null +++ b/app/src/main/res/drawable/laneinfo_1_4.xml @@ -0,0 +1,18 @@ + + + + diff --git a/app/src/main/res/drawable/laneinfo_1_5.xml b/app/src/main/res/drawable/laneinfo_1_5.xml new file mode 100644 index 00000000..95bc3794 --- /dev/null +++ b/app/src/main/res/drawable/laneinfo_1_5.xml @@ -0,0 +1,18 @@ + + + + diff --git a/app/src/main/res/drawable/laneinfo_1_6.xml b/app/src/main/res/drawable/laneinfo_1_6.xml new file mode 100644 index 00000000..a976d2bb --- /dev/null +++ b/app/src/main/res/drawable/laneinfo_1_6.xml @@ -0,0 +1,18 @@ + + + + diff --git a/app/src/main/res/drawable/laneinfo_1_7.xml b/app/src/main/res/drawable/laneinfo_1_7.xml new file mode 100644 index 00000000..3f1b8239 --- /dev/null +++ b/app/src/main/res/drawable/laneinfo_1_7.xml @@ -0,0 +1,18 @@ + + + + diff --git a/app/src/main/res/drawable/laneinfo_2.xml b/app/src/main/res/drawable/laneinfo_2.xml new file mode 100644 index 00000000..75695b9c --- /dev/null +++ b/app/src/main/res/drawable/laneinfo_2.xml @@ -0,0 +1,18 @@ + + + + diff --git a/app/src/main/res/drawable/laneinfo_2_3.xml b/app/src/main/res/drawable/laneinfo_2_3.xml new file mode 100644 index 00000000..e81ba91b --- /dev/null +++ b/app/src/main/res/drawable/laneinfo_2_3.xml @@ -0,0 +1,24 @@ + + + + + diff --git a/app/src/main/res/drawable/laneinfo_2_3_4.xml b/app/src/main/res/drawable/laneinfo_2_3_4.xml new file mode 100644 index 00000000..b351064d --- /dev/null +++ b/app/src/main/res/drawable/laneinfo_2_3_4.xml @@ -0,0 +1,30 @@ + + + + + + diff --git a/app/src/main/res/drawable/laneinfo_2_4.xml b/app/src/main/res/drawable/laneinfo_2_4.xml new file mode 100644 index 00000000..744a41da --- /dev/null +++ b/app/src/main/res/drawable/laneinfo_2_4.xml @@ -0,0 +1,24 @@ + + + + + diff --git a/app/src/main/res/drawable/laneinfo_2_5.xml b/app/src/main/res/drawable/laneinfo_2_5.xml new file mode 100644 index 00000000..a5506bef --- /dev/null +++ b/app/src/main/res/drawable/laneinfo_2_5.xml @@ -0,0 +1,24 @@ + + + + + diff --git a/app/src/main/res/drawable/laneinfo_2_6.xml b/app/src/main/res/drawable/laneinfo_2_6.xml new file mode 100644 index 00000000..8ce8581b --- /dev/null +++ b/app/src/main/res/drawable/laneinfo_2_6.xml @@ -0,0 +1,24 @@ + + + + + diff --git a/app/src/main/res/drawable/laneinfo_3.xml b/app/src/main/res/drawable/laneinfo_3.xml new file mode 100644 index 00000000..96609d0c --- /dev/null +++ b/app/src/main/res/drawable/laneinfo_3.xml @@ -0,0 +1,18 @@ + + + + diff --git a/app/src/main/res/drawable/laneinfo_3_4.xml b/app/src/main/res/drawable/laneinfo_3_4.xml new file mode 100644 index 00000000..bd615d3d --- /dev/null +++ b/app/src/main/res/drawable/laneinfo_3_4.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/laneinfo_3_5.xml b/app/src/main/res/drawable/laneinfo_3_5.xml new file mode 100644 index 00000000..31c37b1f --- /dev/null +++ b/app/src/main/res/drawable/laneinfo_3_5.xml @@ -0,0 +1,24 @@ + + + + + diff --git a/app/src/main/res/drawable/laneinfo_3_6.xml b/app/src/main/res/drawable/laneinfo_3_6.xml new file mode 100644 index 00000000..7cac3588 --- /dev/null +++ b/app/src/main/res/drawable/laneinfo_3_6.xml @@ -0,0 +1,24 @@ + + + + + diff --git a/app/src/main/res/drawable/laneinfo_4.xml b/app/src/main/res/drawable/laneinfo_4.xml new file mode 100644 index 00000000..7587877c --- /dev/null +++ b/app/src/main/res/drawable/laneinfo_4.xml @@ -0,0 +1,12 @@ + + + diff --git a/app/src/main/res/drawable/laneinfo_4_5.xml b/app/src/main/res/drawable/laneinfo_4_5.xml new file mode 100644 index 00000000..a5216c51 --- /dev/null +++ b/app/src/main/res/drawable/laneinfo_4_5.xml @@ -0,0 +1,24 @@ + + + + + diff --git a/app/src/main/res/drawable/laneinfo_4_6.xml b/app/src/main/res/drawable/laneinfo_4_6.xml new file mode 100644 index 00000000..bd615d3d --- /dev/null +++ b/app/src/main/res/drawable/laneinfo_4_6.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/laneinfo_5.xml b/app/src/main/res/drawable/laneinfo_5.xml new file mode 100644 index 00000000..b35bd7a3 --- /dev/null +++ b/app/src/main/res/drawable/laneinfo_5.xml @@ -0,0 +1,18 @@ + + + + diff --git a/app/src/main/res/drawable/laneinfo_5_6.xml b/app/src/main/res/drawable/laneinfo_5_6.xml new file mode 100644 index 00000000..f3cf04f7 --- /dev/null +++ b/app/src/main/res/drawable/laneinfo_5_6.xml @@ -0,0 +1,24 @@ + + + + + diff --git a/app/src/main/res/drawable/laneinfo_6.xml b/app/src/main/res/drawable/laneinfo_6.xml new file mode 100644 index 00000000..fd617e7f --- /dev/null +++ b/app/src/main/res/drawable/laneinfo_6.xml @@ -0,0 +1,18 @@ + + + + diff --git a/app/src/main/res/drawable/laneinfo_7.xml b/app/src/main/res/drawable/laneinfo_7.xml new file mode 100644 index 00000000..8dfa5d45 --- /dev/null +++ b/app/src/main/res/drawable/laneinfo_7.xml @@ -0,0 +1,12 @@ + + + diff --git a/app/src/main/res/drawable/shape_dashed_line.xml b/app/src/main/res/drawable/shape_dashed_line.xml new file mode 100644 index 00000000..843c76c1 --- /dev/null +++ b/app/src/main/res/drawable/shape_dashed_line.xml @@ -0,0 +1,12 @@ + + + + + + + diff --git a/app/src/main/res/drawable/shape_vertical_dashed_line.xml b/app/src/main/res/drawable/shape_vertical_dashed_line.xml new file mode 100644 index 00000000..b9ca9aa6 --- /dev/null +++ b/app/src/main/res/drawable/shape_vertical_dashed_line.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index fc72fe88..c45d8fb2 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -74,61 +74,6 @@ app:layout_constraintLeft_toLeftOf="@id/main_activity_top_sign_recyclerview" app:layout_constraintTop_toTopOf="parent" /> - - - - - - - - - - + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/adapter_sign.xml b/app/src/main/res/layout/adapter_sign.xml index 3dbdbdb6..bb0efa50 100644 --- a/app/src/main/res/layout/adapter_sign.xml +++ b/app/src/main/res/layout/adapter_sign.xml @@ -29,6 +29,16 @@ android:textColor="#2F2F2F" android:textSize="16sp" /> + @@ -65,11 +75,12 @@ + android:visibility="gone" + android:background="@drawable/icon_evaluation" /> \ No newline at end of file diff --git a/app/src/main/res/layout/adapter_sign_laneinfo.xml b/app/src/main/res/layout/adapter_sign_laneinfo.xml new file mode 100644 index 00000000..261a18f9 --- /dev/null +++ b/app/src/main/res/layout/adapter_sign_laneinfo.xml @@ -0,0 +1,41 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_sign_roadname.xml b/app/src/main/res/layout/fragment_sign_info.xml similarity index 69% rename from app/src/main/res/layout/fragment_sign_roadname.xml rename to app/src/main/res/layout/fragment_sign_info.xml index b657f832..acaa2566 100644 --- a/app/src/main/res/layout/fragment_sign_roadname.xml +++ b/app/src/main/res/layout/fragment_sign_info.xml @@ -1,36 +1,35 @@ + tools:context=".ui.fragment.signMoreInfo.SignMoreInfoFragment"> \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index b2ec0c64..8b897586 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -1,6 +1,10 @@ + #FF2271FF + #FF00C800 + #FFFFB400 + #FFFFFF #F1EBEB #4954ED diff --git a/collect-library/build.gradle b/collect-library/build.gradle index eb29aaa7..6b7ed9ba 100644 --- a/collect-library/build.gradle +++ b/collect-library/build.gradle @@ -79,7 +79,7 @@ dependencies { implementation "net.sf.kxml:kxml2:2.3.0" implementation 'org.slf4j:slf4j-api:2.0.7' implementation project(":vtm-themes") - implementation project(":vtm-android") + api project(":vtm-android") implementation project(':vtm-extras') implementation project(":vtm-http") // implementation "org.mapsforge:vtm-themes:$vtmVersion" @@ -109,10 +109,8 @@ dependencies { implementation "com.google.protobuf:protobuf-java:3.6.1" implementation "com.wdtinc:mapbox-vector-tile:3.1.0" - implementation "com.caverock:androidsvg:1.4" implementation "com.badlogicgames.gdx:gdx:1.11.0" implementation "com.badlogicgames.gdx:gdx-backend-android:1.11.0" - implementation "com.caverock:androidsvg:1.4" // api "org.mapsforge:vtm-jts:$vtmVersion" api project(":vtm-jts") api 'org.locationtech.jts:jts-core:1.19.0' diff --git a/collect-library/src/main/java/com/navinfo/collect/library/data/entity/RenderEntity.kt b/collect-library/src/main/java/com/navinfo/collect/library/data/entity/RenderEntity.kt index a799e01c..f0cbe8f5 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/data/entity/RenderEntity.kt +++ b/collect-library/src/main/java/com/navinfo/collect/library/data/entity/RenderEntity.kt @@ -1,5 +1,6 @@ package com.navinfo.collect.library.data.entity +import android.os.Parcelable import com.navinfo.collect.library.system.Constant import com.navinfo.collect.library.utils.GeometryTools import com.navinfo.collect.library.utils.GeometryToolsKt @@ -8,6 +9,7 @@ import io.realm.RealmObject import io.realm.RealmSet import io.realm.annotations.Ignore import io.realm.annotations.PrimaryKey +import kotlinx.parcelize.Parcelize import org.locationtech.jts.geom.Coordinate import org.locationtech.jts.geom.Geometry import org.oscim.core.MercatorProjection @@ -16,13 +18,15 @@ import java.util.* /** * 渲染要素对应的实体 * */ -open class RenderEntity() : RealmObject() { +@Parcelize +open class RenderEntity() : RealmObject(), Parcelable { @PrimaryKey var id: String = UUID.randomUUID().toString() // id lateinit var name: String //要素名 lateinit var table: String //要素表名 var code: Int = 0 // 要素编码 - var geometry: String = "" // 要素渲染参考的geometry,该数据可能会在导入预处理环节被修改,原始geometry会保存在properties的geometry字段下 + var geometry: String = + "" // 要素渲染参考的geometry,该数据可能会在导入预处理环节被修改,原始geometry会保存在properties的geometry字段下 get() { wkt = GeometryTools.createGeometry(field) return field @@ -56,7 +60,7 @@ open class RenderEntity() : RealmObject() { var tileX: RealmSet = RealmSet() // x方向的tile编码 var tileY: RealmSet = RealmSet() // y方向的tile编码 - constructor(name: String): this() { + constructor(name: String) : this() { this.name = name } @@ -65,9 +69,11 @@ open class RenderEntity() : RealmObject() { //道路linkId const val linkPid = "linkPid" } + object LimitTable { const val linkPid = "linkPid" } + object KindCodeTable { const val linkPid = "linkPid" }