From 5defa32f03f47647a81234db7320ff845ff48eaf Mon Sep 17 00:00:00 2001 From: xiaoyan <xiaoyan159@163.com> Date: Wed, 26 Apr 2023 10:53:38 +0800 Subject: [PATCH 1/7] =?UTF-8?q?fix:=20=E4=BF=AE=E6=94=B9=E5=AF=BC=E5=85=A5?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E7=B1=BB=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 2 +- .../java/com/navinfo/omqs/ui/activity/map/MainViewModel.kt | 4 +++- collect-library/{ => src/main/res}/resources/rendertheme.xsd | 0 3 files changed, 4 insertions(+), 2 deletions(-) rename collect-library/{ => src/main/res}/resources/rendertheme.xsd (100%) diff --git a/app/build.gradle b/app/build.gradle index 525a541d..f8b483bb 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -33,7 +33,7 @@ android { signingConfigs { debug { - storeFile file('D:/WrokSpace/OneMapQS/fastmap.keystore') + storeFile file('../fastmap.keystore') storePassword "navinfo" keyAlias "fastmap" keyPassword "navinfo" 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 92fa6dd0..8d4f0a39 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 @@ -123,7 +123,9 @@ class MainViewModel @Inject constructor( context, Constant.USER_DATA_PATH + "/trace.sqlite" ).niLocationDao.insert(niLocation) - niLocationList.removeAt(0) + if (niLocationList.isNotEmpty()) { + niLocationList.removeAt(0) + } Log.e("qj", "saveTrace") } Thread.sleep(30) diff --git a/collect-library/resources/rendertheme.xsd b/collect-library/src/main/res/resources/rendertheme.xsd similarity index 100% rename from collect-library/resources/rendertheme.xsd rename to collect-library/src/main/res/resources/rendertheme.xsd From c4812eada4c0a46eb3884cbccd7c0db9b6eeb181 Mon Sep 17 00:00:00 2001 From: xiaoyan <xiaoyan159@163.com> Date: Wed, 26 Apr 2023 11:32:30 +0800 Subject: [PATCH 2/7] =?UTF-8?q?fix:=20=E4=BF=AE=E6=94=B9ManiFest=E6=96=87?= =?UTF-8?q?=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/AndroidManifest.xml | 1 + collect-library/src/main/AndroidManifest.xml | 1 + 2 files changed, 2 insertions(+) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index ee25edab..39d3b5bc 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -58,6 +58,7 @@ android:name=".ui.activity.map.MainActivity" android:launchMode="singleTask" android:screenOrientation="landscape" + android:exported="false" android:theme="@style/Theme.OMQualityInspection" /> <meta-data diff --git a/collect-library/src/main/AndroidManifest.xml b/collect-library/src/main/AndroidManifest.xml index 0cc633b5..2ffd93be 100644 --- a/collect-library/src/main/AndroidManifest.xml +++ b/collect-library/src/main/AndroidManifest.xml @@ -24,6 +24,7 @@ <service android:name="com.baidu.location.f" + android:exported="true" android:enabled="true" android:process=":remote"> <intent-filter> From c4ee38d70313fb928bbb7d312bc85e45207476b1 Mon Sep 17 00:00:00 2001 From: xiaoyan <xiaoyan159@163.com> Date: Thu, 27 Apr 2023 10:18:11 +0800 Subject: [PATCH 3/7] =?UTF-8?q?fix:=20=E4=BF=AE=E6=94=B9=E9=81=93=E8=B7=AF?= =?UTF-8?q?=E9=9D=A2=E7=9A=84=E6=B8=B2=E6=9F=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 4 +- .../com/navinfo/omqs/bean/HadLinkDvoBean.kt | 1 - .../java/com/navinfo/omqs/bean/TaskBean.kt | 1 - .../com/navinfo/omqs/db/ImportOMDBHelper.kt | 14 ++--- .../omqs/ui/activity/map/MainViewModel.kt | 4 +- .../personalcenter/PersonalCenterFragment.kt | 2 +- .../src/main/assets/editormarker.xml | 55 +++++++++++++++++-- .../library/data/entity/RenderEntity.kt | 5 +- 8 files changed, 63 insertions(+), 23 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 35154f67..ca7aa1cc 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -12,8 +12,8 @@ android { defaultConfig { applicationId "com.navinfo.omqs" - minSdk 26 - targetSdk 32 + minSdk 21 + targetSdk 21 versionCode 1 versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" diff --git a/app/src/main/java/com/navinfo/omqs/bean/HadLinkDvoBean.kt b/app/src/main/java/com/navinfo/omqs/bean/HadLinkDvoBean.kt index 110307dc..28373667 100644 --- a/app/src/main/java/com/navinfo/omqs/bean/HadLinkDvoBean.kt +++ b/app/src/main/java/com/navinfo/omqs/bean/HadLinkDvoBean.kt @@ -3,7 +3,6 @@ package com.navinfo.omqs.bean import io.realm.RealmObject import io.realm.annotations.RealmClass -@RealmClass open class HadLinkDvoBean @JvmOverloads constructor( /** * 图幅号 diff --git a/app/src/main/java/com/navinfo/omqs/bean/TaskBean.kt b/app/src/main/java/com/navinfo/omqs/bean/TaskBean.kt index 86265253..ce2ff849 100644 --- a/app/src/main/java/com/navinfo/omqs/bean/TaskBean.kt +++ b/app/src/main/java/com/navinfo/omqs/bean/TaskBean.kt @@ -9,7 +9,6 @@ import io.realm.annotations.Ignore import io.realm.annotations.PrimaryKey import io.realm.annotations.RealmClass -@RealmClass open class TaskBean @JvmOverloads constructor( /** * 测评任务id 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 0e287e21..55f7e545 100644 --- a/app/src/main/java/com/navinfo/omqs/db/ImportOMDBHelper.kt +++ b/app/src/main/java/com/navinfo/omqs/db/ImportOMDBHelper.kt @@ -136,13 +136,13 @@ class ImportOMDBHelper @AssistedInject constructor( it.name == currentConfig.table } - val listResult = mutableListOf<Map<String, Any?>>() + val listResult = mutableListOf<Map<String, Any>>() currentConfig?.let { val list = FileIOUtils.readFile2List(txtFile, "UTF-8") if (list != null) { // 将list数据转换为map for (line in list) { - val map = gson.fromJson<Map<String, Any?>>(line, object:TypeToken<Map<String, Any?>>(){}.getType()) + val map = gson.fromJson<Map<String, Any>>(line, object:TypeToken<Map<String, Any>>(){}.getType()) .toMutableMap() map["qi_table"] = currentConfig.table map["qi_name"] = currentConfig.name @@ -162,13 +162,13 @@ class ImportOMDBHelper @AssistedInject constructor( renderEntity.geometry = map["geometry"].toString() for ((key, value) in map) { when (value) { - is String -> renderEntity.properties[key.toString()] = value - is Int -> renderEntity.properties[key.toString()] = value.toInt().toString() - is Double -> renderEntity.properties[key.toString()] = value.toDouble().toString() - else -> renderEntity.properties[key.toString()] = value.toString() + 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()) } } - Realm.getDefaultInstance().insert(renderEntity) + Realm.getDefaultInstance().copyToRealm(renderEntity) } // 1个文件发送一次flow流 emit("${index + 1}/${importConfig.tables.size}") 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 28dde80d..6e8895ca 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 @@ -120,9 +120,7 @@ class MainViewModel @Inject constructor( } TraceDataBase.getDatabase(context, Constant.USER_DATA_PATH + "/trace.sqlite").niLocationDao.insert(niLocation) - if (niLocationList.isNotEmpty()) { - niLocationList.remove(niLocation) - } + niLocationList.remove(niLocation) Log.e("qj", "saveTrace==${niLocationList.size}") } 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 0365731f..a068562b 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 @@ -106,7 +106,7 @@ class PersonalCenterFragment : BaseFragment(), FSAFActivityCallbacks { R.id.personal_center_menu_test -> { viewModel.readRealmData() // 定位到指定位置 - niMapController.mMapView.vtmMap.animator().animateTo(GeoPoint(30.270367985798032, 113.83513667119433)) + niMapController.mMapView.vtmMap.animator().animateTo(GeoPoint(30.226256855699773, 113.84660523913344)) } R.id.personal_center_menu_task_list -> { findNavController().navigate(R.id.TaskListFragment) diff --git a/collect-library/src/main/assets/editormarker.xml b/collect-library/src/main/assets/editormarker.xml index 81dba275..4e45ee2a 100644 --- a/collect-library/src/main/assets/editormarker.xml +++ b/collect-library/src/main/assets/editormarker.xml @@ -52,7 +52,7 @@ <style-text style="bold" fill="#606060" id="ferry" k="name" size="12" stroke="#ffffff" stroke-width="2.0" /> <!--speedlimit--> - <style-text fill="#ffffff" id="max-speed-limit" k="name" size="15" stroke="#ffffff" + <style-text fill="#ffffff" id="max-speed-limit" k="name" size="14" stroke="#ffffff" stroke-width="0.1" /> @@ -1618,18 +1618,18 @@ <m v="OMDB_SPEEDLIMIT"> <m k="speedFlag"> <m v="0"> - <circle fill="#0000ff" radius="26" scale-radius="true" stroke="#ff0000" stroke-width="2"/> + <circle fill="#0000ff" radius="28" scale-radius="true" stroke="#ff0000" stroke-width="2"/> <m select="any"> <text k="maxSpeed" use="max-speed-limit"></text> - <caption k="minSpeed" dy="-28" fill="#000000" priority="5" size="15" stroke="#ffffff" + <caption k="minSpeed" dy="-28" fill="#000000" priority="5" size="14" stroke="#ffffff" stroke-width="1.0"></caption> </m> </m> <m v="1"> - <circle fill="#0000ff" radius="26" scale-radius="true" stroke="#ff0000" stroke-width="2"/> + <circle fill="#0000ff" radius="28" scale-radius="true" stroke="#ff0000" stroke-width="2"/> <m select="any"> <text k="maxSpeed" use="max-speed-limit"></text> - <caption k="minSpeed" dy="-28" fill="#000000" priority="5" size="15" stroke="#ffffff" + <caption k="minSpeed" dy="-28" fill="#000000" priority="5" size="14" stroke="#ffffff" stroke-width="1.0"></caption> </m> </m> @@ -1641,5 +1641,50 @@ <!--可变点限速--> <m v="OMDB_SPEEDLIMIT_VAR"> </m> + <!--车道数--> + <m v="OMDB_LANE_NUM"> + <m k="laneNum"> + <m v="1"> + <line stroke="#545D6C" width="3"/> + </m> + <m v="2"> + <line stroke="#545D6C" width="6"/> + </m> + <m v="3"> + <line stroke="#545D6C" width="9"/> + </m> + <m v="4"> + <line stroke="#545D6C" width="12"/> + </m> + <m v="5"> + <line stroke="#545D6C" width="15"/> + </m> + <m v="6"> + <line stroke="#545D6C" width="18"/> + </m> + <m v="7"> + <line stroke="#545D6C" width="21"/> + </m> + <m v="8"> + <line stroke="#545D6C" width="24"/> + </m> + <m v="9"> + <line stroke="#545D6C" width="27"/> + </m> + <m v="10"> + <line stroke="#545D6C" width="30"/> + </m> + <m v="11"> + <line stroke="#545D6C" width="33"/> + </m> + <m v="12"> + <line stroke="#545D6C" width="36"/> + </m> + </m> + </m> + <!--车道中心线--> + <m v="OMDB_LANE_LG_LINK"> + <line stroke="#ecf0f1" width="0.1" dasharray="35,35"/> + </m> </m> </rendertheme> \ No newline at end of file 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 3f7f0df0..b9d3e94e 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 @@ -41,12 +41,11 @@ open class RenderEntity(): RealmObject() { } @Ignore var wkt: Geometry? = null - var properties: RealmDictionary<String?> = RealmDictionary() + var properties: RealmDictionary<String> = RealmDictionary() var tileX: RealmSet<Int> = RealmSet() // x方向的tile编码 var tileY: RealmSet<Int> = RealmSet() // y方向的tile编码 - constructor(name: String, properties: RealmDictionary<String?>): this() { + constructor(name: String): this() { this.name = name - this.properties = properties } } \ No newline at end of file From b0289752219d3facb199ed18682963cf37f86017 Mon Sep 17 00:00:00 2001 From: squallzhjch <zhangjingchao@navinfo.com> Date: Thu, 27 Apr 2023 15:01:57 +0800 Subject: [PATCH 4/7] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E9=AB=98=E4=BA=AE?= =?UTF-8?q?=E5=9B=BE=E5=B1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/navinfo/omqs/bean/TaskBean.kt | 2 +- .../com/navinfo/omqs/db/RealmOperateHelper.kt | 99 +++++++++++++++---- .../EvaluationResultFragment.kt | 2 +- .../EvaluationResultViewModel.kt | 67 +++++++++---- .../library/data/entity/RenderEntity.kt | 28 +++++- .../map/handler/LayerManagerHandler.kt | 36 +------ .../library/map/handler/LineHandler.kt | 85 ++++++++-------- .../map/handler/LocationLayerHandler.kt | 1 + 8 files changed, 201 insertions(+), 119 deletions(-) diff --git a/app/src/main/java/com/navinfo/omqs/bean/TaskBean.kt b/app/src/main/java/com/navinfo/omqs/bean/TaskBean.kt index a036cabf..cd3ab3ac 100644 --- a/app/src/main/java/com/navinfo/omqs/bean/TaskBean.kt +++ b/app/src/main/java/com/navinfo/omqs/bean/TaskBean.kt @@ -68,6 +68,6 @@ open class TaskBean @JvmOverloads constructor( var message: String = "" ) : RealmObject() { fun getDownLoadUrl(): String { - return "${Constant.SERVER_ADDRESS}devcp/download?fileStr=26" + return "${Constant.SERVER_ADDRESS}devcp/download?fileStr=$id" } } \ 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 a00873d3..56ea0bd8 100644 --- a/app/src/main/java/com/navinfo/omqs/db/RealmOperateHelper.kt +++ b/app/src/main/java/com/navinfo/omqs/db/RealmOperateHelper.kt @@ -1,7 +1,10 @@ package com.navinfo.omqs.db +import android.os.Build import android.util.Log +import androidx.annotation.RequiresApi import com.navinfo.collect.library.data.entity.RenderEntity +import com.navinfo.collect.library.data.entity.RenderEntity.Companion.LinkTable import com.navinfo.collect.library.map.NIMapController import com.navinfo.collect.library.utils.GeometryTools import com.navinfo.collect.library.utils.GeometryToolsKt @@ -17,10 +20,11 @@ import org.oscim.core.MercatorProjection import javax.inject.Inject import kotlin.streams.toList - +@RequiresApi(Build.VERSION_CODES.N) class RealmOperateHelper() { @Inject lateinit var niMapController: NIMapController + /** * 根据当前点位查询匹配的Link数据 * @param point 点位经纬度信息 @@ -28,7 +32,12 @@ class RealmOperateHelper() { * @param bufferType 点位外扩距离的单位: 米-Meter,像素-PIXEL * @param sort 是否需要排序 * */ - suspend fun queryLink(point: Point, buffer: Double = DEFAULT_BUFFER, bufferType: BUFFER_TYPE = DEFAULT_BUFFER_TYPE, sort: Boolean = false): MutableList<RenderEntity> { + suspend fun queryLink( + point: Point, + buffer: Double = DEFAULT_BUFFER, + bufferType: BUFFER_TYPE = DEFAULT_BUFFER_TYPE, + sort: Boolean = true + ): MutableList<RenderEntity> { val result = mutableListOf<RenderEntity>() withContext(Dispatchers.IO) { val polygon = getPolygonFromPoint(point, buffer, bufferType) @@ -45,25 +54,49 @@ class RealmOperateHelper() { val yStart = tileYSet.stream().min(Comparator.naturalOrder()).orElse(null) val yEnd = tileYSet.stream().max(Comparator.naturalOrder()).orElse(null) // 查询realm中对应tile号的数据 - val realmList = Realm.getDefaultInstance().where(RenderEntity::class.java) + val realm = Realm.getDefaultInstance() + val realmList = realm.where(RenderEntity::class.java) .equalTo("table", "OMDB_RD_LINK") .and() .rawPredicate("tileX>=$xStart and tileX<=$xEnd and tileY>=$yStart and tileY<=$yEnd") .findAll() // 将获取到的数据和查询的polygon做相交,只返回相交的数据 - val queryResult = realmList?.stream()?.filter { + val dataList = realm.copyFromRealm(realmList) + val queryResult = dataList?.stream()?.filter { polygon.intersects(it.wkt) }?.toList() + queryResult?.let { - result.addAll(queryResult) - } - if (sort) { - result.clear() - result.addAll(sortRenderEntity(point, result)) + if (sort) { + result.addAll(sortRenderEntity(point, it)) + } else { + result.addAll(it) + } } + } return result } + + + suspend fun queryLink( + linkPid: String, + ): RenderEntity? { + var link: RenderEntity? = null + withContext(Dispatchers.IO) { + val realm = Realm.getDefaultInstance() + val realmR = realm.where(RenderEntity::class.java) + .equalTo("table", "OMDB_RD_LINK") + .and() + .rawPredicate("properties['${LinkTable.linkPid}']=$linkPid") + .findFirst() + if (realmR != null) { + link = realm.copyFromRealm(realmR) + } + } + return link + } + /** * 根据当前点位查询匹配的除Link外的其他要素数据 * @param point 点位经纬度信息 @@ -71,7 +104,12 @@ class RealmOperateHelper() { * @param bufferType 点位外扩距离的单位: 米-Meter,像素-PIXEL * @param sort 是否需要排序 * */ - suspend fun queryElement(point: Point, buffer: Double = DEFAULT_BUFFER, bufferType: BUFFER_TYPE = DEFAULT_BUFFER_TYPE, sort: Boolean = false): MutableList<RenderEntity> { + suspend fun queryElement( + point: Point, + buffer: Double = DEFAULT_BUFFER, + bufferType: BUFFER_TYPE = DEFAULT_BUFFER_TYPE, + sort: Boolean = true + ): MutableList<RenderEntity> { val result = mutableListOf<RenderEntity>() withContext(Dispatchers.IO) { val polygon = getPolygonFromPoint(point, buffer, bufferType) @@ -121,7 +159,7 @@ class RealmOperateHelper() { val realmList = Realm.getDefaultInstance().where(RenderEntity::class.java) .notEqualTo("table", "OMDB_RD_LINK") .and() - .equalTo("properties['LINK_PID']", linkPid) + .equalTo("properties['${LinkTable.linkPid}']", linkPid) .findAll() result.addAll(realmList) } @@ -134,15 +172,19 @@ class RealmOperateHelper() { * @param unSortList 未排序的数据 * @return 排序后的数据 * */ - fun sortRenderEntity(point: Point, unSortList: MutableList<RenderEntity>): List<RenderEntity> { + fun sortRenderEntity(point: Point, unSortList: List<RenderEntity>): List<RenderEntity> { val sortList = unSortList.stream().sorted { renderEntity, renderEntity2 -> val near = point.distance(renderEntity.wkt) - point.distance(renderEntity2.wkt) - if (near<0) -1 else 1 + if (near < 0) -1 else 1 }.toList() return sortList } - private fun getPolygonFromPoint(point: Point, buffer: Double = DEFAULT_BUFFER, bufferType: BUFFER_TYPE = DEFAULT_BUFFER_TYPE): Polygon { + private fun getPolygonFromPoint( + point: Point, + buffer: Double = DEFAULT_BUFFER, + bufferType: BUFFER_TYPE = DEFAULT_BUFFER_TYPE + ): Polygon { // 首先计算当前点位的buffer组成的geometry val wkt: Polygon = if (bufferType == BUFFER_TYPE.METER) { // 如果单位是米 val distanceDegrees = GeometryTools.convertDistanceToDegree(buffer, point.y) @@ -151,14 +193,30 @@ class RealmOperateHelper() { } else { // 如果单位是像素,需要根据当前屏幕像素计算出经纬度变化 val currentMapScale = niMapController.mMapView.vtmMap.mapPosition.scale // 转换为屏幕坐标 - val pixelPoint = MercatorProjection.getPixelWithScale(GeoPoint(point.y, point.x), currentMapScale) + val pixelPoint = + MercatorProjection.getPixelWithScale( + GeoPoint(point.y, point.x), + currentMapScale + ) // 将屏幕坐标外扩指定距离 // 计算外扩矩形 val envelope = Envelope( - MercatorProjection.pixelXToLongitudeWithScale(pixelPoint.x - buffer, currentMapScale), - MercatorProjection.pixelXToLongitudeWithScale(pixelPoint.x + buffer, currentMapScale), - MercatorProjection.pixelYToLatitudeWithScale(pixelPoint.y - buffer, currentMapScale), - MercatorProjection.pixelYToLatitudeWithScale(pixelPoint.y + buffer, currentMapScale), + MercatorProjection.pixelXToLongitudeWithScale( + pixelPoint.x - buffer, + currentMapScale + ), + MercatorProjection.pixelXToLongitudeWithScale( + pixelPoint.x + buffer, + currentMapScale + ), + MercatorProjection.pixelYToLatitudeWithScale( + pixelPoint.y - buffer, + currentMapScale + ), + MercatorProjection.pixelYToLatitudeWithScale( + pixelPoint.y + buffer, + currentMapScale + ), ) // 将Envelope对象转换为Polygon对象 val geometryFactory = GeometryFactory() @@ -178,7 +236,8 @@ class RealmOperateHelper() { enum class BUFFER_TYPE(val index: Int) { METER(0)/*米*/, PIXEL(1)/*像素*/; - fun getBufferTypeByIndex(index: Int): BUFFER_TYPE{ + + fun getBufferTypeByIndex(index: Int): BUFFER_TYPE { for (item in BUFFER_TYPE.values()) { if (item.index == index) { return item; 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 65ca7324..f99ceed1 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 @@ -59,7 +59,7 @@ class EvaluationResultFragment : BaseFragment(), View.OnClickListener { if (arguments != null) { val id = requireArguments().getString("QsId") if (id != null) { - viewModel.loadData(id) + viewModel.initData(id) } else { viewModel.initNewData() } 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 f1914053..e059f3e5 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 @@ -1,10 +1,14 @@ package com.navinfo.omqs.ui.fragment.evaluationresult +import android.os.Build import android.util.Log +import androidx.annotation.RequiresApi import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.navinfo.collect.library.data.entity.QsRecordBean +import com.navinfo.collect.library.data.entity.RenderEntity.Companion.LinkTable +import com.navinfo.collect.library.map.GeoPoint import com.navinfo.collect.library.map.NIMapController import com.navinfo.collect.library.utils.GeometryTools import com.navinfo.omqs.db.RealmOperateHelper @@ -14,10 +18,10 @@ import io.realm.Realm import io.realm.kotlin.where import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch -import org.locationtech.jts.geom.Point import java.util.* import javax.inject.Inject +@RequiresApi(Build.VERSION_CODES.N) @HiltViewModel class EvaluationResultViewModel @Inject constructor( private val roomAppDatabase: RoomAppDatabase, @@ -60,15 +64,7 @@ class EvaluationResultViewModel @Inject constructor( liveDataQsRecordBean.value!!.geometry = it.toGeometry() addMarker(it, markerTitle) viewModelScope.launch { - val linkList = realmOperateHelper.queryLink( - point = GeometryTools.createPoint( - it.longitude, - it.latitude - ), sort = true - ) - if (linkList.isNotEmpty()) { - liveDataQsRecordBean.value!!.linkId = linkList[0].id - } + captureLink(it.longitude, it.latitude) } } } @@ -80,6 +76,7 @@ class EvaluationResultViewModel @Inject constructor( Log.e("jingo", "EvaluationResultViewModel 销毁了 ${hashCode()}") mapController.markerHandle.removeMarker(markerTitle) mapController.markerHandle.removeOnMapClickListener() + mapController.lineHandler.removeLine() } @@ -96,15 +93,29 @@ class EvaluationResultViewModel @Inject constructor( liveDataQsRecordBean.value!!.geometry = it.toGeometry() mapController.markerHandle.addMarker(geoPoint, markerTitle) viewModelScope.launch { - val linkList = realmOperateHelper.queryLink( - GeometryTools.createPoint( - geoPoint.longitude, - geoPoint.latitude - ) - ) - if (linkList.isNotEmpty()) { - liveDataQsRecordBean.value!!.linkId = linkList[0].id - } + captureLink(geoPoint.longitude, geoPoint.latitude) + } + } + } + + /** + * 捕捉到路 + */ + private suspend fun captureLink(longitude: Double, latitude: Double) { + val linkList = realmOperateHelper.queryLink( + point = GeometryTools.createPoint( + longitude, + latitude + ), + ) + liveDataQsRecordBean.value?.let { + if (linkList.isNotEmpty()) { + it.linkId = + linkList[0].properties[LinkTable.linkPid] ?: "" + mapController.lineHandler.showLine(linkList[0].geometry) + } else { + it.linkId = "" + mapController.lineHandler.removeLine() } } } @@ -263,14 +274,28 @@ class EvaluationResultViewModel @Inject constructor( /** * 根据数据id,查询数据 */ - fun loadData(id: String) { + + fun initData(id: String) { viewModelScope.launch(Dispatchers.IO) { val realm = Realm.getDefaultInstance() val objects = realm.where<QsRecordBean>().equalTo("id", id).findFirst() if (objects != null) { oldBean = realm.copyFromRealm(objects) - liveDataQsRecordBean.postValue(oldBean!!.copy()) + oldBean?.let { + liveDataQsRecordBean.postValue(it.copy()) + val p = GeometryTools.createGeoPoint(it.geometry) + mapController.markerHandle.addMarker( + GeoPoint(p.longitude, p.latitude), + markerTitle + ) + if (it.linkId.isNotEmpty()) { + val link = realmOperateHelper.queryLink(it.linkId) + link?.let { l -> + mapController.lineHandler.showLine(l.geometry) + } + } + } } } } 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 3f7f0df0..608f59ed 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 @@ -16,7 +16,7 @@ import java.util.* /** * 渲染要素对应的实体 * */ -open class RenderEntity(): RealmObject() { +open class RenderEntity() : RealmObject() { @PrimaryKey var id: String = UUID.randomUUID().toString() // id lateinit var name: String //要素名 @@ -39,14 +39,38 @@ open class RenderEntity(): RealmObject() { } } + @Ignore var wkt: Geometry? = null + get() { + if (field == null || field!!.isEmpty) { + try { + field = GeometryTools.createGeometry(geometry) + } catch (e: Exception) { + + } + } + return field + } var properties: RealmDictionary<String?> = RealmDictionary() var tileX: RealmSet<Int> = RealmSet() // x方向的tile编码 var tileY: RealmSet<Int> = RealmSet() // y方向的tile编码 - constructor(name: String, properties: RealmDictionary<String?>): this() { + constructor(name: String, properties: RealmDictionary<String?>) : this() { this.name = name this.properties = properties } + + companion object { + object LinkTable { + //道路linkId + const val linkPid = "linkPid" + } + object LimitTable { + const val linkPid = "linkPid" + } + object KindCodeTable { + const val linkPid = "linkPid" + } + } } \ No newline at end of file diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LayerManagerHandler.kt b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LayerManagerHandler.kt index f3524706..aafad60d 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LayerManagerHandler.kt +++ b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LayerManagerHandler.kt @@ -1,57 +1,27 @@ package com.navinfo.collect.library.map.handler -import android.content.Context -import android.graphics.BitmapFactory -import android.graphics.Canvas -import android.graphics.Color -import android.util.Log import androidx.appcompat.app.AppCompatActivity -import androidx.core.content.res.ResourcesCompat -import androidx.lifecycle.lifecycleScope -import com.navinfo.collect.library.R -import com.navinfo.collect.library.data.entity.QsRecordBean import com.navinfo.collect.library.map.NIMapView -import com.navinfo.collect.library.map.cluster.ClusterMarkerItem -import com.navinfo.collect.library.map.cluster.ClusterMarkerRenderer -import com.navinfo.collect.library.map.layers.MyItemizedLayer import com.navinfo.collect.library.map.source.MapLifeNiLocationTileSource import com.navinfo.collect.library.map.source.NavinfoMultiMapFileTileSource import com.navinfo.collect.library.map.source.OMDBTileSource import com.navinfo.collect.library.system.Constant -import com.navinfo.collect.library.utils.GeometryTools -import io.realm.Realm -import io.realm.kotlin.where -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.launch -import kotlinx.coroutines.withContext import okhttp3.Cache import okhttp3.OkHttpClient -import org.locationtech.jts.geom.Geometry -import org.oscim.android.canvas.AndroidBitmap -import org.oscim.backend.CanvasAdapter -import org.oscim.backend.canvas.Bitmap -import org.oscim.backend.canvas.Paint -import org.oscim.core.GeoPoint import org.oscim.layers.GroupLayer -import org.oscim.layers.marker.MarkerInterface -import org.oscim.layers.marker.MarkerItem -import org.oscim.layers.marker.MarkerRendererFactory -import org.oscim.layers.marker.MarkerSymbol import org.oscim.layers.tile.buildings.BuildingLayer import org.oscim.layers.tile.vector.VectorTileLayer import org.oscim.layers.tile.vector.labeling.LabelLayer import org.oscim.layers.tile.vector.labeling.LabelTileLoaderHook -import org.oscim.map.Map import org.oscim.map.Map.UpdateListener import org.oscim.tiling.source.OkHttpEngine.OkHttpFactory import org.oscim.tiling.source.mapfile.MapFileTileSource import java.io.File -import java.util.* /** * Layer 操作 */ -open class LayerManagerHandler(context: AppCompatActivity, mapView: NIMapView,tracePath: String) : BaseHandler(context, mapView) { +class LayerManagerHandler(context: AppCompatActivity, mapView: NIMapView,tracePath: String) : BaseHandler(context, mapView) { private var baseGroupLayer // 用于盛放所有基础底图的图层组,便于统一管理 : GroupLayer? = null protected val mTracePath:String = tracePath @@ -76,10 +46,6 @@ open class LayerManagerHandler(context: AppCompatActivity, mapView: NIMapView,tr * */ private lateinit var omdbVectorTileLayer: VectorTileLayer private lateinit var omdbLabelLayer: LabelLayer - /** - * 文字大小 - */ - private val NUM_13 = 13 init { initMap() diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LineHandler.kt b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LineHandler.kt index ac0abb70..ca3ed0b9 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LineHandler.kt +++ b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LineHandler.kt @@ -1,13 +1,15 @@ package com.navinfo.collect.library.map.handler -import android.content.Context import android.graphics.BitmapFactory +import android.os.Build import android.widget.Toast +import androidx.annotation.RequiresApi import androidx.appcompat.app.AppCompatActivity import com.navinfo.collect.library.R import com.navinfo.collect.library.map.NIMapView import com.navinfo.collect.library.utils.GeometryTools import com.navinfo.collect.library.utils.StringUtil +import org.locationtech.jts.geom.LineString import org.oscim.android.canvas.AndroidBitmap import org.oscim.backend.canvas.Bitmap import org.oscim.core.GeoPoint @@ -22,8 +24,9 @@ import org.oscim.layers.vector.PathLayer import org.oscim.layers.vector.geometries.Style import org.oscim.map.Map -open class LineHandler(context: AppCompatActivity, mapView: NIMapView) : - BaseHandler(context, mapView), Map.UpdateListener { +@RequiresApi(Build.VERSION_CODES.M) +class LineHandler(context: AppCompatActivity, mapView: NIMapView) : BaseHandler(context, mapView), + Map.UpdateListener { private var editIndex: Int = -1; private val mPathMakers: MutableList<MarkerItem> = mutableListOf() @@ -51,6 +54,9 @@ open class LineHandler(context: AppCompatActivity, mapView: NIMapView) : private var bDrawLine = false + + private val mDefaultPathLayer: PathLayer + init { mMapView.vtmMap.events.bind(this) @@ -61,29 +67,21 @@ open class LineHandler(context: AppCompatActivity, mapView: NIMapView) : .fillColor(context.resources.getColor(R.color.draw_line_blue2_color, null)) .fillAlpha(0.5f) .strokeColor(context.resources.getColor(R.color.draw_line_blue2_color, null)) - .fixed(true) - .build() + .fixed(true).build() - newTempStyle = Style.builder() - .stippleColor(context.resources.getColor(R.color.transparent, null)) - .stipple(30) - .stippleWidth(30f) - .strokeWidth(4f) - .strokeColor(context.resources.getColor(R.color.draw_line_blue2_color, null)) - .fixed(true) - .randomOffset(false) - .build() - - editTempStyle = Style.builder() - .stippleColor(context.resources.getColor(R.color.transparent, null)) - .stipple(30) - .stippleWidth(30f) - .strokeWidth(8f) - .strokeColor(context.resources.getColor(R.color.draw_line_red_color, null)) - .fixed(true) - .randomOffset(false) - .build() + newTempStyle = + Style.builder().stippleColor(context.resources.getColor(R.color.transparent, null)) + .stipple(30).stippleWidth(30f).strokeWidth(4f) + .strokeColor(context.resources.getColor(R.color.draw_line_blue2_color, null)) + .fixed(true).randomOffset(false).build() + editTempStyle = + Style.builder().stippleColor(context.resources.getColor(R.color.transparent, null)) + .stipple(30).stippleWidth(30f).strokeWidth(8f) + .strokeColor(context.resources.getColor(R.color.draw_line_red_color, null)) + .fixed(true).randomOffset(false).build() + mDefaultPathLayer = PathLayer(mMapView.vtmMap, lineStyle) + addLayer(mDefaultPathLayer, NIMapView.LAYER_GROUPS.VECTOR) mPathLayer = PathLayer(mMapView.vtmMap, lineStyle) // addLayer(mPathLayer, NIMapView.LAYER_GROUPS.OPERATE) @@ -92,8 +90,7 @@ open class LineHandler(context: AppCompatActivity, mapView: NIMapView) : mPathMarkerBitmap = AndroidBitmap( BitmapFactory.decodeResource( - mContext.resources, - R.mipmap.icon_path_maker + mContext.resources, R.mipmap.icon_path_maker ) ) val markerSymbol = MarkerSymbol(mPathMarkerBitmap, MarkerSymbol.HotspotPlace.CENTER) @@ -110,8 +107,7 @@ open class LineHandler(context: AppCompatActivity, mapView: NIMapView) : if (item === item1) { mMapView.vtmMap.animator().animateTo( GeoPoint( - item.getPoint().latitude, - item.getPoint().longitude + item.getPoint().latitude, item.getPoint().longitude ) ) editIndex = i @@ -139,6 +135,22 @@ open class LineHandler(context: AppCompatActivity, mapView: NIMapView) : }) } + fun showLine(geometry: String) { + try { + + } catch (e: Exception) { + Toast.makeText(mContext, "高亮路线失败 ${e.message}", Toast.LENGTH_SHORT).show() + } + val g = GeometryTools.getGeoPoints(geometry) + mDefaultPathLayer.setPoints(g) + mDefaultPathLayer.isEnabled = true + } + + fun removeLine() { + mDefaultPathLayer.clearPath() + mDefaultPathLayer.isEnabled = false + } + fun addDrawLinePoint(geoPoint: GeoPoint): List<GeoPoint> { if (!bDrawLine) { @@ -210,7 +222,7 @@ open class LineHandler(context: AppCompatActivity, mapView: NIMapView) : } } } - if (editIndex < mPathLayer.getPoints().size) { + if (editIndex < mPathLayer.points.size) { mPathLayer.points.removeAt(editIndex) val list2: MutableList<GeoPoint> = mutableListOf<GeoPoint>() list2.addAll(mPathLayer.points) @@ -268,8 +280,7 @@ open class LineHandler(context: AppCompatActivity, mapView: NIMapView) : override fun onMapEvent(e: Event, mapPosition: MapPosition) { - if (!bDrawLine) - return + if (!bDrawLine) return // if (mMapView.centerPixel[1] > mMapView.vtmMap.height / 2) { // val geoPoint = // mMapView.vtmMap.viewport() @@ -287,16 +298,14 @@ open class LineHandler(context: AppCompatActivity, mapView: NIMapView) : list.add(mPathMakers[editIndex].geoPoint) list.add( GeoPoint( - mapPosition.latitude, - mapPosition.longitude + mapPosition.latitude, mapPosition.longitude ) ) } else { list.add(mPathMakers[editIndex - 1].geoPoint) list.add( GeoPoint( - mapPosition.latitude, - mapPosition.longitude + mapPosition.latitude, mapPosition.longitude ) ) list.add(mPathMakers[editIndex + 1].geoPoint) @@ -308,8 +317,7 @@ open class LineHandler(context: AppCompatActivity, mapView: NIMapView) : list.add(mPathLayer.points[mPathLayer.points.size - 1]) list.add( GeoPoint( - mapPosition.latitude, - mapPosition.longitude + mapPosition.latitude, mapPosition.longitude ) ) mPathLayerTemp.setPoints(list) @@ -317,8 +325,7 @@ open class LineHandler(context: AppCompatActivity, mapView: NIMapView) : val listDis: MutableList<GeoPoint> = mutableListOf() listDis.add( GeoPoint( - mapPosition.latitude, - mapPosition.longitude + mapPosition.latitude, mapPosition.longitude ) ) // val distance: Double = diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LocationLayerHandler.kt b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LocationLayerHandler.kt index 8865493a..4b18e5b2 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LocationLayerHandler.kt +++ b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LocationLayerHandler.kt @@ -65,6 +65,7 @@ class LocationLayerHandler(context: AppCompatActivity, mapView: NIMapView) : Bas //第一次定位成功显示当前位置 if (this.bFirst) { animateToCurrentPosition(16.0) + this.bFirst = false } } From 58136320d46409f4873356612ec6c1a519dda14b Mon Sep 17 00:00:00 2001 From: xiaoyan <xiaoyan159@163.com> Date: Thu, 27 Apr 2023 15:04:18 +0800 Subject: [PATCH 5/7] =?UTF-8?q?fix:=20=E5=A2=9E=E5=8A=A0=E5=A4=9A=E7=BA=BF?= =?UTF-8?q?=E5=9B=BE=E5=B1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../map/handler/LayerManagerHandler.kt | 7 + .../library/map/layers/MultiPathLayer.java | 170 ++++++++++++++++++ .../library/map/layers/OmdbTaskLinkLayer.java | 17 ++ 3 files changed, 194 insertions(+) create mode 100644 collect-library/src/main/java/com/navinfo/collect/library/map/layers/MultiPathLayer.java create mode 100644 collect-library/src/main/java/com/navinfo/collect/library/map/layers/OmdbTaskLinkLayer.java diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LayerManagerHandler.kt b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LayerManagerHandler.kt index f3524706..f8a79584 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LayerManagerHandler.kt +++ b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LayerManagerHandler.kt @@ -41,6 +41,7 @@ import org.oscim.layers.tile.buildings.BuildingLayer import org.oscim.layers.tile.vector.VectorTileLayer import org.oscim.layers.tile.vector.labeling.LabelLayer import org.oscim.layers.tile.vector.labeling.LabelTileLoaderHook +import org.oscim.layers.vector.VectorLayer import org.oscim.map.Map import org.oscim.map.Map.UpdateListener import org.oscim.tiling.source.OkHttpEngine.OkHttpFactory @@ -142,6 +143,12 @@ open class LayerManagerHandler(context: AppCompatActivity, mapView: NIMapView,tr } } + /** + * 初始化任务Link高亮的图层 + * */ + private fun initOMDBTaskVectorLayer() { + } + /** * 切换基础底图样式 */ diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/layers/MultiPathLayer.java b/collect-library/src/main/java/com/navinfo/collect/library/map/layers/MultiPathLayer.java new file mode 100644 index 00000000..8f3efc9b --- /dev/null +++ b/collect-library/src/main/java/com/navinfo/collect/library/map/layers/MultiPathLayer.java @@ -0,0 +1,170 @@ +package com.navinfo.collect.library.map.layers; + +import com.navinfo.collect.library.utils.GeometryTools; +import org.locationtech.jts.geom.Geometry; +import org.locationtech.jts.geom.LineString; +import org.oscim.core.GeoPoint; +import org.oscim.layers.vector.PathLayer; +import org.oscim.layers.vector.geometries.LineDrawable; +import org.oscim.layers.vector.geometries.PolygonDrawable; +import org.oscim.layers.vector.geometries.Style; +import org.oscim.map.Map; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +/** + * Created by xiaoxiao on 2018/3/26. + */ + +public class MultiPathLayer extends PathLayer { + private List<LineDrawable> pathDrawableList; + + public MultiPathLayer(Map map, Style style) { + super(map, style); + mStyle = style; + pathDrawableList = new ArrayList<>(); + } + + public MultiPathLayer(Map map, Style style, String name) { + this(map, style); + } + + public MultiPathLayer(Map map, int lineColor, float lineWidth, int fillColor, float fillAlpha) { + this(map, Style.builder() + .stippleColor(lineColor) + .stipple(24) + .stippleWidth(lineWidth) + .strokeWidth(lineWidth) + .strokeColor(lineColor).fillColor(fillColor).fillAlpha(fillAlpha) + .fixed(true) + .randomOffset(false) + .build()); + } + + public MultiPathLayer(Map map, int lineColor, int fillColor, float fillAlpha) { + this(map, lineColor, 0.5f, fillColor, fillAlpha); + } + + /** + * 设置polygon的点位 + */ + public void setPathList(List<List<GeoPoint>> pointListList) { + if (pointListList == null || pointListList.isEmpty()) { + return; + } + for (List<GeoPoint> pointList : pointListList) { + if (pointList == null || pointList.size() < 2) { + return; + } + synchronized (this) { + LineDrawable lineDrawable = new LineDrawable(pointList, mStyle); + add(lineDrawable); + pathDrawableList.add(lineDrawable); + } + mWorker.submit(0); + update(); + } + } + + /** + * 移除正在绘制的polygon的图形 + */ + public void removePathDrawable(int i) { + if (pathDrawableList != null && pathDrawableList.size() > i) { + remove(pathDrawableList.get(i)); + update(); + } + } + + public void removePathDrawable(List<GeoPoint> geoPointList) { + LineString path = GeometryTools.getLineStrinGeo(geoPointList); + removePolygonDrawable(path); + } + + public void removePathDrawable(String pathStr) { + LineString path = (LineString) GeometryTools.createGeometry(pathStr); + removePolygonDrawable(path); + } + + public void removePolygonDrawable(Geometry path) { + if (pathDrawableList != null && !pathDrawableList.isEmpty()) { + Iterator iterator = pathDrawableList.iterator(); + while (iterator.hasNext()) { + LineDrawable lineDrawable = (LineDrawable) iterator.next(); + if (GeometryTools.createGeometry(lineDrawable.getGeometry().toString()).equals(path)) { + remove(lineDrawable); + iterator.remove(); + break; + } + } + mWorker.submit(0); + update(); + } + } + + public void addPathDrawable(List<GeoPoint> pointList) { + if (pathDrawableList != null) { + if (pointList == null || pointList.size() < 2) { + return; + } + synchronized (this) { + LineDrawable pathDrawable = new LineDrawable(pointList, mStyle); + add(pathDrawable); + pathDrawableList.add(pathDrawable); + } + mWorker.submit(0); + } + update(); + } + + public void addPathDrawable(LineString lineString) { + List<GeoPoint> geoPointList = GeometryTools.getGeoPoints(lineString.toString()); + addPathDrawable(geoPointList); + } + + public List<LineString> getAllPathList() { + if (pathDrawableList != null && !pathDrawableList.isEmpty()) { + List<LineString> pathList = new ArrayList<>(); + for (LineDrawable pathDrawable : pathDrawableList) { + pathList.add((LineString) GeometryTools.createGeometry(pathDrawable.getGeometry().toString())); + } + return pathList; + } + return null; + } + + public List<List<GeoPoint>> getAllPathGeoPointList() { + List<LineString> pathList = getAllPathList(); + if (pathList != null) { + List<List<GeoPoint>> geopointList = new ArrayList<>(); + for (LineString path : pathList) { + geopointList.add(GeometryTools.getGeoPoints(path.toString())); + } + return geopointList; + } + return null; + } + + public List<LineDrawable> getPolygonDrawableList() { + return pathDrawableList; + } + + public void setPolygonDrawableList(List<LineDrawable> pathDrawableList) { + this.pathDrawableList = pathDrawableList; + } + + public void removeAllPathDrawable(){ + if (pathDrawableList != null && !pathDrawableList.isEmpty()) { + Iterator iterator = pathDrawableList.iterator(); + while (iterator.hasNext()) { + LineDrawable lineDrawable = (LineDrawable) iterator.next(); + remove(lineDrawable); + iterator.remove(); + } + mWorker.submit(0); + update(); + } + } +} diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/layers/OmdbTaskLinkLayer.java b/collect-library/src/main/java/com/navinfo/collect/library/map/layers/OmdbTaskLinkLayer.java new file mode 100644 index 00000000..d8d2a485 --- /dev/null +++ b/collect-library/src/main/java/com/navinfo/collect/library/map/layers/OmdbTaskLinkLayer.java @@ -0,0 +1,17 @@ +package com.navinfo.collect.library.map.layers; + +import org.oscim.layers.vector.VectorLayer; +import org.oscim.layers.vector.geometries.Drawable; +import org.oscim.map.Map; +import org.oscim.utils.SpatialIndex; + +public class OmdbTaskLinkLayer extends VectorLayer { + public OmdbTaskLinkLayer(Map map, SpatialIndex<Drawable> index) { + super(map, index); + } + + public OmdbTaskLinkLayer(Map map) { + super(map); + } + +} From 3eed9bad33556432114cf7c2a79f6832313099a7 Mon Sep 17 00:00:00 2001 From: xiaoyan <xiaoyan159@163.com> Date: Thu, 27 Apr 2023 17:16:53 +0800 Subject: [PATCH 6/7] =?UTF-8?q?fix:=20=E5=A2=9E=E5=8A=A0=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E9=AB=98=E4=BA=AE=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/navinfo/omqs/bean/TaskBean.kt | 2 +- .../java/com/navinfo/omqs/db/MyRealmModule.kt | 4 +- .../ui/fragment/tasklist/TaskListViewModel.kt | 13 ++++- .../library/data/entity}/HadLinkDvoBean.kt | 3 +- .../library/map/handler/LineHandler.kt | 12 ++++- .../library/map/layers/OmdbTaskLinkLayer.java | 22 -------- .../library/map/layers/OmdbTaskLinkLayer.kt | 54 +++++++++++++++++++ 7 files changed, 81 insertions(+), 29 deletions(-) rename {app/src/main/java/com/navinfo/omqs/bean => collect-library/src/main/java/com/navinfo/collect/library/data/entity}/HadLinkDvoBean.kt (80%) delete mode 100644 collect-library/src/main/java/com/navinfo/collect/library/map/layers/OmdbTaskLinkLayer.java create mode 100644 collect-library/src/main/java/com/navinfo/collect/library/map/layers/OmdbTaskLinkLayer.kt diff --git a/app/src/main/java/com/navinfo/omqs/bean/TaskBean.kt b/app/src/main/java/com/navinfo/omqs/bean/TaskBean.kt index 2f2f6566..d46f6a77 100644 --- a/app/src/main/java/com/navinfo/omqs/bean/TaskBean.kt +++ b/app/src/main/java/com/navinfo/omqs/bean/TaskBean.kt @@ -1,6 +1,7 @@ package com.navinfo.omqs.bean import com.google.gson.annotations.SerializedName +import com.navinfo.collect.library.data.entity.HadLinkDvoBean import com.navinfo.omqs.Constant import com.navinfo.omqs.tools.FileManager import com.navinfo.omqs.tools.FileManager.Companion.FileDownloadStatus @@ -8,7 +9,6 @@ import io.realm.RealmList import io.realm.RealmObject import io.realm.annotations.Ignore import io.realm.annotations.PrimaryKey -import io.realm.annotations.RealmClass open class TaskBean @JvmOverloads constructor( /** diff --git a/app/src/main/java/com/navinfo/omqs/db/MyRealmModule.kt b/app/src/main/java/com/navinfo/omqs/db/MyRealmModule.kt index cab1956b..deb0ee86 100644 --- a/app/src/main/java/com/navinfo/omqs/db/MyRealmModule.kt +++ b/app/src/main/java/com/navinfo/omqs/db/MyRealmModule.kt @@ -1,9 +1,9 @@ package com.navinfo.omqs.db -import com.navinfo.omqs.bean.HadLinkDvoBean +import com.navinfo.collect.library.data.entity.HadLinkDvoBean import com.navinfo.omqs.bean.TaskBean import io.realm.annotations.RealmModule -@RealmModule(classes = [TaskBean::class, HadLinkDvoBean::class]) +@RealmModule(classes = [TaskBean::class]) class MyRealmModule { } \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListViewModel.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListViewModel.kt index 53ee23dd..b9dd9165 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListViewModel.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListViewModel.kt @@ -1,11 +1,16 @@ package com.navinfo.omqs.ui.fragment.tasklist import android.content.Context +import android.graphics.Color +import android.os.Build import android.util.Log import android.widget.Toast +import androidx.annotation.RequiresApi +import androidx.core.graphics.toColor import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope +import com.navinfo.collect.library.map.NIMapController import com.navinfo.omqs.bean.TaskBean import com.navinfo.omqs.http.NetResult import com.navinfo.omqs.http.NetworkService @@ -19,7 +24,8 @@ import javax.inject.Inject @HiltViewModel class TaskListViewModel @Inject constructor( - private val networkService: NetworkService + private val networkService: NetworkService, + private val niMapController: NIMapController ) : ViewModel() { val liveDataTaskList = MutableLiveData<List<TaskBean>>() @@ -70,6 +76,11 @@ class TaskListViewModel @Inject constructor( for (item in taskList) { FileManager.checkOMDBFileInfo(item) } +// niMapController.lineHandler.omdbTaskLinkLayer.setLineColor(Color.rgb(0, 255, 0).toColor()) +// taskList.forEach { +// niMapController.lineHandler.omdbTaskLinkLayer.addLineList(it.hadLinkDvoList) +// } +// niMapController.lineHandler.omdbTaskLinkLayer.update() liveDataTaskList.postValue(taskList) } diff --git a/app/src/main/java/com/navinfo/omqs/bean/HadLinkDvoBean.kt b/collect-library/src/main/java/com/navinfo/collect/library/data/entity/HadLinkDvoBean.kt similarity index 80% rename from app/src/main/java/com/navinfo/omqs/bean/HadLinkDvoBean.kt rename to collect-library/src/main/java/com/navinfo/collect/library/data/entity/HadLinkDvoBean.kt index 28373667..7430050d 100644 --- a/app/src/main/java/com/navinfo/omqs/bean/HadLinkDvoBean.kt +++ b/collect-library/src/main/java/com/navinfo/collect/library/data/entity/HadLinkDvoBean.kt @@ -1,7 +1,6 @@ -package com.navinfo.omqs.bean +package com.navinfo.collect.library.data.entity import io.realm.RealmObject -import io.realm.annotations.RealmClass open class HadLinkDvoBean @JvmOverloads constructor( /** diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LineHandler.kt b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LineHandler.kt index dd733b4d..1d39d1a6 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LineHandler.kt +++ b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LineHandler.kt @@ -26,7 +26,7 @@ import org.oscim.layers.vector.VectorLayer import org.oscim.layers.vector.geometries.Style import org.oscim.map.Map -@RequiresApi(Build.VERSION_CODES.M) +@RequiresApi(Build.VERSION_CODES.N) class LineHandler(context: AppCompatActivity, mapView: NIMapView) : BaseHandler(context, mapView), Map.UpdateListener { @@ -60,6 +60,16 @@ class LineHandler(context: AppCompatActivity, mapView: NIMapView) : BaseHandler( private val mDefaultPathLayer: PathLayer val omdbTaskLinkLayer by lazy { + val omdbTaskLinkLayer = OmdbTaskLinkLayer(mMapView.vtmMap, + Style.builder() +// .stippleColor(context.resources.getColor(R.color.draw_line_red_color, null)) + .fillColor(context.resources.getColor(R.color.draw_line_red_color, null)) + .fillAlpha(0.5f) + .strokeColor(context.resources.getColor(R.color.draw_line_red_color, null)) + .strokeWidth(4f) + .fixed(true).build()) + addLayer(omdbTaskLinkLayer, NIMapView.LAYER_GROUPS.VECTOR) + omdbTaskLinkLayer } init { diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/layers/OmdbTaskLinkLayer.java b/collect-library/src/main/java/com/navinfo/collect/library/map/layers/OmdbTaskLinkLayer.java deleted file mode 100644 index 45a77707..00000000 --- a/collect-library/src/main/java/com/navinfo/collect/library/map/layers/OmdbTaskLinkLayer.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.navinfo.collect.library.map.layers; - -import org.locationtech.jts.geom.Geometry; -import org.locationtech.jts.geom.LineString; -import org.oscim.layers.vector.VectorLayer; -import org.oscim.layers.vector.geometries.Drawable; -import org.oscim.layers.vector.geometries.Style; -import org.oscim.map.Map; -import org.oscim.utils.SpatialIndex; - -import java.util.HashMap; -import java.util.List; - -public class OmdbTaskLinkLayer extends VectorLayer { - private java.util.Map<String, LineString> lineList = new HashMap<>(); - private Style style; - public OmdbTaskLinkLayer(Map map) { - super(map); - } - - -} diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/layers/OmdbTaskLinkLayer.kt b/collect-library/src/main/java/com/navinfo/collect/library/map/layers/OmdbTaskLinkLayer.kt new file mode 100644 index 00000000..02de5184 --- /dev/null +++ b/collect-library/src/main/java/com/navinfo/collect/library/map/layers/OmdbTaskLinkLayer.kt @@ -0,0 +1,54 @@ +package com.navinfo.collect.library.map.layers + +import android.graphics.Color +import com.navinfo.collect.library.R +import com.navinfo.collect.library.data.entity.HadLinkDvoBean +import com.navinfo.collect.library.utils.GeometryTools +import org.locationtech.jts.geom.Geometry +import org.oscim.layers.vector.VectorLayer +import org.oscim.layers.vector.geometries.Drawable +import org.oscim.layers.vector.geometries.LineDrawable +import org.oscim.layers.vector.geometries.Style +import org.oscim.map.Map + +class OmdbTaskLinkLayer(map: Map, private var style: Style) : VectorLayer(map) { + private val lineMap = HashMap<String, Drawable>() + + fun addLine(hadLinkDvoBean: HadLinkDvoBean, style: Style = this.style) { + hadLinkDvoBean.let { + if (!lineMap.containsKey(it.linkPid)) { + // 添加geometry到图层上 + val lineDrawable = LineDrawable(GeometryTools.createGeometry(it.geometry), style) + super.add(lineDrawable) + lineMap[it.linkPid] = lineDrawable + } + } + } + + fun addLineList(hadLinkDvoBeanList: List<HadLinkDvoBean>, style: Style = this.style) { + hadLinkDvoBeanList.forEach { + addLine(it, style) + } + } + + fun removeLine(linkPid: String):Boolean { + if (lineMap.containsKey(linkPid)) { + super.remove(lineMap[linkPid]) + lineMap.remove(linkPid) + } + return false + } + + fun removeLine(geometry: Geometry) { + super.remove(geometry) + } + + fun setLineColor(color: Color) { + this.style = Style.builder() + .fillColor(color.toArgb()) + .fillAlpha(0.5f) + .strokeColor(color.toArgb()) + .strokeWidth(4f) + .fixed(true).build() + } +} \ No newline at end of file From 894732ee45bca09bbb44e08d7a8aea90f3c99c32 Mon Sep 17 00:00:00 2001 From: squallzhjch <zhangjingchao@navinfo.com> Date: Fri, 28 Apr 2023 16:03:40 +0800 Subject: [PATCH 7/7] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=AE=9A=E4=BD=8D?= =?UTF-8?q?=EF=BC=8C=E4=BF=AE=E6=94=B9=E6=8F=90=E5=89=8D=E7=9C=8B=E6=9D=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/navinfo/omqs/db/RealmOperateHelper.kt | 6 +- .../com/navinfo/omqs/hilt/GlobalModule.kt | 12 +- .../omqs/ui/activity/map/MainActivity.kt | 25 ++- .../omqs/ui/activity/map/MainViewModel.kt | 206 ++++++++++++++---- .../omqs/ui/activity/map/SignAdapter.kt | 28 +++ .../navinfo/omqs/ui/activity/map/SignBean.kt | 8 + .../EvaluationResultViewModel.kt | 85 ++++---- .../evaluationresult/MiddleAdapter.kt | 3 + .../main/res/drawable/icon_speed_limit.xml | 12 + app/src/main/res/layout/activity_main.xml | 21 +- app/src/main/res/layout/adapter_sign.xml | 20 ++ app/src/main/res/mipmap-xxhdpi/bg_sign.png | Bin 0 -> 11622 bytes .../navinfo/collect/library/map/GeoPoint.kt | 28 +-- .../collect/library/map/NIMapController.kt | 36 ++- .../collect/library/map/NIMapOptions.kt | 2 + .../collect/library/map/NIMapView.java | 10 +- .../library/map/handler/BaseHandler.kt | 14 +- .../map/handler/LayerManagerHandler.kt | 2 +- .../library/map/handler/LineHandler.kt | 7 +- .../map/handler/LocationLayerHandler.kt | 54 +++-- .../library/map/handler/MarkHandler.kt | 9 +- .../map/handler/MeasureLayerHandler.kt | 9 +- .../collect/library/utils/GeometryTools.java | 2 +- 23 files changed, 435 insertions(+), 164 deletions(-) create mode 100644 app/src/main/java/com/navinfo/omqs/ui/activity/map/SignAdapter.kt create mode 100644 app/src/main/java/com/navinfo/omqs/ui/activity/map/SignBean.kt create mode 100644 app/src/main/res/drawable/icon_speed_limit.xml create mode 100644 app/src/main/res/layout/adapter_sign.xml create mode 100644 app/src/main/res/mipmap-xxhdpi/bg_sign.png diff --git a/app/src/main/java/com/navinfo/omqs/db/RealmOperateHelper.kt b/app/src/main/java/com/navinfo/omqs/db/RealmOperateHelper.kt index 56ea0bd8..9bb6be80 100644 --- a/app/src/main/java/com/navinfo/omqs/db/RealmOperateHelper.kt +++ b/app/src/main/java/com/navinfo/omqs/db/RealmOperateHelper.kt @@ -79,16 +79,14 @@ class RealmOperateHelper() { } - suspend fun queryLink( - linkPid: String, - ): RenderEntity? { + suspend fun queryLink(linkPid: String): RenderEntity? { var link: RenderEntity? = null withContext(Dispatchers.IO) { val realm = Realm.getDefaultInstance() val realmR = realm.where(RenderEntity::class.java) .equalTo("table", "OMDB_RD_LINK") .and() - .rawPredicate("properties['${LinkTable.linkPid}']=$linkPid") + .equalTo("properties['${LinkTable.linkPid}']", linkPid) .findFirst() if (realmR != null) { link = realm.copyFromRealm(realmR) diff --git a/app/src/main/java/com/navinfo/omqs/hilt/GlobalModule.kt b/app/src/main/java/com/navinfo/omqs/hilt/GlobalModule.kt index 25cc9516..180e720f 100644 --- a/app/src/main/java/com/navinfo/omqs/hilt/GlobalModule.kt +++ b/app/src/main/java/com/navinfo/omqs/hilt/GlobalModule.kt @@ -6,6 +6,7 @@ import androidx.room.Room import com.google.gson.Gson import com.google.gson.GsonBuilder import com.google.gson.reflect.TypeToken +import com.navinfo.collect.library.data.dao.impl.TraceDataBase import com.navinfo.omqs.Constant import com.navinfo.omqs.OMQSApplication import com.navinfo.omqs.db.RoomAppDatabase @@ -90,7 +91,7 @@ class GlobalModule { @Provides @Singleton fun provideGson(): Gson = GsonBuilder() - // 解决解析Json时将int类型自动转换为Double的问题 + // 解决解析Json时将int类型自动转换为Double的问题 .registerTypeAdapter(object : TypeToken<Map<String, Any?>>() {}.getType(), IntTypeAdapter()) .registerTypeAdapter(object : TypeToken<Map<String, Any>>() {}.getType(), IntTypeAdapter()) .registerTypeAdapter(object : TypeToken<Map<Any, Any>>() {}.getType(), IntTypeAdapter()) @@ -137,6 +138,15 @@ class GlobalModule { .build(); } + @Singleton + @Provides + fun provideTraceDatabase(context: Application): TraceDataBase { + return TraceDataBase.getDatabase( + context, + Constant.USER_DATA_PATH + "/trace.sqlite" + ) + } + // /** // * realm 注册 // */ diff --git a/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainActivity.kt b/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainActivity.kt index 44732ade..35271e25 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainActivity.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainActivity.kt @@ -1,10 +1,13 @@ package com.navinfo.omqs.ui.activity.map +import android.os.Build import android.os.Bundle import androidx.activity.viewModels +import androidx.annotation.RequiresApi import androidx.core.view.WindowCompat import androidx.databinding.DataBindingUtil import androidx.navigation.findNavController +import androidx.recyclerview.widget.LinearLayoutManager import com.blankj.utilcode.util.ToastUtils import com.navinfo.collect.library.map.NIMapController import com.navinfo.collect.library.map.handler.NiLocationListener @@ -32,6 +35,7 @@ class MainActivity : BaseActivity() { @Inject lateinit var offlineMapDownloadManager: OfflineMapDownloadManager + private val signAdapter by lazy { SignAdapter() } override fun onCreate(savedInstanceState: Bundle?) { WindowCompat.setDecorFitsSystemWindows(window, false) @@ -43,7 +47,7 @@ class MainActivity : BaseActivity() { binding.mainActivityMap, null, Constant.MAP_PATH, - Constant.USER_DATA_PATH+"/trace.sqlite" + Constant.USER_DATA_PATH + "/trace.sqlite" ) //关联生命周期 binding.lifecycleOwner = this @@ -56,7 +60,11 @@ class MainActivity : BaseActivity() { //处理页面跳转 viewModel.navigation(this, it) } - + binding.mainActivitySignRecyclerview.layoutManager = LinearLayoutManager(this) + binding.mainActivitySignRecyclerview.adapter = signAdapter + viewModel.liveDataSignList.observe(this) { + signAdapter.refreshData(it) + } } override fun onStart() { @@ -64,15 +72,10 @@ class MainActivity : BaseActivity() { //开启定位 mapController.locationLayerHandler.startLocation() + //启动轨迹存储 - mapController.locationLayerHandler.setNiLocationListener(NiLocationListener { - //ToastUtils.showLong("定位${it.longitude}") - binding!!.viewModel!!.addSaveTrace(it) - binding!!.viewModel!!.startSaveTraceThread(this) - }) - //显示轨迹图层 -// mapController.layerManagerHandler.showNiLocationLayer(Constant.DATA_PATH+ SystemConstant.USER_ID+"/trace.sqlite") - mapController.layerManagerHandler.showNiLocationLayer() +// viewModel.startSaveTraceThread(this) + } override fun onPause() { @@ -103,7 +106,7 @@ class MainActivity : BaseActivity() { */ fun openCamera() { //显示轨迹图层 - binding!!.viewModel!!.onClickCameraButton(this) + viewModel.onClickCameraButton(this) } /** diff --git a/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainViewModel.kt b/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainViewModel.kt index 6969cdad..f8ec8e3e 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainViewModel.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainViewModel.kt @@ -2,23 +2,33 @@ package com.navinfo.omqs.ui.activity.map import android.content.Context import android.content.DialogInterface +import android.os.Build import android.os.Bundle import android.util.Log +import androidx.annotation.RequiresApi import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope import androidx.navigation.findNavController import com.navinfo.collect.library.data.dao.impl.TraceDataBase import com.navinfo.collect.library.data.entity.NiLocation +import com.navinfo.collect.library.data.entity.RenderEntity import com.navinfo.collect.library.map.NIMapController +import com.navinfo.collect.library.map.handler.NiLocationListener import com.navinfo.collect.library.map.handler.OnQsRecordItemClickListener import com.navinfo.collect.library.utils.GeometryTools import com.navinfo.collect.library.utils.GeometryToolsKt import com.navinfo.omqs.Constant import com.navinfo.omqs.R +import com.navinfo.omqs.db.RealmOperateHelper import com.navinfo.omqs.ui.dialog.CommonDialog import com.navinfo.omqs.ui.manager.TakePhotoManager import dagger.hilt.android.lifecycle.HiltViewModel +import dagger.hilt.android.qualifiers.ActivityContext +import dagger.hilt.android.qualifiers.ApplicationContext import io.realm.RealmSet +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch import org.oscim.core.GeoPoint import org.videolan.libvlc.LibVlcUtil import javax.inject.Inject @@ -26,15 +36,25 @@ import javax.inject.Inject /** * 创建Activity全局viewmode */ + @HiltViewModel class MainViewModel @Inject constructor( private val mapController: NIMapController, + private val traceDataBase: TraceDataBase, + private val realmOperateHelper: RealmOperateHelper ) : ViewModel() { - val liveDataQsRecordIdList = MutableLiveData<List<String>>() private var mCameraDialog: CommonDialog? = null - private var niLocationList: MutableList<NiLocation> = ArrayList<NiLocation>() + //地图点击捕捉到的质检数据ID列表 + val liveDataQsRecordIdList = MutableLiveData<List<String>>() + + //看板数据 + val liveDataSignList = MutableLiveData<List<SignBean>>() + + + // private var niLocationList: MutableList<NiLocation> = ArrayList<NiLocation>() + var testPoint = GeoPoint(0, 0) init { mapController.markerHandle.setOnQsRecordItemClickListener(object : @@ -43,6 +63,93 @@ class MainViewModel @Inject constructor( liveDataQsRecordIdList.value = list } }) + initLocation() + viewModelScope.launch { + mapController.onMapClickFlow.collect { + testPoint = it + } + } + + } + + private fun initLocation() { + // mapController.locationLayerHandler.setNiLocationListener(NiLocationListener { +// addSaveTrace(it) +// +// }) + //用于定位点存储到数据库 + viewModelScope.launch(Dispatchers.Default) { + mapController.locationLayerHandler.niLocationFlow.collect { location -> + location.longitude = testPoint.longitude + location.latitude = testPoint.latitude + val geometry = GeometryTools.createGeometry( + GeoPoint( + location.latitude, + location.longitude + ) + ) + val tileX = RealmSet<Int>() + GeometryToolsKt.getTileXByGeometry(geometry.toString(), tileX) + val tileY = RealmSet<Int>() + GeometryToolsKt.getTileYByGeometry(geometry.toString(), tileY) + + //遍历存储tile对应的x与y的值 + tileX.forEach { x -> + tileY.forEach { y -> + location.tilex = x + location.tiley = y + } + } + Log.e("jingo", "定位点插入 ${Thread.currentThread().name}") + traceDataBase.niLocationDao.insert(location) + } + } + //用于定位点捕捉道路 + viewModelScope.launch(Dispatchers.Default) { + mapController.locationLayerHandler.niLocationFlow.collect { location -> + Log.e("jingo", "定位点绑定道路 ${Thread.currentThread().name}") + location.longitude = testPoint.longitude + location.latitude = testPoint.latitude + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + val linkList = realmOperateHelper.queryLink( + point = GeometryTools.createPoint( + location.longitude, + location.latitude + ), + ) + //看板数据 + val signList = mutableListOf<SignBean>() + if (linkList.isNotEmpty()) { + val link = linkList[0] + val linkId = link.properties[RenderEntity.Companion.LinkTable.linkPid] + mapController.lineHandler.showLine(link.geometry) + linkId?.let { + var elementList = realmOperateHelper.queryLinkByLinkPid(it) + for (element in elementList) { + val distance = GeometryTools.distanceToDouble( + GeoPoint( + location.latitude, location.longitude, + ), + GeometryTools.createGeoPoint(element.geometry) + ) + signList.add( + SignBean( + iconId = R.drawable.icon_speed_limit, + iconText = element.name, + distance = distance.toInt(), + ) + ) + } + liveDataSignList.postValue(signList) + Log.e("jingo", "自动捕捉数据 共${elementList.size}条") + } + } + } + } + } + + //显示轨迹图层 + mapController.layerManagerHandler.showNiLocationLayer() } /** @@ -54,6 +161,9 @@ class MainViewModel @Inject constructor( override fun onCleared() { super.onCleared() + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + mapController.lineHandler.removeLine() + } } //点击相机按钮 @@ -96,49 +206,61 @@ class MainViewModel @Inject constructor( }) } - fun startSaveTraceThread(context: Context) { - Thread(Runnable { - try { - while (true) { - if (niLocationList != null && niLocationList.size > 0) { +// fun startSaveTraceThread(context: Context) { +// Thread(Runnable { +// try { +// while (true) { +// +// if (niLocationList != null && niLocationList.size > 0) { +// +// var niLocation = niLocationList[0] +// val geometry = GeometryTools.createGeometry( +// GeoPoint( +// niLocation.latitude, +// niLocation.longitude +// ) +// ) +// val tileX = RealmSet<Int>() +// GeometryToolsKt.getTileXByGeometry(geometry.toString(), tileX) +// val tileY = RealmSet<Int>() +// GeometryToolsKt.getTileYByGeometry(geometry.toString(), tileY) +// +// //遍历存储tile对应的x与y的值 +// tileX.forEach { x -> +// tileY.forEach { y -> +// niLocation.tilex = x +// niLocation.tiley = y +// } +// } +// +// TraceDataBase.getDatabase( +// context, +// Constant.USER_DATA_PATH + "/trace.sqlite" +// ).niLocationDao.insert(niLocation) +// niLocationList.remove(niLocation) +// +// Log.e("qj", "saveTrace==${niLocationList.size}") +// } +// Thread.sleep(30) +// } +// } catch (e: InterruptedException) { +// e.printStackTrace() +// Log.e("qj", "异常==${e.message}") +// } +// }).start() +// } - var niLocation = niLocationList[0] - val geometry = GeometryTools.createGeometry(GeoPoint(niLocation.latitude,niLocation.longitude)) - val tileX = RealmSet<Int>() - GeometryToolsKt.getTileXByGeometry(geometry.toString(), tileX) - val tileY = RealmSet<Int>() - GeometryToolsKt.getTileYByGeometry(geometry.toString(), tileY) - - //遍历存储tile对应的x与y的值 - tileX.forEach { x -> - tileY.forEach { y -> - niLocation.tilex = x - niLocation.tiley = y - } - } - - TraceDataBase.getDatabase(context, Constant.USER_DATA_PATH + "/trace.sqlite").niLocationDao.insert(niLocation) - niLocationList.remove(niLocation) - - Log.e("qj", "saveTrace==${niLocationList.size}") - } - Thread.sleep(30) - } - } catch (e: InterruptedException) { - e.printStackTrace() - Log.e("qj", "异常==${e.message}") - } - }).start() - } - - //增加轨迹存储 - fun addSaveTrace(niLocation: NiLocation) { - if (niLocation != null && niLocationList != null) { - niLocationList.add(niLocation) - } - } +// //增加轨迹存储 +// fun addSaveTrace(niLocation: NiLocation) { +// if (niLocation != null && niLocationList != null) { +// niLocationList.add(niLocation) +// } +// } + /** + * 处理页面调转 + */ fun navigation(activity: MainActivity, list: List<String>) { //获取右侧fragment容器 val naviController = activity.findNavController(R.id.main_activity_right_fragment) diff --git a/app/src/main/java/com/navinfo/omqs/ui/activity/map/SignAdapter.kt b/app/src/main/java/com/navinfo/omqs/ui/activity/map/SignAdapter.kt new file mode 100644 index 00000000..e024ba5d --- /dev/null +++ b/app/src/main/java/com/navinfo/omqs/ui/activity/map/SignAdapter.kt @@ -0,0 +1,28 @@ +package com.navinfo.omqs.ui.activity.map + +import android.view.LayoutInflater +import android.view.ViewGroup +import com.navinfo.omqs.R +import com.navinfo.omqs.databinding.AdapterSignBinding +import com.navinfo.omqs.ui.other.BaseRecyclerViewAdapter +import com.navinfo.omqs.ui.other.BaseViewHolder + +class SignAdapter : BaseRecyclerViewAdapter<SignBean>() { + override fun getItemViewRes(position: Int): Int { + return R.layout.adapter_sign + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseViewHolder { + val viewBinding = + AdapterSignBinding.inflate(LayoutInflater.from(parent.context), parent, false) + return BaseViewHolder(viewBinding) + } + + override fun onBindViewHolder(holder: BaseViewHolder, position: Int) { + val bd = holder.viewBinding as AdapterSignBinding + val item = data[position] + bd.signMainIcon.background = holder.viewBinding.root.context.getDrawable(item.iconId) + bd.signMainIcon.text = item.iconText + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/ui/activity/map/SignBean.kt b/app/src/main/java/com/navinfo/omqs/ui/activity/map/SignBean.kt new file mode 100644 index 00000000..9ee45b97 --- /dev/null +++ b/app/src/main/java/com/navinfo/omqs/ui/activity/map/SignBean.kt @@ -0,0 +1,8 @@ +package com.navinfo.omqs.ui.activity.map + +data class SignBean( + //图标ID + val iconId: Int, + val distance: Int = 0, + val iconText: String = "" +) \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultViewModel.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultViewModel.kt index e059f3e5..053e3fe6 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultViewModel.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultViewModel.kt @@ -8,7 +8,6 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.navinfo.collect.library.data.entity.QsRecordBean import com.navinfo.collect.library.data.entity.RenderEntity.Companion.LinkTable -import com.navinfo.collect.library.map.GeoPoint import com.navinfo.collect.library.map.NIMapController import com.navinfo.collect.library.utils.GeometryTools import com.navinfo.omqs.db.RealmOperateHelper @@ -18,10 +17,10 @@ import io.realm.Realm import io.realm.kotlin.where import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch +import org.oscim.core.GeoPoint import java.util.* import javax.inject.Inject -@RequiresApi(Build.VERSION_CODES.N) @HiltViewModel class EvaluationResultViewModel @Inject constructor( private val roomAppDatabase: RoomAppDatabase, @@ -59,24 +58,24 @@ class EvaluationResultViewModel @Inject constructor( init { liveDataQsRecordBean.value = QsRecordBean(id = UUID.randomUUID().toString()) Log.e("jingo", "EvaluationResultViewModel 创建了 ${hashCode()}") - mapController.markerHandle.run { - setOnMapClickListener { - liveDataQsRecordBean.value!!.geometry = it.toGeometry() - addMarker(it, markerTitle) + viewModelScope.launch { + mapController.onMapClickFlow.collect { + liveDataQsRecordBean.value!!.geometry = GeometryTools.createGeometry(it).toText() + mapController.markerHandle.addMarker(it, markerTitle) viewModelScope.launch { captureLink(it.longitude, it.latitude) } } } - } override fun onCleared() { super.onCleared() Log.e("jingo", "EvaluationResultViewModel 销毁了 ${hashCode()}") mapController.markerHandle.removeMarker(markerTitle) - mapController.markerHandle.removeOnMapClickListener() - mapController.lineHandler.removeLine() + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + mapController.lineHandler.removeLine() + } } @@ -90,7 +89,7 @@ class EvaluationResultViewModel @Inject constructor( } val geoPoint = mapController.locationLayerHandler.getCurrentGeoPoint() geoPoint?.let { - liveDataQsRecordBean.value!!.geometry = it.toGeometry() + liveDataQsRecordBean.value!!.geometry = GeometryTools.createGeometry(it).toText() mapController.markerHandle.addMarker(geoPoint, markerTitle) viewModelScope.launch { captureLink(geoPoint.longitude, geoPoint.latitude) @@ -102,20 +101,23 @@ class EvaluationResultViewModel @Inject constructor( * 捕捉到路 */ private suspend fun captureLink(longitude: Double, latitude: Double) { - val linkList = realmOperateHelper.queryLink( - point = GeometryTools.createPoint( - longitude, - latitude - ), - ) - liveDataQsRecordBean.value?.let { - if (linkList.isNotEmpty()) { - it.linkId = - linkList[0].properties[LinkTable.linkPid] ?: "" - mapController.lineHandler.showLine(linkList[0].geometry) - } else { - it.linkId = "" - mapController.lineHandler.removeLine() + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + val linkList = realmOperateHelper.queryLink( + point = GeometryTools.createPoint( + longitude, + latitude + ), + ) + + liveDataQsRecordBean.value?.let { + if (linkList.isNotEmpty()) { + it.linkId = + linkList[0].properties[LinkTable.linkPid] ?: "" + mapController.lineHandler.showLine(linkList[0].geometry) + } else { + it.linkId = "" + mapController.lineHandler.removeLine() + } } } } @@ -276,23 +278,26 @@ class EvaluationResultViewModel @Inject constructor( */ fun initData(id: String) { - viewModelScope.launch(Dispatchers.IO) { - val realm = Realm.getDefaultInstance() - val objects = realm.where<QsRecordBean>().equalTo("id", id).findFirst() + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + viewModelScope.launch(Dispatchers.IO) { + val realm = Realm.getDefaultInstance() + val objects = realm.where<QsRecordBean>().equalTo("id", id).findFirst() - if (objects != null) { - oldBean = realm.copyFromRealm(objects) - oldBean?.let { - liveDataQsRecordBean.postValue(it.copy()) - val p = GeometryTools.createGeoPoint(it.geometry) - mapController.markerHandle.addMarker( - GeoPoint(p.longitude, p.latitude), - markerTitle - ) - if (it.linkId.isNotEmpty()) { - val link = realmOperateHelper.queryLink(it.linkId) - link?.let { l -> - mapController.lineHandler.showLine(l.geometry) + if (objects != null) { + oldBean = realm.copyFromRealm(objects) + oldBean?.let { + liveDataQsRecordBean.postValue(it.copy()) + val p = GeometryTools.createGeoPoint(it.geometry) + mapController.markerHandle.addMarker( + GeoPoint(p.latitude, p.longitude), + markerTitle + ) + + if (it.linkId.isNotEmpty()) { + val link = realmOperateHelper.queryLink(it.linkId) + link?.let { l -> + mapController.lineHandler.showLine(l.geometry) + } } } } diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/MiddleAdapter.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/MiddleAdapter.kt index d3020c80..034d5787 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/MiddleAdapter.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/MiddleAdapter.kt @@ -1,7 +1,9 @@ package com.navinfo.omqs.ui.fragment.evaluationresult +import android.os.Build import android.view.LayoutInflater import android.view.ViewGroup +import androidx.annotation.RequiresApi import com.navinfo.omqs.R import com.navinfo.omqs.databinding.TextItemSelectBinding import com.navinfo.omqs.ui.other.BaseRecyclerViewAdapter @@ -21,6 +23,7 @@ class MiddleAdapter(private var itemListener: ((Int, String) -> Unit?)? = null) return BaseViewHolder(viewBinding) } + @RequiresApi(Build.VERSION_CODES.M) override fun onBindViewHolder(holder: BaseViewHolder, position: Int) { val bd = holder.viewBinding as TextItemSelectBinding val title = data[position] diff --git a/app/src/main/res/drawable/icon_speed_limit.xml b/app/src/main/res/drawable/icon_speed_limit.xml new file mode 100644 index 00000000..e6ac7102 --- /dev/null +++ b/app/src/main/res/drawable/icon_speed_limit.xml @@ -0,0 +1,12 @@ +<shape xmlns:android="http://schemas.android.com/apk/res/android" + android:shape="oval" + android:useLevel="false"> + <stroke + android:width="1.33dp" + android:color="#DB4646" /> + <size + android:width="24dp" + android:height="24dp" /> + <solid android:color="@color/white" /> + +</shape> \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 40393b4f..1a869281 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -35,6 +35,7 @@ app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" /> + <ImageButton android:id="@+id/main_activity_person_center" android:layout_width="48dp" @@ -46,6 +47,14 @@ app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintTop_toTopOf="parent" /> + <androidx.recyclerview.widget.RecyclerView + android:id="@+id/main_activity_sign_recyclerview" + android:layout_width="150dp" + android:layout_height="350dp" + android:layout_marginTop="10dp" + app:layout_constraintLeft_toLeftOf="@id/main_activity_person_center" + app:layout_constraintTop_toBottomOf="@id/main_activity_person_center" /> + <ImageButton android:id="@+id/main_activity_location" android:layout_width="48dp" @@ -68,6 +77,16 @@ app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintRight_toRightOf="parent" /> + <ImageButton + android:id="@+id/main_activity_line" + android:layout_width="48dp" + android:layout_height="48dp" + android:layout_marginBottom="10dp" + android:onClick="@{()->mainActivity.voiceOnclick()}" + android:src="@drawable/baseline_keyboard_voice_24" + app:layout_constraintBottom_toTopOf="@id/main_activity_voice" + app:layout_constraintRight_toRightOf="@id/main_activity_voice" /> + <fragment android:id="@+id/main_activity_middle_fragment" android:name="androidx.navigation.fragment.NavHostFragment" @@ -107,11 +126,11 @@ android:id="@+id/main_activity_camera2" android:layout_width="48dp" android:layout_height="48dp" - android:visibility="gone" android:layout_marginLeft="20dp" android:layout_marginTop="20dp" android:onClick="@{()->mainActivity.openCamera()}" android:src="@drawable/baseline_person_24" + android:visibility="gone" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" /> diff --git a/app/src/main/res/layout/adapter_sign.xml b/app/src/main/res/layout/adapter_sign.xml new file mode 100644 index 00000000..8e1a9042 --- /dev/null +++ b/app/src/main/res/layout/adapter_sign.xml @@ -0,0 +1,20 @@ +<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:background="@mipmap/bg_sign" + tools:context="com.navinfo.omqs.ui.activity.map.SignAdapter"> + + <TextView + android:id="@+id/sign_main_icon" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginLeft="19dp" + android:layout_marginTop="4dp" + android:background="@drawable/icon_speed_limit" + android:gravity="center" + android:text="80" + android:textColor="#2F2F2F" + android:textSize="14.67sp" /> +</RelativeLayout> \ No newline at end of file diff --git a/app/src/main/res/mipmap-xxhdpi/bg_sign.png b/app/src/main/res/mipmap-xxhdpi/bg_sign.png new file mode 100644 index 0000000000000000000000000000000000000000..5ba9099815dda6588496994d0ae5a7cb71cbefb4 GIT binary patch literal 11622 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 CX8;TU literal 0 HcmV?d00001 diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/GeoPoint.kt b/collect-library/src/main/java/com/navinfo/collect/library/map/GeoPoint.kt index ed7115f8..714b7442 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/map/GeoPoint.kt +++ b/collect-library/src/main/java/com/navinfo/collect/library/map/GeoPoint.kt @@ -1,14 +1,14 @@ -package com.navinfo.collect.library.map - -import android.os.Parcelable -import kotlinx.parcelize.Parcelize - -@Parcelize -data class GeoPoint( - var latitude: Double = 0.0, - var longitude: Double = 0.0 -) : Parcelable { - fun toGeometry(): String { - return "POINT($longitude $latitude)" - } -} \ No newline at end of file +//package com.navinfo.collect.library.map +// +//import android.os.Parcelable +//import kotlinx.parcelize.Parcelize +// +//@Parcelize +//data class GeoPoint( +// var latitude: Double = 0.0, +// var longitude: Double = 0.0 +//) : Parcelable { +// fun toGeometry(): String { +// return "POINT($longitude $latitude)" +// } +//} \ No newline at end of file diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/NIMapController.kt b/collect-library/src/main/java/com/navinfo/collect/library/map/NIMapController.kt index 8a172a47..9841797c 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/map/NIMapController.kt +++ b/collect-library/src/main/java/com/navinfo/collect/library/map/NIMapController.kt @@ -1,14 +1,20 @@ package com.navinfo.collect.library.map -import android.content.Context -import android.util.Log +import android.os.Build +import androidx.annotation.RequiresApi import androidx.appcompat.app.AppCompatActivity +import androidx.lifecycle.lifecycleScope import com.navinfo.collect.library.data.entity.NiLocation import com.navinfo.collect.library.data.handler.DataNiLocationHandler +import com.navinfo.collect.library.map.NIMapView.OnMapClickListener import com.navinfo.collect.library.map.handler.* -import com.navinfo.collect.library.map.maphandler.MeasureLayerHandler +import com.navinfo.collect.library.map.handler.MeasureLayerHandler import com.navinfo.collect.library.map.handler.ViewportHandler import com.navinfo.collect.library.system.Constant +import kotlinx.coroutines.flow.MutableSharedFlow +import kotlinx.coroutines.flow.SharedFlow +import kotlinx.coroutines.launch +import org.oscim.core.GeoPoint /** * 地图控制器 @@ -25,19 +31,35 @@ class NIMapController { lateinit var viewportHandler: ViewportHandler lateinit var measureLayerHandler: MeasureLayerHandler - fun init(context: AppCompatActivity, mapView: NIMapView, options: NIMapOptions? = null, mapPath: String, tracePath: String) { + val onMapClickFlow = MutableSharedFlow<GeoPoint>() + + fun init( + context: AppCompatActivity, + mapView: NIMapView, + options: NIMapOptions? = null, + mapPath: String, + tracePath: String + ) { Constant.MAP_PATH = mapPath layerManagerHandler = LayerManagerHandler(context, mapView, tracePath) locationLayerHandler = LocationLayerHandler(context, mapView) animationHandler = AnimationHandler(context, mapView) markerHandle = MarkHandler(context, mapView) - lineHandler = LineHandler(context, mapView) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + lineHandler = LineHandler(context, mapView) + } polygonHandler = PolygonHandler(context, mapView) viewportHandler = ViewportHandler(context, mapView) - measureLayerHandler = MeasureLayerHandler(context, mapView) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + measureLayerHandler = MeasureLayerHandler(context, mapView) + } mMapView = mapView + mMapView.setOnMapClickListener { + context.lifecycleScope.launch { + onMapClickFlow.emit(it) + } + } mapView.setOptions(options) - mMapView.vtmMap.viewport().maxZoomLevel = Constant.MAX_ZOOM // 设置地图的最大级别 } diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/NIMapOptions.kt b/collect-library/src/main/java/com/navinfo/collect/library/map/NIMapOptions.kt index 796ac2bc..8231bbfa 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/map/NIMapOptions.kt +++ b/collect-library/src/main/java/com/navinfo/collect/library/map/NIMapOptions.kt @@ -1,5 +1,6 @@ package com.navinfo.collect.library.map +import com.navinfo.collect.library.system.Constant import org.json.JSONObject @@ -8,6 +9,7 @@ data class NIMapOptions( val showZoomControl: Boolean = true, //是否显示zoom按钮 val zoomLevel: Double = 13.0, /// 地图比例尺初始级别 val coordinate: NICoordinate = NICoordinate(39.907375, 116.391349), + val maxZoom: Int = Constant.MAX_ZOOM ) { companion object { fun fromJson(json: String): NIMapOptions { diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/NIMapView.java b/collect-library/src/main/java/com/navinfo/collect/library/map/NIMapView.java index fb115dd4..e9c64238 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/map/NIMapView.java +++ b/collect-library/src/main/java/com/navinfo/collect/library/map/NIMapView.java @@ -1,6 +1,7 @@ package com.navinfo.collect.library.map; import android.content.Context; +import android.os.Build; import android.os.Bundle; import android.util.AttributeSet; import android.view.LayoutInflater; @@ -121,7 +122,7 @@ public final class NIMapView extends RelativeLayout { * * @param point */ - void onMapClick(com.navinfo.collect.library.map.GeoPoint point); + void onMapClick(GeoPoint point); /** * 地图内 Poi 单击事件回调函数 @@ -358,6 +359,7 @@ public final class NIMapView extends RelativeLayout { } MapPosition mapPosition = getVtmMap().getMapPosition(); mapPosition.setZoom(options.getZoomLevel()); + getVtmMap().viewport().setMaxZoomLevel(options.getMaxZoom()); mapPosition.setPosition(options.getCoordinate().getLatitude(), options.getCoordinate().getLongitude()); getVtmMap().animator().animateTo(100, mapPosition); } @@ -819,7 +821,9 @@ public final class NIMapView extends RelativeLayout { LayoutParams layoutParams = (LayoutParams) view.getLayoutParams(); if (layoutParams.getRules() != null) { for (int i = 0; i < layoutParams.getRules().length; i++) { - layoutParams.removeRule(i); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { + layoutParams.removeRule(i); + } } } switch (position) { @@ -926,7 +930,7 @@ public final class NIMapView extends RelativeLayout { GeoPoint geoPoint = mMap.viewport().fromScreenPoint(e.getX(), e.getY()); if (g instanceof Gesture.Tap) { // 单击事件 if (mapClickListener != null) { - mapClickListener.onMapClick(new com.navinfo.collect.library.map.GeoPoint(geoPoint.getLatitude(), geoPoint.getLongitude())); + mapClickListener.onMapClick(geoPoint); } } else if (g instanceof Gesture.DoubleTap) { // 双击 if (mapDoubleClickListener != null) { diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/BaseHandler.kt b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/BaseHandler.kt index 2d5bf2e5..4f3d1274 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/BaseHandler.kt +++ b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/BaseHandler.kt @@ -20,11 +20,11 @@ abstract class BaseHandler(context: AppCompatActivity, mapView: NIMapView) { mMapView.vtmMap.layers().remove(layer) } - fun setOnMapClickListener(listener: NIMapView.OnMapClickListener) { - mMapView.setOnMapClickListener(listener) - } - - fun removeOnMapClickListener() { - mMapView.setOnMapClickListener(null) - } +// fun setOnMapClickListener(listener: NIMapView.OnMapClickListener) { +// mMapView.setOnMapClickListener(listener) +// } +// +// fun removeOnMapClickListener() { +// mMapView.setOnMapClickListener(null) +// } } \ No newline at end of file diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LayerManagerHandler.kt b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LayerManagerHandler.kt index aafad60d..7e5ab8b8 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LayerManagerHandler.kt +++ b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LayerManagerHandler.kt @@ -24,7 +24,7 @@ import java.io.File class LayerManagerHandler(context: AppCompatActivity, mapView: NIMapView,tracePath: String) : BaseHandler(context, mapView) { private var baseGroupLayer // 用于盛放所有基础底图的图层组,便于统一管理 : GroupLayer? = null - protected val mTracePath:String = tracePath + private val mTracePath:String = tracePath /** * 轨迹渲染图层 diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LineHandler.kt b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LineHandler.kt index ca3ed0b9..8d0af45a 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LineHandler.kt +++ b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LineHandler.kt @@ -137,13 +137,12 @@ class LineHandler(context: AppCompatActivity, mapView: NIMapView) : BaseHandler( fun showLine(geometry: String) { try { - + mDefaultPathLayer.clearPath() + mDefaultPathLayer.setPoints(GeometryTools.getGeoPoints(geometry)) + mDefaultPathLayer.isEnabled = true } catch (e: Exception) { Toast.makeText(mContext, "高亮路线失败 ${e.message}", Toast.LENGTH_SHORT).show() } - val g = GeometryTools.getGeoPoints(geometry) - mDefaultPathLayer.setPoints(g) - mDefaultPathLayer.isEnabled = true } fun removeLine() { diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LocationLayerHandler.kt b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LocationLayerHandler.kt index 4b18e5b2..823510f8 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LocationLayerHandler.kt +++ b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LocationLayerHandler.kt @@ -1,27 +1,34 @@ package com.navinfo.collect.library.map.handler -import android.content.Context import android.util.Log import android.widget.Toast import androidx.appcompat.app.AppCompatActivity +import androidx.lifecycle.lifecycleScope import com.baidu.location.BDAbstractLocationListener import com.baidu.location.BDLocation import com.baidu.location.LocationClient import com.baidu.location.LocationClientOption import com.baidu.location.LocationClientOption.LocationMode import com.navinfo.collect.library.data.entity.NiLocation -import com.navinfo.collect.library.map.GeoPoint import com.navinfo.collect.library.map.NIMapView +import kotlinx.coroutines.flow.MutableSharedFlow +import kotlinx.coroutines.launch +import org.oscim.core.GeoPoint import org.oscim.layers.LocationLayer -class LocationLayerHandler(context: AppCompatActivity, mapView: NIMapView) : BaseHandler(context, mapView) { +class LocationLayerHandler(context: AppCompatActivity, mapView: NIMapView) : + BaseHandler(context, mapView) { private var mCurrentLocation: BDLocation? = null private var bFirst = true private val mLocationLayer: LocationLayer = LocationLayer(mMapView.vtmMap) private lateinit var locationClient: LocationClient - private lateinit var niLocationListener: NiLocationListener +// private var niLocationListener: NiLocationListener by lazy{ +// +// } + + val niLocationFlow = MutableSharedFlow<NiLocation>(5) init { ///添加定位图层到地图,[NIMapView.LAYER_GROUPS.NAVIGATION] 是最上层layer组 @@ -47,20 +54,29 @@ class LocationLayerHandler(context: AppCompatActivity, mapView: NIMapView) : Bas //更多结果信息获取说明,请参照类参考中BDLocation类中的说明 //获取纬度信息 - val latitude = it.latitude +// val latitude = it.latitude //获取经度信息 - val longitude = it.longitude +// val longitude = it.longitude //获取定位精度,默认值为0.0f - val radius = it.radius +// val radius = it.radius //获取经纬度坐标类型,以LocationClientOption中设置过的坐标类型为准 - val coorType = it.coorType +// val coorType = it.coorType //获取定位类型、定位错误返回码,具体信息可参照类参考中BDLocation类中的说明 val errorCode = it.locType mCurrentLocation = it mLocationLayer.setPosition(it.latitude, it.longitude, it.radius) - Log.e("qj","location==${it.longitude}==errorCode===$errorCode===${it.locTypeDescription}") - if(niLocationListener!=null){ - getCurrentNiLocation()?.let { it1 -> niLocationListener.call(it1) } +// Log.e( +// "qj", +// "location==${it.longitude}==errorCode===$errorCode===${it.locTypeDescription}" +// ) + +// if (niLocationListener != null) { + getCurrentNiLocation()?.let { it1 -> + mContext.lifecycleScope.launch { + niLocationFlow.emit(it1) + } + +// }// niLocationListener.call(it1) } } //第一次定位成功显示当前位置 if (this.bFirst) { @@ -107,7 +123,7 @@ class LocationLayerHandler(context: AppCompatActivity, mapView: NIMapView) : Bas locationClient.locOption = locationOption } catch (e: Throwable) { Toast.makeText(mContext, "定位初始化失败 $e", Toast.LENGTH_SHORT) - Log.e("qj","定位初始化失败$e") + Log.e("qj", "定位初始化失败$e") } } @@ -160,8 +176,8 @@ class LocationLayerHandler(context: AppCompatActivity, mapView: NIMapView) : Bas //获取当前定位对象 fun getCurrentNiLocation(): NiLocation? { - if(mCurrentLocation!=null){ - val niLocation:NiLocation = NiLocation() + if (mCurrentLocation != null) { + val niLocation: NiLocation = NiLocation() niLocation.longitude = mCurrentLocation!!.longitude niLocation.latitude = mCurrentLocation!!.latitude niLocation.direction = mCurrentLocation!!.direction.toDouble() @@ -186,10 +202,10 @@ class LocationLayerHandler(context: AppCompatActivity, mapView: NIMapView) : Bas return null } - //设置定位回调 - fun setNiLocationListener(listener: NiLocationListener){ - niLocationListener = listener - } +// //设置定位回调 +// fun setNiLocationListener(listener: NiLocationListener) { +// niLocationListener = listener +// } } /** @@ -205,7 +221,7 @@ private class MyLocationListener(callback: (BDLocation) -> Unit) : BDAbstractLoc /** * 实现定位回调 */ -public class NiLocationListener(callback: (NiLocation) -> Unit){ +class NiLocationListener(callback: (NiLocation) -> Unit) { val call = callback; fun onReceiveLocation(location: NiLocation) { call(location) diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MarkHandler.kt b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MarkHandler.kt index 240b6ef5..2c8528c4 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MarkHandler.kt +++ b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MarkHandler.kt @@ -10,7 +10,6 @@ import androidx.core.content.res.ResourcesCompat import androidx.lifecycle.lifecycleScope import com.navinfo.collect.library.R import com.navinfo.collect.library.data.entity.QsRecordBean -import com.navinfo.collect.library.map.GeoPoint import com.navinfo.collect.library.map.NIMapView import com.navinfo.collect.library.map.cluster.ClusterMarkerItem import com.navinfo.collect.library.map.cluster.ClusterMarkerRenderer @@ -27,6 +26,7 @@ import org.oscim.android.canvas.AndroidBitmap import org.oscim.backend.CanvasAdapter import org.oscim.backend.canvas.Bitmap import org.oscim.backend.canvas.Paint +import org.oscim.core.GeoPoint import org.oscim.layers.marker.* import org.oscim.layers.marker.ItemizedLayer.OnItemGestureListener import org.oscim.map.Map @@ -90,9 +90,10 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : } ) - addLayer(mDefaultMarkerLayer, NIMapView.LAYER_GROUPS.OPERATE); + //初始化之间数据图层 initQsRecordDataLayer() + addLayer(mDefaultMarkerLayer, NIMapView.LAYER_GROUPS.OPERATE); // 设置矢量图层均在12级以上才显示 mMapView.vtmMap.events.bind(Map.UpdateListener { e, mapPosition -> if (e == Map.SCALE_EVENT) { @@ -127,13 +128,13 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : val marker = MarkerItem( tempTitle, description, - org.oscim.core.GeoPoint(geoPoint.latitude, geoPoint.longitude) + geoPoint ) mDefaultMarkerLayer.addItem(marker); mMapView.vtmMap.updateMap(true) } else { marker.description = description - marker.geoPoint = org.oscim.core.GeoPoint(geoPoint.latitude, geoPoint.longitude) + marker.geoPoint = geoPoint mDefaultMarkerLayer.removeItem(marker) mDefaultMarkerLayer.addItem(marker) mMapView.vtmMap.updateMap(true) diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MeasureLayerHandler.kt b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MeasureLayerHandler.kt index 41c0cf41..e6b99078 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MeasureLayerHandler.kt +++ b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MeasureLayerHandler.kt @@ -1,19 +1,17 @@ -package com.navinfo.collect.library.map.maphandler +package com.navinfo.collect.library.map.handler -import android.content.Context import android.graphics.BitmapFactory import android.graphics.Canvas import android.graphics.Color +import android.os.Build import android.text.TextPaint -import android.widget.Toast +import androidx.annotation.RequiresApi import androidx.appcompat.app.AppCompatActivity import com.navinfo.collect.library.R import com.navinfo.collect.library.map.NIMapView -import com.navinfo.collect.library.map.handler.BaseHandler import com.navinfo.collect.library.map.layers.NIPolygonLayer import com.navinfo.collect.library.utils.DistanceUtil import com.navinfo.collect.library.utils.GeometryTools -import com.navinfo.collect.library.utils.StringUtil.Companion.createUUID import org.oscim.android.canvas.AndroidBitmap import org.oscim.backend.CanvasAdapter import org.oscim.backend.canvas.Bitmap @@ -30,6 +28,7 @@ import org.oscim.layers.vector.geometries.Style import org.oscim.map.Map import java.math.BigDecimal +@RequiresApi(Build.VERSION_CODES.M) open class MeasureLayerHandler(context: AppCompatActivity, mapView: NIMapView) : BaseHandler(context, mapView), Map.UpdateListener { diff --git a/collect-library/src/main/java/com/navinfo/collect/library/utils/GeometryTools.java b/collect-library/src/main/java/com/navinfo/collect/library/utils/GeometryTools.java index e9cd2426..e0855bb1 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/utils/GeometryTools.java +++ b/collect-library/src/main/java/com/navinfo/collect/library/utils/GeometryTools.java @@ -418,7 +418,7 @@ public class GeometryTools { Geometry startGeo = createGeometry(startGeoPoint); Geometry endGeo = createGeometry(endGeoPoint); double d = startGeo.distance(endGeo); - return d * 100000; + return convertDistanceToDegree(d,startGeoPoint.getLatitude()); } return 0;