From 202e2b3a8e0bdbbf4e719f538cb848615131b419 Mon Sep 17 00:00:00 2001 From: squallzhjch Date: Tue, 17 Oct 2023 09:18:25 +0800 Subject: [PATCH 1/7] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=B7=AF=E5=BE=84?= =?UTF-8?q?=E8=A7=84=E5=88=92=E5=A4=B1=E8=B4=A5=E6=8F=90=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../omqs/ui/activity/map/MainViewModel.kt | 21 ++++++++++++++- .../java/com/navinfo/omqs/util/NaviEngine.kt | 27 ++++++++++++++----- 2 files changed, 40 insertions(+), 8 deletions(-) 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 36be0428..8f79c704 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 @@ -403,7 +403,10 @@ class MainViewModel @Inject constructor( naviOption = naviOption, callback = object : OnNaviEngineCallbackListener { - override fun planningPathStatus(status: NaviStatus) { + override fun planningPathStatus( + status: NaviStatus, linkdId: String?, + geometry: String? + ) { when (status) { NaviStatus.NAVI_STATUS_PATH_PLANNING -> naviEngineStatus = 0 NaviStatus.NAVI_STATUS_PATH_ERROR_NODE -> naviEngineStatus = 0 @@ -415,8 +418,24 @@ class MainViewModel @Inject constructor( NaviStatus.NAVI_STATUS_DIRECTION_OFF -> {} } liveDataNaviStatus.postValue(status) + if (geometry != null) { + viewModelScope.launch(Dispatchers.Main) { + + val lineString = GeometryTools.createGeometry(geometry) + val envelope = lineString.envelopeInternal + mapController.animationHandler.animateToBox( + envelope.maxX, + envelope.maxY, + envelope.minX, + envelope.minY + ) + + mapController.lineHandler.showLine(geometry) + } + } } + override suspend fun bindingResults( route: NaviRoute?, list: List diff --git a/app/src/main/java/com/navinfo/omqs/util/NaviEngine.kt b/app/src/main/java/com/navinfo/omqs/util/NaviEngine.kt index d2613b24..fa657a1e 100644 --- a/app/src/main/java/com/navinfo/omqs/util/NaviEngine.kt +++ b/app/src/main/java/com/navinfo/omqs/util/NaviEngine.kt @@ -11,15 +11,17 @@ import com.navinfo.omqs.bean.NaviRoute import com.navinfo.omqs.bean.NaviRouteItem import com.navinfo.omqs.db.RealmOperateHelper import io.realm.Realm +import org.locationtech.jts.geom.Geometry import org.locationtech.jts.geom.LineString import org.locationtech.jts.geom.Point import org.oscim.core.GeoPoint interface OnNaviEngineCallbackListener { - fun planningPathStatus(code: NaviStatus) + fun planningPathStatus(code: NaviStatus, linkdId: String? = null, geometry: String? = null) // fun planningPathError(errorCode: NaviStatus, errorMessage: String) suspend fun bindingResults(route: NaviRoute?, list: List) + } enum class NaviStatus { @@ -205,9 +207,12 @@ class NaviEngine( callback.planningPathStatus(NaviStatus.NAVI_STATUS_PATH_PLANNING) val pathList = mutableListOf() val realm = realmOperateHelper.getSelectTaskRealmInstance() - for (link in taskBean.hadLinkDvoList) { + Log.e("jingo", "路径计算 条数 ${taskBean.hadLinkDvoList.size}") + for (i in 0 until taskBean.hadLinkDvoList.size) { + val link = taskBean.hadLinkDvoList[i] + Log.e("jingo","获取 S E $i 总共 ${taskBean.hadLinkDvoList.size}") //测线不参与导航 - if (link.linkStatus == 3) { + if (link!!.linkStatus == 3) { continue } val route = NaviRoute( @@ -255,13 +260,17 @@ class NaviEngine( } if (!bHasNode) { callback.planningPathStatus( - NaviStatus.NAVI_STATUS_PATH_ERROR_NODE + NaviStatus.NAVI_STATUS_PATH_ERROR_NODE, + link.linkPid, + link.geometry ) return } if (!bHasDir) { callback.planningPathStatus( - NaviStatus.NAVI_STATUS_PATH_ERROR_DIRECTION + NaviStatus.NAVI_STATUS_PATH_ERROR_DIRECTION, + link!!.linkPid, + link.geometry ) return } @@ -346,7 +355,9 @@ class NaviEngine( if (!bHasLast && !bHasNext) { bBreak = false callback.planningPathStatus( - NaviStatus.NAVI_STATUS_PATH_ERROR_BLOCKED + NaviStatus.NAVI_STATUS_PATH_ERROR_BLOCKED, + tempRouteList[0].linkId, + GeometryTools.getLineString(tempRouteList[0].pointList) ) realm.close() return @@ -356,7 +367,9 @@ class NaviEngine( val itemMap: MutableMap> = mutableMapOf() //查询每根link上的关联要素 - for (route in newRouteList) { + for (i in newRouteList.indices) { + val route = newRouteList[i] + Log.e("jingo","获取 插入要素 $i 总共 ${newRouteList.size}") itemMap.clear() //常规点限速 val res = realm.where(RenderEntity::class.java) From 7a99a9d0fb1a6e22eb519e041e0a8dd7cebb33e3 Mon Sep 17 00:00:00 2001 From: xiaoyan Date: Thu, 19 Oct 2023 09:56:42 +0800 Subject: [PATCH 2/7] =?UTF-8?q?fix:=20=E5=B0=86=E6=95=B0=E6=8D=AE=E7=9A=84?= =?UTF-8?q?linkPid=E6=8F=90=E5=88=B0=E5=A4=96=E8=BE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/assets/omdb_config.json | 10 ++- .../com/navinfo/omqs/db/ImportOMDBHelper.kt | 35 ++++++++- .../com/navinfo/omqs/db/ImportPreProcess.kt | 76 +++++++++++++++---- .../omqs/ui/activity/login/LoginViewModel.kt | 21 ++++- .../library/data/entity/LinkRelation.kt | 33 ++++++++ .../library/data/entity/RenderEntity.kt | 2 + 6 files changed, 158 insertions(+), 19 deletions(-) create mode 100644 collect-library/src/main/java/com/navinfo/collect/library/data/entity/LinkRelation.kt diff --git a/app/src/main/assets/omdb_config.json b/app/src/main/assets/omdb_config.json index 1adbb1ba..89c49505 100644 --- a/app/src/main/assets/omdb_config.json +++ b/app/src/main/assets/omdb_config.json @@ -59,7 +59,15 @@ "name": "道路方向", "zoomMin": 15, "zoomMax": 17, - "checkLinkId": false + "checkLinkId": false, + "transformer": [ + { + "k": "geometry", + "v": "~", + "klib": "geometry", + "vlib": "addRdLinkDirect()" + } + ] }, "2011": { "table": "OMDB_LINK_NAME", 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 24cc8c0f..65ae1278 100644 --- a/app/src/main/java/com/navinfo/omqs/db/ImportOMDBHelper.kt +++ b/app/src/main/java/com/navinfo/omqs/db/ImportOMDBHelper.kt @@ -11,6 +11,7 @@ import com.blankj.utilcode.util.ZipUtils import com.google.gson.Gson import com.google.gson.reflect.TypeToken import com.navinfo.collect.library.data.entity.HadLinkDvoBean +import com.navinfo.collect.library.data.entity.LinkRelation import com.navinfo.collect.library.data.entity.RenderEntity import com.navinfo.collect.library.data.entity.TaskBean import com.navinfo.collect.library.enums.DataCodeEnum @@ -257,6 +258,25 @@ class ImportOMDBHelper @AssistedInject constructor( renderEntity.taskId = task.id renderEntity.zoomMin = map["qi_zoomMin"].toString().toInt() renderEntity.zoomMax = map["qi_zoomMax"].toString().toInt() + // 在外层记录当前数据的linkPid + if (renderEntity.properties.containsKey("linkPid")) { + renderEntity.linkPid = + renderEntity.properties["linkPid"]?.split(",")?.get(0) + .toString() + } else if (renderEntity.properties.containsKey("linkList")){ + val linkList = + renderEntity.properties["linkList"] + if (!linkList.isNullOrEmpty() && linkList != "null") { + val list: List = gson.fromJson( + linkList, + object : + TypeToken>() {}.type + ) + if (list != null) { + renderEntity.linkPid = list[0].linkPid + } + } + } renderEntity.geometry = map["geometry"].toString() Log.d("ImportOMDBHelper", "解析===1处理3D") @@ -748,6 +768,16 @@ class ImportOMDBHelper @AssistedInject constructor( if (renderEntity.properties.containsKey("geometry")) { renderEntity.properties.remove("geometry") } + + // 如果当前解析的是OMDB_RD_LINK数据,将其缓存在预处理类中,以便后续处理其他要素时使用 + if (currentConfig.code == DataCodeEnum.OMDB_RD_LINK.code.toInt()) { + if (renderEntity.linkRelation == null) { + renderEntity.linkRelation = LinkRelation() + } + renderEntity.linkRelation!!.sNodeId = renderEntity.properties["snodePid"] + renderEntity.linkRelation!!.eNodeId = renderEntity.properties["enodePid"] + } + Log.d("ImportOMDBHelper", "解析===1insert") Realm.getInstance(currentInstallTaskConfig) .insert(renderEntity) @@ -762,8 +792,9 @@ class ImportOMDBHelper @AssistedInject constructor( // 如果当前解析的是OMDB_RD_LINK数据,将其缓存在预处理类中,以便后续处理其他要素时使用 if (currentConfig.code == DataCodeEnum.OMDB_RD_LINK.code.toInt()) { - importConfig.preProcess.cacheRdLink = - listResult.associateBy { it.properties["linkPid"] } +// importConfig.preProcess.cacheRdLink = +// listResult.associateBy { it.properties["linkPid"] } + // 将sNodeId和eNodeId放在外层关联对象中,优化查询效率 } // 1个文件发送一次flow流 emit("${processIndex}/${tableNum}") diff --git a/app/src/main/java/com/navinfo/omqs/db/ImportPreProcess.kt b/app/src/main/java/com/navinfo/omqs/db/ImportPreProcess.kt index 438319c8..ca0d695e 100644 --- a/app/src/main/java/com/navinfo/omqs/db/ImportPreProcess.kt +++ b/app/src/main/java/com/navinfo/omqs/db/ImportPreProcess.kt @@ -1,8 +1,10 @@ package com.navinfo.omqs.db import android.util.Log +import com.navinfo.collect.library.data.entity.LinkRelation import com.navinfo.collect.library.data.entity.ReferenceEntity import com.navinfo.collect.library.data.entity.RenderEntity +import com.navinfo.collect.library.enums.DataCodeEnum import com.navinfo.collect.library.utils.GeometryTools import com.navinfo.omqs.Constant import io.realm.Realm @@ -17,27 +19,41 @@ import org.oscim.core.GeoPoint class ImportPreProcess { val code2NameMap = Code2NameMap() - lateinit var cacheRdLink: Map +// lateinit var cacheRdLink: Map val defaultTranslateDistance = 3.0 val testFlag: Boolean = false fun checkCircleRoad(renderEntity: RenderEntity): Boolean { val linkInId = renderEntity.properties["linkIn"] val linkOutId = renderEntity.properties["linkOut"] - // 根据linkIn和linkOut获取对应的link数据 - val linkInEntity = cacheRdLink[linkInId] - val linkOutEntity = cacheRdLink[linkOutId] - Log.d( - "checkCircleRoad", - "LinkInEntity: ${linkInId}- ${linkInEntity?.properties?.get("snodePid")},LinkOutEntity: ${linkOutId}- ${ - linkOutEntity?.properties?.get("enodePid") - }" - ) - // 查询linkIn的sNode和linkOut的eNode是否相同,如果相同,认为数据是环形路口,返回false - if (linkInEntity != null && linkOutEntity != null) { - if (linkInEntity.properties["snodePid"] == linkOutEntity.properties["enodePid"] || linkInEntity.properties["enodePid"] == linkOutEntity.properties["snodePid"] || linkInEntity.properties["snodePid"] == linkOutEntity.properties["snodePid"] || linkInEntity.properties["enodePid"] == linkOutEntity.properties["enodePid"]) { - return false +// // 根据linkIn和linkOut获取对应的link数据 +// val linkInEntity = cacheRdLink[linkInId] +// val linkOutEntity = cacheRdLink[linkOutId] + + // 根据linkIn和linkOut从数据库获取对应的link数据 + Realm.getInstance(Constant.currentInstallTaskConfig) + .use { realm -> + val linkInEntity = realm.where(RenderEntity::class.java) + .equalTo("code", DataCodeEnum.OMDB_RD_LINK.code) + .and().equalTo("linkPid", linkInId) + .findFirst() + val linkOutEntity = realm.where(RenderEntity::class.java) + .equalTo("code", DataCodeEnum.OMDB_RD_LINK.code) + .and().equalTo("linkPid", linkOutId) + .findFirst() + + Log.d( + "checkCircleRoad", + "LinkInEntity: ${linkInId}- ${linkInEntity?.properties?.get("snodePid")},LinkOutEntity: ${linkOutId}- ${ + linkOutEntity?.properties?.get("enodePid") + }" + ) + // 查询linkIn的sNode和linkOut的eNode是否相同,如果相同,认为数据是环形路口,返回false + if (linkInEntity != null && linkOutEntity != null) { + if (linkInEntity.properties["snodePid"] == linkOutEntity.properties["enodePid"] || linkInEntity.properties["enodePid"] == linkOutEntity.properties["snodePid"] || linkInEntity.properties["snodePid"] == linkOutEntity.properties["snodePid"] || linkInEntity.properties["enodePid"] == linkOutEntity.properties["enodePid"]) { + return false + } + } } - } return true } @@ -566,6 +582,36 @@ class ImportPreProcess { } else { renderEntity.properties["name"] = "" } + // 同时尝试更新RD_link的relation记录中的名称字段 + val rdLinkEntity = queryRdLink(renderEntity.properties["linkPid"]!!) + if (rdLinkEntity?.linkRelation == null) { + rdLinkEntity?.linkRelation = LinkRelation() + } + rdLinkEntity?.linkRelation?.linkName = renderEntity.properties["name"] + Realm.getInstance(Constant.currentInstallTaskConfig).insertOrUpdate(rdLinkEntity) + } + + /** + * 通过rdDirect对象向rdLink的relation字段 + * */ + fun addRdLinkDirect(renderEntity: RenderEntity) { + // 尝试更新RD_link的relation记录中的方向字段 + val rdLinkEntity = queryRdLink(renderEntity.properties["linkPid"]!!) + if (rdLinkEntity?.linkRelation == null) { + rdLinkEntity?.linkRelation = LinkRelation() + } + rdLinkEntity?.linkRelation?.direct = renderEntity.properties["direct"]!!.toInt() + Realm.getInstance(Constant.currentInstallTaskConfig).insertOrUpdate(rdLinkEntity) + } + + /** + * 查询指定的Rdlink数据 + * */ + fun queryRdLink(rdLinkId: String): RenderEntity? { + return Realm.getInstance(Constant.currentInstallTaskConfig).where(RenderEntity::class.java) + .equalTo("code", DataCodeEnum.OMDB_RD_LINK.code) + .and().equalTo("linkPid", rdLinkId) + .findFirst() } /** diff --git a/app/src/main/java/com/navinfo/omqs/ui/activity/login/LoginViewModel.kt b/app/src/main/java/com/navinfo/omqs/ui/activity/login/LoginViewModel.kt index 037b2e97..d5c76bce 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/activity/login/LoginViewModel.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/activity/login/LoginViewModel.kt @@ -8,10 +8,13 @@ import android.widget.Toast import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope +import androidx.room.migration.Migration +import androidx.sqlite.db.SupportSQLiteDatabase import com.blankj.utilcode.util.FileIOUtils import com.blankj.utilcode.util.ResourceUtils import com.google.gson.Gson import com.google.gson.reflect.TypeToken +import com.navinfo.collect.library.data.entity.LinkRelation import com.navinfo.collect.library.data.entity.RenderEntity import com.navinfo.collect.library.data.entity.TaskBean import com.navinfo.collect.library.utils.GeometryTools @@ -27,6 +30,8 @@ import com.navinfo.omqs.util.DateTimeUtil import dagger.hilt.android.lifecycle.HiltViewModel import io.realm.Realm import io.realm.RealmConfiguration +import io.realm.RealmMigration +import io.realm.RealmSchema import kotlinx.coroutines.* import java.io.File import java.io.IOException @@ -432,7 +437,8 @@ class LoginViewModel @Inject constructor( .name("OMQS.realm") .encryptionKey(Constant.PASSWORD) .allowQueriesOnUiThread(true) - .schemaVersion(2) + .schemaVersion(3) +// .migration(migration) .build() Realm.setDefaultConfiguration(config) // 拷贝配置文件到用户目录下 @@ -458,4 +464,17 @@ class LoginViewModel @Inject constructor( private fun byteArrayToHexString(byteArray: ByteArray): String { return byteArray.joinToString("") { "%02x".format(it) } } + + val migration : RealmMigration = RealmMigration { + realm, oldVersion, newVersion -> { + if (oldVersion == 2L && newVersion == 3L) { + // DynamicRealm exposes an editable schema + val schema: RealmSchema = realm.schema + if (!schema.get("RenderEntity")!!.hasField("linkPid")) { + schema.get("RenderEntity") + ?.addField("linkPid", String::class.java) + } + } + } + } } \ No newline at end of file diff --git a/collect-library/src/main/java/com/navinfo/collect/library/data/entity/LinkRelation.kt b/collect-library/src/main/java/com/navinfo/collect/library/data/entity/LinkRelation.kt new file mode 100644 index 00000000..1ee3fb8f --- /dev/null +++ b/collect-library/src/main/java/com/navinfo/collect/library/data/entity/LinkRelation.kt @@ -0,0 +1,33 @@ +package com.navinfo.collect.library.data.entity + +import android.os.Parcelable +import com.navinfo.collect.library.system.Constant +import com.navinfo.collect.library.utils.GeometryTools +import com.navinfo.collect.library.utils.GeometryToolsKt +import io.realm.RealmDictionary +import io.realm.RealmObject +import io.realm.RealmSet +import io.realm.annotations.Ignore +import io.realm.annotations.PrimaryKey +import kotlinx.parcelize.Parcelize +import org.locationtech.jts.geom.Coordinate +import org.locationtech.jts.geom.Geometry +import org.oscim.core.MercatorProjection +import java.util.* + +/** + * 渲染要素对应的实体 + * */ +@Parcelize +open class LinkRelation() : RealmObject(), Parcelable { + @PrimaryKey + var id: String = UUID.randomUUID().toString() // id + var sNodeId: String? = null + var eNodeId: String? = null + var linkName: String? = null + var direct: Int = 0 + + constructor(direct: Int) : this() { + this.direct = direct + } +} \ 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 deeade38..ee0632cd 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 @@ -63,6 +63,8 @@ open class RenderEntity() : RealmObject(), Parcelable { var zoomMax: Int = 23 //显示最大级别 var enable:Int = 0 // 默认0不是显示 1为渲染显示 2为常显 var catchEnable:Int = 0 // 0不捕捉 1捕捉 + lateinit var linkPid: String // RenderEntity关联的linkPid集合(可能会关联多个) + var linkRelation: LinkRelation? = null constructor(name: String) : this() { this.name = name From 129c48f11d8db510635bca584cc6c60710fc6be9 Mon Sep 17 00:00:00 2001 From: squallzhjch Date: Thu, 19 Oct 2023 14:47:15 +0800 Subject: [PATCH 3/7] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=BA=93=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/navinfo/omqs/db/ImportOMDBHelper.kt | 2 +- .../omqs/ui/activity/login/LoginViewModel.kt | 2 +- .../omqs/ui/activity/map/MainViewModel.kt | 175 ++++++++++-------- .../ui/fragment/tasklist/TaskViewModel.kt | 3 +- .../com/navinfo/omqs/util/NaviEngineNew.kt | 96 ++++++++++ .../library/data/entity/ReferenceEntity.kt | 11 +- .../library/data/entity/RenderEntity.kt | 12 ++ .../map/handler/LocationLayerHandler.kt | 1 - .../map/source/OMDBReferenceDataSource.java | 28 +-- .../map/source/OMDBTileDataSource.java | 130 +++++++++++-- 10 files changed, 352 insertions(+), 108 deletions(-) create mode 100644 app/src/main/java/com/navinfo/omqs/util/NaviEngineNew.kt 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 24cc8c0f..4129f1de 100644 --- a/app/src/main/java/com/navinfo/omqs/db/ImportOMDBHelper.kt +++ b/app/src/main/java/com/navinfo/omqs/db/ImportOMDBHelper.kt @@ -154,7 +154,7 @@ class ImportOMDBHelper @AssistedInject constructor( .directory(currentInstallTaskFolder) .name("OMQS.realm") .encryptionKey(Constant.PASSWORD) - .allowQueriesOnUiThread(true) +// .allowQueriesOnUiThread(true) .schemaVersion(2) .build() val unZipFolder = File(omdbZipFile.parentFile, "result") diff --git a/app/src/main/java/com/navinfo/omqs/ui/activity/login/LoginViewModel.kt b/app/src/main/java/com/navinfo/omqs/ui/activity/login/LoginViewModel.kt index 037b2e97..1a8dfacc 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/activity/login/LoginViewModel.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/activity/login/LoginViewModel.kt @@ -431,7 +431,7 @@ class LoginViewModel @Inject constructor( .directory(userFolder) .name("OMQS.realm") .encryptionKey(Constant.PASSWORD) - .allowQueriesOnUiThread(true) +// .allowQueriesOnUiThread(true) .schemaVersion(2) .build() Realm.setDefaultConfiguration(config) 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 8f79c704..3b51016a 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 @@ -50,7 +50,9 @@ import io.realm.Realm import io.realm.RealmConfiguration import io.realm.RealmSet import kotlinx.coroutines.* +import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.collectLatest +import kotlinx.coroutines.flow.flow import kotlinx.coroutines.sync.Mutex import org.locationtech.jts.geom.Geometry import org.oscim.core.GeoPoint @@ -239,11 +241,14 @@ class MainViewModel @Inject constructor( //导航信息 private var naviEngine: NaviEngine? = null + private var naviEngineNew: NaviEngineNew = NaviEngineNew(realmOperateHelper) + // 0:不导航 1:导航 2:暂停 private var naviEngineStatus = 0 // 定义一个互斥锁 private val naviMutex = Mutex() + private var testRealm: Realm? = null; init { mapController.mMapView.vtmMap.events.bind(Map.UpdateListener { e, mapPosition -> @@ -336,32 +341,44 @@ class MainViewModel @Inject constructor( File(Constant.USER_DATA_PATH + "/${MapParamUtils.getTaskId()}") Constant.currentSelectTaskConfig = RealmConfiguration.Builder().directory(Constant.currentSelectTaskFolder) - .name("OMQS.realm").encryptionKey(Constant.PASSWORD).allowQueriesOnUiThread(true) + .name("OMQS.realm").encryptionKey(Constant.PASSWORD) +// .allowQueriesOnUiThread(true) .schemaVersion(2).build() MapParamUtils.setTaskConfig(Constant.currentSelectTaskConfig) socketServer = SocketServer(mapController, traceDataBase, sharedPreferences) -// viewModelScope.launch(Dispatchers.Default) { -// naviTestFlow().collect { point -> -// if (naviEngineStatus == 1) { -// naviEngine?.let { + viewModelScope.launch(Dispatchers.IO) { + + naviTestFlow().collect { point -> + if (naviEngineStatus == 1) { + naviEngineNew.let { // naviMutex.lock() + Log.e("jingo","${Thread.currentThread().name} ${Thread.currentThread().hashCode()}") + if (testRealm == null) + testRealm = realmOperateHelper.getSelectTaskRealmInstance() + if (currentTaskBean != null) { + naviEngineNew.bindingRoute( + taskBean = currentTaskBean!!, + geoPoint = point, + realm = testRealm!! + ) + } // it.bindingRoute(null, point) // naviMutex.unlock() -// } -// } -// } -// } + } + } + } + } } -// fun naviTestFlow(): Flow = flow { -// -// while (true) { -// emit(mapController.mMapView.vtmMap.mapPosition.geoPoint) -// delay(1000) -// } -// } + fun naviTestFlow(): Flow = flow { + + while (true) { + emit(mapController.mMapView.vtmMap.mapPosition.geoPoint) + delay(5000) + } + } /** * 获取当前任务 @@ -559,62 +576,62 @@ class MainViewModel @Inject constructor( viewModelScope.launch(Dispatchers.Default) { //用于定位点捕捉道路 mapController.locationLayerHandler.niLocationFlow.collect { location -> - - //过滤掉无效点 - if (!naviLocationTest && !GeometryTools.isCheckError( - location.longitude, - location.latitude - ) - ) { - val geometry = GeometryTools.createGeometry( - GeoPoint( - location.latitude, location.longitude - ) - ) - val tileX = RealmSet() - GeometryToolsKt.getTileXByGeometry(geometry.toString(), tileX) - val tileY = RealmSet() - GeometryToolsKt.getTileYByGeometry(geometry.toString(), tileY) - - //遍历存储tile对应的x与y的值 - tileX.forEach { x -> - tileY.forEach { y -> - location.tilex = x - location.tiley = y - } - } - location.groupId = uuid - try { - location.timeStamp = DateTimeUtil.getTime(location.time).toString() - } catch (e: Exception) { - - } - - location.taskId = - sharedPreferences.getInt(Constant.SELECT_TASK_ID, -1).toString() - - //判断如果是连接状态并处于录像模式,标记为有效点 - if (shareUtil?.connectstate == true && shareUtil?.takeCameraMode == 0) { - location.media = 1 - } - var disance = 0.0 - //增加间距判断 - if (lastNiLocaion != null) { - disance = GeometryTools.getDistance( - location.latitude, - location.longitude, - lastNiLocaion!!.latitude, - lastNiLocaion!!.longitude - ) - } - //室内整理工具时不能进行轨迹存储,判断轨迹间隔要超过2.5并小于60米 - if (Constant.INDOOR_IP.isEmpty() && (disance == 0.0 || (disance > 2.5 && disance < 60))) { - traceDataBase.niLocationDao.insert(location) - mapController.markerHandle.addNiLocationMarkerItem(location) - mapController.mMapView.vtmMap.updateMap(true) - lastNiLocaion = location - } - } +// +// //过滤掉无效点 +// if (!naviLocationTest && !GeometryTools.isCheckError( +// location.longitude, +// location.latitude +// ) +// ) { +// val geometry = GeometryTools.createGeometry( +// GeoPoint( +// location.latitude, location.longitude +// ) +// ) +// val tileX = RealmSet() +// GeometryToolsKt.getTileXByGeometry(geometry.toString(), tileX) +// val tileY = RealmSet() +// GeometryToolsKt.getTileYByGeometry(geometry.toString(), tileY) +// +// //遍历存储tile对应的x与y的值 +// tileX.forEach { x -> +// tileY.forEach { y -> +// location.tilex = x +// location.tiley = y +// } +// } +// location.groupId = uuid +// try { +// location.timeStamp = DateTimeUtil.getTime(location.time).toString() +// } catch (e: Exception) { +// +// } +// +// location.taskId = +// sharedPreferences.getInt(Constant.SELECT_TASK_ID, -1).toString() +// +// //判断如果是连接状态并处于录像模式,标记为有效点 +// if (shareUtil?.connectstate == true && shareUtil?.takeCameraMode == 0) { +// location.media = 1 +// } +// var disance = 0.0 +// //增加间距判断 +// if (lastNiLocaion != null) { +// disance = GeometryTools.getDistance( +// location.latitude, +// location.longitude, +// lastNiLocaion!!.latitude, +// lastNiLocaion!!.longitude +// ) +// } +// //室内整理工具时不能进行轨迹存储,判断轨迹间隔要超过2.5并小于60米 +// if (Constant.INDOOR_IP.isEmpty() && (disance == 0.0 || (disance > 2.5 && disance < 60))) { +// traceDataBase.niLocationDao.insert(location) +// mapController.markerHandle.addNiLocationMarkerItem(location) +// mapController.mMapView.vtmMap.updateMap(true) +// lastNiLocaion = location +// } +// } } } @@ -636,11 +653,11 @@ class MainViewModel @Inject constructor( naviEngine!!.bindingRoute(location, point) naviMutex.unlock() } else { - captureLink( - GeoPoint( - location.latitude, location.longitude - ) - ) +// captureLink( +// GeoPoint( +// location.latitude, location.longitude +// ) +// ) } } } @@ -983,6 +1000,7 @@ class MainViewModel @Inject constructor( if (!hisRoadName) { liveDataRoadName.postValue(null) } + Log.e("jingo", "另一个地方查询数据库") realm.close() } } catch (e: Exception) { @@ -1001,6 +1019,7 @@ class MainViewModel @Inject constructor( mapPosition.setBearing(0f) // 锁定角度,自动将地图旋转到正北方向 mapController.mMapView.vtmMap.setMapPosition(mapPosition) mapController.locationLayerHandler.animateToCurrentPosition() + naviEngineStatus = 1 } /** @@ -1677,7 +1696,7 @@ class MainViewModel @Inject constructor( val tempTime = nowTime - lastTime if (tempTime > 10000) { liveDataMessage.postValue("下个定位点与当前定位点时间间隔超过10秒(${tempTime}),将直接跳转到下个点") - delay(5000) + delay(2000) } else { delay(tempTime) } diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskViewModel.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskViewModel.kt index 358f63c7..1ca96f20 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskViewModel.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskViewModel.kt @@ -276,7 +276,8 @@ class TaskViewModel @Inject constructor( Constant.currentSelectTaskFolder = File(Constant.USER_DATA_PATH + "/${taskBean.id}") Constant.currentSelectTaskConfig = RealmConfiguration.Builder().directory(Constant.currentSelectTaskFolder) - .name("OMQS.realm").encryptionKey(Constant.PASSWORD).allowQueriesOnUiThread(true) + .name("OMQS.realm").encryptionKey(Constant.PASSWORD) + //.allowQueriesOnUiThread(true) .schemaVersion(2).build() MapParamUtils.setTaskConfig(Constant.currentSelectTaskConfig) mapController.layerManagerHandler.updateOMDBVectorTileLayer() diff --git a/app/src/main/java/com/navinfo/omqs/util/NaviEngineNew.kt b/app/src/main/java/com/navinfo/omqs/util/NaviEngineNew.kt new file mode 100644 index 00000000..73e20fd9 --- /dev/null +++ b/app/src/main/java/com/navinfo/omqs/util/NaviEngineNew.kt @@ -0,0 +1,96 @@ +package com.navinfo.omqs.util + +import android.os.Build +import android.util.Log +import androidx.annotation.RequiresApi +import com.navinfo.collect.library.data.entity.HadLinkDvoBean +import com.navinfo.collect.library.data.entity.NiLocation +import com.navinfo.collect.library.data.entity.RenderEntity +import com.navinfo.collect.library.data.entity.TaskBean +import com.navinfo.collect.library.enums.DataCodeEnum +import com.navinfo.collect.library.utils.FootAndDistance +import com.navinfo.collect.library.utils.GeometryTools +import com.navinfo.omqs.db.RealmOperateHelper +import io.realm.Realm +import org.oscim.core.GeoPoint +import java.time.LocalDate +import java.time.LocalDateTime + +class NaviEngineNew( + private val realmOperateHelper: RealmOperateHelper, +) { + /** + * 要查询的link基本信息列表 + */ + private val QUERY_KEY_LINK_INFO_LIST = arrayOf( + DataCodeEnum.OMDB_RD_LINK.name, + DataCodeEnum.OMDB_LINK_DIRECT.name, + DataCodeEnum.OMDB_LINK_NAME.name, + ) + + + private val locationList = mutableListOf() + + + suspend fun bindingRoute( + niLocation: NiLocation? = null, + taskBean: TaskBean, + geoPoint: GeoPoint, + realm:Realm + ) { +// val geoPoint = GeoPoint(niLocation.latitude, niLocation.longitude) + var latestRoute: HadLinkDvoBean? = null + var lastDis = -1.0 + + for (link in taskBean.hadLinkDvoList) { + val linkGeometry = GeometryTools.createGeometry(link.geometry) + val footAndDistance = GeometryTools.pointToLineDistance(geoPoint, linkGeometry) + val meterD = footAndDistance.getMeterDistance() + if (meterD < 15 && (lastDis < 0 || lastDis > meterD)) { + latestRoute = link + lastDis = meterD + } + } + + + latestRoute?.let { + var lastTime = System.currentTimeMillis() + + var nowTime = System.currentTimeMillis() + Log.e("jingo","打开数据库 ${nowTime - lastTime}") + lastTime = nowTime + val res2 = + realm.where(RenderEntity::class.java).`in`("table", QUERY_KEY_LINK_INFO_LIST) + .equalTo("properties['linkPid']", it.linkPid).findAll() + nowTime = System.currentTimeMillis() + Log.e("jingo", "第一种 耗时 ${nowTime - lastTime}") + if (res2 != null) { + for (entity in res2) { + when (entity.code) { + DataCodeEnum.OMDB_RD_LINK.code -> { + val snodePid = entity.properties["snodePid"] + if (snodePid != null) { + } else { + } + val enodePid = entity.properties["enodePid"] + if (enodePid != null) { + } else { + } + } + DataCodeEnum.OMDB_LINK_DIRECT.code -> { + val direct = entity.properties["direct"] + if (direct != null) { + } + } + DataCodeEnum.OMDB_LINK_NAME.code -> { +// var name = realm.copyFromRealm(res4) + } + } + } + + } + + } + + } +} \ No newline at end of file diff --git a/collect-library/src/main/java/com/navinfo/collect/library/data/entity/ReferenceEntity.kt b/collect-library/src/main/java/com/navinfo/collect/library/data/entity/ReferenceEntity.kt index 07d2917b..1e509da0 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/data/entity/ReferenceEntity.kt +++ b/collect-library/src/main/java/com/navinfo/collect/library/data/entity/ReferenceEntity.kt @@ -24,7 +24,10 @@ open class ReferenceEntity() : RealmObject() { var zoomMax: Int = 23 //显示最大级别 var taskId: Int = 0 //任务ID var enable:Int = 0 // 默认0不是显示 1为渲染显示 - + var tileXMin:Int =0 + var tileXMax:Int = 0 + var tileYMin:Int =0 + var tileYMax:Int = 0 var geometry: String = "" // 要素渲染参考的geometry,该数据可能会在导入预处理环节被修改,原始geometry会保存在properties的geometry字段下 get() { wkt = GeometryTools.createGeometry(field) @@ -34,7 +37,13 @@ open class ReferenceEntity() : RealmObject() { field = value // 根据geometry自动计算当前要素的x-tile和y-tile GeometryToolsKt.getTileXByGeometry(value, tileX) + tileXMin = tileX.min() + tileXMax = tileX.max() + GeometryToolsKt.getTileYByGeometry(value, tileY) + + tileYMin = tileY.min() + tileYMax = tileY.max() // 根据传入的geometry文本,自动转换为Geometry对象 try { wkt = GeometryTools.createGeometry(value) 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 deeade38..0a33336e 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 @@ -34,7 +34,15 @@ open class RenderEntity() : RealmObject(), Parcelable { field = value // 根据geometry自动计算当前要素的x-tile和y-tile GeometryToolsKt.getTileXByGeometry(value, tileX) + + tileXMin = tileX.min() + tileXMax = tileX.max() + GeometryToolsKt.getTileYByGeometry(value, tileY) + + tileYMin = tileY.min() + tileYMax = tileY.max() + // 根据传入的geometry文本,自动转换为Geometry对象 try { wkt = GeometryTools.createGeometry(value) @@ -58,6 +66,10 @@ open class RenderEntity() : RealmObject(), Parcelable { var properties: RealmDictionary = RealmDictionary() var tileX: RealmSet = RealmSet() // x方向的tile编码 var tileY: RealmSet = RealmSet() // y方向的tile编码 + var tileXMin:Int =0 + var tileXMax:Int = 0 + var tileYMin:Int =0 + var tileYMax:Int = 0 var taskId: Int = 0 //任务ID var zoomMin: Int = 18 //显示最小级别 var zoomMax: Int = 23 //显示最大级别 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 a44d100f..cddaf7d9 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 @@ -224,7 +224,6 @@ private class MyLocationListener(callback: (BDLocation) -> Unit) : BDAbstractLoc val call = callback; override fun onReceiveLocation(location: BDLocation) { call(location) - Log.e("jingo", "定位结果:速度=" + location.speed + " 方向=" + location.direction) } } diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBReferenceDataSource.java b/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBReferenceDataSource.java index 61a0334b..44a128e9 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBReferenceDataSource.java +++ b/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBReferenceDataSource.java @@ -6,6 +6,7 @@ import android.util.Log; import androidx.annotation.RequiresApi; import com.navinfo.collect.library.data.entity.ReferenceEntity; +import com.navinfo.collect.library.data.entity.RenderEntity; import com.navinfo.collect.library.system.Constant; import com.navinfo.collect.library.utils.GeometryTools; import com.navinfo.collect.library.utils.MapParamUtils; @@ -17,6 +18,7 @@ import org.oscim.tiling.ITileDataSink; import org.oscim.tiling.ITileDataSource; import org.oscim.tiling.QueryResult; +import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; @@ -43,12 +45,14 @@ public class OMDBReferenceDataSource implements ITileDataSource { public void query(MapTile tile, ITileDataSink mapDataSink) { // 获取tile对应的坐标范围 if (tile.zoomLevel >= Constant.OMDB_MIN_ZOOM && tile.zoomLevel <= Constant.DATA_ZOOM) { + Realm realm = Realm.getInstance(MapParamUtils.getTaskConfig()); + RealmQuery realmQuery = realm.where(ReferenceEntity.class); int m = Constant.DATA_ZOOM - tile.zoomLevel; int xStart = tile.tileX; int xEnd = tile.tileX + 1; int yStart = tile.tileY; int yEnd = tile.tileY + 1; - if (m>0) { + if (m > 0) { xStart = (int) (xStart << m); xEnd = (int) (xEnd << m); yStart = (int) (yStart << m); @@ -56,21 +60,22 @@ public class OMDBReferenceDataSource implements ITileDataSource { } final int currentTileX = xStart; - if(isUpdate){ - Realm.getInstance(MapParamUtils.getTaskConfig()).refresh(); + if (isUpdate) { + realm.refresh(); isUpdate = false; } - String sql = " tileX>=" + xStart + " and tileX<=" + xEnd + " and tileY>=" + yStart + " and tileY<=" + yEnd + ""; + String sql = " ((tileXMin <= " + xStart + " and tileXMax >= " + xStart + ") or (tileXMin <=" + xEnd + " and tileXMax >=" + xStart + ")) and ((tileYMin <= " + yStart + " and tileYMax >= " + yStart + ") or (tileYMin <=" + yEnd + " and tileYMin >=" + yStart + "))"; - if(MapParamUtils.getDataLayerEnum()!=null){ +// String sql = " tileX>=" + xStart + " and tileX<=" + xEnd + " and tileY>=" + yStart + " and tileY<=" + yEnd + ""; + + if (MapParamUtils.getDataLayerEnum() != null) { sql += " and enable" + MapParamUtils.getDataLayerEnum().getSql(); - }else{ + } else { sql += " and enable>=0"; } - RealmQuery realmQuery = Realm.getInstance(MapParamUtils.getTaskConfig()).where(ReferenceEntity.class) - .rawPredicate(sql); + realmQuery.rawPredicate(sql); // 筛选不显示的数据 if (Constant.HAD_LAYER_INVISIABLE_ARRAY != null && Constant.HAD_LAYER_INVISIABLE_ARRAY.length > 0) { realmQuery.beginGroup(); @@ -91,10 +96,11 @@ public class OMDBReferenceDataSource implements ITileDataSource { } else { mapDataSink.completed(QueryResult.SUCCESS); } - Realm.getInstance(MapParamUtils.getTaskConfig()).close(); + realm.close(); } else { mapDataSink.completed(QueryResult.SUCCESS); } + } @Override @@ -109,8 +115,8 @@ public class OMDBReferenceDataSource implements ITileDataSource { } } - public void update(){ + public void update() { isUpdate = true; - Log.e("qj",Thread.currentThread().getName()); + Log.e("qj", Thread.currentThread().getName()); } } diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBTileDataSource.java b/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBTileDataSource.java index c6e5be22..41022674 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBTileDataSource.java +++ b/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBTileDataSource.java @@ -11,21 +11,45 @@ import com.navinfo.collect.library.utils.GeometryTools; import com.navinfo.collect.library.utils.MapParamUtils; import org.locationtech.jts.geom.Polygon; +import org.oscim.core.MapPosition; import org.oscim.layers.tile.MapTile; +import org.oscim.map.Map; import org.oscim.map.Viewport; import org.oscim.tiling.ITileDataSink; import org.oscim.tiling.ITileDataSource; import org.oscim.tiling.QueryResult; +import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.stream.Collectors; import io.realm.Realm; +import io.realm.RealmConfiguration; import io.realm.RealmQuery; public class OMDBTileDataSource implements ITileDataSource { + + class RealmObject { + int threadCode; + int realmConfigCode; + Realm realm; + } + +// class DataObject { +// int threadCode = 0; +// byte zoom = 0; +// String lonLat = ""; +// List listIds = new ArrayList<>(); +// } + private boolean isUpdate; private Viewport viewport; + + private List realmObjectList = new ArrayList<>(); + +// private List dataObjectList = new ArrayList<>(); + private final ThreadLocal mThreadLocalDecoders = new ThreadLocal() { @Override protected OMDBDataDecoder initialValue() { @@ -42,12 +66,46 @@ public class OMDBTileDataSource implements ITileDataSource { public void query(MapTile tile, ITileDataSink mapDataSink) { // 获取tile对应的坐标范围 if (tile.zoomLevel >= Constant.OMDB_MIN_ZOOM && tile.zoomLevel <= Constant.DATA_ZOOM) { + Realm realm = null; + int threadCode = Thread.currentThread().hashCode(); +// MapPosition pos = new MapPosition(); +// viewport.getMapPosition(pos); +// DataObject newDataObject = new DataObject(); +// newDataObject.zoom = tile.zoomLevel; +// newDataObject.threadCode = threadCode; +// newDataObject.lonLat = pos.getX() + "," + pos.getY(); + synchronized (realmObjectList) { + int configCode = MapParamUtils.getTaskConfig().hashCode(); + for (RealmObject object : realmObjectList) { + if (object.threadCode == threadCode) { + if (object.realmConfigCode == configCode) { + realm = object.realm; + } else { + object.realm.close(); + realmObjectList.remove(object); + } + break; + } + } + if (realm == null) { + realm = Realm.getInstance(MapParamUtils.getTaskConfig()); + RealmObject o = new RealmObject(); + o.threadCode = threadCode; + o.realmConfigCode = configCode; + o.realm = realm; + realmObjectList.add(o); + } + } +// Log.e("jingo", " " + Realm.getDefaultInstance().hashCode() + " " + Realm.getInstance(MapParamUtils.getTaskConfig()).hashCode()); + +// Realm realm = Realm.getInstance(MapParamUtils.getTaskConfig()); + RealmQuery realmQuery = realm.where(RenderEntity.class); int m = Constant.DATA_ZOOM - tile.zoomLevel; int xStart = tile.tileX; int xEnd = tile.tileX + 1; int yStart = tile.tileY; int yEnd = tile.tileY + 1; - if (m>0) { + if (m > 0) { xStart = (int) (xStart << m); xEnd = (int) (xEnd << m); yStart = (int) (yStart << m); @@ -55,20 +113,28 @@ public class OMDBTileDataSource implements ITileDataSource { } final int currentTileX = xStart; - if(isUpdate){ - Realm.getInstance(MapParamUtils.getTaskConfig()).refresh(); + if (isUpdate) { + realm.refresh(); isUpdate = false; } - String sql =" tileX>=" + xStart + " and tileX<=" + xEnd + " and tileY>=" + yStart + " and tileY<=" + yEnd + ""; - - if(MapParamUtils.getDataLayerEnum()!=null){ + String sql = " ((tileXMin <= " + xStart + " and tileXMax >= " + xStart + ") or (tileXMin <=" + xEnd + " and tileXMax >=" + xStart + ")) and ((tileYMin <= " + yStart + " and tileYMax >= " + yStart + ") or (tileYMin <=" + yEnd + " and tileYMin >=" + yStart + "))"; + if (MapParamUtils.getDataLayerEnum() != null) { sql += " and enable" + MapParamUtils.getDataLayerEnum().getSql(); - }else{ + } else { sql += " and enable>=0"; } - RealmQuery realmQuery = Realm.getInstance(MapParamUtils.getTaskConfig()).where(RenderEntity.class).rawPredicate(sql); + realmQuery.rawPredicate(sql); + if (MapParamUtils.getDataLayerEnum() != null) { + MapParamUtils.getDataLayerEnum().getSql(); + } + +// realmQuery.greaterThanOrEqualTo("tileXMin", xStart); +// realmQuery.lessThanOrEqualTo("tileXMax", xEnd); +// realmQuery.greaterThanOrEqualTo("tileYMin", yStart); +// realmQuery.lessThanOrEqualTo("tileYMax", yEnd); +// realmQuery.like("geometry","116.31509664888955 39.83318797612014 0"); // 筛选不显示的数据 if (Constant.HAD_LAYER_INVISIABLE_ARRAY != null && Constant.HAD_LAYER_INVISIABLE_ARRAY.length > 0) { realmQuery.beginGroup(); @@ -77,13 +143,47 @@ public class OMDBTileDataSource implements ITileDataSource { } realmQuery.endGroup(); } + long time = System.currentTimeMillis(); List listResult = realmQuery/*.distinct("id")*/.findAll(); + long newTime = System.currentTimeMillis() - time; + + Log.e("jingo", "当前OMDBTileDataSource " + Thread.currentThread().hashCode() + " 当前realm " + realm.hashCode() + " 查询耗时" + newTime ); // 数据记录的tile号是以正外接tile号列表,此处过滤并未与当前tile相交的数据 if (!listResult.isEmpty()) { Polygon tilePolygon = GeometryTools.getTilePolygon(tile); - System.out.println("第一条数据的最小x值:" + listResult.get(0).getTileX().stream().min(Integer::compare).get()); - System.out.println("当前tile的:" + listResult.get(0).getTileX().stream().min(Integer::compare).get()); - listResult = listResult.stream().filter((RenderEntity renderEntity) -> renderEntity.getWkt().intersects(tilePolygon)) +// System.out.println("第一条数据的最小x值:" + listResult.get(0).getTileX().stream().min(Integer::compare).get()); +// System.out.println("当前tile的:" + listResult.get(0).getTileX().stream().min(Integer::compare).get()); +// synchronized (dataObjectList) { +// int index = -1; +// for (int i = 0; i < dataObjectList.size(); i++) { +// DataObject dataObject = dataObjectList.get(i); +// if (dataObject.threadCode == newDataObject.threadCode) { +// index = i; +// } else if (dataObject.zoom == tile.zoomLevel && dataObject.lonLat.equals(newDataObject.lonLat)) { +// listResult = listResult.stream().filter((RenderEntity renderEntity) -> { +// for (String id : dataObject.listIds) { +// if (id.equals(renderEntity.getId())) { +// return false; +// } +// } +// return renderEntity.getWkt().intersects(tilePolygon); +// }) +// /*过滤数据,只有最小x(屏幕的最小x或数据的最小x会被渲染,跨Tile的其他数据不再重复渲染)*/ +//// .filter((RenderEntity renderEntity) -> MercatorProjection.longitudeToTileX(viewport.fromScreenPoint(0,0).getLongitude(), (byte) Constant.DATA_ZOOM) == currentTileX || renderEntity.getTileX().stream().min(Integer::compare).get() == currentTileX) +// .collect(Collectors.toList()); +// } +// } +// if (index > -1) { +// dataObjectList.remove(index); +// } +// for (RenderEntity renderEntity : listResult) { +// newDataObject.listIds.add(renderEntity.getId()); +// } +// dataObjectList.add(newDataObject); +// } + listResult = listResult.stream().filter((RenderEntity renderEntity) -> + renderEntity.getWkt().intersects(tilePolygon) + ) /*过滤数据,只有最小x(屏幕的最小x或数据的最小x会被渲染,跨Tile的其他数据不再重复渲染)*/ // .filter((RenderEntity renderEntity) -> MercatorProjection.longitudeToTileX(viewport.fromScreenPoint(0,0).getLongitude(), (byte) Constant.DATA_ZOOM) == currentTileX || renderEntity.getTileX().stream().min(Integer::compare).get() == currentTileX) .collect(Collectors.toList()); @@ -92,10 +192,12 @@ public class OMDBTileDataSource implements ITileDataSource { } else { mapDataSink.completed(QueryResult.SUCCESS); } - Realm.getInstance(MapParamUtils.getTaskConfig()).close(); + +// realm.close(); } else { mapDataSink.completed(QueryResult.SUCCESS); } + } @Override @@ -110,8 +212,8 @@ public class OMDBTileDataSource implements ITileDataSource { } } - public void update(){ + public void update() { isUpdate = true; - Log.e("qj",Thread.currentThread().getName()); + Log.e("qj", Thread.currentThread().getName()); } } From 51c44f00b17e62d8de329b5a4c2f108a1250803d Mon Sep 17 00:00:00 2001 From: squallzhjch Date: Fri, 20 Oct 2023 16:30:27 +0800 Subject: [PATCH 4/7] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=BA=93=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/assets/omdb_config.json | 1291 ++++++++--------- .../com/navinfo/omqs/db/ImportOMDBHelper.kt | 58 +- .../com/navinfo/omqs/db/ImportPreProcess.kt | 8 +- .../com/navinfo/omqs/db/RealmOperateHelper.kt | 5 +- .../omqs/ui/activity/map/MainViewModel.kt | 6 +- .../java/com/navinfo/omqs/util/NaviEngine.kt | 106 +- .../library/data/entity/LinkRelation.kt | 7 +- .../library/data/entity/RenderEntity.kt | 4 + 8 files changed, 746 insertions(+), 739 deletions(-) diff --git a/app/src/main/assets/omdb_config.json b/app/src/main/assets/omdb_config.json index 89c49505..36740a1c 100644 --- a/app/src/main/assets/omdb_config.json +++ b/app/src/main/assets/omdb_config.json @@ -1,648 +1,647 @@ [ - { - "tableGroupName": "普通图层", - "tableMap" : { - "1007": { - "table": "OMDB_NODE_FORM", - "code": 1007, - "name": "点形态", - "existSubCode": true, - "checkLinkId": false, - "zoomMin": 15, - "zoomMax": 20 - }, - "1007_PA": { - "table": "OMDB_NODE_PA", - "code": 1007, - "name": "点形态PA", - "existSubCode": true, - "checkLinkId": false, - "zoomMin": 15, - "zoomMax": 20 - }, - "1012": { - "table": "OMDB_CHECKPOINT", - "code": 1012, - "name": "检查点", - "catch":true, - "zoomMin": 15, - "zoomMax": 20 - }, - "2001": { - "table": "OMDB_RD_LINK", - "code": 2001, - "name": "道路线", - "zoomMin": 15, - "zoomMax": 17, - "catch":true, - "checkLinkId": false - }, - "2002": { - "table": "OMDB_RD_LINK_FUNCTION_CLASS", - "code": 2002, - "name": "道路功能等级", - "zoomMin": 15, - "zoomMax": 17 - }, - "2008": { - "table": "OMDB_RD_LINK_KIND", - "code": 2008, - "name": "道路种别", - "zoomMin": 15, - "zoomMax": 17, - "catch":false, - "checkLinkId": false - }, - "2010": { - "table": "OMDB_LINK_DIRECT", - "code": 2010, - "name": "道路方向", - "zoomMin": 15, - "zoomMax": 17, - "checkLinkId": false, - "transformer": [ - { - "k": "geometry", - "v": "~", - "klib": "geometry", - "vlib": "addRdLinkDirect()" - } - ] - }, - "2011": { - "table": "OMDB_LINK_NAME", - "code": 2011, - "name": "道路名", - "zoomMin": 15, - "zoomMax": 17, - "checkLinkId": false, - "transformer": [ - { - "k": "geometry", - "v": "~", - "klib": "geometry", - "vlib": "generateRoadName()" - } - ] - }, - "2013": { - "table": "OMDB_LANE_MARK_BOUNDARYTYPE", - "code": 2013, - "name": "车道边界类型", - "zoomMin": 18, - "zoomMax": 20, - "checkLinkId": false, - "filterData": true, - "catch":true, - "transformer": [ - { - "k": "geometry", - "v": "~", - "klib": "geometry", - "vlib": "unpackingLaneBoundary()" - } - ] - }, - "2017": { - "table": "OMDB_LINK_CONSTRUCTION", - "code": 2017, - "name": "道路施工", - "catch":true, - "checkLinkId": false, - "zoomMin": 15, - "zoomMax": 17 - }, - "2019": { - "table": "OMDB_LINK_SPEEDLIMIT", - "code": 2019, - "name": "常规线限速", - "zoomMin": 15, - "zoomMax": 17 - }, - "2020": { - "table": "OMDB_LINK_SPEEDLIMIT_COND", - "code": 2020, - "name": "条件线限速", - "zoomMin": 15, - "zoomMax": 17 - }, - "2021": { - "table": "OMDB_LINK_SPEEDLIMIT_VAR", - "code": 2021, - "name": "可变线限速", - "zoomMin": 15, - "zoomMax": 17 - }, - "2041":{ - "table": "OMDB_LANE_NUM", - "code": 2041, - "name": "车道数" - }, - "2083":{ - "table": "OMDB_RDBOUND_BOUNDARYTYPE", - "code": 2083, - "name": "道路边界类型", - "checkLinkId": false, - "filterData": true, - "zoomMin": 18, - "zoomMax": 20, - "catch":true - }, - "2090":{ - "table": "OMDB_LANE_CONSTRUCTION", - "code": 2090, - "name": "车道施工", - "existSubCode": true, - "catch":true, - "zoomMin": 18, - "zoomMax": 20 - }, - "2201":{ - "table": "OMDB_BRIDGE", - "code": 2201, - "name": "桥", - "catch":true, - "existSubCode": true, - "zoomMin": 15, - "zoomMax": 20, - "transformer": [ - { - "k": "geometry", - "v": "~", - "klib": "geometry", - "vlib": "generateS2EReferencePoint(bridgeType,OMDB_BRIDGE)" - } - ] - }, - "2202":{ - "table": "OMDB_TUNNEL", - "code": 2202, - "name": "隧道", - "zoomMin": 15, - "zoomMax": 20, - "catch":true, - "transformer": [ - { - "k": "geometry", - "v": "~", - "klib": "geometry", - "vlib": "generateS2EReferencePoint()" - } - ] - }, - "3001":{ - "table": "OMDB_OBJECT_OH_STRUCT", - "code": 3001, - "name": "上方障碍物", - "zoomMin": 15, - "zoomMax": 20, - "catch":true, - "checkLinkId": false, - "transformer": [ - { - "k": "geometry", - "v": "~", - "klib": "geometry", - "vlib": "getPolygonCenterPoint()" - } - ] - }, - "3002":{ - "table": "OMDB_OBJECT_TEXT", - "code": 3002, - "name": "文字", - "zoomMin": 18, - "zoomMax": 20, - "catch":true, - "checkLinkId": false, - "transformer": [] - }, - "3003":{ - "table": "OMDB_OBJECT_SYMBOL", - "code": 3003, - "name": "符号", - "checkLinkId": false, - "zoomMin": 18, - "zoomMax": 20, - "catch":true, - "transformer": [] - }, - "3004":{ - "table": "OMDB_OBJECT_ARROW", - "code": 3004, - "name": "箭头", - "checkLinkId": false, - "zoomMin": 18, - "zoomMax": 20, - "catch":true, - "transformer": [ - { - "k": "geometry", - "v": "~", - "klib": "geometry", - "vlib": "obtainDynamicSrc('assets:omdb/arrowDirection/','.svg','arrowClass')" - } - ] - }, - "3005":{ - "table": "OMDB_TRAFFIC_SIGN", - "code": 3005, - "name": "交通标牌", - "zoomMin": 18, - "zoomMax": 20, - "is3D": true, - "catch":true, - "transformer": [ - { - "k": "geometry", - "v": "~", - "klib": "geometry", - "vlib": "obtainTrafficSignCenterPoint()" - } - ] - }, - "3006":{ - "table": "OMDB_POLE", - "code": 3006, - "name": "杆状物", - "is3D": true, - "catch":true, - "filterData": true, - "zoomMin": 18, - "zoomMax": 20, - "transformer": [ - { - "k": "geometry", - "v": "~", - "klib": "geometry", - "vlib": "normalizationPoleHeight()" - } - ] - }, - "3012":{ - "table": "OMDB_FILL_AREA", - "code": 3012, - "name": "导流区", - "catch":true, - "checkLinkId": false, - "zoomMin": 18, - "zoomMax": 20 - }, - "3014":{ - "table": "OMDB_CROSS_WALK", - "code": 3014, - "name": "人行横道", - "catch":true, - "checkLinkId": false, - "zoomMin": 18, - "zoomMax": 20 - }, - "3016":{ - "table": "OMDB_OBJECT_STOPLOCATION", - "code": 3016, - "name": "停止位置", - "checkLinkId": false, - "filterData": true, - "zoomMin": 18, - "catch":true, - "zoomMax": 20 - }, - "3027":{ - "table": "OMDB_OBJECT_REFUGE_ISLAND", - "code": 3027, - "name": "路口内交通岛", - "catch":true, - "checkLinkId": false, - "zoomMin": 18, - "zoomMax": 20 - }, - "4001": { - "table": "OMDB_INTERSECTION", - "code": 4001, - "name": "路口", - "zoomMin": 15, - "zoomMax": 17, - "catch":true, - "transformer": [ - { - "k": "geometry", - "v": "~", - "klib": "geometry", - "vlib": "generateIntersectionReference()" - } - ] - }, - "4002": { - "table": "OMDB_SPEEDLIMIT", - "code": 4002, - "name": "常规点限速", - "catch":true, - "zoomMin": 15, - "zoomMax": 20, - "transformer": [ - { - "k": "maxSpeed", - "v": "0", - "klib": "maxSpeed", - "vlib": "限" - }, - { - "k": "geometry", - "v": "~", - "klib": "geometry", - "vlib": "translateRight()" - } - ] - }, - "4003":{ - "table": "OMDB_SPEEDLIMIT_COND", - "code": 4003, - "name": "条件点限速", - "catch":true, - "zoomMin": 15, - "zoomMax": 20, - "transformer": [ - { - "k": "maxSpeed", - "v": "0|", - "klib": "maxSpeed", - "vlib": "限" - } - ] - }, - "4004":{ - "table": "OMDB_SPEEDLIMIT_VAR", - "code": 4004, - "name": "可变点限速", - "catch":true, - "zoomMin": 15, - "zoomMax": 20, - "transformer": [ - { - "k": "location", - "v": "1", - "klib": "ref", - "vlib": "左" - }, - { - "k": "location", - "v": "2", - "klib": "ref", - "vlib": "右" - }, - { - "k": "location", - "v": "3", - "klib": "ref", - "vlib": "上" - } - ] - }, - "4006": { - "table": "OMDB_RESTRICTION", - "code": 4006, - "name": "普通交限", - "zoomMin": 15, - "zoomMax": 17, - "filterData":true, - "catch":true, - "transformer": [ - { - "k": "geometry", - "v": "~", - "klib": "geometry", - "vlib": "checkCircleRoad()" - }, - { - "k": "geometry", - "v": "~", - "klib": "geometry", - "vlib": "translateBack()" - }, - { - "k": "geometry", - "v": "~", - "klib": "geometry", - "vlib": "translateRight()" - }, - { - "k": "geometry", - "v": "~", - "klib": "geometry", - "vlib": "generateS2EReferenceLine()" - }, - { - "k": "geometry", - "v": "~", - "klib": "geometry", - "vlib": "generateDirectReferenceLine()" - } - ] - }, - "4009":{ - "table": "OMDB_WARNINGSIGN", - "code": 4009, - "name": "警示信息", - "catch":true, - "zoomMin": 15, - "zoomMax": 20, - "transformer": [ - { - "k": "geometry", - "v": "~", - "klib": "geometry", - "vlib": "translateRight()" - }, - { - "k": "geometry", - "v": "~", - "klib": "geometry", - "vlib": "generateS2EReferenceLine()" - }, - { - "k": "geometry", - "v": "~", - "klib": "geometry", - "vlib": "generateDirectReferenceLine('',3)" - }, - { - "k": "geometry", - "v": "~", - "klib": "geometry", - "vlib": "obtainReferenceDynamicSrc('assets:omdb/appendix/1105_','_0.svg','typeCode')" - } - ] - }, - "4010":{ - "table": "OMDB_ELECTRONICEYE", - "code": 4010, - "name": "电子眼", - "catch":true, - "zoomMin": 15, - "zoomMax": 20, - "transformer": [ - { - "k": "geometry", - "v": "~", - "klib": "geometry", - "vlib": "translateRight()" - }, - { - "k": "geometry", - "v": "~", - "klib": "geometry", - "vlib": "generateS2EReferenceLine()" - }, - { - "k": "geometry", - "v": "~", - "klib": "geometry", - "vlib": "generateDirectReferenceLine('',3)" - }, - { - "k": "geometry", - "v": "~", - "klib": "geometry", - "vlib": "generateElectronName()" - } - ] - }, - "4022": { - "table": "OMDB_TRAFFICLIGHT", - "code": 4022, - "name": "交通灯", - "catch":true, - "zoomMin": 15, - "zoomMax": 20, - "transformer": [ - ] - }, - "4023": { - "table": "OMDB_TOLLGATE", - "code": 4023, - "name": "收费站", - "catch":true, - "zoomMin": 15, - "zoomMax": 20, - "transformer": [ - ] - }, - "4601":{ - "table": "OMDB_LANEINFO", - "code": 4601, - "name": "车信", - "catch":true, - "zoomMin": 15, - "zoomMax": 17, - "transformer": [ - { - "k": "geometry", - "v": "~", - "klib": "geometry", - "vlib": "translateRight(direct=3)" - }, - { - "k": "geometry", - "v": "~", - "klib": "geometry", - "vlib": "unpackingLaneInfo()" - }, - { - "k": "geometry", - "v": "~", - "klib": "geometry", - "vlib": "generateS2EReferenceLine()" - } - ] - }, - "5001":{ - "table": "OMDB_LANE_LINK_LG", - "code": 5001, - "name": "车道中心线", - "catch":false, - "checkLinkId": false, - "zoomMin": 18, - "zoomMax": 20, - "transformer": [ - { - "k": "geometry", - "v": "~", - "klib": "geometry", - "vlib": "generateAddWidthLine()" - } - ] - } - } - }, - { - "tableGroupName": "道路形态", - "tableMap" : { - "2004": { - "table": "OMDB_LINK_ATTRIBUTE", - "code": 2004, - "name": "道路属性", - "existSubCode": true, - "catch":true, - "zoomMin": 15, - "zoomMax": 20, - "transformer": [ - { - "k": "geometry", - "v": "~", - "klib": "geometry", - "vlib": "generateRoadText()" - } - ] - }, - "2022": { - "table": "OMDB_CON_ACCESS", - "code": 2022, - "name": "全封闭", - "zoomMin": 15, - "zoomMax": 17 - }, - "2037": { - "table": "OMDB_RAMP", - "code": 2037, - "name": "匝道", - "existSubCode": true, - "zoomMin": 15, - "zoomMax": 17 - }, - "2040": { - "table": "OMDB_MULTI_DIGITIZED", - "code": 2040, - "name": "上下线分离", - "zoomMin": 15, - "zoomMax": 17 - }, - "2204":{ - "table": "OMDB_ROUNDABOUT", - "code": 2204, - "name": "环岛", - "catch":true, - "zoomMin": 15, - "zoomMax": 17, - "transformer": [ - ] - }, - "2205":{ - "table": "OMDB_LINK_FORM1", - "code": 2205, - "name": "道路形态1", - "existSubCode": true, - "zoomMin": 15, - "zoomMax": 17 - }, - "2206":{ - "table": "OMDB_LINK_FORM2", - "code": 2206, - "existSubCode": true, - "name": "道路形态2", - "zoomMin": 15, - "zoomMax": 17 - } - - } - } + { + "tableGroupName": "普通图层", + "tableMap": { + "2001": { + "table": "OMDB_RD_LINK", + "code": 2001, + "name": "道路线", + "zoomMin": 15, + "zoomMax": 17, + "catch": true, + "checkLinkId": false + }, + "1007": { + "table": "OMDB_NODE_FORM", + "code": 1007, + "name": "点形态", + "existSubCode": true, + "checkLinkId": false, + "zoomMin": 15, + "zoomMax": 20 + }, + "1007_PA": { + "table": "OMDB_NODE_PA", + "code": 1007, + "name": "点形态PA", + "existSubCode": true, + "checkLinkId": false, + "zoomMin": 15, + "zoomMax": 20 + }, + "1012": { + "table": "OMDB_CHECKPOINT", + "code": 1012, + "name": "检查点", + "catch": true, + "zoomMin": 15, + "zoomMax": 20 + }, + "2002": { + "table": "OMDB_RD_LINK_FUNCTION_CLASS", + "code": 2002, + "name": "道路功能等级", + "zoomMin": 15, + "zoomMax": 17 + }, + "2008": { + "table": "OMDB_RD_LINK_KIND", + "code": 2008, + "name": "道路种别", + "zoomMin": 15, + "zoomMax": 17, + "catch": false, + "checkLinkId": false + }, + "2010": { + "table": "OMDB_LINK_DIRECT", + "code": 2010, + "name": "道路方向", + "zoomMin": 15, + "zoomMax": 17, + "checkLinkId": false, + "transformer": [ + { + "k": "geometry", + "v": "~", + "klib": "geometry", + "vlib": "addRdLinkDirect()" + } + ] + }, + "2011": { + "table": "OMDB_LINK_NAME", + "code": 2011, + "name": "道路名", + "zoomMin": 15, + "zoomMax": 17, + "checkLinkId": false, + "transformer": [ + { + "k": "geometry", + "v": "~", + "klib": "geometry", + "vlib": "generateRoadName()" + } + ] + }, + "2013": { + "table": "OMDB_LANE_MARK_BOUNDARYTYPE", + "code": 2013, + "name": "车道边界类型", + "zoomMin": 18, + "zoomMax": 20, + "checkLinkId": false, + "filterData": true, + "catch": true, + "transformer": [ + { + "k": "geometry", + "v": "~", + "klib": "geometry", + "vlib": "unpackingLaneBoundary()" + } + ] + }, + "2017": { + "table": "OMDB_LINK_CONSTRUCTION", + "code": 2017, + "name": "道路施工", + "catch": true, + "checkLinkId": false, + "zoomMin": 15, + "zoomMax": 17 + }, + "2019": { + "table": "OMDB_LINK_SPEEDLIMIT", + "code": 2019, + "name": "常规线限速", + "zoomMin": 15, + "zoomMax": 17 + }, + "2020": { + "table": "OMDB_LINK_SPEEDLIMIT_COND", + "code": 2020, + "name": "条件线限速", + "zoomMin": 15, + "zoomMax": 17 + }, + "2021": { + "table": "OMDB_LINK_SPEEDLIMIT_VAR", + "code": 2021, + "name": "可变线限速", + "zoomMin": 15, + "zoomMax": 17 + }, + "2041": { + "table": "OMDB_LANE_NUM", + "code": 2041, + "name": "车道数" + }, + "2083": { + "table": "OMDB_RDBOUND_BOUNDARYTYPE", + "code": 2083, + "name": "道路边界类型", + "checkLinkId": false, + "filterData": true, + "zoomMin": 18, + "zoomMax": 20, + "catch": true + }, + "2090": { + "table": "OMDB_LANE_CONSTRUCTION", + "code": 2090, + "name": "车道施工", + "existSubCode": true, + "catch": true, + "zoomMin": 18, + "zoomMax": 20 + }, + "2201": { + "table": "OMDB_BRIDGE", + "code": 2201, + "name": "桥", + "catch": true, + "existSubCode": true, + "zoomMin": 15, + "zoomMax": 20, + "transformer": [ + { + "k": "geometry", + "v": "~", + "klib": "geometry", + "vlib": "generateS2EReferencePoint(bridgeType,OMDB_BRIDGE)" + } + ] + }, + "2202": { + "table": "OMDB_TUNNEL", + "code": 2202, + "name": "隧道", + "zoomMin": 15, + "zoomMax": 20, + "catch": true, + "transformer": [ + { + "k": "geometry", + "v": "~", + "klib": "geometry", + "vlib": "generateS2EReferencePoint()" + } + ] + }, + "3001": { + "table": "OMDB_OBJECT_OH_STRUCT", + "code": 3001, + "name": "上方障碍物", + "zoomMin": 15, + "zoomMax": 20, + "catch": true, + "checkLinkId": false, + "transformer": [ + { + "k": "geometry", + "v": "~", + "klib": "geometry", + "vlib": "getPolygonCenterPoint()" + } + ] + }, + "3002": { + "table": "OMDB_OBJECT_TEXT", + "code": 3002, + "name": "文字", + "zoomMin": 18, + "zoomMax": 20, + "catch": true, + "checkLinkId": false, + "transformer": [] + }, + "3003": { + "table": "OMDB_OBJECT_SYMBOL", + "code": 3003, + "name": "符号", + "checkLinkId": false, + "zoomMin": 18, + "zoomMax": 20, + "catch": true, + "transformer": [] + }, + "3004": { + "table": "OMDB_OBJECT_ARROW", + "code": 3004, + "name": "箭头", + "checkLinkId": false, + "zoomMin": 18, + "zoomMax": 20, + "catch": true, + "transformer": [ + { + "k": "geometry", + "v": "~", + "klib": "geometry", + "vlib": "obtainDynamicSrc('assets:omdb/arrowDirection/','.svg','arrowClass')" + } + ] + }, + "3005": { + "table": "OMDB_TRAFFIC_SIGN", + "code": 3005, + "name": "交通标牌", + "zoomMin": 18, + "zoomMax": 20, + "is3D": true, + "catch": true, + "transformer": [ + { + "k": "geometry", + "v": "~", + "klib": "geometry", + "vlib": "obtainTrafficSignCenterPoint()" + } + ] + }, + "3006": { + "table": "OMDB_POLE", + "code": 3006, + "name": "杆状物", + "is3D": true, + "catch": true, + "filterData": true, + "zoomMin": 18, + "zoomMax": 20, + "transformer": [ + { + "k": "geometry", + "v": "~", + "klib": "geometry", + "vlib": "normalizationPoleHeight()" + } + ] + }, + "3012": { + "table": "OMDB_FILL_AREA", + "code": 3012, + "name": "导流区", + "catch": true, + "checkLinkId": false, + "zoomMin": 18, + "zoomMax": 20 + }, + "3014": { + "table": "OMDB_CROSS_WALK", + "code": 3014, + "name": "人行横道", + "catch": true, + "checkLinkId": false, + "zoomMin": 18, + "zoomMax": 20 + }, + "3016": { + "table": "OMDB_OBJECT_STOPLOCATION", + "code": 3016, + "name": "停止位置", + "checkLinkId": false, + "filterData": true, + "zoomMin": 18, + "catch": true, + "zoomMax": 20 + }, + "3027": { + "table": "OMDB_OBJECT_REFUGE_ISLAND", + "code": 3027, + "name": "路口内交通岛", + "catch": true, + "checkLinkId": false, + "zoomMin": 18, + "zoomMax": 20 + }, + "4001": { + "table": "OMDB_INTERSECTION", + "code": 4001, + "name": "路口", + "zoomMin": 15, + "zoomMax": 17, + "catch": true, + "transformer": [ + { + "k": "geometry", + "v": "~", + "klib": "geometry", + "vlib": "generateIntersectionReference()" + } + ] + }, + "4002": { + "table": "OMDB_SPEEDLIMIT", + "code": 4002, + "name": "常规点限速", + "catch": true, + "zoomMin": 15, + "zoomMax": 20, + "transformer": [ + { + "k": "maxSpeed", + "v": "0", + "klib": "maxSpeed", + "vlib": "限" + }, + { + "k": "geometry", + "v": "~", + "klib": "geometry", + "vlib": "translateRight()" + } + ] + }, + "4003": { + "table": "OMDB_SPEEDLIMIT_COND", + "code": 4003, + "name": "条件点限速", + "catch": true, + "zoomMin": 15, + "zoomMax": 20, + "transformer": [ + { + "k": "maxSpeed", + "v": "0|", + "klib": "maxSpeed", + "vlib": "限" + } + ] + }, + "4004": { + "table": "OMDB_SPEEDLIMIT_VAR", + "code": 4004, + "name": "可变点限速", + "catch": true, + "zoomMin": 15, + "zoomMax": 20, + "transformer": [ + { + "k": "location", + "v": "1", + "klib": "ref", + "vlib": "左" + }, + { + "k": "location", + "v": "2", + "klib": "ref", + "vlib": "右" + }, + { + "k": "location", + "v": "3", + "klib": "ref", + "vlib": "上" + } + ] + }, + "4006": { + "table": "OMDB_RESTRICTION", + "code": 4006, + "name": "普通交限", + "zoomMin": 15, + "zoomMax": 17, + "filterData": true, + "catch": true, + "transformer": [ + { + "k": "geometry", + "v": "~", + "klib": "geometry", + "vlib": "checkCircleRoad()" + }, + { + "k": "geometry", + "v": "~", + "klib": "geometry", + "vlib": "translateBack()" + }, + { + "k": "geometry", + "v": "~", + "klib": "geometry", + "vlib": "translateRight()" + }, + { + "k": "geometry", + "v": "~", + "klib": "geometry", + "vlib": "generateS2EReferenceLine()" + }, + { + "k": "geometry", + "v": "~", + "klib": "geometry", + "vlib": "generateDirectReferenceLine()" + } + ] + }, + "4009": { + "table": "OMDB_WARNINGSIGN", + "code": 4009, + "name": "警示信息", + "catch": true, + "zoomMin": 15, + "zoomMax": 20, + "transformer": [ + { + "k": "geometry", + "v": "~", + "klib": "geometry", + "vlib": "translateRight()" + }, + { + "k": "geometry", + "v": "~", + "klib": "geometry", + "vlib": "generateS2EReferenceLine()" + }, + { + "k": "geometry", + "v": "~", + "klib": "geometry", + "vlib": "generateDirectReferenceLine('',3)" + }, + { + "k": "geometry", + "v": "~", + "klib": "geometry", + "vlib": "obtainReferenceDynamicSrc('assets:omdb/appendix/1105_','_0.svg','typeCode')" + } + ] + }, + "4010": { + "table": "OMDB_ELECTRONICEYE", + "code": 4010, + "name": "电子眼", + "catch": true, + "zoomMin": 15, + "zoomMax": 20, + "transformer": [ + { + "k": "geometry", + "v": "~", + "klib": "geometry", + "vlib": "translateRight()" + }, + { + "k": "geometry", + "v": "~", + "klib": "geometry", + "vlib": "generateS2EReferenceLine()" + }, + { + "k": "geometry", + "v": "~", + "klib": "geometry", + "vlib": "generateDirectReferenceLine('',3)" + }, + { + "k": "geometry", + "v": "~", + "klib": "geometry", + "vlib": "generateElectronName()" + } + ] + }, + "4022": { + "table": "OMDB_TRAFFICLIGHT", + "code": 4022, + "name": "交通灯", + "catch": true, + "zoomMin": 15, + "zoomMax": 20, + "transformer": [ + ] + }, + "4023": { + "table": "OMDB_TOLLGATE", + "code": 4023, + "name": "收费站", + "catch": true, + "zoomMin": 15, + "zoomMax": 20, + "transformer": [ + ] + }, + "4601": { + "table": "OMDB_LANEINFO", + "code": 4601, + "name": "车信", + "catch": true, + "zoomMin": 15, + "zoomMax": 17, + "transformer": [ + { + "k": "geometry", + "v": "~", + "klib": "geometry", + "vlib": "translateRight(direct=3)" + }, + { + "k": "geometry", + "v": "~", + "klib": "geometry", + "vlib": "unpackingLaneInfo()" + }, + { + "k": "geometry", + "v": "~", + "klib": "geometry", + "vlib": "generateS2EReferenceLine()" + } + ] + }, + "5001": { + "table": "OMDB_LANE_LINK_LG", + "code": 5001, + "name": "车道中心线", + "catch": false, + "checkLinkId": false, + "zoomMin": 18, + "zoomMax": 20, + "transformer": [ + { + "k": "geometry", + "v": "~", + "klib": "geometry", + "vlib": "generateAddWidthLine()" + } + ] + } + } + }, + { + "tableGroupName": "道路形态", + "tableMap": { + "2004": { + "table": "OMDB_LINK_ATTRIBUTE", + "code": 2004, + "name": "道路属性", + "existSubCode": true, + "catch": true, + "zoomMin": 15, + "zoomMax": 20, + "transformer": [ + { + "k": "geometry", + "v": "~", + "klib": "geometry", + "vlib": "generateRoadText()" + } + ] + }, + "2022": { + "table": "OMDB_CON_ACCESS", + "code": 2022, + "name": "全封闭", + "zoomMin": 15, + "zoomMax": 17 + }, + "2037": { + "table": "OMDB_RAMP", + "code": 2037, + "name": "匝道", + "existSubCode": true, + "zoomMin": 15, + "zoomMax": 17 + }, + "2040": { + "table": "OMDB_MULTI_DIGITIZED", + "code": 2040, + "name": "上下线分离", + "zoomMin": 15, + "zoomMax": 17 + }, + "2204": { + "table": "OMDB_ROUNDABOUT", + "code": 2204, + "name": "环岛", + "catch": true, + "zoomMin": 15, + "zoomMax": 17, + "transformer": [ + ] + }, + "2205": { + "table": "OMDB_LINK_FORM1", + "code": 2205, + "name": "道路形态1", + "existSubCode": true, + "zoomMin": 15, + "zoomMax": 17 + }, + "2206": { + "table": "OMDB_LINK_FORM2", + "code": 2206, + "existSubCode": true, + "name": "道路形态2", + "zoomMin": 15, + "zoomMax": 17 + } + } + } ] \ No newline at end of file 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 65ae1278..0fab9459 100644 --- a/app/src/main/java/com/navinfo/omqs/db/ImportOMDBHelper.kt +++ b/app/src/main/java/com/navinfo/omqs/db/ImportOMDBHelper.kt @@ -37,7 +37,9 @@ import org.locationtech.jts.geom.LineString import org.locationtech.jts.geom.MultiLineString import org.spatialite.database.SQLiteDatabase import java.io.File +import java.util.* import javax.inject.Inject +import kotlin.collections.HashMap import kotlin.streams.toList /** @@ -155,7 +157,7 @@ class ImportOMDBHelper @AssistedInject constructor( .directory(currentInstallTaskFolder) .name("OMQS.realm") .encryptionKey(Constant.PASSWORD) - .allowQueriesOnUiThread(true) +// .allowQueriesOnUiThread(true) .schemaVersion(2) .build() val unZipFolder = File(omdbZipFile.parentFile, "result") @@ -181,28 +183,27 @@ class ImportOMDBHelper @AssistedInject constructor( var tableImportTime = System.currentTimeMillis() //总表要素统计时间 var dataImportTime = System.currentTimeMillis() - - Realm.getInstance(currentInstallTaskConfig).beginTransaction() - + val realm = Realm.getInstance(currentInstallTaskConfig) + realm.beginTransaction() for (importConfig in importConfigList) { tableNum += importConfig.tableMap.size } //缓存任务link信息,便于下面与数据进行任务link匹配 val hashMap: HashMap = HashMap() - val lineList = arrayOfNulls(task.hadLinkDvoList.size) - var index = 0 +// val lineList = arrayOfNulls(task.hadLinkDvoList.size) +// var index = 0 task.hadLinkDvoList.forEach { hashMap[it.linkPid.toLong()] = it - lineList[index] = GeometryTools.createGeometry(it.geometry) as LineString - index++ +// lineList[index] = GeometryTools.createGeometry(it.geometry) as LineString +// index++ } val resHashMap: HashMap = HashMap() //define empty hashmap try { - var multipLine = MultiLineString(lineList, GeometryFactory()) +// var multipLine = MultiLineString(lineList, GeometryFactory()) // 遍历解压后的文件,读取该数据返回 @@ -259,13 +260,14 @@ class ImportOMDBHelper @AssistedInject constructor( renderEntity.zoomMin = map["qi_zoomMin"].toString().toInt() renderEntity.zoomMax = map["qi_zoomMax"].toString().toInt() // 在外层记录当前数据的linkPid - if (renderEntity.properties.containsKey("linkPid")) { + if (map.containsKey("linkPid")) { renderEntity.linkPid = - renderEntity.properties["linkPid"]?.split(",")?.get(0) + map["linkPid"].toString().split(",") + ?.get(0) .toString() - } else if (renderEntity.properties.containsKey("linkList")){ + } else if (map.containsKey("linkList")) { val linkList = - renderEntity.properties["linkList"] + map["linkList"].toString() if (!linkList.isNullOrEmpty() && linkList != "null") { val list: List = gson.fromJson( linkList, @@ -774,13 +776,18 @@ class ImportOMDBHelper @AssistedInject constructor( if (renderEntity.linkRelation == null) { renderEntity.linkRelation = LinkRelation() } - renderEntity.linkRelation!!.sNodeId = renderEntity.properties["snodePid"] - renderEntity.linkRelation!!.eNodeId = renderEntity.properties["enodePid"] + renderEntity.linkRelation!!.sNodeId = + renderEntity.properties["snodePid"] + renderEntity.linkRelation!!.eNodeId = + renderEntity.properties["enodePid"] + // 同时尝试更新RD_link的relation记录中的名称字段 + renderEntity.linkRelation!!.linkPid = + renderEntity.properties["linkPid"] + ?: UUID.randomUUID().toString() } Log.d("ImportOMDBHelper", "解析===1insert") - Realm.getInstance(currentInstallTaskConfig) - .insert(renderEntity) + realm.insert(renderEntity) Log.d("ImportOMDBHelper", "解析===2insert") } if (currentConfig.code == DataCodeEnum.OMDB_RD_LINK.code.toInt()) { @@ -805,30 +812,33 @@ class ImportOMDBHelper @AssistedInject constructor( ) elementIndex = 0 tableImportTime = System.currentTimeMillis() - if (insertIndex % 20000 == 0) { + if (insertIndex % 20000 == 0 || currentEntry.value.table == DataCodeEnum.OMDB_RD_LINK.name) { Log.d( "ImportOMDBHelper", "表解析===结束用时时间===事物开始" ) - Realm.getInstance(currentInstallTaskConfig).commitTransaction() - Realm.getInstance(currentInstallTaskConfig).beginTransaction() + realm.commitTransaction() + realm.refresh() + realm.beginTransaction() Log.d( "ImportOMDBHelper", "表解析===结束用时时间===事物结束" ) } + } } - Realm.getInstance(currentInstallTaskConfig).commitTransaction() - Realm.getInstance(currentInstallTaskConfig).close() + realm.commitTransaction() + realm.close() Log.d( "ImportOMDBHelper", "表解析===结束用时时间${(System.currentTimeMillis() - dataImportTime)}===$dataIndex===插入$insertIndex" ) Log.e("qj", "安装结束") } catch (e: Exception) { - if (Realm.getInstance(currentInstallTaskConfig).isInTransaction) { - Realm.getInstance(currentInstallTaskConfig).cancelTransaction() + if (realm.isInTransaction) { + realm.cancelTransaction() + realm.close() } throw e } diff --git a/app/src/main/java/com/navinfo/omqs/db/ImportPreProcess.kt b/app/src/main/java/com/navinfo/omqs/db/ImportPreProcess.kt index ca0d695e..88975c05 100644 --- a/app/src/main/java/com/navinfo/omqs/db/ImportPreProcess.kt +++ b/app/src/main/java/com/navinfo/omqs/db/ImportPreProcess.kt @@ -15,6 +15,7 @@ import org.locationtech.jts.geom.Coordinate import org.locationtech.jts.geom.Geometry import org.locationtech.jts.io.WKTWriter import org.oscim.core.GeoPoint +import java.util.* class ImportPreProcess { @@ -582,13 +583,6 @@ class ImportPreProcess { } else { renderEntity.properties["name"] = "" } - // 同时尝试更新RD_link的relation记录中的名称字段 - val rdLinkEntity = queryRdLink(renderEntity.properties["linkPid"]!!) - if (rdLinkEntity?.linkRelation == null) { - rdLinkEntity?.linkRelation = LinkRelation() - } - rdLinkEntity?.linkRelation?.linkName = renderEntity.properties["name"] - Realm.getInstance(Constant.currentInstallTaskConfig).insertOrUpdate(rdLinkEntity) } /** 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 30cfb6d6..8a9f189a 100644 --- a/app/src/main/java/com/navinfo/omqs/db/RealmOperateHelper.kt +++ b/app/src/main/java/com/navinfo/omqs/db/RealmOperateHelper.kt @@ -178,7 +178,8 @@ class RealmOperateHelper() { ) val realm = getRealmDefaultInstance() try { - val realmList = realm.where(HadLinkDvoBean::class.java).equalTo("taskId", taskId).findAll() + val realmList = + realm.where(HadLinkDvoBean::class.java).equalTo("taskId", taskId).findAll() var linkBean: HadLinkDvoBean? = null var nearLast: Double = 99999.99 for (link in realmList) { @@ -333,7 +334,7 @@ class RealmOperateHelper() { val result = mutableListOf() val realmList = getSelectTaskRealmTools(realm, RenderEntity::class.java, false) .notEqualTo("table", DataCodeEnum.OMDB_RD_LINK.name) - .equalTo("properties['${LinkTable.linkPid}']", linkPid) + .equalTo("linkPid", linkPid) .findAll() result.addAll(realm.copyFromRealm(realmList)) return result 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 36be0428..a05c1b64 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 @@ -816,8 +816,12 @@ class MainViewModel @Inject constructor( val newLineString = GeometryTools.createLineString(linePoints) linkId?.let { + val time = System.currentTimeMillis() val elementList = realmOperateHelper.queryLinkByLinkPid(realm, it) - Log.e("jingo", "捕捉到数据 ${elementList.size} 个") + Log.e( + "jingo", + "捕捉到数据 ${elementList.size} 个 ${System.currentTimeMillis() - time}" + ) for (element in elementList) { if (element.code == DataCodeEnum.OMDB_LINK_NAME.code) { hisRoadName = true diff --git a/app/src/main/java/com/navinfo/omqs/util/NaviEngine.kt b/app/src/main/java/com/navinfo/omqs/util/NaviEngine.kt index d2613b24..c5db3cd1 100644 --- a/app/src/main/java/com/navinfo/omqs/util/NaviEngine.kt +++ b/app/src/main/java/com/navinfo/omqs/util/NaviEngine.kt @@ -81,11 +81,11 @@ class NaviEngine( /** * 要查询的link基本信息列表 */ - private val QUERY_KEY_LINK_INFO_LIST = arrayOf( - DataCodeEnum.OMDB_RD_LINK.name, - DataCodeEnum.OMDB_LINK_DIRECT.name, - DataCodeEnum.OMDB_LINK_NAME.name, - ) +// private val QUERY_KEY_LINK_INFO_LIST = arrayOf( +// DataCodeEnum.OMDB_RD_LINK.name, +// DataCodeEnum.OMDB_LINK_DIRECT.name, +// DataCodeEnum.OMDB_LINK_NAME.name, +// ) // /** // * 偏离距离 单位:米 @@ -215,62 +215,56 @@ class NaviEngine( ) route.pointList = GeometryTools.getGeoPoints(link.geometry) + var time = System.currentTimeMillis() + val res = realm.where(RenderEntity::class.java) + .equalTo("table", DataCodeEnum.OMDB_RD_LINK.name).equalTo("linkPid", link.linkPid) + .findFirst() - val res = realm.where(RenderEntity::class.java).`in`("table", QUERY_KEY_LINK_INFO_LIST) - .equalTo("properties['linkPid']", link.linkPid).findAll() - var bHasNode = false - var bHasDir = false - var bHasName = false - if (res != null) { - for (entity in res) { - when (entity.code) { - DataCodeEnum.OMDB_RD_LINK.code -> { - bHasNode = true - val snodePid = entity.properties["snodePid"] - if (snodePid != null) { - route.sNode = snodePid - } else { - bHasNode = false - } - val enodePid = entity.properties["enodePid"] - if (enodePid != null) { - route.eNode = enodePid - } else { - bHasNode = false - } - } - DataCodeEnum.OMDB_LINK_DIRECT.code -> { - val direct = entity.properties["direct"] - if (direct != null) { - bHasDir = true - route.direct = direct.toInt() - } - } - DataCodeEnum.OMDB_LINK_NAME.code -> { - bHasName = true - route.name = realm.copyFromRealm(entity) - } - } + Log.e("jingo","查询link时间 ${System.currentTimeMillis() - time}") + + if (res?.linkRelation != null) { + if (res.linkRelation!!.sNodeId == null) { + callback.planningPathStatus( + NaviStatus.NAVI_STATUS_PATH_ERROR_NODE + ) + return + } else { + route.sNode = res.linkRelation!!.sNodeId!! } - } - if (!bHasNode) { + if (res.linkRelation!!.eNodeId == null) { + callback.planningPathStatus( + NaviStatus.NAVI_STATUS_PATH_ERROR_NODE + ) + return + } else { + route.eNode = res.linkRelation!!.eNodeId!! + } + + route.direct = res.linkRelation!!.direct +// route.name = res.linkRelation!!.linkName + time = System.currentTimeMillis() + val otherLinks = realm.where(RenderEntity::class.java) + .equalTo("table", DataCodeEnum.OMDB_RD_LINK.name) + .notEqualTo("linkPid", route.linkId).beginGroup() + .`in`("linkRelation.sNodeId", arrayOf(route.sNode, route.eNode)).or() + .`in`("linkRelation.eNodeId", arrayOf(route.sNode, route.eNode)).endGroup() + .findAll() + Log.e("jingo","拓扑道路时间 ${System.currentTimeMillis() - time} 共${otherLinks.size}条") + } else { callback.planningPathStatus( NaviStatus.NAVI_STATUS_PATH_ERROR_NODE ) return } - if (!bHasDir) { - callback.planningPathStatus( - NaviStatus.NAVI_STATUS_PATH_ERROR_DIRECTION - ) - return - } pathList.add(route) } + //用来存储最终的导航路径 val newRouteList = mutableListOf() + //比对路径排序用的 val tempRouteList = pathList.toMutableList() + //先找到一根有方向的link,确定起终点 var routeStart: NaviRoute? = null for (i in tempRouteList.indices) { @@ -290,7 +284,7 @@ class NaviEngine( var sNode = "" var eNode = "" - //如果sNode,eNode是顺方向,geometry 不动,否则反转 +//如果sNode,eNode是顺方向,geometry 不动,否则反转 if (routeStart.direct == 3) { routeStart.pointList.reverse() sNode = routeStart.eNode @@ -355,15 +349,14 @@ class NaviEngine( } val itemMap: MutableMap> = mutableMapOf() - //查询每根link上的关联要素 +//查询每根link上的关联要素 for (route in newRouteList) { itemMap.clear() //常规点限速 - val res = realm.where(RenderEntity::class.java) - .equalTo("properties['linkPid']", route.linkId).and().`in`( - "table", - QUERY_KEY_ITEM_LIST - ).findAll() + val res = + realm.where(RenderEntity::class.java).equalTo("linkPid", route.linkId).and().`in`( + "table", QUERY_KEY_ITEM_LIST + ).findAll() if (res.isNotEmpty()) { // Log.e("jingo", "道路查询预警要素 ${route.linkId} ${res.size}条数据") for (r in res) { @@ -541,8 +534,7 @@ class NaviEngine( // if (route.itemList != null) { // Log.e("jingo", "${route.linkId}我有${route.itemList!!.size}个要素 ") // } - if (route.indexInPath < routeIndex) - continue + if (route.indexInPath < routeIndex) continue if (route.indexInPath == routeIndex) { currentRoute = route } diff --git a/collect-library/src/main/java/com/navinfo/collect/library/data/entity/LinkRelation.kt b/collect-library/src/main/java/com/navinfo/collect/library/data/entity/LinkRelation.kt index 1ee3fb8f..ccb8137a 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/data/entity/LinkRelation.kt +++ b/collect-library/src/main/java/com/navinfo/collect/library/data/entity/LinkRelation.kt @@ -8,6 +8,7 @@ import io.realm.RealmDictionary import io.realm.RealmObject import io.realm.RealmSet import io.realm.annotations.Ignore +import io.realm.annotations.Index import io.realm.annotations.PrimaryKey import kotlinx.parcelize.Parcelize import org.locationtech.jts.geom.Coordinate @@ -21,10 +22,12 @@ import java.util.* @Parcelize open class LinkRelation() : RealmObject(), Parcelable { @PrimaryKey - var id: String = UUID.randomUUID().toString() // id + var linkPid:String = UUID.randomUUID().toString() + @Index var sNodeId: String? = null + @Index var eNodeId: String? = null - var linkName: String? = null + var direct: Int = 0 constructor(direct: Int) : this() { 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 ee0632cd..90d5bcd9 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 @@ -8,6 +8,7 @@ import io.realm.RealmDictionary import io.realm.RealmObject import io.realm.RealmSet import io.realm.annotations.Ignore +import io.realm.annotations.Index import io.realm.annotations.PrimaryKey import kotlinx.parcelize.Parcelize import org.locationtech.jts.geom.Coordinate @@ -56,13 +57,16 @@ open class RenderEntity() : RealmObject(), Parcelable { return field } var properties: RealmDictionary = RealmDictionary() + @Ignore var tileX: RealmSet = RealmSet() // x方向的tile编码 + @Ignore var tileY: RealmSet = RealmSet() // y方向的tile编码 var taskId: Int = 0 //任务ID var zoomMin: Int = 18 //显示最小级别 var zoomMax: Int = 23 //显示最大级别 var enable:Int = 0 // 默认0不是显示 1为渲染显示 2为常显 var catchEnable:Int = 0 // 0不捕捉 1捕捉 + @Index lateinit var linkPid: String // RenderEntity关联的linkPid集合(可能会关联多个) var linkRelation: LinkRelation? = null From c7122376cf4f6fdef04e2197f2f7d1f98a7f2af1 Mon Sep 17 00:00:00 2001 From: squallzhjch Date: Wed, 25 Oct 2023 10:17:16 +0800 Subject: [PATCH 5/7] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=BA=93=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/assets/omdb_config.json | 10 +- .../com/navinfo/omqs/bean/ImportConfig.kt | 64 +- .../com/navinfo/omqs/db/ImportOMDBHelper.kt | 1355 +++++++++-------- .../com/navinfo/omqs/db/ImportPreProcess.kt | 167 +- .../com/navinfo/omqs/db/RealmOperateHelper.kt | 15 +- .../com/navinfo/omqs/hilt/GlobalModule.kt | 14 - .../omqs/ui/activity/login/LoginActivity.kt | 5 - .../omqs/ui/activity/map/MainViewModel.kt | 5 +- .../ui/fragment/tasklist/TaskViewModel.kt | 25 +- .../library/data/entity/LinkRelation.kt | 11 +- .../library/data/entity/ReferenceEntity.kt | 29 +- .../library/data/entity/RenderEntity.kt | 54 +- .../library/data/entity/RenderEntity1.kt | 40 + .../map/source/OMDBReferenceDataSource.java | 7 +- .../map/source/OMDBTileDataSource.java | 7 +- .../library/map/source/OMDBTileSource.java | 2 +- .../map/source/RealmDBTileDataSource.java | 47 +- .../collect/library/utils/StrZipUtil.kt | 282 ++++ vtm | 2 +- 19 files changed, 1301 insertions(+), 840 deletions(-) create mode 100644 collect-library/src/main/java/com/navinfo/collect/library/data/entity/RenderEntity1.kt create mode 100644 collect-library/src/main/java/com/navinfo/collect/library/utils/StrZipUtil.kt diff --git a/app/src/main/assets/omdb_config.json b/app/src/main/assets/omdb_config.json index 36740a1c..7adcbb9d 100644 --- a/app/src/main/assets/omdb_config.json +++ b/app/src/main/assets/omdb_config.json @@ -59,15 +59,7 @@ "name": "道路方向", "zoomMin": 15, "zoomMax": 17, - "checkLinkId": false, - "transformer": [ - { - "k": "geometry", - "v": "~", - "klib": "geometry", - "vlib": "addRdLinkDirect()" - } - ] + "checkLinkId": false }, "2011": { "table": "OMDB_LINK_NAME", diff --git a/app/src/main/java/com/navinfo/omqs/bean/ImportConfig.kt b/app/src/main/java/com/navinfo/omqs/bean/ImportConfig.kt index 2bfedff9..cf50508f 100644 --- a/app/src/main/java/com/navinfo/omqs/bean/ImportConfig.kt +++ b/app/src/main/java/com/navinfo/omqs/bean/ImportConfig.kt @@ -4,6 +4,7 @@ import android.util.Log import com.google.gson.annotations.Expose import com.navinfo.collect.library.data.entity.RenderEntity import com.navinfo.omqs.db.ImportPreProcess +import io.realm.Realm import kotlin.reflect.KFunction import kotlin.reflect.KParameter import kotlin.reflect.full.declaredMemberFunctions @@ -12,13 +13,15 @@ import kotlin.reflect.full.declaredMemberFunctions class ImportConfig { @Expose var tableMap: MutableMap = mutableMapOf() + @Expose val tableGroupName: String = "OMDB数据" - @Expose - var checked : Boolean = true - val preProcess: ImportPreProcess = ImportPreProcess() - fun transformProperties(renderEntity: RenderEntity): RenderEntity? { + @Expose + var checked: Boolean = true + val preProcess: ImportPreProcess = ImportPreProcess() + fun transformProperties(renderEntity: RenderEntity, realm: Realm): RenderEntity? { + preProcess.realm = realm val transformList = tableMap[renderEntity.code.toString()]?.transformer if (transformList.isNullOrEmpty()) { Log.e("qj", "子表转换为空===${renderEntity.code}") @@ -27,7 +30,7 @@ class ImportConfig { Log.e("qj", "子表转换不为空===${renderEntity.code}") for (transform in transformList) { // 开始执行转换 - val key:String = transform.k + val key: String = transform.k val value = transform.v val keylib = transform.klib val valuelib = transform.vlib @@ -36,7 +39,10 @@ class ImportConfig { continue } // 如果key和value都为空,说明当前数据需要增加一个新字段 - if (key.isNullOrEmpty()&&value.isNullOrEmpty()&&!renderEntity.properties.containsKey(keylib)) { + if (key.isNullOrEmpty() && value.isNullOrEmpty() && !renderEntity.properties.containsKey( + keylib + ) + ) { renderEntity.properties[keylib] = valuelib continue } @@ -44,26 +50,32 @@ class ImportConfig { m@ for (k in processKeyOrValue(key)) { if (renderEntity.properties.containsKey(k)) { // json配置的key可以匹配到数据 for (v in processKeyOrValue(value)) { - if ("~" == v ) { // ~符可以匹配任意元素 + if ("~" == v) { // ~符可以匹配任意元素 if (valuelib.endsWith(")")) { // 以()结尾,说明该value配置是一个function,需要通过反射调用指定方法 // 获取方法名 val methodName = valuelib.substringBefore("(") // 获取参数 - val params: List = valuelib.substringAfter("(").substringBefore(")").split(",").filter{ it.isNotEmpty() }.map { it.trim() } - val method = preProcess::class.members.filter { it.name == methodName }.first() as KFunction<*> + val params: List = + valuelib.substringAfter("(").substringBefore(")").split(",") + .filter { it.isNotEmpty() }.map { it.trim() } + val method = + preProcess::class.members.filter { it.name == methodName } + .first() as KFunction<*> val methodParams = method.parameters val callByParams = mutableMapOf( methodParams[0] to preProcess, - methodParams[1] to renderEntity + methodParams[1] to renderEntity, ) for ((index, value) in params.withIndex()) { // 前2个参数确定为对象本身和RenderEntity,因此自定义参数从index+2开始设置 - if (methodParams.size>index+2) { - callByParams[methodParams[index+2]] = value.replace("'", "") + if (methodParams.size > index + 2) { + callByParams[methodParams[index + 2]] = + value.replace("'", "") } } - when(val result = method.callBy(callByParams)) { // 如果方法返回的数据类型是boolean,且返回为false,则该数据不处理 + when (val result = + method.callBy(callByParams)) { // 如果方法返回的数据类型是boolean,且返回为false,则该数据不处理 is Boolean -> if (!result) { return null @@ -78,8 +90,12 @@ class ImportConfig { // 获取方法名 val methodName = valuelib.substringBefore("(") // 获取参数 - val params: List = valuelib.substringAfter("(").substringBefore(")").split(",").filter{ it.isNotEmpty() }.map { it.trim() } - val method = preProcess::class.members.filter { it.name == methodName }.first() as KFunction<*> + val params: List = + valuelib.substringAfter("(").substringBefore(")").split(",") + .filter { it.isNotEmpty() }.map { it.trim() } + val method = + preProcess::class.members.filter { it.name == methodName } + .first() as KFunction<*> val methodParams = method.parameters val callByParams = mutableMapOf( @@ -88,11 +104,11 @@ class ImportConfig { ) for ((index, value) in params.withIndex()) { // 前2个参数确定为对象本身和RenderEntity,因此自定义参数从index+2开始设置 - if (methodParams.size>index+2) { - callByParams[methodParams[index+2]] = value + if (methodParams.size > index + 2) { + callByParams[methodParams[index + 2]] = value } } - when(val result = method.callBy(callByParams)) { + when (val result = method.callBy(callByParams)) { is Boolean -> if (!result) { return null @@ -107,6 +123,7 @@ class ImportConfig { } } } + preProcess.realm = null return renderEntity } @@ -125,14 +142,15 @@ class TableInfo { val zoomMin: Int = 16 val zoomMax: Int = 21 val checkLinkId: Boolean = true//是否需要校验linkid - val filterData : Boolean = false//是否需要过滤数据 - val existSubCode : Boolean = false//是否存在子编码 + val filterData: Boolean = false//是否需要过滤数据 + val existSubCode: Boolean = false//是否存在子编码 - val catch: Boolean = false//是否需要捕捉 // 需要根据丹丹提供的捕捉原则进行设置,参考文档W行设置条件,https://navinfo.feishu.cn/sheets/shtcnfsxKZhekU26ezBcHgl7aWh?sheet=BZd6yM + val catch: Boolean = + false//是否需要捕捉 // 需要根据丹丹提供的捕捉原则进行设置,参考文档W行设置条件,https://navinfo.feishu.cn/sheets/shtcnfsxKZhekU26ezBcHgl7aWh?sheet=BZd6yM val name: String = "" - var checked : Boolean = true + var checked: Boolean = true var transformer: MutableList = mutableListOf() - var is3D : Boolean = false // 是否支持3D,默认情况下都不支持3D,在数据导入阶段会自动抹去Z轴高程信息 + var is3D: Boolean = false // 是否支持3D,默认情况下都不支持3D,在数据导入阶段会自动抹去Z轴高程信息 } class Transform { 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 0fab9459..48c5cbfc 100644 --- a/app/src/main/java/com/navinfo/omqs/db/ImportOMDBHelper.kt +++ b/app/src/main/java/com/navinfo/omqs/db/ImportOMDBHelper.kt @@ -10,12 +10,10 @@ import com.blankj.utilcode.util.FileIOUtils import com.blankj.utilcode.util.ZipUtils import com.google.gson.Gson import com.google.gson.reflect.TypeToken -import com.navinfo.collect.library.data.entity.HadLinkDvoBean -import com.navinfo.collect.library.data.entity.LinkRelation -import com.navinfo.collect.library.data.entity.RenderEntity -import com.navinfo.collect.library.data.entity.TaskBean +import com.navinfo.collect.library.data.entity.* import com.navinfo.collect.library.enums.DataCodeEnum import com.navinfo.collect.library.utils.GeometryTools +import com.navinfo.collect.library.utils.StrZipUtil import com.navinfo.omqs.Constant import com.navinfo.omqs.Constant.Companion.currentInstallTaskConfig import com.navinfo.omqs.Constant.Companion.currentInstallTaskFolder @@ -28,6 +26,7 @@ import dagger.assisted.AssistedInject import io.realm.Realm import io.realm.RealmConfiguration import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.delay import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.flow import kotlinx.coroutines.withContext @@ -36,7 +35,9 @@ import org.locationtech.jts.geom.GeometryFactory import org.locationtech.jts.geom.LineString import org.locationtech.jts.geom.MultiLineString import org.spatialite.database.SQLiteDatabase +import java.io.BufferedReader import java.io.File +import java.io.FileReader import java.util.* import javax.inject.Inject import kotlin.collections.HashMap @@ -46,8 +47,7 @@ import kotlin.streams.toList * 导入omdb数据的帮助类 * */ class ImportOMDBHelper @AssistedInject constructor( - @Assisted("context") val context: Context, - @Assisted("omdbFile") val omdbFile: File + @Assisted("context") val context: Context, @Assisted("omdbFile") val omdbFile: File ) { @Inject lateinit var omdbHiltFactory: OMDBDataBaseHiltFactory @@ -56,13 +56,10 @@ class ImportOMDBHelper @AssistedInject constructor( lateinit var gson: Gson private val database by lazy { omdbHiltFactory.obtainOmdbDataBaseHelper( - context, - omdbFile.absolutePath, - 1 + context, omdbFile.absolutePath, 1 ).writableDatabase } - private val configFile: File = - File("${Constant.USER_DATA_PATH}", Constant.OMDB_CONFIG) + private val configFile: File = File("${Constant.USER_DATA_PATH}", Constant.OMDB_CONFIG) private val importConfigList by lazy { openConfigFile() @@ -106,8 +103,14 @@ class ImportOMDBHelper @AssistedInject constructor( }.toList() val cursor = database.query( - table, finalColumns.toTypedArray(), "1=1", - mutableListOf().toTypedArray(), null, null, null, null + table, + finalColumns.toTypedArray(), + "1=1", + mutableListOf().toTypedArray(), + null, + null, + null, + null ) with(cursor) { if (moveToFirst()) { @@ -151,15 +154,17 @@ class ImportOMDBHelper @AssistedInject constructor( suspend fun importOmdbZipFile(omdbZipFile: File, task: TaskBean): Flow = withContext(Dispatchers.IO) { installTaskid = task.id.toString() - currentInstallTaskFolder = File(Constant.USER_DATA_PATH + "/$installTaskid") +// currentInstallTaskFolder = File(Constant.USER_DATA_PATH + "/$installTaskid") + currentInstallTaskFolder = File(Constant.USER_DATA_PATH + "/237") if (!currentInstallTaskFolder.exists()) currentInstallTaskFolder.mkdirs() - currentInstallTaskConfig = RealmConfiguration.Builder() - .directory(currentInstallTaskFolder) - .name("OMQS.realm") - .encryptionKey(Constant.PASSWORD) + currentInstallTaskConfig = + RealmConfiguration.Builder() + .directory(currentInstallTaskFolder) + .name("OMQS.realm") + .encryptionKey(Constant.PASSWORD) // .allowQueriesOnUiThread(true) - .schemaVersion(2) - .build() + .schemaVersion(2) + .build() val unZipFolder = File(omdbZipFile.parentFile, "result") flow { @@ -169,7 +174,6 @@ class ImportOMDBHelper @AssistedInject constructor( unZipFolder.mkdirs() // 开始解压zip文件 val unZipFiles = ZipUtils.unzipFile(omdbZipFile, unZipFolder) - // 先获取当前配置的所有图层的个数,方便后续计算数据解析进度 var tableNum = 0 var processIndex = 0 @@ -180,10 +184,12 @@ class ImportOMDBHelper @AssistedInject constructor( //单个表要素统计 var elementIndex = 0 //单个表要素时间统计 - var tableImportTime = System.currentTimeMillis() +// var tableImportTime = System.currentTimeMillis() //总表要素统计时间 - var dataImportTime = System.currentTimeMillis() - val realm = Realm.getInstance(currentInstallTaskConfig) +// var dataImportTime = System.currentTimeMillis() +// Realm.compactRealm(currentInstallTaskConfig) + var realm = Realm.getInstance(currentInstallTaskConfig) + realm.beginTransaction() for (importConfig in importConfigList) { tableNum += importConfig.tableMap.size @@ -199,641 +205,728 @@ class ImportOMDBHelper @AssistedInject constructor( // index++ } - val resHashMap: HashMap = - HashMap() //define empty hashmap + val resHashMap: HashMap = HashMap() //define empty hashmap + val listRenderEntity = mutableListOf() + val listRenderEntity1 = mutableListOf() try { // var multipLine = MultiLineString(lineList, GeometryFactory()) // 遍历解压后的文件,读取该数据返回 - Log.d("ImportOMDBHelper", "表解析===开始时间$dataImportTime===") +// Log.d("ImportOMDBHelper", "表解析===开始时间$dataImportTime===") for (importConfig in importConfigList) { for ((index, currentEntry) in importConfig.tableMap.entries.withIndex()) { processIndex += 1 - Log.d( - "ImportOMDBHelper", - "表解析===开始时间$tableImportTime===${currentEntry.value.table}" - ) - Log.d( - "ImportOMDBHelper", - "表解析===processIndex${processIndex}====${processIndex}/${tableNum}" - ) - val listResult = mutableListOf() +// Log.d( +// "ImportOMDBHelper", +// "表解析===开始时间$tableImportTime===${currentEntry.value.table}" +// ) +// Log.d( +// "ImportOMDBHelper", +// "表解析===processIndex${processIndex}====${processIndex}/${tableNum}" +// ) +// val listResult = mutableListOf() val currentConfig = currentEntry.value val txtFile = unZipFiles.find { it.name == currentConfig.table } - // 将listResult数据插入到Realm数据库中 - currentConfig?.let { - val list = FileIOUtils.readFile2List(txtFile, "UTF-8") - Log.d("ImportOMDBHelper", "开始解析:${txtFile?.name}") - if (list != null) { - // 将list数据转换为map - for ((index, line) in list.withIndex()) { - if (line == null || line.trim() == "") { - continue - } - elementIndex += 1 - dataIndex += 1 - Log.d("ImportOMDBHelper", "解析第:${index + 1}行") - val map = gson.fromJson>( - line, - object : TypeToken>() {}.getType() - ) - .toMutableMap() - map["qi_table"] = currentConfig.table - map["qi_name"] = currentConfig.name - map["qi_code"] = - if (currentConfig.code == 0) currentConfig.code else currentEntry.key - map["qi_zoomMin"] = currentConfig.zoomMin - map["qi_zoomMax"] = currentConfig.zoomMax - - // 先查询这个mesh下有没有数据,如果有则跳过即可 - val renderEntity = RenderEntity() - renderEntity.code = map["qi_code"].toString() - renderEntity.name = map["qi_name"].toString() - renderEntity.table = map["qi_table"].toString() - renderEntity.taskId = task.id - renderEntity.zoomMin = map["qi_zoomMin"].toString().toInt() - renderEntity.zoomMax = map["qi_zoomMax"].toString().toInt() - // 在外层记录当前数据的linkPid - if (map.containsKey("linkPid")) { - renderEntity.linkPid = - map["linkPid"].toString().split(",") - ?.get(0) - .toString() - } else if (map.containsKey("linkList")) { - val linkList = - map["linkList"].toString() - if (!linkList.isNullOrEmpty() && linkList != "null") { - val list: List = gson.fromJson( - linkList, - object : - TypeToken>() {}.type - ) - if (list != null) { - renderEntity.linkPid = list[0].linkPid - } - } - } - - renderEntity.geometry = map["geometry"].toString() - Log.d("ImportOMDBHelper", "解析===1处理3D") - // 其他数据插入到Properties中 -/* if (!currentConfig.is3D) { // 如果是非3d要素,则自动将Z轴坐标全部置为0 - val coordinates = - renderEntity.wkt?.coordinates?.map { coordinate -> - coordinate.z = 0.0 - coordinate - }?.toTypedArray() - var newGeometry: Geometry? = null - if (renderEntity.wkt?.geometryType == Geometry.TYPENAME_POINT) { - newGeometry = GeometryTools.createPoint( - coordinates!![0].x, - coordinates!![0].y - ) - } else if (renderEntity.wkt?.geometryType == Geometry.TYPENAME_LINESTRING) { - newGeometry = - GeometryTools.createLineString(coordinates) - } else if (renderEntity.wkt?.geometryType == Geometry.TYPENAME_POLYGON) { - newGeometry = - GeometryTools.createLineString(coordinates) - } - if (newGeometry != null) { - renderEntity.geometry = newGeometry.toString() - } - }*/ - Log.d("ImportOMDBHelper", "解析===2处理3D") - Log.d("ImportOMDBHelper", "解析===1处理属性") - for ((key, value) in map) { - when (value) { - is String -> renderEntity.properties.put(key, value) - is Int -> renderEntity.properties.put( - key, - value.toInt().toString() - ) - - is Double -> renderEntity.properties.put( - key, - value.toDouble().toString() - ) - - else -> renderEntity.properties.put( - key, - value.toString() - ) - } - } - Log.d("ImportOMDBHelper", "解析===2处理属性") - Log.d("ImportOMDBHelper", "解析===1处理name") - // 如果properties中不包含name,那么自动将要素名称添加进properties中 - if (!renderEntity.properties.containsKey("name")) { - renderEntity.properties["name"] = renderEntity.name; - } - Log.d("ImportOMDBHelper", "解析===2处理name") - Log.d("ImportOMDBHelper", "解析===1处理杆状物") - - if (currentConfig.filterData) { - when (renderEntity.code.toInt()) { - - DataCodeEnum.OMDB_POLE.code.toInt() -> { - //过滤树类型的杆状物,无需导入到数据库中 - val poleType = - renderEntity.properties["poleType"] - if (poleType != null && poleType.toInt() == 2) { - continue - } - } - - DataCodeEnum.OMDB_LANE_MARK_BOUNDARYTYPE.code.toInt() -> { - var boundaryType = - renderEntity.properties["boundaryType"] - if (boundaryType != null) { - when (boundaryType.toInt()) { - 0, 1, 6, 8, 9 -> { - renderEntity.enable = 0 - Log.e( - "qj", - "过滤不显示数据${renderEntity.table}" - ) - continue - } - } - } - } - - DataCodeEnum.OMDB_RDBOUND_BOUNDARYTYPE.code.toInt() -> { - var boundaryType = - renderEntity.properties["boundaryType"] - if (boundaryType != null) { - when (boundaryType.toInt()) { - 0, 1, 3, 4, 5, 7, 9 -> { - renderEntity.enable = 0 - Log.e( - "qj", - "过滤不显示数据${renderEntity.table}" - ) - continue - } - } - } - } - - DataCodeEnum.OMDB_OBJECT_STOPLOCATION.code.toInt() -> { - var locationType = - renderEntity.properties["locationType"] - if (locationType != null) { - when (locationType.toInt()) { - 3, 4 -> { - renderEntity.enable = 0 - Log.e( - "qj", - "过滤不显示数据${renderEntity.table}" - ) - continue - } - } - } - } - - DataCodeEnum.OMDB_RESTRICTION.code.toInt() -> { - if (renderEntity.properties.containsKey("linkIn") && renderEntity.properties.containsKey( - "linkOut" - ) - ) { - var linkIn = - renderEntity.properties["linkIn"] - var linkOut = - renderEntity.properties["linkOut"] - if (linkIn != null && linkOut != null) { - var checkMsg = "$linkIn$linkOut" - if (resHashMap.containsKey(checkMsg)) { - Log.e( - "qj", - "${renderEntity.name}==过滤交限linkin与linkout相同且存在多条数据" - ) - continue - } else { - resHashMap[checkMsg] = renderEntity - } - } - } - } - } - - } - - Log.d("ImportOMDBHelper", "解析===2处理杆状物") - Log.d("ImportOMDBHelper", "解析===1任务路线匹配") - - //遍历判断只显示与任务Link相关的任务数据 - if (currentConfig.checkLinkId) { - - if (renderEntity.properties.containsKey("linkPid")) { - - var currentLinkPid = - renderEntity.properties["linkPid"] - - Log.d( - "ImportOMDBHelper", - "解析===1任务路线匹配${currentLinkPid}" - ) - - if (!currentLinkPid.isNullOrEmpty() && currentLinkPid != "null") { - - var list = currentLinkPid.split(",") - - if (list != null && list.isNotEmpty()) { - - Log.d( - "ImportOMDBHelper", - "解析===1任务路线匹配${list.size}" - ) - - m@ for (linkPid in list) { - if (hashMap.containsKey(linkPid.toLong())) { - renderEntity.enable = 1 - Log.e( - "qj", - "${renderEntity.name}==包括任务link" - ) - break@m - } - } - } - } - - } else if (renderEntity.code.toInt() == DataCodeEnum.OMDB_INTERSECTION.code.toInt() && renderEntity.properties.containsKey( - "linkList" - ) - ) { - - if (renderEntity.properties["linkList"] != null) { - - Log.e( - "qj", - "linkList==开始${renderEntity.name}==${renderEntity.properties["linkList"]}}" - ) - - val linkList = - renderEntity.properties["linkList"] - - if (!linkList.isNullOrEmpty() && linkList != "null") { - - Log.e( - "qj", - "linkList==${renderEntity.name}==${renderEntity.properties["linkList"]}}" - ) - - val list: List = gson.fromJson( - linkList, - object : - TypeToken>() {}.type - ) - - if (list != null) { - m@ for (link in list) { - if (hashMap.containsKey(link.linkPid.toLong())) { - renderEntity.enable = 1 - Log.e( - "qj", - "${renderEntity.name}==包括任务link" - ) - break@m - } - } - } - } - } - } else { - //不包括linkPid直接过滤 - continue - } - //过滤掉非任务路线上的数据 - if (renderEntity.enable != 1) { - Log.e( - "qj", - "${renderEntity.name}==过滤不包括任务路线上的数据" - ) - continue - } - - } else { - renderEntity.enable = 1 - - /* var geometry = GeometryTools.createGeometry(renderEntity.geometry) - if(multipLine.intersects(geometry)){ - renderEntity.enable = 1 - }else{ - val dis = multipLine.distance(GeometryTools.createGeometry(renderEntity.geometry)) - if(dis>36){ - continue - }else{ - renderEntity.enable = 1 - } - }*/ - Log.e("qj", "${renderEntity.name}==不包括任务linkPid") - } - Log.d("ImportOMDBHelper", "解析===2任务路线匹配") - Log.d("ImportOMDBHelper", "解析===1预处理") - - if (currentConfig.catch) { - renderEntity.catchEnable = 1 - } else { - renderEntity.catchEnable = 0 - } - - // 对renderEntity做预处理后再保存 - val resultEntity = - importConfig.transformProperties(renderEntity) - Log.d("ImportOMDBHelper", "解析===2预处理") - if (resultEntity != null) { - - Log.d("ImportOMDBHelper", "解析===1子code处理") - //对code编码需要特殊处理 存在多个属性值时,渲染优先级:SA>PA,存在多个属性值时,渲染优先级:FRONTAGE>MAIN_SIDE_A CCESS - - if (currentConfig.existSubCode) { - when (renderEntity.code.toInt()) { - DataCodeEnum.OMDB_LINK_ATTRIBUTE.code.toInt() -> { - - Log.e("qj", "道路属性===0") - - var type = renderEntity.properties["sa"] - - if (type != null && type == "1") { - renderEntity.code = - DataCodeEnum.OMDB_LINK_ATTRIBUTE_SA.code - Log.e("qj", "道路属性===1") - } else { - type = renderEntity.properties["pa"] - if (type != null && type == "1") { - renderEntity.code = - DataCodeEnum.OMDB_LINK_ATTRIBUTE_PA.code - Log.e("qj", "道路属性===2") - } else { - type = - renderEntity.properties["frontage"] - if (type != null && type == "1") { - renderEntity.code = - DataCodeEnum.OMDB_LINK_ATTRIBUTE_FORNTAGE.code - renderEntity.zoomMin = 15 - renderEntity.zoomMax = 17 - Log.e("qj", "道路属性===3") - } else { - type = - renderEntity.properties["mainSideAccess"] - if (type != null && type == "1") { - renderEntity.code = - DataCodeEnum.OMDB_LINK_ATTRIBUTE_MAIN_SIDE_ACCESS.code - renderEntity.zoomMin = 15 - renderEntity.zoomMax = 17 - Log.e("qj", "道路属性===4") - } else { - renderEntity.enable = 0 - renderEntity.zoomMin = 15 - renderEntity.zoomMax = 17 - Log.e( - "qj", - "过滤不显示数据${renderEntity.table}" - ) - Log.e("qj", "道路属性===5") - continue - } - } - } - } - } - //桥 - DataCodeEnum.OMDB_BRIDGE.code.toInt() -> { - when (renderEntity.properties["bridgeType"]) { - "1" -> renderEntity.code = - DataCodeEnum.OMDB_BRIDGE_1.code - "2" -> renderEntity.code = - DataCodeEnum.OMDB_BRIDGE_2.code -// "3" -> renderEntity.code = DataCodeEnum.OMDB_BRIDGE_3.code - else -> DataCodeEnum.OMDB_BRIDGE.code - } - } - - DataCodeEnum.OMDB_RAMP.code.toInt() -> { - /*匝道*/ - var formWay = - renderEntity.properties["formOfWay"] - if (formWay != null) { - when (formWay.toInt()) { - 93 -> renderEntity.code = - DataCodeEnum.OMDB_RAMP_1.code - - 98 -> renderEntity.code = - DataCodeEnum.OMDB_RAMP_2.code - - 99 -> renderEntity.code = - DataCodeEnum.OMDB_RAMP_3.code - - 100 -> renderEntity.code = - DataCodeEnum.OMDB_RAMP_4.code - - 102 -> renderEntity.code = - DataCodeEnum.OMDB_RAMP_5.code - - 103 -> renderEntity.code = - DataCodeEnum.OMDB_RAMP_6.code - - 104 -> renderEntity.code = - DataCodeEnum.OMDB_RAMP_7.code - } - } - } - - DataCodeEnum.OMDB_LINK_FORM1.code.toInt() -> { - /*道路形态1*/ - var formWay = - renderEntity.properties["formOfWay"] - if (formWay != null) { - when (formWay.toInt()) { - 35 -> renderEntity.code = - DataCodeEnum.OMDB_LINK_FORM1_1.code - - 37 -> renderEntity.code = - DataCodeEnum.OMDB_LINK_FORM1_2.code - - 38 -> renderEntity.code = - DataCodeEnum.OMDB_LINK_FORM1_3.code - } - } - } - - DataCodeEnum.OMDB_LINK_FORM2.code.toInt() -> { - Log.e( - "qj", - "道路形态2${renderEntity.properties["formOfWay"]}" - ) - /*道路形态2*/ - var formWay = - renderEntity.properties["formOfWay"] - if (formWay != null) { - when (formWay.toInt()) { - 10 -> renderEntity.code = - DataCodeEnum.OMDB_LINK_FORM2_1.code - - 11 -> renderEntity.code = - DataCodeEnum.OMDB_LINK_FORM2_2.code - - 17 -> renderEntity.code = - DataCodeEnum.OMDB_LINK_FORM2_3.code - - 18 -> renderEntity.code = - DataCodeEnum.OMDB_LINK_FORM2_4.code - - 20 -> renderEntity.code = - DataCodeEnum.OMDB_LINK_FORM2_5.code - - 22 -> renderEntity.code = - DataCodeEnum.OMDB_LINK_FORM2_6.code - - 36 -> renderEntity.code = - DataCodeEnum.OMDB_LINK_FORM2_7.code - - 52 -> renderEntity.code = - DataCodeEnum.OMDB_LINK_FORM2_8.code - - 53 -> renderEntity.code = - DataCodeEnum.OMDB_LINK_FORM2_9.code - - 54 -> renderEntity.code = - DataCodeEnum.OMDB_LINK_FORM2_10.code - - 60 -> renderEntity.code = - DataCodeEnum.OMDB_LINK_FORM2_11.code - - 84 -> renderEntity.code = - DataCodeEnum.OMDB_LINK_FORM2_12.code - - 85 -> renderEntity.code = - DataCodeEnum.OMDB_LINK_FORM2_13.code - } - } - } - - DataCodeEnum.OMDB_LANE_CONSTRUCTION.code.toInt() -> { - //特殊处理空数据,渲染原则使用 - var startTime = - renderEntity.properties["startTime"] - if (startTime == null || startTime == "") { - renderEntity.properties["startTime"] = - "null" - } - } - } - - if (renderEntity.table == DataCodeEnum.OMDB_NODE_FORM.name) {//特殊处理,因为code相同,使用表名判断 - //过滤不需要渲染的要素 - var formOfWay = - renderEntity.properties["formOfWay"] - if (formOfWay != null && formOfWay.toInt() == 30) { - renderEntity.enable = 2 - renderEntity.code = - DataCodeEnum.OMDB_NODE_FORM.code - } else { - Log.e( - "qj", - "过滤不显示数据${renderEntity.table}" - ) - continue - } - } else if (renderEntity.table == DataCodeEnum.OMDB_NODE_PA.name) {//特殊处理,因为code相同,使用表名判断 - //过滤不需要渲染的要素 - var attributeType = - renderEntity.properties["attributeType"] - if (attributeType != null && attributeType.toInt() == 30) { - renderEntity.enable = 2 - renderEntity.code = - DataCodeEnum.OMDB_NODE_PA.code - } else { - Log.e( - "qj", - "过滤不显示数据${renderEntity.table}" - ) - continue - } - } - } - - Log.d("ImportOMDBHelper", "解析===2子code处理") - ++insertIndex - Log.e("qj", "统计==${insertIndex}") - - //移除该字段,减少数据量 - if (renderEntity.properties.containsKey("geometry")) { - renderEntity.properties.remove("geometry") - } - - // 如果当前解析的是OMDB_RD_LINK数据,将其缓存在预处理类中,以便后续处理其他要素时使用 - if (currentConfig.code == DataCodeEnum.OMDB_RD_LINK.code.toInt()) { - if (renderEntity.linkRelation == null) { - renderEntity.linkRelation = LinkRelation() - } - renderEntity.linkRelation!!.sNodeId = - renderEntity.properties["snodePid"] - renderEntity.linkRelation!!.eNodeId = - renderEntity.properties["enodePid"] - // 同时尝试更新RD_link的relation记录中的名称字段 - renderEntity.linkRelation!!.linkPid = - renderEntity.properties["linkPid"] - ?: UUID.randomUUID().toString() - } - - Log.d("ImportOMDBHelper", "解析===1insert") - realm.insert(renderEntity) - Log.d("ImportOMDBHelper", "解析===2insert") - } - if (currentConfig.code == DataCodeEnum.OMDB_RD_LINK.code.toInt()) { - listResult.add(renderEntity) + if (txtFile != null) { + val fileReader = FileReader(txtFile) + val bufferedReader = BufferedReader(fileReader) + var line: String? = bufferedReader.readLine() + while (line != null) { + if (line == null || line.trim() == "") { + line = bufferedReader.readLine() + continue + } + elementIndex += 1 + dataIndex += 1 +// Log.d("ImportOMDBHelper", "解析第:${index + 1}行") + val map = gson.fromJson>( + line, object : TypeToken>() {}.type + ).toMutableMap() + map["qi_table"] = currentConfig.table + map["qi_name"] = currentConfig.name + map["qi_code"] = + if (currentConfig.code == 0) currentConfig.code else currentEntry.key + map["qi_zoomMin"] = currentConfig.zoomMin + map["qi_zoomMax"] = currentConfig.zoomMax + + // 先查询这个mesh下有没有数据,如果有则跳过即可 + val renderEntity = RenderEntity() + renderEntity.code = map["qi_code"].toString() + renderEntity.name = map["qi_name"].toString() + renderEntity.table = map["qi_table"].toString() + renderEntity.taskId = task.id + renderEntity.zoomMin = map["qi_zoomMin"].toString().toInt() + renderEntity.zoomMax = map["qi_zoomMax"].toString().toInt() + + // 在外层记录当前数据的linkPid + if (map.containsKey("linkPid")) { + renderEntity.linkPid = + map["linkPid"].toString().split(",")[0] + } else if (map.containsKey("linkList")) { + val linkList = map["linkList"].toString() + if (!linkList.isNullOrEmpty() && linkList != "null") { + val list: List = gson.fromJson( + linkList, + object : TypeToken>() {}.type + ) + renderEntity.linkPid = list[0].linkPid } } + + Log.e( + "jingo", + "安装数据 ${renderEntity.table} ${renderEntity.linkPid} ${elementIndex} ${insertIndex}" + ) + renderEntity.geometry = map["geometry"].toString() +// Log.d("ImportOMDBHelper", "解析===1处理3D") + // 其他数据插入到Properties中 + /* if (!currentConfig.is3D) { // 如果是非3d要素,则自动将Z轴坐标全部置为0 + val coordinates = + renderEntity.wkt?.coordinates?.map { coordinate -> + coordinate.z = 0.0 + coordinate + }?.toTypedArray() + var newGeometry: Geometry? = null + if (renderEntity.wkt?.geometryType == Geometry.TYPENAME_POINT) { + newGeometry = GeometryTools.createPoint( + coordinates!![0].x, + coordinates!![0].y + ) + } else if (renderEntity.wkt?.geometryType == Geometry.TYPENAME_LINESTRING) { + newGeometry = + GeometryTools.createLineString(coordinates) + } else if (renderEntity.wkt?.geometryType == Geometry.TYPENAME_POLYGON) { + newGeometry = + GeometryTools.createLineString(coordinates) + } + if (newGeometry != null) { + renderEntity.geometry = newGeometry.toString() + } + }*/ +// Log.d("ImportOMDBHelper", "解析===2处理3D") +// Log.d("ImportOMDBHelper", "解析===1处理属性") + for ((key, value) in map) { + when (value) { + is String -> renderEntity.properties[key] = value + is Int -> renderEntity.properties[key] = + value.toInt().toString() + + is Double -> renderEntity.properties[key] = + value.toDouble().toString() + + else -> renderEntity.properties[key] = + value.toString() + } + } +// Log.d("ImportOMDBHelper", "解析===2处理属性") +// Log.d("ImportOMDBHelper", "解析===1处理name") + // 如果properties中不包含name,那么自动将要素名称添加进properties中 + if (!renderEntity.properties.containsKey("name")) { + renderEntity.properties["name"] = renderEntity.name; + } +// Log.d("ImportOMDBHelper", "解析===2处理name") +// Log.d("ImportOMDBHelper", "解析===1处理杆状物") + + if (currentConfig.filterData) { + when (renderEntity.code.toInt()) { + +// DataCodeEnum.OMDB_POLE.code.toInt() -> { +// //过滤树类型的杆状物,无需导入到数据库中 +// val poleType = +// renderEntity.properties["poleType"] +// if (poleType != null && poleType.toInt() == 2) { +// line = bufferedReader.readLine() +// continue +// } +// } + +// DataCodeEnum.OMDB_LANE_MARK_BOUNDARYTYPE.code.toInt() -> { +// val boundaryType = +// renderEntity.properties["boundaryType"] +// if (boundaryType != null) { +// when (boundaryType.toInt()) { +// 0, 1, 6, 8, 9 -> { +// renderEntity.enable = 0 +//// Log.e( +//// "qj", +//// "过滤不显示数据${renderEntity.table}" +//// ) +// line = bufferedReader.readLine() +// continue +// } +// } +// } +// } + +// DataCodeEnum.OMDB_RDBOUND_BOUNDARYTYPE.code.toInt() -> { +// val boundaryType = +// renderEntity.properties["boundaryType"] +// if (boundaryType != null) { +// when (boundaryType.toInt()) { +// 0, 1, 3, 4, 5, 7, 9 -> { +// renderEntity.enable = 0 +//// Log.e( +//// "qj", +//// "过滤不显示数据${renderEntity.table}" +//// ) +// line = bufferedReader.readLine() +// continue +// } +// } +// } +// } + +// DataCodeEnum.OMDB_OBJECT_STOPLOCATION.code.toInt() -> { +// val locationType = +// renderEntity.properties["locationType"] +// if (locationType != null) { +// when (locationType.toInt()) { +// 3, 4 -> { +// renderEntity.enable = 0 +//// Log.e( +//// "qj", +//// "过滤不显示数据${renderEntity.table}" +//// ) +// line = bufferedReader.readLine() +// continue +// } +// } +// } +// } + + DataCodeEnum.OMDB_RESTRICTION.code.toInt() -> { + if (renderEntity.properties.containsKey("linkIn") && renderEntity.properties.containsKey( + "linkOut" + ) + ) { + val linkIn = + renderEntity.properties["linkIn"] + val linkOut = + renderEntity.properties["linkOut"] + if (linkIn != null && linkOut != null) { + val checkMsg = "$linkIn$linkOut" + if (resHashMap.containsKey(checkMsg)) { +// Log.e( +// "qj", +// "${renderEntity.name}==过滤交限linkin与linkout相同且存在多条数据" +// ) + line = bufferedReader.readLine() + continue + } else { + resHashMap[checkMsg] = renderEntity + } + } + } + } + } + + } + +// Log.d("ImportOMDBHelper", "解析===2处理杆状物") +// Log.d("ImportOMDBHelper", "解析===1任务路线匹配") + + //遍历判断只显示与任务Link相关的任务数据 + if (currentConfig.checkLinkId) { + + if (renderEntity.linkPid.isNotEmpty()) { + + val currentLinkPid = renderEntity.linkPid + +// Log.d( +// "ImportOMDBHelper", +// "解析===1任务路线匹配${currentLinkPid}" +// ) + + if (!currentLinkPid.isNullOrEmpty() && currentLinkPid != "null") { + + val list = currentLinkPid.split(",") + + if (list.isNotEmpty()) { + +// Log.d( +// "ImportOMDBHelper", +// "解析===1任务路线匹配${list.size}" +// ) + + m@ for (linkPid in list) { + if (hashMap.containsKey(linkPid.toLong())) { + renderEntity.enable = 1 +// Log.e( +// "qj", +// "${renderEntity.name}==包括任务link" +// ) + break@m + } + } + } + } + + } else if (renderEntity.code.toInt() == DataCodeEnum.OMDB_INTERSECTION.code.toInt() && renderEntity.properties.containsKey( + "linkList" + ) + ) { + + if (renderEntity.properties["linkList"] != null) { + +// Log.e( +// "qj", +// "linkList==开始${renderEntity.name}==${renderEntity.properties["linkList"]}}" +// ) + + val linkList = + renderEntity.properties["linkList"] + + if (!linkList.isNullOrEmpty() && linkList != "null") { + +// Log.e( +// "qj", +// "linkList==${renderEntity.name}==${renderEntity.properties["linkList"]}}" +// ) + + val list: List = gson.fromJson( + linkList, + object : + TypeToken>() {}.type + ) + + m@ for (link in list) { + if (hashMap.containsKey(link.linkPid.toLong())) { + renderEntity.enable = 1 +// Log.e( +// "qj", +// "${renderEntity.name}==包括任务link" +// ) + break@m + } + } + } + } + } +// else { +// //不包括linkPid直接过滤 +// line = bufferedReader.readLine() +// continue +// } +// //过滤掉非任务路线上的数据 +// if (renderEntity.enable != 1) { +//// Log.e( +//// "qj", +//// "${renderEntity.name}==过滤不包括任务路线上的数据" +//// ) +// line = bufferedReader.readLine() +// continue +// } + + } else { + renderEntity.enable = 1 + + /* var geometry = GeometryTools.createGeometry(renderEntity.geometry) + if(multipLine.intersects(geometry)){ + renderEntity.enable = 1 + }else{ + val dis = multipLine.distance(GeometryTools.createGeometry(renderEntity.geometry)) + if(dis>36){ + continue + }else{ + renderEntity.enable = 1 + } + }*/ +// Log.e("qj", "${renderEntity.name}==不包括任务linkPid") + } +// Log.d("ImportOMDBHelper", "解析===2任务路线匹配") +// Log.d("ImportOMDBHelper", "解析===1预处理") + + if (currentConfig.catch) { + renderEntity.catchEnable = 1 + } else { + renderEntity.catchEnable = 0 + } + + // 对renderEntity做预处理后再保存 + val resultEntity = + importConfig.transformProperties(renderEntity, realm) +// Log.d("ImportOMDBHelper", "解析===2预处理") + if (resultEntity != null) { + +// Log.d("ImportOMDBHelper", "解析===1子code处理") + //对code编码需要特殊处理 存在多个属性值时,渲染优先级:SA>PA,存在多个属性值时,渲染优先级:FRONTAGE>MAIN_SIDE_A CCESS + + if (currentConfig.existSubCode) { + when (renderEntity.code.toInt()) { + DataCodeEnum.OMDB_LINK_ATTRIBUTE.code.toInt() -> { + +// Log.e("qj", "道路属性===0") + + var type = renderEntity.properties["sa"] + + if (type != null && type == "1") { + renderEntity.code = + DataCodeEnum.OMDB_LINK_ATTRIBUTE_SA.code +// Log.e("qj", "道路属性===1") + } else { + type = renderEntity.properties["pa"] + if (type != null && type == "1") { + renderEntity.code = + DataCodeEnum.OMDB_LINK_ATTRIBUTE_PA.code +// Log.e("qj", "道路属性===2") + } else { + type = + renderEntity.properties["frontage"] + if (type != null && type == "1") { + renderEntity.code = + DataCodeEnum.OMDB_LINK_ATTRIBUTE_FORNTAGE.code + renderEntity.zoomMin = 15 + renderEntity.zoomMax = 17 +// Log.e("qj", "道路属性===3") + } else { + type = + renderEntity.properties["mainSideAccess"] + if (type != null && type == "1") { + renderEntity.code = + DataCodeEnum.OMDB_LINK_ATTRIBUTE_MAIN_SIDE_ACCESS.code + renderEntity.zoomMin = 15 + renderEntity.zoomMax = 17 +// Log.e("qj", "道路属性===4") + } +// else { +// renderEntity.enable = 0 +// renderEntity.zoomMin = 15 +// renderEntity.zoomMax = 17 +//// Log.e( +//// "qj", +//// "过滤不显示数据${renderEntity.table}" +//// ) +//// Log.e("qj", "道路属性===5") +// line = bufferedReader.readLine() +// continue +// } + } + } + } + } + //桥 + DataCodeEnum.OMDB_BRIDGE.code.toInt() -> { + when (renderEntity.properties["bridgeType"]) { + "1" -> renderEntity.code = + DataCodeEnum.OMDB_BRIDGE_1.code + "2" -> renderEntity.code = + DataCodeEnum.OMDB_BRIDGE_2.code + // "3" -> renderEntity.code = DataCodeEnum.OMDB_BRIDGE_3.code + else -> DataCodeEnum.OMDB_BRIDGE.code + } + } + + DataCodeEnum.OMDB_RAMP.code.toInt() -> { + /*匝道*/ + val formWay = + renderEntity.properties["formOfWay"] + if (formWay != null) { + when (formWay.toInt()) { + 93 -> renderEntity.code = + DataCodeEnum.OMDB_RAMP_1.code + + 98 -> renderEntity.code = + DataCodeEnum.OMDB_RAMP_2.code + + 99 -> renderEntity.code = + DataCodeEnum.OMDB_RAMP_3.code + + 100 -> renderEntity.code = + DataCodeEnum.OMDB_RAMP_4.code + + 102 -> renderEntity.code = + DataCodeEnum.OMDB_RAMP_5.code + + 103 -> renderEntity.code = + DataCodeEnum.OMDB_RAMP_6.code + + 104 -> renderEntity.code = + DataCodeEnum.OMDB_RAMP_7.code + } + } + } + + DataCodeEnum.OMDB_LINK_FORM1.code.toInt() -> { + /*道路形态1*/ + val formWay = + renderEntity.properties["formOfWay"] + if (formWay != null) { + when (formWay.toInt()) { + 35 -> renderEntity.code = + DataCodeEnum.OMDB_LINK_FORM1_1.code + + 37 -> renderEntity.code = + DataCodeEnum.OMDB_LINK_FORM1_2.code + + 38 -> renderEntity.code = + DataCodeEnum.OMDB_LINK_FORM1_3.code + } + } + } + + DataCodeEnum.OMDB_LINK_FORM2.code.toInt() -> { +// Log.e( +// "qj", +// "道路形态2${renderEntity.properties["formOfWay"]}" +// ) + /*道路形态2*/ + val formWay = + renderEntity.properties["formOfWay"] + if (formWay != null) { + when (formWay.toInt()) { + 10 -> renderEntity.code = + DataCodeEnum.OMDB_LINK_FORM2_1.code + + 11 -> renderEntity.code = + DataCodeEnum.OMDB_LINK_FORM2_2.code + + 17 -> renderEntity.code = + DataCodeEnum.OMDB_LINK_FORM2_3.code + + 18 -> renderEntity.code = + DataCodeEnum.OMDB_LINK_FORM2_4.code + + 20 -> renderEntity.code = + DataCodeEnum.OMDB_LINK_FORM2_5.code + + 22 -> renderEntity.code = + DataCodeEnum.OMDB_LINK_FORM2_6.code + + 36 -> renderEntity.code = + DataCodeEnum.OMDB_LINK_FORM2_7.code + + 52 -> renderEntity.code = + DataCodeEnum.OMDB_LINK_FORM2_8.code + + 53 -> renderEntity.code = + DataCodeEnum.OMDB_LINK_FORM2_9.code + + 54 -> renderEntity.code = + DataCodeEnum.OMDB_LINK_FORM2_10.code + + 60 -> renderEntity.code = + DataCodeEnum.OMDB_LINK_FORM2_11.code + + 84 -> renderEntity.code = + DataCodeEnum.OMDB_LINK_FORM2_12.code + + 85 -> renderEntity.code = + DataCodeEnum.OMDB_LINK_FORM2_13.code + } + } + } + + DataCodeEnum.OMDB_LANE_CONSTRUCTION.code.toInt() -> { + //特殊处理空数据,渲染原则使用 + val startTime = + renderEntity.properties["startTime"] + if (startTime == null || startTime == "") { + renderEntity.properties["startTime"] = + "null" + } + } + } + +// if (renderEntity.table == DataCodeEnum.OMDB_NODE_FORM.name) {//特殊处理,因为code相同,使用表名判断 +// //过滤不需要渲染的要素 +// val formOfWay = +// renderEntity.properties["formOfWay"] +// if (formOfWay != null && formOfWay.toInt() == 30) { +// renderEntity.enable = 2 +// renderEntity.code = +// DataCodeEnum.OMDB_NODE_FORM.code +// } else { +//// Log.e( +//// "qj", +//// "过滤不显示数据${renderEntity.table}" +//// ) +// line = bufferedReader.readLine() +// continue +// } +// } else if (renderEntity.table == DataCodeEnum.OMDB_NODE_PA.name) {//特殊处理,因为code相同,使用表名判断 +// //过滤不需要渲染的要素 +// val attributeType = +// renderEntity.properties["attributeType"] +// if (attributeType != null && attributeType.toInt() == 30) { +// renderEntity.enable = 2 +// renderEntity.code = +// DataCodeEnum.OMDB_NODE_PA.code +// } else { +//// Log.e( +//// "qj", +//// "过滤不显示数据${renderEntity.table}" +//// ) +// line = bufferedReader.readLine() +// continue +// } +// } + } + +// Log.d("ImportOMDBHelper", "解析===2子code处理") + ++insertIndex + Log.e("qj", "统计==${insertIndex}") + + //移除该字段,减少数据量 + if (renderEntity.properties.containsKey("geometry")) { + renderEntity.properties.remove("geometry") + } + + //移除该字段,减少数据量 + if (renderEntity.properties.containsKey("linkPid")) { + renderEntity.properties.remove("linkPid") + } + + // 如果当前解析的是OMDB_RD_LINK数据,将其缓存在预处理类中,以便后续处理其他要素时使用 + if (currentConfig.code == DataCodeEnum.OMDB_RD_LINK.code.toInt()) { + if (renderEntity.linkRelation == null) { + renderEntity.linkRelation = LinkRelation() + } + renderEntity.linkRelation!!.linkPid = + renderEntity.linkPid + renderEntity.linkRelation!!.sNodeId = + renderEntity.properties["snodePid"] + renderEntity.linkRelation!!.eNodeId = + renderEntity.properties["enodePid"] + } + renderEntity.propertiesDb = StrZipUtil.compress( + gson.toJson(renderEntity.properties).toString() + ) + + when (renderEntity.code) { + DataCodeEnum.OMDB_LANE_LINK_LG.code, + DataCodeEnum.OMDB_LINK_SPEEDLIMIT.code, + DataCodeEnum.OMDB_POLE.code, + DataCodeEnum.OMDB_LINK_DIRECT.code, + DataCodeEnum.OMDB_RD_LINK_FUNCTION_CLASS.code, + DataCodeEnum.OMDB_LINK_NAME.code, + DataCodeEnum.OMDB_OBJECT_ARROW.code, + DataCodeEnum.OMDB_TRAFFICLIGHT.code -> { + val renderEntity1 = RenderEntity1() + renderEntity1.code = resultEntity.code + renderEntity1.linkPid = renderEntity.linkPid + renderEntity1.table = renderEntity.table + renderEntity1.name = renderEntity.name + renderEntity1.linkRelation = + renderEntity.linkRelation + renderEntity1.catchEnable = renderEntity.catchEnable + renderEntity1.enable = renderEntity.enable + renderEntity1.geometry = renderEntity.geometry + renderEntity1.taskId = renderEntity.taskId +// renderEntity1.tileX = renderEntity.tileX +// renderEntity1.tileY = renderEntity.tileY + renderEntity1.tileXMin = renderEntity.tileXMin + renderEntity1.tileXMax = renderEntity.tileXMax + renderEntity1.tileYMin = renderEntity.tileYMin + renderEntity1.tileYMax = renderEntity.tileYMax +// renderEntity1.wkt = renderEntity.wkt + renderEntity1.zoomMin = renderEntity.zoomMin + renderEntity1.zoomMax = renderEntity.zoomMax + renderEntity1.propertiesDb = + renderEntity.propertiesDb + listRenderEntity1.add(renderEntity1) + + } + + + else -> listRenderEntity.add(renderEntity) + } +// Log.d("ImportOMDBHelper", "解析===1insert") +// realm.insert(renderEntity) + +// Log.d("ImportOMDBHelper", "解析===2insert") + } +// if (currentConfig.code == DataCodeEnum.OMDB_RD_LINK.code.toInt()) { +// listResult.add(renderEntity) +// } + + + if (listRenderEntity.size > 10000) { + Log.e( + "jingo", "20000刷新" + ) + realm.copyToRealm(listRenderEntity) + realm.commitTransaction() + realm.close() + listRenderEntity.clear() + insertIndex = 0 + delay(100) +// Realm.compactRealm(currentInstallTaskConfig) + realm = Realm.getInstance(currentInstallTaskConfig) + + realm.beginTransaction() + } + if (listRenderEntity1.size > 10000) { + Log.e( + "jingo", "20000刷新" + ) + realm.copyToRealm(listRenderEntity1) + realm.commitTransaction() + realm.close() + listRenderEntity1.clear() + insertIndex = 0 + delay(100) +// Realm.compactRealm(currentInstallTaskConfig) + realm = Realm.getInstance(currentInstallTaskConfig) + realm.beginTransaction() + +// Log.d( +// "ImportOMDBHelper", +// "表解析===结束用时时间===事物结束" +// ) + } + line = bufferedReader.readLine() } + bufferedReader.close() + } - // 如果当前解析的是OMDB_RD_LINK数据,将其缓存在预处理类中,以便后续处理其他要素时使用 - if (currentConfig.code == DataCodeEnum.OMDB_RD_LINK.code.toInt()) { -// importConfig.preProcess.cacheRdLink = -// listResult.associateBy { it.properties["linkPid"] } - // 将sNodeId和eNodeId放在外层关联对象中,优化查询效率 - } + +// // 将listResult数据插入到Realm数据库中 +// currentConfig.let { +// val list = FileIOUtils.readFile2List(txtFile, "UTF-8") +//// Log.d("ImportOMDBHelper", "开始解析:${txtFile?.name}") +// if (list != null) { +// // 将list数据转换为map +// for ((index, line) in list.withIndex()) { +// +// } +// +// } +// } +// // 如果当前解析的是OMDB_RD_LINK数据,将其缓存在预处理类中,以便后续处理其他要素时使用 +// if (currentConfig.code == DataCodeEnum.OMDB_RD_LINK.code.toInt()) { +//// importConfig.preProcess.cacheRdLink = +//// listResult.associateBy { it.properties["linkPid"] } +// // 将sNodeId和eNodeId放在外层关联对象中,优化查询效率 +// } // 1个文件发送一次flow流 emit("${processIndex}/${tableNum}") - Log.d("ImportOMDBHelper", "表解析===2${currentConfig.table}") - Log.d( - "ImportOMDBHelper", - "表解析===结束用时时间${(System.currentTimeMillis() - tableImportTime)}===${currentEntry.value.table}===$elementIndex" - ) +// Log.d("ImportOMDBHelper", "表解析===2${currentConfig.table}") +// Log.d( +// "ImportOMDBHelper", +// "表解析===结束用时时间${(System.currentTimeMillis() - tableImportTime)}===${currentEntry.value.table}===$elementIndex" +// ) elementIndex = 0 - tableImportTime = System.currentTimeMillis() - if (insertIndex % 20000 == 0 || currentEntry.value.table == DataCodeEnum.OMDB_RD_LINK.name) { - Log.d( - "ImportOMDBHelper", - "表解析===结束用时时间===事物开始" - ) - realm.commitTransaction() - realm.refresh() - realm.beginTransaction() - Log.d( - "ImportOMDBHelper", - "表解析===结束用时时间===事物结束" - ) - } +// tableImportTime = System.currentTimeMillis() } } + + realm.copyToRealm(listRenderEntity) realm.commitTransaction() + realm.close() - Log.d( - "ImportOMDBHelper", - "表解析===结束用时时间${(System.currentTimeMillis() - dataImportTime)}===$dataIndex===插入$insertIndex" - ) + listRenderEntity.clear() +// Log.d( +// "ImportOMDBHelper", +// "表解析===结束用时时间${(System.currentTimeMillis() - dataImportTime)}===$dataIndex===插入$insertIndex" +// ) Log.e("qj", "安装结束") } catch (e: Exception) { if (realm.isInTransaction) { diff --git a/app/src/main/java/com/navinfo/omqs/db/ImportPreProcess.kt b/app/src/main/java/com/navinfo/omqs/db/ImportPreProcess.kt index 88975c05..df1b2b36 100644 --- a/app/src/main/java/com/navinfo/omqs/db/ImportPreProcess.kt +++ b/app/src/main/java/com/navinfo/omqs/db/ImportPreProcess.kt @@ -20,41 +20,43 @@ import java.util.* class ImportPreProcess { val code2NameMap = Code2NameMap() -// lateinit var cacheRdLink: Map + + // lateinit var cacheRdLink: Map val defaultTranslateDistance = 3.0 val testFlag: Boolean = false + var realm: Realm? = null fun checkCircleRoad(renderEntity: RenderEntity): Boolean { val linkInId = renderEntity.properties["linkIn"] val linkOutId = renderEntity.properties["linkOut"] // // 根据linkIn和linkOut获取对应的link数据 // val linkInEntity = cacheRdLink[linkInId] // val linkOutEntity = cacheRdLink[linkOutId] + realm?.let { + val linkInEntity = it.where(RenderEntity::class.java) + .equalTo("code", DataCodeEnum.OMDB_RD_LINK.code) + .and().equalTo("linkPid", linkInId) + .findFirst() + val linkOutEntity = it.where(RenderEntity::class.java) + .equalTo("code", DataCodeEnum.OMDB_RD_LINK.code) + .and().equalTo("linkPid", linkOutId) + .findFirst() - // 根据linkIn和linkOut从数据库获取对应的link数据 - Realm.getInstance(Constant.currentInstallTaskConfig) - .use { realm -> - val linkInEntity = realm.where(RenderEntity::class.java) - .equalTo("code", DataCodeEnum.OMDB_RD_LINK.code) - .and().equalTo("linkPid", linkInId) - .findFirst() - val linkOutEntity = realm.where(RenderEntity::class.java) - .equalTo("code", DataCodeEnum.OMDB_RD_LINK.code) - .and().equalTo("linkPid", linkOutId) - .findFirst() - - Log.d( - "checkCircleRoad", - "LinkInEntity: ${linkInId}- ${linkInEntity?.properties?.get("snodePid")},LinkOutEntity: ${linkOutId}- ${ - linkOutEntity?.properties?.get("enodePid") - }" - ) - // 查询linkIn的sNode和linkOut的eNode是否相同,如果相同,认为数据是环形路口,返回false - if (linkInEntity != null && linkOutEntity != null) { - if (linkInEntity.properties["snodePid"] == linkOutEntity.properties["enodePid"] || linkInEntity.properties["enodePid"] == linkOutEntity.properties["snodePid"] || linkInEntity.properties["snodePid"] == linkOutEntity.properties["snodePid"] || linkInEntity.properties["enodePid"] == linkOutEntity.properties["enodePid"]) { - return false - } + Log.d( + "checkCircleRoad", + "LinkInEntity: ${linkInId}- ${linkInEntity?.properties?.get("snodePid")},LinkOutEntity: ${linkOutId}- ${ + linkOutEntity?.properties?.get("enodePid") + }" + ) + // 查询linkIn的sNode和linkOut的eNode是否相同,如果相同,认为数据是环形路口,返回false + if (linkInEntity != null && linkOutEntity != null) { + if (linkInEntity.properties["snodePid"] == linkOutEntity.properties["enodePid"] || linkInEntity.properties["enodePid"] == linkOutEntity.properties["snodePid"] || linkInEntity.properties["snodePid"] == linkOutEntity.properties["snodePid"] || linkInEntity.properties["enodePid"] == linkOutEntity.properties["enodePid"]) { + return false } } + } +// // 根据linkIn和linkOut从数据库获取对应的link数据 +// Realm.getInstance(Constant.currentInstallTaskConfig) + return true } @@ -78,8 +80,8 @@ class ImportPreProcess { } } // 如果是正向,则取最后一个点作为渲染图标的位置 - var point = geometry!!.coordinates[geometry!!.coordinates.size-1] - if (isReverse){ + var point = geometry!!.coordinates[geometry!!.coordinates.size - 1] + if (isReverse) { // 逆向的话取第一个点作为渲染图标的位置 point = geometry.coordinates[0] } @@ -214,16 +216,16 @@ class ImportPreProcess { startGeometry!!.coordinates[startGeometry.numPoints - 1] // 获取这个geometry对应的结束点坐标 if (translateGeometry.geometryType == Geometry.TYPENAME_LINESTRING) { // 如果是线数据,则取倒数第二个点作为偏移的起止点 pointEnd = - translateGeometry!!.coordinates[translateGeometry.numPoints - 2] // 获取这个geometry对应的结束点坐标 + translateGeometry.coordinates[translateGeometry.numPoints - 2] // 获取这个geometry对应的结束点坐标 } if (startGeometry.geometryType == Geometry.TYPENAME_LINESTRING) { // 如果是线数据,则取倒数第二个点作为偏移的起止点 pointStart = - startGeometry!!.coordinates[startGeometry.numPoints - 2] // 获取这个geometry对应的结束点坐标 + startGeometry.coordinates[startGeometry.numPoints - 2] // 获取这个geometry对应的结束点坐标 } // 将这个起终点的线记录在数据中 val startEndReference = ReferenceEntity() - startEndReference.renderEntityId = renderEntity.id +// startEndReference.renderEntityId = renderEntity.id startEndReference.name = "${renderEntity.name}参考线" startEndReference.table = renderEntity.table startEndReference.zoomMin = renderEntity.zoomMin @@ -253,7 +255,7 @@ class ImportPreProcess { // 将这个起终点的线记录在数据中 val startReference = ReferenceEntity() - startReference.renderEntityId = renderEntity.id +// startReference.renderEntityId = renderEntity.id startReference.name = "${renderEntity.name}参考点" startReference.code = renderEntity.code startReference.table = renderEntity.table @@ -290,7 +292,7 @@ class ImportPreProcess { Log.e("qj", "generateS2EReferencePoint===1") val endReference = ReferenceEntity() - endReference.renderEntityId = renderEntity.id +// endReference.renderEntityId = renderEntity.id endReference.name = "${renderEntity.name}参考点" endReference.code = renderEntity.code endReference.table = renderEntity.table @@ -405,7 +407,7 @@ class ImportPreProcess { val coorEnd = Coordinate(pointStart.getX() + dx, pointStart.getY() + dy, pointStart.z) val angleReference = ReferenceEntity() - angleReference.renderEntityId = renderEntity.id +// angleReference.renderEntityId = renderEntity.id angleReference.name = "${renderEntity.name}参考方向" angleReference.table = renderEntity.table angleReference.zoomMin = renderEntity.zoomMin @@ -492,7 +494,7 @@ class ImportPreProcess { for (i in 0 until laneInfoDirectArray.length()) { // 根据后续的数据生成辅助表数据 val referenceEntity = ReferenceEntity() - referenceEntity.renderEntityId = renderEntity.id +// referenceEntity.renderEntityId = renderEntity.id referenceEntity.name = "${renderEntity.name}参考方向" referenceEntity.table = renderEntity.table referenceEntity.enable = renderEntity.enable @@ -500,7 +502,7 @@ class ImportPreProcess { referenceEntity.zoomMin = renderEntity.zoomMin referenceEntity.zoomMax = renderEntity.zoomMax // 与原数据使用相同的geometry - referenceEntity.geometry = renderEntity.geometry.toString() + referenceEntity.geometry = renderEntity.geometry referenceEntity.properties["qi_table"] = renderEntity.table referenceEntity.properties["currentDirect"] = laneInfoDirectArray[i].toString().split(",").distinct().joinToString("_") @@ -579,7 +581,7 @@ class ImportPreProcess { } // 获取最小的shape值,将其记录增加记录在properties的name属性下 if (shape != null) { - renderEntity.properties["name"] = shape["name"].toString() + renderEntity.properties["name"] = shape.optString("name", "") } else { renderEntity.properties["name"] = "" } @@ -588,25 +590,25 @@ class ImportPreProcess { /** * 通过rdDirect对象向rdLink的relation字段 * */ - fun addRdLinkDirect(renderEntity: RenderEntity) { - // 尝试更新RD_link的relation记录中的方向字段 - val rdLinkEntity = queryRdLink(renderEntity.properties["linkPid"]!!) - if (rdLinkEntity?.linkRelation == null) { - rdLinkEntity?.linkRelation = LinkRelation() - } - rdLinkEntity?.linkRelation?.direct = renderEntity.properties["direct"]!!.toInt() - Realm.getInstance(Constant.currentInstallTaskConfig).insertOrUpdate(rdLinkEntity) - } +// fun addRdLinkDirect(renderEntity: RenderEntity) { +// // 尝试更新RD_link的relation记录中的方向字段 +// val rdLinkEntity = queryRdLink(renderEntity.properties["linkPid"]!!) +// if (rdLinkEntity?.linkRelation == null) { +// rdLinkEntity?.linkRelation = LinkRelation() +// } +// rdLinkEntity?.linkRelation?.direct = renderEntity.properties["direct"]!!.toInt() +// Realm.getInstance(Constant.currentInstallTaskConfig).insertOrUpdate(rdLinkEntity) +// } /** * 查询指定的Rdlink数据 * */ - fun queryRdLink(rdLinkId: String): RenderEntity? { - return Realm.getInstance(Constant.currentInstallTaskConfig).where(RenderEntity::class.java) - .equalTo("code", DataCodeEnum.OMDB_RD_LINK.code) - .and().equalTo("linkPid", rdLinkId) - .findFirst() - } +// fun queryRdLink(rdLinkId: String): RenderEntity? { +// //////// return Realm.getInstance(Constant.currentInstallTaskConfig).where(RenderEntity::class.java) +// .equalTo("code", DataCodeEnum.OMDB_RD_LINK.code) +// .and().equalTo("linkPid", rdLinkId) +// .findFirst() +// } /** * 生成电子眼对应的渲染名称 @@ -626,21 +628,28 @@ class ImportPreProcess { * 生成车道中心线面宽度 * */ fun generateAddWidthLine(renderEntity: RenderEntity) { - // 添加车道中心面渲染原则,根据车道宽度进行渲染 - val angleReference = ReferenceEntity() - angleReference.renderEntityId = renderEntity.id - angleReference.name = "${renderEntity.name}车道中线面" - angleReference.table = renderEntity.table - angleReference.geometry = GeometryTools.createGeometry(renderEntity.geometry).buffer(0.000035).toString()//GeometryTools.computeLine(0.000035,0.000035,renderEntity.geometry) - angleReference.properties["qi_table"] = renderEntity.table - angleReference.properties["widthProperties"] = "3" - angleReference.zoomMin = renderEntity.zoomMin - angleReference.zoomMax = renderEntity.zoomMax - angleReference.taskId = renderEntity.taskId - angleReference.enable = renderEntity.enable - val listResult = mutableListOf() - listResult.add(angleReference) - insertData(listResult) + try { + // 添加车道中心面渲染原则,根据车道宽度进行渲染 + val angleReference = ReferenceEntity() +// angleReference.renderEntityId = renderEntity.id + angleReference.name = "${renderEntity.name}车道中线面" + angleReference.table = renderEntity.table + angleReference.geometry = + GeometryTools.createGeometry(renderEntity.geometry).buffer(0.000035) + .toString()//GeometryTools.computeLine(0.000035,0.000035,renderEntity.geometry) + angleReference.properties["qi_table"] = renderEntity.table + angleReference.properties["widthProperties"] = "3" + angleReference.zoomMin = renderEntity.zoomMin + angleReference.zoomMax = renderEntity.zoomMax + angleReference.taskId = renderEntity.taskId + angleReference.enable = renderEntity.enable + val listResult = mutableListOf() + listResult.add(angleReference) + insertData(listResult) + } catch (e: Exception) { + Log.e("jingo", "车道中心线 generateAddWidthLine ${e.message}") + } + } @@ -656,7 +665,7 @@ class ImportPreProcess { for (i in 0 until nodeListJsonArray.length()) { val nodeJSONObject = nodeListJsonArray.getJSONObject(i) val intersectionReference = ReferenceEntity() - intersectionReference.renderEntityId = renderEntity.id +// intersectionReference.renderEntityId = renderEntity.id intersectionReference.name = "${renderEntity.name}参考点" intersectionReference.code = renderEntity.code intersectionReference.table = renderEntity.table @@ -823,7 +832,7 @@ class ImportPreProcess { val coorEnd = Coordinate(pointStart.getX() + dx, pointStart.getY() + dy, pointStart.z) val dynamicSrcReference = ReferenceEntity() - dynamicSrcReference.renderEntityId = renderEntity.id +// dynamicSrcReference.renderEntityId = renderEntity.id dynamicSrcReference.name = "${renderEntity.name}动态icon" dynamicSrcReference.table = renderEntity.table dynamicSrcReference.zoomMin = renderEntity.zoomMin @@ -842,13 +851,16 @@ class ImportPreProcess { insertData(listResult) } - private fun insertData(list:List){ - Log.e("qj", "子表插入==") - if(list!=null&& list.isNotEmpty()){ - Log.e("qj", "子表插入开始==") - Realm.getInstance(Constant.currentInstallTaskConfig).insert(list) - Log.e("qj", "子表插入结束==") + private fun insertData(list: List) { + realm?.let { + Log.e("qj", "子表插入==") + if (list != null && list.isNotEmpty()) { + Log.e("qj", "子表插入开始==") + it.insert(list) + Log.e("qj", "子表插入结束==") + } } + } /** @@ -894,7 +906,8 @@ class ImportPreProcess { val coorEnd = Coordinate(pointStart.getX() + dx, pointStart.getY() + dy, pointStart.z) // renderEntity.geometry = WKTWriter(3).write(GeometryTools.createLineString(arrayOf(pointStart, coorEnd))) - renderEntity.geometry = GeometryTools.createGeometry(GeoPoint(centerPoint!!.y, centerPoint.x)).toString() + renderEntity.geometry = + GeometryTools.createGeometry(GeoPoint(centerPoint!!.y, centerPoint.x)).toString() val code = renderEntity.properties["signType"] renderEntity.properties["src"] = "assets:omdb/appendix/1105_${code}_0.svg" } @@ -930,9 +943,11 @@ class ImportPreProcess { val listResult = mutableListOf() val coorEnd = Coordinate(pointStart.getX() + dx, pointStart.getY() + dy, pointStart.z) - renderEntity.geometry = WKTWriter(3).write(GeometryTools.createLineString(arrayOf(pointStart, coorEnd))) + renderEntity.geometry = + WKTWriter(3).write(GeometryTools.createLineString(arrayOf(pointStart, coorEnd))) } else { - renderEntity.geometry = GeometryTools.createGeometry(GeoPoint(centerPoint!!.y, centerPoint.x)).toString() + renderEntity.geometry = + GeometryTools.createGeometry(GeoPoint(centerPoint!!.y, centerPoint.x)).toString() } } } \ 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 8a9f189a..f32b64c5 100644 --- a/app/src/main/java/com/navinfo/omqs/db/RealmOperateHelper.kt +++ b/app/src/main/java/com/navinfo/omqs/db/RealmOperateHelper.kt @@ -65,13 +65,12 @@ class RealmOperateHelper() { val yEnd = tileYSet.stream().max(Comparator.naturalOrder()).orElse(null) // 查询realm中对应tile号的数据 // val realm = getSelectTaskRealmInstance() + val sql = + " ((tileXMin <= $xStart and tileXMax >= $xStart) or (tileXMin <=$xEnd and tileXMax >=$xStart)) and ((tileYMin <= $yStart and tileYMax >= $yStart) or (tileYMin <=$yEnd and tileYMin >=$yStart))" val realmList = getSelectTaskRealmTools(realm, RenderEntity::class.java, false) .equalTo("table", DataCodeEnum.OMDB_LINK_DIRECT.name) - .greaterThanOrEqualTo("tileX", xStart) - .lessThanOrEqualTo("tileX", xEnd) - .greaterThanOrEqualTo("tileY", yStart) - .lessThanOrEqualTo("tileY", yEnd) + .rawPredicate(sql) .findAll() // 将获取到的数据和查询的polygon做相交,只返回相交的数据 val dataList = realm.copyFromRealm(realmList) @@ -285,11 +284,11 @@ class RealmOperateHelper() { val yEnd = tileYSet.stream().max(Comparator.naturalOrder()).orElse(null) val realm = getSelectTaskRealmInstance() var realmList = mutableListOf() + val sql = + " ((tileXMin <= $xStart and tileXMax >= $xStart) or (tileXMin <=$xEnd and tileXMax >=$xStart)) and ((tileYMin <= $yStart and tileYMax >= $yStart) or (tileYMin <=$yEnd and tileYMin >=$yStart))" + val realmQuery = getSelectTaskRealmTools(realm, RenderEntity::class.java, false) - .greaterThanOrEqualTo("tileX", xStart) - .lessThanOrEqualTo("tileX", xEnd) - .greaterThanOrEqualTo("tileY", yStart) - .lessThanOrEqualTo("tileY", yEnd) + .rawPredicate(sql) // 筛选不显示的数据 if (catchAll) { // 查询realm中对应tile号的数据 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 69963b8b..4dffc1b4 100644 --- a/app/src/main/java/com/navinfo/omqs/hilt/GlobalModule.kt +++ b/app/src/main/java/com/navinfo/omqs/hilt/GlobalModule.kt @@ -154,20 +154,6 @@ class GlobalModule { ) } -// /** -// * realm 注册 -// */ -// @Provides -// @Singleton -// fun provideRealmService(context: Application): RealmCoroutineScope { -// return RealmCoroutineScope(context) -// } - -// @Singleton -// @Provides -// fun provideRealmDefaultInstance(): Realm { -// return Realm.getDefaultInstance() -// } @Singleton @Provides diff --git a/app/src/main/java/com/navinfo/omqs/ui/activity/login/LoginActivity.kt b/app/src/main/java/com/navinfo/omqs/ui/activity/login/LoginActivity.kt index f6a9b4f4..75801d42 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/activity/login/LoginActivity.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/activity/login/LoginActivity.kt @@ -1,7 +1,5 @@ package com.navinfo.omqs.ui.activity.login -import android.app.Activity -import android.app.ActivityManager import android.content.Intent import android.os.Bundle import android.util.DisplayMetrics @@ -11,7 +9,6 @@ import androidx.activity.viewModels import androidx.appcompat.app.AlertDialog import androidx.databinding.DataBindingUtil import androidx.lifecycle.Observer -import androidx.lifecycle.viewModelScope import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.navinfo.omqs.R import com.navinfo.omqs.databinding.ActivityLoginBinding @@ -19,8 +16,6 @@ import com.navinfo.omqs.ui.activity.CheckPermissionsActivity import com.navinfo.omqs.ui.activity.map.MainActivity import com.umeng.commonsdk.UMConfigure import dagger.hilt.android.AndroidEntryPoint -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.launch /** * 登陆页面 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 efd07c8e..21ecd00c 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 @@ -342,6 +342,8 @@ class MainViewModel @Inject constructor( Constant.currentSelectTaskConfig = RealmConfiguration.Builder().directory(Constant.currentSelectTaskFolder) .name("OMQS.realm").encryptionKey(Constant.PASSWORD) +// .assetFile("${Constant.currentSelectTaskFolder}/OMQS.realm") +// .readOnly() // .allowQueriesOnUiThread(true) .schemaVersion(2).build() MapParamUtils.setTaskConfig(Constant.currentSelectTaskConfig) @@ -353,8 +355,7 @@ class MainViewModel @Inject constructor( if (naviEngineStatus == 1) { naviEngineNew.let { // naviMutex.lock() - Log.e("jingo","${Thread.currentThread().name} ${Thread.currentThread().hashCode()}") - if (testRealm == null) + if (testRealm == null) testRealm = realmOperateHelper.getSelectTaskRealmInstance() if (currentTaskBean != null) { naviEngineNew.bindingRoute( diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskViewModel.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskViewModel.kt index 1ca96f20..a3edd425 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskViewModel.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskViewModel.kt @@ -107,7 +107,8 @@ class TaskViewModel @Inject constructor( if (currentSelectTaskBean == null) { liveDataToastMessage.postValue("还没有开启任何任务") } else { - val links = realmOperateHelper.queryLink(realm, + val links = realmOperateHelper.queryLink( + realm, point = point, ) if (links.isNotEmpty()) { @@ -184,7 +185,7 @@ class TaskViewModel @Inject constructor( if (task.syncStatus != FileManager.Companion.FileUploadStatus.DONE) { //赋值时间,用于查询过滤 task.operationTime = DateTimeUtil.getNowDate().time - }else{//已上传数据不做更新 + } else {//已上传数据不做更新 continue } } else { @@ -194,7 +195,7 @@ class TaskViewModel @Inject constructor( //赋值时间,用于查询过滤 task.operationTime = DateTimeUtil.getNowDate().time } - realm.copyToRealmOrUpdate(task) + it.copyToRealmOrUpdate(task) } } @@ -273,10 +274,15 @@ class TaskViewModel @Inject constructor( liveDataTaskLinks.value = taskBean.hadLinkDvoList showTaskLinks(taskBean) MapParamUtils.setTaskId(taskBean.id) - Constant.currentSelectTaskFolder = File(Constant.USER_DATA_PATH + "/${taskBean.id}") +// Constant.currentSelectTaskFolder = File(Constant.USER_DATA_PATH + "/${taskBean.id}") + Constant.currentSelectTaskFolder = File(Constant.USER_DATA_PATH + "/237") Constant.currentSelectTaskConfig = - RealmConfiguration.Builder().directory(Constant.currentSelectTaskFolder) - .name("OMQS.realm").encryptionKey(Constant.PASSWORD) + RealmConfiguration.Builder() + .directory(Constant.currentSelectTaskFolder) + .name("OMQS.realm") + .encryptionKey(Constant.PASSWORD) +// .assetFile("${Constant.currentSelectTaskFolder}/OMQS.realm") +// .readOnly() //.allowQueriesOnUiThread(true) .schemaVersion(2).build() MapParamUtils.setTaskConfig(Constant.currentSelectTaskConfig) @@ -574,7 +580,7 @@ class TaskViewModel @Inject constructor( } //根据Link数据查询对应数据上要素,对要素进行显示重置 data.properties["linkPid"]?.let { - realmOperateHelper.queryLinkToMutableRenderEntityList(realm,it) + realmOperateHelper.queryLinkToMutableRenderEntityList(realm, it) ?.forEach { renderEntity -> if (renderEntity.enable != 1) { renderEntity.enable = 1 @@ -629,7 +635,10 @@ class TaskViewModel @Inject constructor( //重置数据为隐藏 if (hadLinkDvoBean.linkStatus == 2) { - realmOperateHelper.queryLinkToMutableRenderEntityList(realm,hadLinkDvoBean.linkPid) + realmOperateHelper.queryLinkToMutableRenderEntityList( + realm, + hadLinkDvoBean.linkPid + ) ?.forEach { renderEntity -> if (renderEntity.enable == 1) { renderEntity.enable = 0 diff --git a/collect-library/src/main/java/com/navinfo/collect/library/data/entity/LinkRelation.kt b/collect-library/src/main/java/com/navinfo/collect/library/data/entity/LinkRelation.kt index ccb8137a..2e52a7cf 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/data/entity/LinkRelation.kt +++ b/collect-library/src/main/java/com/navinfo/collect/library/data/entity/LinkRelation.kt @@ -21,16 +21,7 @@ import java.util.* * */ @Parcelize open class LinkRelation() : RealmObject(), Parcelable { - @PrimaryKey - var linkPid:String = UUID.randomUUID().toString() - @Index + var linkPid:String = "" var sNodeId: String? = null - @Index var eNodeId: String? = null - - var direct: Int = 0 - - constructor(direct: Int) : this() { - this.direct = direct - } } \ No newline at end of file diff --git a/collect-library/src/main/java/com/navinfo/collect/library/data/entity/ReferenceEntity.kt b/collect-library/src/main/java/com/navinfo/collect/library/data/entity/ReferenceEntity.kt index 1e509da0..16bc51a9 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/data/entity/ReferenceEntity.kt +++ b/collect-library/src/main/java/com/navinfo/collect/library/data/entity/ReferenceEntity.kt @@ -14,21 +14,25 @@ import java.util.* * 渲染要素对应的实体 * */ open class ReferenceEntity() : RealmObject() { - @PrimaryKey - var id: String = UUID.randomUUID().toString() // id - var renderEntityId: String = "" // 参考的renderEntity的Id + // @PrimaryKey +// var id: Int = 0 // id +// var renderEntityId: Int = 0 // 参考的renderEntity的Id + @Ignore lateinit var name: String //要素名 lateinit var table: String //要素表名 var code: String = "0" // 要素编码 + @Ignore var zoomMin: Int = 18 //显示最小级别 + @Ignore var zoomMax: Int = 23 //显示最大级别 var taskId: Int = 0 //任务ID - var enable:Int = 0 // 默认0不是显示 1为渲染显示 - var tileXMin:Int =0 - var tileXMax:Int = 0 - var tileYMin:Int =0 - var tileYMax:Int = 0 - var geometry: String = "" // 要素渲染参考的geometry,该数据可能会在导入预处理环节被修改,原始geometry会保存在properties的geometry字段下 + var enable: Int = 0 // 默认0不是显示 1为渲染显示 + var tileXMin: Int = 0 + var tileXMax: Int = 0 + var tileYMin: Int = 0 + var tileYMax: Int = 0 + var geometry: String = + "" // 要素渲染参考的geometry,该数据可能会在导入预处理环节被修改,原始geometry会保存在properties的geometry字段下 get() { wkt = GeometryTools.createGeometry(field) return field @@ -64,11 +68,16 @@ open class ReferenceEntity() : RealmObject() { } return field } + @Ignore var properties: RealmDictionary = RealmDictionary() + + @Ignore var tileX: RealmSet = RealmSet() // x方向的tile编码 + + @Ignore var tileY: RealmSet = RealmSet() // y方向的tile编码 - constructor(name: String): this() { + constructor(name: String) : this() { this.name = name } } \ 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 b554a838..a776ea61 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/data/entity/RenderEntity.kt +++ b/collect-library/src/main/java/com/navinfo/collect/library/data/entity/RenderEntity.kt @@ -1,9 +1,12 @@ package com.navinfo.collect.library.data.entity import android.os.Parcelable +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken import com.navinfo.collect.library.system.Constant import com.navinfo.collect.library.utils.GeometryTools import com.navinfo.collect.library.utils.GeometryToolsKt +import com.navinfo.collect.library.utils.StrZipUtil import io.realm.RealmDictionary import io.realm.RealmObject import io.realm.RealmSet @@ -15,24 +18,35 @@ import org.locationtech.jts.geom.Coordinate import org.locationtech.jts.geom.Geometry import org.oscim.core.MercatorProjection import java.util.* +import java.util.zip.GZIPInputStream /** * 渲染要素对应的实体 * */ @Parcelize open class RenderEntity() : RealmObject(), Parcelable { - @PrimaryKey - var id: String = UUID.randomUUID().toString() // id + // @PrimaryKey +// var id: String = UUID.randomUUID().toString() // id lateinit var name: String //要素名 lateinit var table: String //要素表名 var code: String = "0" // 要素编码 - var geometry: String = "" // 要素渲染参考的geometry,该数据可能会在导入预处理环节被修改,原始geometry会保存在properties的geometry字段下 +// var geometryDb: String = "" + + var geometry: String = + "" // 要素渲染参考的geometry,该数据可能会在导入预处理环节被修改,原始geometry会保存在properties的geometry字段下 get() { wkt = GeometryTools.createGeometry(field) return field } + // get() { +// if (geometryDb != null && geometryDb.isNotEmpty() && field.isEmpty()) { +// field = StrZipUtil.uncompress(geometryDb) +// } +// return field +// } set(value) { field = value +// geometryDb = StrZipUtil.compress(value) // 根据geometry自动计算当前要素的x-tile和y-tile GeometryToolsKt.getTileXByGeometry(value, tileX) @@ -64,22 +78,40 @@ open class RenderEntity() : RealmObject(), Parcelable { } return field } + + @Ignore var properties: RealmDictionary = RealmDictionary() + get() { + if (propertiesDb != null && propertiesDb.isNotEmpty() && field.isEmpty()) { + try { + val gson = Gson() + val type = object : TypeToken>>() {}.type + field = gson.fromJson(StrZipUtil.uncompress(propertiesDb), type) + } catch (e: Exception) { + + } + } + return field + } + + var propertiesDb: String = "" + @Ignore var tileX: RealmSet = RealmSet() // x方向的tile编码 + @Ignore var tileY: RealmSet = RealmSet() // y方向的tile编码 - var tileXMin:Int =0 - var tileXMax:Int = 0 - var tileYMin:Int =0 - var tileYMax:Int = 0 + var tileXMin: Int = 0 + var tileXMax: Int = 0 + var tileYMin: Int = 0 + var tileYMax: Int = 0 var taskId: Int = 0 //任务ID var zoomMin: Int = 18 //显示最小级别 var zoomMax: Int = 23 //显示最大级别 - var enable:Int = 0 // 默认0不是显示 1为渲染显示 2为常显 - var catchEnable:Int = 0 // 0不捕捉 1捕捉 - @Index - lateinit var linkPid: String // RenderEntity关联的linkPid集合(可能会关联多个) + var enable: Int = 0 // 默认0不是显示 1为渲染显示 2为常显 + var catchEnable: Int = 0 // 0不捕捉 1捕捉 + + var linkPid: String = "" // RenderEntity关联的linkPid集合(可能会关联多个) var linkRelation: LinkRelation? = null constructor(name: String) : this() { diff --git a/collect-library/src/main/java/com/navinfo/collect/library/data/entity/RenderEntity1.kt b/collect-library/src/main/java/com/navinfo/collect/library/data/entity/RenderEntity1.kt new file mode 100644 index 00000000..ae3ab97a --- /dev/null +++ b/collect-library/src/main/java/com/navinfo/collect/library/data/entity/RenderEntity1.kt @@ -0,0 +1,40 @@ +package com.navinfo.collect.library.data.entity + +import android.os.Parcelable +import com.navinfo.collect.library.utils.GeometryTools +import com.navinfo.collect.library.utils.GeometryToolsKt +import io.realm.RealmDictionary +import io.realm.RealmObject +import io.realm.RealmSet +import io.realm.annotations.Ignore +import io.realm.annotations.Index +import kotlinx.parcelize.Parcelize +import org.locationtech.jts.geom.Geometry + +/** + * 渲染要素对应的实体 + * */ +@Parcelize +open class RenderEntity1() : RealmObject(), Parcelable { + lateinit var name: String //要素名 + lateinit var table: String //要素表名 + var code: String = "0" // 要素编码 + var geometry: String = "" + var propertiesDb: String = "" + var tileXMin: Int = 0 + var tileXMax: Int = 0 + var tileYMin: Int = 0 + var tileYMax: Int = 0 + var taskId: Int = 0 //任务ID + var zoomMin: Int = 18 //显示最小级别 + var zoomMax: Int = 23 //显示最大级别 + var enable: Int = 0 // 默认0不是显示 1为渲染显示 2为常显 + var catchEnable: Int = 0 // 0不捕捉 1捕捉 + + var linkPid: String = "" // RenderEntity关联的linkPid集合(可能会关联多个) + var linkRelation: LinkRelation? = null + + constructor(name: String) : this() { + this.name = name + } +} \ No newline at end of file diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBReferenceDataSource.java b/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBReferenceDataSource.java index 44a128e9..67ace839 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBReferenceDataSource.java +++ b/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBReferenceDataSource.java @@ -110,13 +110,12 @@ public class OMDBReferenceDataSource implements ITileDataSource { @Override public void cancel() { - if (Realm.getDefaultInstance().isInTransaction()) { - Realm.getDefaultInstance().cancelTransaction(); - } +// if (Realm.getDefaultInstance().isInTransaction()) { +// Realm.getDefaultInstance().cancelTransaction(); +// } } public void update() { isUpdate = true; - Log.e("qj", Thread.currentThread().getName()); } } diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBTileDataSource.java b/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBTileDataSource.java index 41022674..fe5dc2b1 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBTileDataSource.java +++ b/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBTileDataSource.java @@ -207,13 +207,12 @@ public class OMDBTileDataSource implements ITileDataSource { @Override public void cancel() { - if (Realm.getDefaultInstance().isInTransaction()) { - Realm.getDefaultInstance().cancelTransaction(); - } +// if (Realm.getDefaultInstance().isInTransaction()) { +// Realm.getDefaultInstance().cancelTransaction(); +// } } public void update() { isUpdate = true; - Log.e("qj", Thread.currentThread().getName()); } } diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBTileSource.java b/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBTileSource.java index ab35f515..86f66737 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBTileSource.java +++ b/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBTileSource.java @@ -27,7 +27,7 @@ public class OMDBTileSource extends RealmDBTileSource { @Override public OpenResult open() { - Log.d("qj", Realm.getDefaultInstance().where(RenderEntity.class).findAll().size()+"open安装数量"); +// Log.d("qj", Realm.getDefaultInstance().where(RenderEntity.class).findAll().size()+"open安装数量"); return OpenResult.SUCCESS; } diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/source/RealmDBTileDataSource.java b/collect-library/src/main/java/com/navinfo/collect/library/map/source/RealmDBTileDataSource.java index 279a799f..d0198f46 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/map/source/RealmDBTileDataSource.java +++ b/collect-library/src/main/java/com/navinfo/collect/library/map/source/RealmDBTileDataSource.java @@ -35,27 +35,28 @@ public class RealmDBTileDataSource implements ITileDataSource { public void query(MapTile tile, ITileDataSink mapDataSink) { // 获取tile对应的坐标范围 if (tile.zoomLevel>=15&&tile.zoomLevel<=Constant.OVER_ZOOM) { - int m = Constant.OVER_ZOOM-tile.zoomLevel; - int xStart = (int)tile.tileX< realmQuery = Realm.getDefaultInstance().where(GeometryFeatureEntity.class) - .rawPredicate("tileX>="+xStart+" and tileX<="+xEnd+" and tileY>="+yStart+" and tileY<="+yEnd); - // 筛选不显示的数据 - if (Constant.HAD_LAYER_INVISIABLE_ARRAY!=null&&Constant.HAD_LAYER_INVISIABLE_ARRAY.length>0) { - realmQuery.beginGroup(); - for (String type: Constant.HAD_LAYER_INVISIABLE_ARRAY) { - realmQuery.notEqualTo("name", type); - } - realmQuery.endGroup(); - } - List listResult = realmQuery.distinct("id").findAll(); - mThreadLocalDecoders.get().decode(tile, mapDataSink, listResult); - mapDataSink.completed(QueryResult.SUCCESS); - Realm.getDefaultInstance().close(); +// int m = Constant.OVER_ZOOM-tile.zoomLevel; +// int xStart = (int)tile.tileX< realmQuery = Realm.getDefaultInstance().where(GeometryFeatureEntity.class) +// .rawPredicate("tileX>="+xStart+" and tileX<="+xEnd+" and tileY>="+yStart+" and tileY<="+yEnd); +// // 筛选不显示的数据 +// if (Constant.HAD_LAYER_INVISIABLE_ARRAY!=null&&Constant.HAD_LAYER_INVISIABLE_ARRAY.length>0) { +// realmQuery.beginGroup(); +// for (String type: Constant.HAD_LAYER_INVISIABLE_ARRAY) { +// realmQuery.notEqualTo("name", type); +// } +// realmQuery.endGroup(); +// } +// List listResult = realmQuery.distinct("id").findAll(); +// mThreadLocalDecoders.get().decode(tile, mapDataSink, listResult); +// mapDataSink.completed(QueryResult.SUCCESS); +// Realm.getDefaultInstance().close(); // Log.d("RealmDBTileDataSource", "tile:"+tile.getBoundingBox().toString()); + mapDataSink.completed(QueryResult.SUCCESS); } else { mapDataSink.completed(QueryResult.SUCCESS); } @@ -68,8 +69,8 @@ public class RealmDBTileDataSource implements ITileDataSource { @Override public void cancel() { - if (Realm.getInstance(RealmUtils.getInstance().getRealmConfiguration()).isInTransaction()) { - Realm.getInstance(RealmUtils.getInstance().getRealmConfiguration()).cancelTransaction(); - } +// if (Realm.getInstance(RealmUtils.getInstance().getRealmConfiguration()).isInTransaction()) { +// Realm.getInstance(RealmUtils.getInstance().getRealmConfiguration()).cancelTransaction(); +// } } } diff --git a/collect-library/src/main/java/com/navinfo/collect/library/utils/StrZipUtil.kt b/collect-library/src/main/java/com/navinfo/collect/library/utils/StrZipUtil.kt new file mode 100644 index 00000000..67c0fcfe --- /dev/null +++ b/collect-library/src/main/java/com/navinfo/collect/library/utils/StrZipUtil.kt @@ -0,0 +1,282 @@ +package com.navinfo.collect.library.utils + +import sun.misc.BASE64Decoder +import sun.misc.BASE64Encoder +import java.io.ByteArrayInputStream +import java.io.ByteArrayOutputStream +import java.io.IOException +import java.util.* +import java.util.zip.* + +object StrZipUtil { + + /** + * @param input 需要压缩的字符串 + * @return 压缩后的字符串 + * @throws IOException IO + */ + fun compress(input: String): String { + if (input.isEmpty()) { + return input + } + try { + val out = ByteArrayOutputStream() + val gzipOs = GZIPOutputStream(out) + gzipOs.write(input.toByteArray()) + gzipOs.close() + return BASE64Encoder().encode(out.toByteArray()) + } catch (e: Exception) { + return input + } + + } + + /** + * @param zippedStr 压缩后的字符串 + * @return 解压缩后的 + * @throws IOException IO + */ + fun uncompress(zippedStr: String): String { + if (zippedStr.isEmpty()) { + return zippedStr + } + try { + val out = ByteArrayOutputStream() + val `in` = ByteArrayInputStream( + BASE64Decoder().decodeBuffer(zippedStr) + ) + val gzipIs = GZIPInputStream(`in`) + val buffer = ByteArray(256) + var n: Int + while (gzipIs.read(buffer).also { n = it } >= 0) { + out.write(buffer, 0, n) + } + // toString()使用平台默认编码,也可以显式的指定如toString("GBK") + return out.toString() + } catch (e: Exception) { + return zippedStr + } + + } + + /*** + * 压缩GZip + * + * @param data + * @return + */ + fun gZip(data: ByteArray?): ByteArray? { + var b: ByteArray? = null + try { + val bos = ByteArrayOutputStream() + val gzip = GZIPOutputStream(bos) + gzip.write(data) + gzip.finish() + gzip.close() + b = bos.toByteArray() + bos.close() + } catch (ex: java.lang.Exception) { + ex.printStackTrace() + } + return b + } + + /*** + * 解压GZip + * + * @param data + * @return + */ + fun unGZip(data: ByteArray?): ByteArray? { + var b: ByteArray? = null + try { + val bis = ByteArrayInputStream(data) + val gzip = GZIPInputStream(bis) + val buf = ByteArray(1024) + var num = -1 + val baos = ByteArrayOutputStream() + while (gzip.read(buf, 0, buf.size).also { num = it } != -1) { + baos.write(buf, 0, num) + } + b = baos.toByteArray() + baos.flush() + baos.close() + gzip.close() + bis.close() + } catch (ex: java.lang.Exception) { + ex.printStackTrace() + } + return b + } + + + /*** + * 压缩Zip + * + * @param data + * @return + */ + fun zip(data: ByteArray): ByteArray? { + var b: ByteArray? = null + try { + val bos = ByteArrayOutputStream() + val zip = ZipOutputStream(bos) + val entry = ZipEntry("zip") + entry.size = data.size.toLong() + zip.putNextEntry(entry) + zip.write(data) + zip.closeEntry() + zip.close() + b = bos.toByteArray() + bos.close() + } catch (ex: java.lang.Exception) { + ex.printStackTrace() + } + return b + } + + /*** + * 解压Zip + * + * @param data + * @return + */ + fun unZip(data: ByteArray?): ByteArray? { + var b: ByteArray? = null + try { + val bis = ByteArrayInputStream(data) + val zip = ZipInputStream(bis) + while (zip.nextEntry != null) { + val buf = ByteArray(1024) + var num = -1 + val baos = ByteArrayOutputStream() + while (zip.read(buf, 0, buf.size).also { num = it } != -1) { + baos.write(buf, 0, num) + } + b = baos.toByteArray() + baos.flush() + baos.close() + } + zip.close() + bis.close() + } catch (ex: java.lang.Exception) { + ex.printStackTrace() + } + return b + } + +// /*** +// * 压缩BZip2 +// * +// * @param data +// * @return +// */ +// public static byte[] bZip2(byte[] data) { +// byte[] b = null; +// try { +// ByteArrayOutputStream bos = new ByteArrayOutputStream(); +// CBZip2OutputStream bzip2 = new CBZip2OutputStream(bos); +// bzip2.write(data); +// bzip2.flush(); +// bzip2.close(); +// b = bos.toByteArray(); +// bos.close(); +// } catch (Exception ex) { +// ex.printStackTrace(); +// } +// return b; +// } + +// /*** +// * 解压BZip2 +// * +// * @param data +// * @return +// */ +// public static byte[] unBZip2(byte[] data) { +// byte[] b = null; +// try { +// ByteArrayInputStream bis = new ByteArrayInputStream(data); +// CBZip2InputStream bzip2 = new CBZip2InputStream(bis); +// byte[] buf = new byte[1024]; +// int num = -1; +// ByteArrayOutputStream baos = new ByteArrayOutputStream(); +// while ((num = bzip2.read(buf, 0, buf.length)) != -1) { +// baos.write(buf, 0, num); +// } +// b = baos.toByteArray(); +// baos.flush(); +// baos.close(); +// bzip2.close(); +// bis.close(); +// } catch (Exception ex) { +// ex.printStackTrace(); +// } +// return b; +// } + + // /*** + // * 压缩BZip2 + // * + // * @param data + // * @return + // */ + // public static byte[] bZip2(byte[] data) { + // byte[] b = null; + // try { + // ByteArrayOutputStream bos = new ByteArrayOutputStream(); + // CBZip2OutputStream bzip2 = new CBZip2OutputStream(bos); + // bzip2.write(data); + // bzip2.flush(); + // bzip2.close(); + // b = bos.toByteArray(); + // bos.close(); + // } catch (Exception ex) { + // ex.printStackTrace(); + // } + // return b; + // } + // /*** + // * 解压BZip2 + // * + // * @param data + // * @return + // */ + // public static byte[] unBZip2(byte[] data) { + // byte[] b = null; + // try { + // ByteArrayInputStream bis = new ByteArrayInputStream(data); + // CBZip2InputStream bzip2 = new CBZip2InputStream(bis); + // byte[] buf = new byte[1024]; + // int num = -1; + // ByteArrayOutputStream baos = new ByteArrayOutputStream(); + // while ((num = bzip2.read(buf, 0, buf.length)) != -1) { + // baos.write(buf, 0, num); + // } + // b = baos.toByteArray(); + // baos.flush(); + // baos.close(); + // bzip2.close(); + // bis.close(); + // } catch (Exception ex) { + // ex.printStackTrace(); + // } + // return b; + // } + /** + * 把字节数组转换成16进制字符串 + * + * @param bArray + * @return + */ + fun bytesToHexString(bArray: ByteArray): String? { + val sb = StringBuffer(bArray.size) + var sTemp: String + for (i in bArray.indices) { + sTemp = Integer.toHexString(0xFF and bArray[i].toInt()) + if (sTemp.length < 2) sb.append(0) + sb.append(sTemp.uppercase(Locale.getDefault())) + } + return sb.toString() + } +} \ No newline at end of file diff --git a/vtm b/vtm index 6a6bb9ab..c046e788 160000 --- a/vtm +++ b/vtm @@ -1 +1 @@ -Subproject commit 6a6bb9ab5eaf6bb4c05b3110c612c32ef4c6ef3d +Subproject commit c046e788f5c739612a31c308639fca2de639669a From 1b5da9e5360b01acb4fbf90b24deeb367d9fb29f Mon Sep 17 00:00:00 2001 From: squallzhjch Date: Thu, 26 Oct 2023 09:18:02 +0800 Subject: [PATCH 6/7] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=BA=93=E6=9F=A5=E8=AF=A2=201=E3=80=81=E5=8E=BB=E6=8E=89?= =?UTF-8?q?=E4=BA=86RenderEntity=E8=A1=A8=E7=9A=84=E4=B8=BB=E9=94=AE=202?= =?UTF-8?q?=E3=80=81=E5=8E=BB=E6=8E=89=E4=BA=86ReferenceEntity=E8=A1=A8?= =?UTF-8?q?=E7=9A=84=E4=B8=BB=E9=94=AE=E5=92=8C=20=E4=B8=8ERenderEntity?= =?UTF-8?q?=E8=A1=A8=E7=9A=84=E5=85=B3=E8=81=94=E5=A4=96=E9=94=AE=203?= =?UTF-8?q?=E3=80=81=E5=8E=BB=E6=8E=89=E4=BA=86=E4=B8=8A=E9=9D=A2=E4=B8=A4?= =?UTF-8?q?=E4=B8=AA=E8=A1=A8=E7=9A=84set=EF=BC=8Cmap=E9=9B=86=E5=90=88?= =?UTF-8?q?=E6=94=B9=E4=B8=BAint=EF=BC=8CString=E5=9F=BA=E7=A1=80=E5=AD=97?= =?UTF-8?q?=E6=AE=B5=204=E3=80=81=E5=AF=B9properties=E5=AD=97=E6=AE=B5?= =?UTF-8?q?=E8=BF=9B=E8=A1=8C=E4=BA=86=E5=8E=8B=E7=BC=A9=205=E3=80=81?= =?UTF-8?q?=E5=B0=86properties=E8=A1=A8=E4=B8=AD=E7=9A=84linkpid=E5=AD=97?= =?UTF-8?q?=E6=AE=B5=E7=A7=BB=E5=88=B0RenderEntity=E4=B8=AD=206=E3=80=81?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E8=AF=AD=E5=8F=A5=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/navinfo/omqs/db/ImportOMDBHelper.kt | 330 +++++++----------- .../com/navinfo/omqs/db/ImportPreProcess.kt | 30 +- .../com/navinfo/omqs/db/RealmOperateHelper.kt | 5 +- .../omqs/ui/activity/map/MainViewModel.kt | 126 +++---- .../EvaluationResultViewModel.kt | 3 +- .../ui/fragment/tasklist/TaskViewModel.kt | 11 +- .../java/com/navinfo/omqs/util/NaviEngine.kt | 4 +- .../com/navinfo/omqs/util/NaviEngineNew.kt | 8 +- .../java/com/navinfo/omqs/util/SignUtil.kt | 14 +- .../library/data/entity/ReferenceEntity.kt | 20 ++ .../library/data/entity/RenderEntity.kt | 26 +- .../library/data/entity/RenderEntity1.kt | 40 --- .../map/source/OMDBReferenceDataSource.java | 2 + .../map/source/OMDBTileDataSource.java | 57 +-- .../map/source/RealmDBTileDataSource.java | 1 + 15 files changed, 267 insertions(+), 410 deletions(-) delete mode 100644 collect-library/src/main/java/com/navinfo/collect/library/data/entity/RenderEntity1.kt 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 48c5cbfc..62e8f498 100644 --- a/app/src/main/java/com/navinfo/omqs/db/ImportOMDBHelper.kt +++ b/app/src/main/java/com/navinfo/omqs/db/ImportOMDBHelper.kt @@ -154,17 +154,13 @@ class ImportOMDBHelper @AssistedInject constructor( suspend fun importOmdbZipFile(omdbZipFile: File, task: TaskBean): Flow = withContext(Dispatchers.IO) { installTaskid = task.id.toString() -// currentInstallTaskFolder = File(Constant.USER_DATA_PATH + "/$installTaskid") - currentInstallTaskFolder = File(Constant.USER_DATA_PATH + "/237") + currentInstallTaskFolder = File(Constant.USER_DATA_PATH + "/$installTaskid") if (!currentInstallTaskFolder.exists()) currentInstallTaskFolder.mkdirs() currentInstallTaskConfig = - RealmConfiguration.Builder() - .directory(currentInstallTaskFolder) - .name("OMQS.realm") + RealmConfiguration.Builder().directory(currentInstallTaskFolder).name("OMQS.realm") .encryptionKey(Constant.PASSWORD) // .allowQueriesOnUiThread(true) - .schemaVersion(2) - .build() + .schemaVersion(2).build() val unZipFolder = File(omdbZipFile.parentFile, "result") flow { @@ -207,7 +203,6 @@ class ImportOMDBHelper @AssistedInject constructor( val resHashMap: HashMap = HashMap() //define empty hashmap val listRenderEntity = mutableListOf() - val listRenderEntity1 = mutableListOf() try { // var multipLine = MultiLineString(lineList, GeometryFactory()) @@ -320,8 +315,7 @@ class ImportOMDBHelper @AssistedInject constructor( is Double -> renderEntity.properties[key] = value.toDouble().toString() - else -> renderEntity.properties[key] = - value.toString() + else -> renderEntity.properties[key] = value.toString() } } // Log.d("ImportOMDBHelper", "解析===2处理属性") @@ -336,79 +330,76 @@ class ImportOMDBHelper @AssistedInject constructor( if (currentConfig.filterData) { when (renderEntity.code.toInt()) { -// DataCodeEnum.OMDB_POLE.code.toInt() -> { -// //过滤树类型的杆状物,无需导入到数据库中 -// val poleType = -// renderEntity.properties["poleType"] -// if (poleType != null && poleType.toInt() == 2) { -// line = bufferedReader.readLine() -// continue -// } -// } + DataCodeEnum.OMDB_POLE.code.toInt() -> { + //过滤树类型的杆状物,无需导入到数据库中 + val poleType = renderEntity.properties["poleType"] + if (poleType != null && poleType.toInt() == 2) { + line = bufferedReader.readLine() + continue + } + } -// DataCodeEnum.OMDB_LANE_MARK_BOUNDARYTYPE.code.toInt() -> { -// val boundaryType = -// renderEntity.properties["boundaryType"] -// if (boundaryType != null) { -// when (boundaryType.toInt()) { -// 0, 1, 6, 8, 9 -> { -// renderEntity.enable = 0 -//// Log.e( -//// "qj", -//// "过滤不显示数据${renderEntity.table}" -//// ) -// line = bufferedReader.readLine() -// continue -// } -// } -// } -// } + DataCodeEnum.OMDB_LANE_MARK_BOUNDARYTYPE.code.toInt() -> { + val boundaryType = + renderEntity.properties["boundaryType"] + if (boundaryType != null) { + when (boundaryType.toInt()) { + 0, 1, 6, 8, 9 -> { + renderEntity.enable = 0 +// Log.e( +// "qj", +// "过滤不显示数据${renderEntity.table}" +// ) + line = bufferedReader.readLine() + continue + } + } + } + } -// DataCodeEnum.OMDB_RDBOUND_BOUNDARYTYPE.code.toInt() -> { -// val boundaryType = -// renderEntity.properties["boundaryType"] -// if (boundaryType != null) { -// when (boundaryType.toInt()) { -// 0, 1, 3, 4, 5, 7, 9 -> { -// renderEntity.enable = 0 -//// Log.e( -//// "qj", -//// "过滤不显示数据${renderEntity.table}" -//// ) -// line = bufferedReader.readLine() -// continue -// } -// } -// } -// } + DataCodeEnum.OMDB_RDBOUND_BOUNDARYTYPE.code.toInt() -> { + val boundaryType = + renderEntity.properties["boundaryType"] + if (boundaryType != null) { + when (boundaryType.toInt()) { + 0, 1, 3, 4, 5, 7, 9 -> { + renderEntity.enable = 0 +// Log.e( +// "qj", +// "过滤不显示数据${renderEntity.table}" +// ) + line = bufferedReader.readLine() + continue + } + } + } + } -// DataCodeEnum.OMDB_OBJECT_STOPLOCATION.code.toInt() -> { -// val locationType = -// renderEntity.properties["locationType"] -// if (locationType != null) { -// when (locationType.toInt()) { -// 3, 4 -> { -// renderEntity.enable = 0 -//// Log.e( -//// "qj", -//// "过滤不显示数据${renderEntity.table}" -//// ) -// line = bufferedReader.readLine() -// continue -// } -// } -// } -// } + DataCodeEnum.OMDB_OBJECT_STOPLOCATION.code.toInt() -> { + val locationType = + renderEntity.properties["locationType"] + if (locationType != null) { + when (locationType.toInt()) { + 3, 4 -> { + renderEntity.enable = 0 +// Log.e( +// "qj", +// "过滤不显示数据${renderEntity.table}" +// ) + line = bufferedReader.readLine() + continue + } + } + } + } DataCodeEnum.OMDB_RESTRICTION.code.toInt() -> { if (renderEntity.properties.containsKey("linkIn") && renderEntity.properties.containsKey( "linkOut" ) ) { - val linkIn = - renderEntity.properties["linkIn"] - val linkOut = - renderEntity.properties["linkOut"] + val linkIn = renderEntity.properties["linkIn"] + val linkOut = renderEntity.properties["linkOut"] if (linkIn != null && linkOut != null) { val checkMsg = "$linkIn$linkOut" if (resHashMap.containsKey(checkMsg)) { @@ -479,8 +470,7 @@ class ImportOMDBHelper @AssistedInject constructor( // "linkList==开始${renderEntity.name}==${renderEntity.properties["linkList"]}}" // ) - val linkList = - renderEntity.properties["linkList"] + val linkList = renderEntity.properties["linkList"] if (!linkList.isNullOrEmpty() && linkList != "null") { @@ -491,8 +481,7 @@ class ImportOMDBHelper @AssistedInject constructor( val list: List = gson.fromJson( linkList, - object : - TypeToken>() {}.type + object : TypeToken>() {}.type ) m@ for (link in list) { @@ -507,21 +496,20 @@ class ImportOMDBHelper @AssistedInject constructor( } } } + } else { + //不包括linkPid直接过滤 + line = bufferedReader.readLine() + continue + } + //过滤掉非任务路线上的数据 + if (renderEntity.enable != 1) { +// Log.e( +// "qj", +// "${renderEntity.name}==过滤不包括任务路线上的数据" +// ) + line = bufferedReader.readLine() + continue } -// else { -// //不包括linkPid直接过滤 -// line = bufferedReader.readLine() -// continue -// } -// //过滤掉非任务路线上的数据 -// if (renderEntity.enable != 1) { -//// Log.e( -//// "qj", -//// "${renderEntity.name}==过滤不包括任务路线上的数据" -//// ) -// line = bufferedReader.readLine() -// continue -// } } else { renderEntity.enable = 1 @@ -593,19 +581,18 @@ class ImportOMDBHelper @AssistedInject constructor( renderEntity.zoomMin = 15 renderEntity.zoomMax = 17 // Log.e("qj", "道路属性===4") + } else { + renderEntity.enable = 0 + renderEntity.zoomMin = 15 + renderEntity.zoomMax = 17 +// Log.e( +// "qj", +// "过滤不显示数据${renderEntity.table}" +// ) +// Log.e("qj", "道路属性===5") + line = bufferedReader.readLine() + continue } -// else { -// renderEntity.enable = 0 -// renderEntity.zoomMin = 15 -// renderEntity.zoomMax = 17 -//// Log.e( -//// "qj", -//// "过滤不显示数据${renderEntity.table}" -//// ) -//// Log.e("qj", "道路属性===5") -// line = bufferedReader.readLine() -// continue -// } } } } @@ -733,39 +720,38 @@ class ImportOMDBHelper @AssistedInject constructor( } } -// if (renderEntity.table == DataCodeEnum.OMDB_NODE_FORM.name) {//特殊处理,因为code相同,使用表名判断 -// //过滤不需要渲染的要素 -// val formOfWay = -// renderEntity.properties["formOfWay"] -// if (formOfWay != null && formOfWay.toInt() == 30) { -// renderEntity.enable = 2 -// renderEntity.code = -// DataCodeEnum.OMDB_NODE_FORM.code -// } else { -//// Log.e( -//// "qj", -//// "过滤不显示数据${renderEntity.table}" -//// ) -// line = bufferedReader.readLine() -// continue -// } -// } else if (renderEntity.table == DataCodeEnum.OMDB_NODE_PA.name) {//特殊处理,因为code相同,使用表名判断 -// //过滤不需要渲染的要素 -// val attributeType = -// renderEntity.properties["attributeType"] -// if (attributeType != null && attributeType.toInt() == 30) { -// renderEntity.enable = 2 -// renderEntity.code = -// DataCodeEnum.OMDB_NODE_PA.code -// } else { -//// Log.e( -//// "qj", -//// "过滤不显示数据${renderEntity.table}" -//// ) -// line = bufferedReader.readLine() -// continue -// } -// } + if (renderEntity.table == DataCodeEnum.OMDB_NODE_FORM.name) {//特殊处理,因为code相同,使用表名判断 + //过滤不需要渲染的要素 + val formOfWay = renderEntity.properties["formOfWay"] + if (formOfWay != null && formOfWay.toInt() == 30) { + renderEntity.enable = 2 + renderEntity.code = + DataCodeEnum.OMDB_NODE_FORM.code + } else { +// Log.e( +// "qj", +// "过滤不显示数据${renderEntity.table}" +// ) + line = bufferedReader.readLine() + continue + } + } else if (renderEntity.table == DataCodeEnum.OMDB_NODE_PA.name) {//特殊处理,因为code相同,使用表名判断 + //过滤不需要渲染的要素 + val attributeType = + renderEntity.properties["attributeType"] + if (attributeType != null && attributeType.toInt() == 30) { + renderEntity.enable = 2 + renderEntity.code = + DataCodeEnum.OMDB_NODE_PA.code + } else { +// Log.e( +// "qj", +// "过滤不显示数据${renderEntity.table}" +// ) + line = bufferedReader.readLine() + continue + } + } } // Log.d("ImportOMDBHelper", "解析===2子code处理") @@ -798,92 +784,26 @@ class ImportOMDBHelper @AssistedInject constructor( gson.toJson(renderEntity.properties).toString() ) - when (renderEntity.code) { - DataCodeEnum.OMDB_LANE_LINK_LG.code, - DataCodeEnum.OMDB_LINK_SPEEDLIMIT.code, - DataCodeEnum.OMDB_POLE.code, - DataCodeEnum.OMDB_LINK_DIRECT.code, - DataCodeEnum.OMDB_RD_LINK_FUNCTION_CLASS.code, - DataCodeEnum.OMDB_LINK_NAME.code, - DataCodeEnum.OMDB_OBJECT_ARROW.code, - DataCodeEnum.OMDB_TRAFFICLIGHT.code -> { - val renderEntity1 = RenderEntity1() - renderEntity1.code = resultEntity.code - renderEntity1.linkPid = renderEntity.linkPid - renderEntity1.table = renderEntity.table - renderEntity1.name = renderEntity.name - renderEntity1.linkRelation = - renderEntity.linkRelation - renderEntity1.catchEnable = renderEntity.catchEnable - renderEntity1.enable = renderEntity.enable - renderEntity1.geometry = renderEntity.geometry - renderEntity1.taskId = renderEntity.taskId -// renderEntity1.tileX = renderEntity.tileX -// renderEntity1.tileY = renderEntity.tileY - renderEntity1.tileXMin = renderEntity.tileXMin - renderEntity1.tileXMax = renderEntity.tileXMax - renderEntity1.tileYMin = renderEntity.tileYMin - renderEntity1.tileYMax = renderEntity.tileYMax -// renderEntity1.wkt = renderEntity.wkt - renderEntity1.zoomMin = renderEntity.zoomMin - renderEntity1.zoomMax = renderEntity.zoomMax - renderEntity1.propertiesDb = - renderEntity.propertiesDb - listRenderEntity1.add(renderEntity1) - - } - - - else -> listRenderEntity.add(renderEntity) - } -// Log.d("ImportOMDBHelper", "解析===1insert") -// realm.insert(renderEntity) - -// Log.d("ImportOMDBHelper", "解析===2insert") + listRenderEntity.add(renderEntity) } -// if (currentConfig.code == DataCodeEnum.OMDB_RD_LINK.code.toInt()) { -// listResult.add(renderEntity) -// } if (listRenderEntity.size > 10000) { Log.e( - "jingo", "20000刷新" + "jingo", "10000刷新" ) realm.copyToRealm(listRenderEntity) realm.commitTransaction() realm.close() listRenderEntity.clear() insertIndex = 0 - delay(100) -// Realm.compactRealm(currentInstallTaskConfig) - realm = Realm.getInstance(currentInstallTaskConfig) - - realm.beginTransaction() - } - if (listRenderEntity1.size > 10000) { - Log.e( - "jingo", "20000刷新" - ) - realm.copyToRealm(listRenderEntity1) - realm.commitTransaction() - realm.close() - listRenderEntity1.clear() - insertIndex = 0 - delay(100) // Realm.compactRealm(currentInstallTaskConfig) realm = Realm.getInstance(currentInstallTaskConfig) realm.beginTransaction() - -// Log.d( -// "ImportOMDBHelper", -// "表解析===结束用时时间===事物结束" -// ) } line = bufferedReader.readLine() } bufferedReader.close() - } diff --git a/app/src/main/java/com/navinfo/omqs/db/ImportPreProcess.kt b/app/src/main/java/com/navinfo/omqs/db/ImportPreProcess.kt index df1b2b36..990a0ad4 100644 --- a/app/src/main/java/com/navinfo/omqs/db/ImportPreProcess.kt +++ b/app/src/main/java/com/navinfo/omqs/db/ImportPreProcess.kt @@ -1,11 +1,13 @@ package com.navinfo.omqs.db import android.util.Log +import com.google.gson.Gson import com.navinfo.collect.library.data.entity.LinkRelation import com.navinfo.collect.library.data.entity.ReferenceEntity import com.navinfo.collect.library.data.entity.RenderEntity import com.navinfo.collect.library.enums.DataCodeEnum import com.navinfo.collect.library.utils.GeometryTools +import com.navinfo.collect.library.utils.StrZipUtil import com.navinfo.omqs.Constant import io.realm.Realm import org.json.JSONArray @@ -25,6 +27,7 @@ class ImportPreProcess { val defaultTranslateDistance = 3.0 val testFlag: Boolean = false var realm: Realm? = null + val gson = Gson() fun checkCircleRoad(renderEntity: RenderEntity): Boolean { val linkInId = renderEntity.properties["linkIn"] val linkOutId = renderEntity.properties["linkOut"] @@ -238,6 +241,9 @@ class ImportPreProcess { startEndReference.properties["qi_table"] = renderEntity.table startEndReference.properties["type"] = "s_2_e" val listResult = mutableListOf() + startEndReference.propertiesDb = StrZipUtil.compress( + gson.toJson(startEndReference.properties).toString() + ) listResult.add(startEndReference) insertData(listResult) } @@ -287,6 +293,9 @@ class ImportPreProcess { Log.e("qj", "generateS2EReferencePoint===${startReference.geometry}") startReference.properties["geometry"] = startReference.geometry + startReference.propertiesDb = StrZipUtil.compress( + gson.toJson(startReference.properties).toString() + ) listResult.add(startReference) Log.e("qj", "generateS2EReferencePoint===1") @@ -321,7 +330,9 @@ class ImportPreProcess { Log.e("qj", "generateS2EReferencePoint===e_2_p${renderEntity.name}") } endReference.properties["geometry"] = endReference.geometry - + endReference.propertiesDb = StrZipUtil.compress( + gson.toJson(endReference.properties).toString() + ) listResult.add(endReference) Log.e("qj", "generateS2EReferencePoint===4") insertData(listResult) @@ -419,6 +430,9 @@ class ImportPreProcess { WKTWriter(3).write(GeometryTools.createLineString(arrayOf(pointStart, coorEnd))) angleReference.properties["qi_table"] = renderEntity.table angleReference.properties["type"] = "angle" + angleReference.propertiesDb = StrZipUtil.compress( + gson.toJson(angleReference.properties).toString() + ) listResult.add(angleReference) } insertData(listResult) @@ -513,6 +527,9 @@ class ImportPreProcess { referenceEntity.properties["symbol"] = "assets:omdb/4601/${type}/1301_${referenceEntity.properties["currentDirect"]}.svg" Log.d("unpackingLaneInfo", referenceEntity.properties["symbol"].toString()) + referenceEntity.propertiesDb = StrZipUtil.compress( + gson.toJson(referenceEntity.properties).toString() + ) listResult.add(referenceEntity) } insertData(listResult) @@ -644,6 +661,9 @@ class ImportPreProcess { angleReference.taskId = renderEntity.taskId angleReference.enable = renderEntity.enable val listResult = mutableListOf() + angleReference.propertiesDb = StrZipUtil.compress( + gson.toJson(angleReference.properties).toString() + ) listResult.add(angleReference) insertData(listResult) } catch (e: Exception) { @@ -678,6 +698,9 @@ class ImportPreProcess { GeometryTools.createGeometry(nodeJSONObject["geometry"].toString()).toString() intersectionReference.properties["qi_table"] = renderEntity.table intersectionReference.properties["type"] = "node" + intersectionReference.propertiesDb = StrZipUtil.compress( + gson.toJson(intersectionReference.properties).toString() + ) listResult.add(intersectionReference) } insertData(listResult) @@ -846,6 +869,9 @@ class ImportPreProcess { dynamicSrcReference.properties["type"] = "dynamicSrc" val code = renderEntity.properties[codeName] dynamicSrcReference.properties["src"] = "${prefix}${code}${suffix}" + dynamicSrcReference.propertiesDb = StrZipUtil.compress( + gson.toJson(dynamicSrcReference.properties).toString() + ) listResult.add(dynamicSrcReference) } insertData(listResult) @@ -856,7 +882,7 @@ class ImportPreProcess { Log.e("qj", "子表插入==") if (list != null && list.isNotEmpty()) { Log.e("qj", "子表插入开始==") - it.insert(list) + it.copyToRealm(list) Log.e("qj", "子表插入结束==") } } 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 f32b64c5..37e949dd 100644 --- a/app/src/main/java/com/navinfo/omqs/db/RealmOperateHelper.kt +++ b/app/src/main/java/com/navinfo/omqs/db/RealmOperateHelper.kt @@ -6,7 +6,6 @@ import androidx.annotation.RequiresApi import com.navinfo.collect.library.data.entity.HadLinkDvoBean import com.navinfo.collect.library.data.entity.QsRecordBean import com.navinfo.collect.library.data.entity.RenderEntity -import com.navinfo.collect.library.data.entity.RenderEntity.Companion.LinkTable import com.navinfo.collect.library.enums.DataCodeEnum import com.navinfo.collect.library.map.NIMapController import com.navinfo.collect.library.utils.GeometryTools @@ -206,7 +205,7 @@ class RealmOperateHelper() { val realm = getSelectTaskRealmInstance() val realmR = realm.where(RenderEntity::class.java).equalTo("table", "OMDB_RD_LINK_KIND") - .equalTo("properties['${LinkTable.linkPid}']", linkPid).findFirst() + .equalTo("linkPid", linkPid).findFirst() if (realmR != null) { link = realm.copyFromRealm(realmR) } @@ -238,7 +237,7 @@ class RealmOperateHelper() { // val realm = getSelectTaskRealmInstance() val realmR = getSelectTaskRealmTools(realm, RenderEntity::class.java, true) - .equalTo("properties['${LinkTable.linkPid}']", linkPid).findAll() + .equalTo("linkPid", linkPid).findAll() val dataList = realm.copyFromRealm(realmR) 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 21ecd00c..98edf756 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 @@ -577,62 +577,62 @@ class MainViewModel @Inject constructor( viewModelScope.launch(Dispatchers.Default) { //用于定位点捕捉道路 mapController.locationLayerHandler.niLocationFlow.collect { location -> -// -// //过滤掉无效点 -// if (!naviLocationTest && !GeometryTools.isCheckError( -// location.longitude, -// location.latitude -// ) -// ) { -// val geometry = GeometryTools.createGeometry( -// GeoPoint( -// location.latitude, location.longitude -// ) -// ) -// val tileX = RealmSet() -// GeometryToolsKt.getTileXByGeometry(geometry.toString(), tileX) -// val tileY = RealmSet() -// GeometryToolsKt.getTileYByGeometry(geometry.toString(), tileY) -// -// //遍历存储tile对应的x与y的值 -// tileX.forEach { x -> -// tileY.forEach { y -> -// location.tilex = x -// location.tiley = y -// } -// } -// location.groupId = uuid -// try { -// location.timeStamp = DateTimeUtil.getTime(location.time).toString() -// } catch (e: Exception) { -// -// } -// -// location.taskId = -// sharedPreferences.getInt(Constant.SELECT_TASK_ID, -1).toString() -// -// //判断如果是连接状态并处于录像模式,标记为有效点 -// if (shareUtil?.connectstate == true && shareUtil?.takeCameraMode == 0) { -// location.media = 1 -// } -// var disance = 0.0 -// //增加间距判断 -// if (lastNiLocaion != null) { -// disance = GeometryTools.getDistance( -// location.latitude, -// location.longitude, -// lastNiLocaion!!.latitude, -// lastNiLocaion!!.longitude -// ) -// } -// //室内整理工具时不能进行轨迹存储,判断轨迹间隔要超过2.5并小于60米 -// if (Constant.INDOOR_IP.isEmpty() && (disance == 0.0 || (disance > 2.5 && disance < 60))) { -// traceDataBase.niLocationDao.insert(location) -// mapController.markerHandle.addNiLocationMarkerItem(location) -// mapController.mMapView.vtmMap.updateMap(true) -// lastNiLocaion = location -// } -// } + + //过滤掉无效点 + if (!naviLocationTest && !GeometryTools.isCheckError( + location.longitude, + location.latitude + ) + ) { + val geometry = GeometryTools.createGeometry( + GeoPoint( + location.latitude, location.longitude + ) + ) + val tileX = RealmSet() + GeometryToolsKt.getTileXByGeometry(geometry.toString(), tileX) + val tileY = RealmSet() + GeometryToolsKt.getTileYByGeometry(geometry.toString(), tileY) + + //遍历存储tile对应的x与y的值 + tileX.forEach { x -> + tileY.forEach { y -> + location.tilex = x + location.tiley = y + } + } + location.groupId = uuid + try { + location.timeStamp = DateTimeUtil.getTime(location.time).toString() + } catch (e: Exception) { + + } + + location.taskId = + sharedPreferences.getInt(Constant.SELECT_TASK_ID, -1).toString() + + //判断如果是连接状态并处于录像模式,标记为有效点 + if (shareUtil?.connectstate == true && shareUtil?.takeCameraMode == 0) { + location.media = 1 + } + var disance = 0.0 + //增加间距判断 + if (lastNiLocaion != null) { + disance = GeometryTools.getDistance( + location.latitude, + location.longitude, + lastNiLocaion!!.latitude, + lastNiLocaion!!.longitude + ) + } + //室内整理工具时不能进行轨迹存储,判断轨迹间隔要超过2.5并小于60米 + if (Constant.INDOOR_IP.isEmpty() && (disance == 0.0 || (disance > 2.5 && disance < 60))) { + traceDataBase.niLocationDao.insert(location) + mapController.markerHandle.addNiLocationMarkerItem(location) + mapController.mMapView.vtmMap.updateMap(true) + lastNiLocaion = location + } + } } } @@ -654,11 +654,11 @@ class MainViewModel @Inject constructor( naviEngine!!.bindingRoute(location, point) naviMutex.unlock() } else { -// captureLink( -// GeoPoint( -// location.latitude, location.longitude -// ) -// ) + captureLink( + GeoPoint( + location.latitude, location.longitude + ) + ) } } } @@ -823,7 +823,7 @@ class MainViewModel @Inject constructor( if (linkList.isNotEmpty()) { val link = linkList[0] - val linkId = link.properties[RenderEntity.Companion.LinkTable.linkPid] + val linkId = link.linkPid //看板数据 val signList = mutableListOf() val topSignList = mutableListOf() @@ -971,7 +971,7 @@ class MainViewModel @Inject constructor( .equalTo("table", DataCodeEnum.OMDB_RD_LINK_KIND.name) .and() .equalTo( - "properties['${RenderEntity.Companion.LinkTable.linkPid}']", + "linkPid", outLink ).findFirst() if (linkOutEntity != null) { 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 b7281da4..e26c0e5f 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 @@ -23,7 +23,6 @@ import com.blankj.utilcode.util.ToastUtils import com.navinfo.collect.library.data.entity.AttachmentBean import com.navinfo.collect.library.data.entity.HadLinkDvoBean import com.navinfo.collect.library.data.entity.QsRecordBean -import com.navinfo.collect.library.data.entity.RenderEntity.Companion.LinkTable import com.navinfo.collect.library.data.entity.TaskBean import com.navinfo.collect.library.map.NIMapController import com.navinfo.collect.library.map.OnGeoPointClickListener @@ -236,7 +235,7 @@ class EvaluationResultViewModel @Inject constructor( } else { val linkList = realmOperateHelper.queryLink(realm, point = point) if (linkList.isNotEmpty()) { - it.linkId = linkList[0].properties[LinkTable.linkPid] ?: "" + it.linkId = linkList[0].linkPid mapController.lineHandler.showLine(linkList[0].geometry) Log.e("jingo", "捕捉道路EEE 2") return diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskViewModel.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskViewModel.kt index a3edd425..dc7c9d1e 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskViewModel.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskViewModel.kt @@ -114,7 +114,7 @@ class TaskViewModel @Inject constructor( if (links.isNotEmpty()) { val l = links[0] for (link in currentSelectTaskBean!!.hadLinkDvoList) { - if (link.linkPid == l.properties["linkPid"]) { + if (link.linkPid == l.linkPid) { return@launch } } @@ -132,7 +132,7 @@ class TaskViewModel @Inject constructor( if (links.isNotEmpty()) { val l = links[0] for (link in currentSelectTaskBean!!.hadLinkDvoList) { - if (link.linkPid == l.properties["linkPid"]) { + if (link.linkPid == l.linkPid) { liveDataSelectLink.postValue(link.linkPid) mapController.lineHandler.showLine(link.geometry) break @@ -274,8 +274,7 @@ class TaskViewModel @Inject constructor( liveDataTaskLinks.value = taskBean.hadLinkDvoList showTaskLinks(taskBean) MapParamUtils.setTaskId(taskBean.id) -// Constant.currentSelectTaskFolder = File(Constant.USER_DATA_PATH + "/${taskBean.id}") - Constant.currentSelectTaskFolder = File(Constant.USER_DATA_PATH + "/237") + Constant.currentSelectTaskFolder = File(Constant.USER_DATA_PATH + "/${taskBean.id}") Constant.currentSelectTaskConfig = RealmConfiguration.Builder() .directory(Constant.currentSelectTaskFolder) @@ -566,7 +565,7 @@ class TaskViewModel @Inject constructor( viewModelScope.launch(Dispatchers.IO) { val hadLinkDvoBean = HadLinkDvoBean( taskId = currentSelectTaskBean!!.id, - linkPid = data.properties["linkPid"]!!, + linkPid = data.linkPid, geometry = data.geometry, linkStatus = 2 ) @@ -579,7 +578,7 @@ class TaskViewModel @Inject constructor( r.copyToRealmOrUpdate(currentSelectTaskBean!!) } //根据Link数据查询对应数据上要素,对要素进行显示重置 - data.properties["linkPid"]?.let { + data.linkPid.let { realmOperateHelper.queryLinkToMutableRenderEntityList(realm, it) ?.forEach { renderEntity -> if (renderEntity.enable != 1) { diff --git a/app/src/main/java/com/navinfo/omqs/util/NaviEngine.kt b/app/src/main/java/com/navinfo/omqs/util/NaviEngine.kt index fa657a1e..246125eb 100644 --- a/app/src/main/java/com/navinfo/omqs/util/NaviEngine.kt +++ b/app/src/main/java/com/navinfo/omqs/util/NaviEngine.kt @@ -222,7 +222,7 @@ class NaviEngine( route.pointList = GeometryTools.getGeoPoints(link.geometry) val res = realm.where(RenderEntity::class.java).`in`("table", QUERY_KEY_LINK_INFO_LIST) - .equalTo("properties['linkPid']", link.linkPid).findAll() + .equalTo("linkPid", link.linkPid).findAll() var bHasNode = false var bHasDir = false var bHasName = false @@ -373,7 +373,7 @@ class NaviEngine( itemMap.clear() //常规点限速 val res = realm.where(RenderEntity::class.java) - .equalTo("properties['linkPid']", route.linkId).and().`in`( + .equalTo("linkPid", route.linkId).and().`in`( "table", QUERY_KEY_ITEM_LIST ).findAll() diff --git a/app/src/main/java/com/navinfo/omqs/util/NaviEngineNew.kt b/app/src/main/java/com/navinfo/omqs/util/NaviEngineNew.kt index 73e20fd9..82363d40 100644 --- a/app/src/main/java/com/navinfo/omqs/util/NaviEngineNew.kt +++ b/app/src/main/java/com/navinfo/omqs/util/NaviEngineNew.kt @@ -54,16 +54,10 @@ class NaviEngineNew( latestRoute?.let { - var lastTime = System.currentTimeMillis() - var nowTime = System.currentTimeMillis() - Log.e("jingo","打开数据库 ${nowTime - lastTime}") - lastTime = nowTime val res2 = realm.where(RenderEntity::class.java).`in`("table", QUERY_KEY_LINK_INFO_LIST) - .equalTo("properties['linkPid']", it.linkPid).findAll() - nowTime = System.currentTimeMillis() - Log.e("jingo", "第一种 耗时 ${nowTime - lastTime}") + .equalTo("linkPid", it.linkPid).findAll() if (res2 != null) { for (entity in res2) { when (entity.code) { diff --git a/app/src/main/java/com/navinfo/omqs/util/SignUtil.kt b/app/src/main/java/com/navinfo/omqs/util/SignUtil.kt index 14f84764..b813d6c2 100644 --- a/app/src/main/java/com/navinfo/omqs/util/SignUtil.kt +++ b/app/src/main/java/com/navinfo/omqs/util/SignUtil.kt @@ -35,7 +35,7 @@ class SignUtil { return SignBean( iconId = getSignIcon(element), iconText = getSignIconText(element), - linkId = element.properties[RenderEntity.Companion.LinkTable.linkPid] + linkId = element.linkPid ?: "", name = getSignNameText(element), bottomRightText = getSignBottomRightText( @@ -207,7 +207,7 @@ class SignUtil { DataCodeEnum.OMDB_RD_LINK.code -> { list.add( TwoItemAdapterItem( - title = "linkPid", text = "${data.properties["linkPid"]}" + title = "linkPid", text = "${data.linkPid}" ) ) list.add( @@ -225,7 +225,7 @@ class SignUtil { DataCodeEnum.OMDB_RD_LINK_KIND.code -> { list.add( TwoItemAdapterItem( - title = "linkPid", text = "${data.properties["linkPid"]}" + title = "linkPid", text = "${data.linkPid}" ) ) try { @@ -243,7 +243,7 @@ class SignUtil { DataCodeEnum.OMDB_LINK_DIRECT.code -> { list.add( TwoItemAdapterItem( - title = "linkPid", text = "${data.properties["linkPid"]}" + title = "linkPid", text = "${data.linkPid}" ) ) try { @@ -331,7 +331,7 @@ class SignUtil { DataCodeEnum.OMDB_LINK_CONSTRUCTION.code -> { list.add( TwoItemAdapterItem( - title = "linkPid", text = "${data.properties["linkPid"]}" + title = "linkPid", text = "${data.linkPid}" ) ) @@ -384,7 +384,7 @@ class SignUtil { DataCodeEnum.OMDB_WARNINGSIGN.code -> { list.add( TwoItemAdapterItem( - title = "linkPid", text = "${data.properties["linkPid"]}" + title = "linkPid", text = "${data.linkPid}" ) ) list.add( @@ -749,7 +749,7 @@ class SignUtil { fun getTollgateInfo(renderEntity: RenderEntity): List { val list = mutableListOf() list.add( - LaneBoundaryItem("linkPid", "${renderEntity.properties["linkPid"]}", null) + LaneBoundaryItem("linkPid", "${renderEntity.linkPid}", null) ) list.add( LaneBoundaryItem("收费站号码", "${renderEntity.properties["tollgatePid"]}", null) diff --git a/collect-library/src/main/java/com/navinfo/collect/library/data/entity/ReferenceEntity.kt b/collect-library/src/main/java/com/navinfo/collect/library/data/entity/ReferenceEntity.kt index 16bc51a9..59b95a1c 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/data/entity/ReferenceEntity.kt +++ b/collect-library/src/main/java/com/navinfo/collect/library/data/entity/ReferenceEntity.kt @@ -1,7 +1,11 @@ package com.navinfo.collect.library.data.entity +import android.util.Log +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken import com.navinfo.collect.library.utils.GeometryTools import com.navinfo.collect.library.utils.GeometryToolsKt +import com.navinfo.collect.library.utils.StrZipUtil import io.realm.RealmDictionary import io.realm.RealmObject import io.realm.RealmSet @@ -20,9 +24,12 @@ open class ReferenceEntity() : RealmObject() { @Ignore lateinit var name: String //要素名 lateinit var table: String //要素表名 + var propertiesDb: String = "" var code: String = "0" // 要素编码 + @Ignore var zoomMin: Int = 18 //显示最小级别 + @Ignore var zoomMax: Int = 23 //显示最大级别 var taskId: Int = 0 //任务ID @@ -68,8 +75,21 @@ open class ReferenceEntity() : RealmObject() { } return field } + @Ignore var properties: RealmDictionary = RealmDictionary() + get() { + if (propertiesDb.isNotEmpty() && field.isEmpty()) { + try { + val gson = Gson() + val type = object : TypeToken>() {}.type + field = gson.fromJson(StrZipUtil.uncompress(propertiesDb), type) + } catch (e: Exception) { + Log.e("jingo","ReferenceEntity 转 properties $e") + } + } + return field + } @Ignore var tileX: RealmSet = RealmSet() // x方向的tile编码 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 a776ea61..390a93d8 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/data/entity/RenderEntity.kt +++ b/collect-library/src/main/java/com/navinfo/collect/library/data/entity/RenderEntity.kt @@ -1,6 +1,7 @@ package com.navinfo.collect.library.data.entity import android.os.Parcelable +import android.util.Log import com.google.gson.Gson import com.google.gson.reflect.TypeToken import com.navinfo.collect.library.system.Constant @@ -30,8 +31,7 @@ open class RenderEntity() : RealmObject(), Parcelable { lateinit var name: String //要素名 lateinit var table: String //要素表名 var code: String = "0" // 要素编码 -// var geometryDb: String = "" - + var propertiesDb: String = "" var geometry: String = "" // 要素渲染参考的geometry,该数据可能会在导入预处理环节被修改,原始geometry会保存在properties的geometry字段下 get() { @@ -73,7 +73,7 @@ open class RenderEntity() : RealmObject(), Parcelable { try { field = GeometryTools.createGeometry(geometry) } catch (e: Exception) { - + Log.e("jingo","RenderEntity 转 wkt失败 $e") } } return field @@ -85,16 +85,15 @@ open class RenderEntity() : RealmObject(), Parcelable { if (propertiesDb != null && propertiesDb.isNotEmpty() && field.isEmpty()) { try { val gson = Gson() - val type = object : TypeToken>>() {}.type + val type = object : TypeToken>() {}.type field = gson.fromJson(StrZipUtil.uncompress(propertiesDb), type) } catch (e: Exception) { - + Log.e("jingo","RenderEntity 转 properties $e") } } return field } - var propertiesDb: String = "" @Ignore var tileX: RealmSet = RealmSet() // x方向的tile编码 @@ -117,19 +116,4 @@ open class RenderEntity() : RealmObject(), Parcelable { constructor(name: String) : this() { this.name = name } - - 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/data/entity/RenderEntity1.kt b/collect-library/src/main/java/com/navinfo/collect/library/data/entity/RenderEntity1.kt deleted file mode 100644 index ae3ab97a..00000000 --- a/collect-library/src/main/java/com/navinfo/collect/library/data/entity/RenderEntity1.kt +++ /dev/null @@ -1,40 +0,0 @@ -package com.navinfo.collect.library.data.entity - -import android.os.Parcelable -import com.navinfo.collect.library.utils.GeometryTools -import com.navinfo.collect.library.utils.GeometryToolsKt -import io.realm.RealmDictionary -import io.realm.RealmObject -import io.realm.RealmSet -import io.realm.annotations.Ignore -import io.realm.annotations.Index -import kotlinx.parcelize.Parcelize -import org.locationtech.jts.geom.Geometry - -/** - * 渲染要素对应的实体 - * */ -@Parcelize -open class RenderEntity1() : RealmObject(), Parcelable { - lateinit var name: String //要素名 - lateinit var table: String //要素表名 - var code: String = "0" // 要素编码 - var geometry: String = "" - var propertiesDb: String = "" - var tileXMin: Int = 0 - var tileXMax: Int = 0 - var tileYMin: Int = 0 - var tileYMax: Int = 0 - var taskId: Int = 0 //任务ID - var zoomMin: Int = 18 //显示最小级别 - var zoomMax: Int = 23 //显示最大级别 - var enable: Int = 0 // 默认0不是显示 1为渲染显示 2为常显 - var catchEnable: Int = 0 // 0不捕捉 1捕捉 - - var linkPid: String = "" // RenderEntity关联的linkPid集合(可能会关联多个) - var linkRelation: LinkRelation? = null - - constructor(name: String) : this() { - this.name = name - } -} \ No newline at end of file diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBReferenceDataSource.java b/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBReferenceDataSource.java index 67ace839..0aea8ff3 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBReferenceDataSource.java +++ b/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBReferenceDataSource.java @@ -43,6 +43,8 @@ public class OMDBReferenceDataSource implements ITileDataSource { @RequiresApi(api = Build.VERSION_CODES.N) @Override public void query(MapTile tile, ITileDataSink mapDataSink) { + if(MapParamUtils.getTaskConfig() == null) + return; // 获取tile对应的坐标范围 if (tile.zoomLevel >= Constant.OMDB_MIN_ZOOM && tile.zoomLevel <= Constant.DATA_ZOOM) { Realm realm = Realm.getInstance(MapParamUtils.getTaskConfig()); diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBTileDataSource.java b/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBTileDataSource.java index fe5dc2b1..b74840e3 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBTileDataSource.java +++ b/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBTileDataSource.java @@ -64,16 +64,12 @@ public class OMDBTileDataSource implements ITileDataSource { @RequiresApi(api = Build.VERSION_CODES.N) @Override public void query(MapTile tile, ITileDataSink mapDataSink) { + if(MapParamUtils.getTaskConfig() == null) + return; // 获取tile对应的坐标范围 if (tile.zoomLevel >= Constant.OMDB_MIN_ZOOM && tile.zoomLevel <= Constant.DATA_ZOOM) { Realm realm = null; int threadCode = Thread.currentThread().hashCode(); -// MapPosition pos = new MapPosition(); -// viewport.getMapPosition(pos); -// DataObject newDataObject = new DataObject(); -// newDataObject.zoom = tile.zoomLevel; -// newDataObject.threadCode = threadCode; -// newDataObject.lonLat = pos.getX() + "," + pos.getY(); synchronized (realmObjectList) { int configCode = MapParamUtils.getTaskConfig().hashCode(); for (RealmObject object : realmObjectList) { @@ -96,7 +92,6 @@ public class OMDBTileDataSource implements ITileDataSource { realmObjectList.add(o); } } -// Log.e("jingo", " " + Realm.getDefaultInstance().hashCode() + " " + Realm.getInstance(MapParamUtils.getTaskConfig()).hashCode()); // Realm realm = Realm.getInstance(MapParamUtils.getTaskConfig()); RealmQuery realmQuery = realm.where(RenderEntity.class); @@ -112,7 +107,6 @@ public class OMDBTileDataSource implements ITileDataSource { yEnd = (int) (yEnd << m); } - final int currentTileX = xStart; if (isUpdate) { realm.refresh(); isUpdate = false; @@ -124,18 +118,9 @@ public class OMDBTileDataSource implements ITileDataSource { } else { sql += " and enable>=0"; } - realmQuery.rawPredicate(sql); - if (MapParamUtils.getDataLayerEnum() != null) { - MapParamUtils.getDataLayerEnum().getSql(); - } -// realmQuery.greaterThanOrEqualTo("tileXMin", xStart); -// realmQuery.lessThanOrEqualTo("tileXMax", xEnd); -// realmQuery.greaterThanOrEqualTo("tileYMin", yStart); -// realmQuery.lessThanOrEqualTo("tileYMax", yEnd); -// realmQuery.like("geometry","116.31509664888955 39.83318797612014 0"); - // 筛选不显示的数据 +// 筛选不显示的数据 if (Constant.HAD_LAYER_INVISIABLE_ARRAY != null && Constant.HAD_LAYER_INVISIABLE_ARRAY.length > 0) { realmQuery.beginGroup(); for (String type : Constant.HAD_LAYER_INVISIABLE_ARRAY) { @@ -144,43 +129,13 @@ public class OMDBTileDataSource implements ITileDataSource { realmQuery.endGroup(); } long time = System.currentTimeMillis(); - List listResult = realmQuery/*.distinct("id")*/.findAll(); + List listResult = realmQuery.findAll(); long newTime = System.currentTimeMillis() - time; - Log.e("jingo", "当前OMDBTileDataSource " + Thread.currentThread().hashCode() + " 当前realm " + realm.hashCode() + " 查询耗时" + newTime ); + Log.e("jingo", "当前OMDBTileDataSource " + Thread.currentThread().hashCode() + " 当前realm " + realm.hashCode() + " 查询耗时" + newTime + " 条数" + listResult.size()); // 数据记录的tile号是以正外接tile号列表,此处过滤并未与当前tile相交的数据 if (!listResult.isEmpty()) { Polygon tilePolygon = GeometryTools.getTilePolygon(tile); -// System.out.println("第一条数据的最小x值:" + listResult.get(0).getTileX().stream().min(Integer::compare).get()); -// System.out.println("当前tile的:" + listResult.get(0).getTileX().stream().min(Integer::compare).get()); -// synchronized (dataObjectList) { -// int index = -1; -// for (int i = 0; i < dataObjectList.size(); i++) { -// DataObject dataObject = dataObjectList.get(i); -// if (dataObject.threadCode == newDataObject.threadCode) { -// index = i; -// } else if (dataObject.zoom == tile.zoomLevel && dataObject.lonLat.equals(newDataObject.lonLat)) { -// listResult = listResult.stream().filter((RenderEntity renderEntity) -> { -// for (String id : dataObject.listIds) { -// if (id.equals(renderEntity.getId())) { -// return false; -// } -// } -// return renderEntity.getWkt().intersects(tilePolygon); -// }) -// /*过滤数据,只有最小x(屏幕的最小x或数据的最小x会被渲染,跨Tile的其他数据不再重复渲染)*/ -//// .filter((RenderEntity renderEntity) -> MercatorProjection.longitudeToTileX(viewport.fromScreenPoint(0,0).getLongitude(), (byte) Constant.DATA_ZOOM) == currentTileX || renderEntity.getTileX().stream().min(Integer::compare).get() == currentTileX) -// .collect(Collectors.toList()); -// } -// } -// if (index > -1) { -// dataObjectList.remove(index); -// } -// for (RenderEntity renderEntity : listResult) { -// newDataObject.listIds.add(renderEntity.getId()); -// } -// dataObjectList.add(newDataObject); -// } listResult = listResult.stream().filter((RenderEntity renderEntity) -> renderEntity.getWkt().intersects(tilePolygon) ) @@ -192,12 +147,10 @@ public class OMDBTileDataSource implements ITileDataSource { } else { mapDataSink.completed(QueryResult.SUCCESS); } - // realm.close(); } else { mapDataSink.completed(QueryResult.SUCCESS); } - } @Override diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/source/RealmDBTileDataSource.java b/collect-library/src/main/java/com/navinfo/collect/library/map/source/RealmDBTileDataSource.java index d0198f46..771153d0 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/map/source/RealmDBTileDataSource.java +++ b/collect-library/src/main/java/com/navinfo/collect/library/map/source/RealmDBTileDataSource.java @@ -35,6 +35,7 @@ public class RealmDBTileDataSource implements ITileDataSource { public void query(MapTile tile, ITileDataSink mapDataSink) { // 获取tile对应的坐标范围 if (tile.zoomLevel>=15&&tile.zoomLevel<=Constant.OVER_ZOOM) { + Log.e("jingo","RealmDBTileDataSource RealmDBTileDataSource RealmDBTileDataSource"); // int m = Constant.OVER_ZOOM-tile.zoomLevel; // int xStart = (int)tile.tileX< Date: Thu, 26 Oct 2023 10:04:20 +0800 Subject: [PATCH 7/7] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E8=AF=AD=E5=8F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/com/navinfo/omqs/db/ImportPreProcess.kt | 7 +++---- .../main/java/com/navinfo/omqs/db/RealmOperateHelper.kt | 7 +++---- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/com/navinfo/omqs/db/ImportPreProcess.kt b/app/src/main/java/com/navinfo/omqs/db/ImportPreProcess.kt index dbf124f8..b394acf0 100644 --- a/app/src/main/java/com/navinfo/omqs/db/ImportPreProcess.kt +++ b/app/src/main/java/com/navinfo/omqs/db/ImportPreProcess.kt @@ -260,7 +260,7 @@ class ImportPreProcess { // 将这个起终点的线记录在数据中 val startReference = ReferenceEntity() - startReference.renderEntityId = renderEntity.id +// startReference.renderEntityId = renderEntity.id startReference.name = "${renderEntity.name}参考点" startReference.code = renderEntity.code startReference.table = renderEntity.table @@ -278,7 +278,7 @@ class ImportPreProcess { listResult.add(startReference) val endReference = ReferenceEntity() - endReference.renderEntityId = renderEntity.id +// endReference.renderEntityId = renderEntity.id endReference.name = "${renderEntity.name}参考点" endReference.code = renderEntity.code endReference.table = renderEntity.table @@ -960,7 +960,7 @@ class ImportPreProcess { insertData(listResult) } - private fun insertData(list: List) { + private fun insertData(list: List) { realm?.let { Log.e("qj", "子表插入==") if (list != null && list.isNotEmpty()) { @@ -969,7 +969,6 @@ class ImportPreProcess { Log.e("qj", "子表插入结束==") } } - } /** 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 37e949dd..97f81dd7 100644 --- a/app/src/main/java/com/navinfo/omqs/db/RealmOperateHelper.kt +++ b/app/src/main/java/com/navinfo/omqs/db/RealmOperateHelper.kt @@ -131,12 +131,11 @@ class RealmOperateHelper() { val yEnd = tileYSet.stream().max(Comparator.naturalOrder()).orElse(null) // 查询realm中对应tile号的数据 val realm = getSelectTaskRealmInstance() + val sql = + " ((tileXMin <= $xStart and tileXMax >= $xStart) or (tileXMin <=$xEnd and tileXMax >=$xStart)) and ((tileYMin <= $yStart and tileYMax >= $yStart) or (tileYMin <=$yEnd and tileYMin >=$yStart))" val realmList = getSelectTaskRealmTools(realm, RenderEntity::class.java, true) .equalTo("table", table) - .greaterThanOrEqualTo("tileX", xStart) - .lessThanOrEqualTo("tileX", xEnd) - .greaterThanOrEqualTo("tileY", yStart) - .lessThanOrEqualTo("tileY", yEnd) + .rawPredicate(sql) .findAll() // 将获取到的数据和查询的polygon做相交,只返回相交的数据 val dataList = realm.copyFromRealm(realmList)