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