Merge branch 'navinfo-20231018'

# Conflicts:
#	app/src/main/java/com/navinfo/omqs/ui/activity/login/LoginViewModel.kt
#	app/src/main/java/com/navinfo/omqs/util/NaviEngine.kt
#	collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBTileDataSource.java
This commit is contained in:
squallzhjch 2023-10-20 16:38:53 +08:00
commit 9cf39d476c
12 changed files with 836 additions and 685 deletions

File diff suppressed because it is too large Load Diff

View File

@ -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
@ -36,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
/**
@ -180,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<Long, HadLinkDvoBean> = HashMap<Long, HadLinkDvoBean>()
val lineList = arrayOfNulls<LineString>(task.hadLinkDvoList.size)
var index = 0
// val lineList = arrayOfNulls<LineString>(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<String, RenderEntity> =
HashMap<String, RenderEntity>() //define empty hashmap
try {
var multipLine = MultiLineString(lineList, GeometryFactory())
// var multipLine = MultiLineString(lineList, GeometryFactory())
// 遍历解压后的文件,读取该数据返回
@ -257,6 +259,26 @@ class ImportOMDBHelper @AssistedInject constructor(
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<LinkList> = gson.fromJson(
linkList,
object :
TypeToken<List<LinkList>>() {}.type
)
if (list != null) {
renderEntity.linkPid = list[0].linkPid
}
}
}
renderEntity.geometry = map["geometry"].toString()
Log.d("ImportOMDBHelper", "解析===1处理3D")
@ -748,9 +770,24 @@ 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"]
// 同时尝试更新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()) {
@ -762,8 +799,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}")
@ -774,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
}

View File

@ -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
@ -13,31 +15,46 @@ 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 {
val code2NameMap = Code2NameMap()
lateinit var cacheRdLink: Map<String?, RenderEntity>
// lateinit var cacheRdLink: Map<String?, RenderEntity>
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
}
@ -568,6 +585,29 @@ 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)
}
/**
* 查询指定的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()
}
/**
* 生成电子眼对应的渲染名称
* */

View File

@ -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<RenderEntity>()
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

View File

@ -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)
}
}
}
}
}

View File

@ -852,8 +852,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

View File

@ -182,7 +182,7 @@ class PersonalCenterFragment(private var indoorDataListener: ((Boolean) -> Unit?
// 定位到指定位置
niMapController.mMapView.vtmMap.animator()
// .animateTo(GeoPoint( 40.05108004733645, 116.29187746293708 ))
.animateTo(GeoPoint(40.07245537956604, 116.239638575623))
.animateTo(GeoPoint(40.0882756, 116.3033581))
}
R.id.personal_center_menu_open_all_layer -> {

View File

@ -0,0 +1,36 @@
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.Index
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 linkPid:String = UUID.randomUUID().toString()
@Index
var sNodeId: String? = null
@Index
var eNodeId: String? = null
var direct: Int = 0
constructor(direct: Int) : this() {
this.direct = direct
}
}

View File

@ -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
@ -64,7 +65,9 @@ open class RenderEntity() : RealmObject(), Parcelable {
return field
}
var properties: RealmDictionary<String> = RealmDictionary()
@Ignore
var tileX: RealmSet<Int> = RealmSet() // x方向的tile编码
@Ignore
var tileY: RealmSet<Int> = RealmSet() // y方向的tile编码
var tileXMin:Int =0
var tileXMax:Int = 0
@ -75,6 +78,9 @@ open class RenderEntity() : RealmObject(), Parcelable {
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
constructor(name: String) : this() {
this.name = name

View File

@ -1,10 +1,7 @@
package com.navinfo.collect.library.map.source;
import com.navinfo.collect.library.system.Constant;
import org.oscim.map.Viewport;
import org.oscim.tiling.ITileDataSource;
import org.oscim.tiling.OverzoomTileDataSource;
public class OMDBReferenceTileSource extends RealmDBTileSource {
private OMDBReferenceDataSource omdbReferenceTileSource;
@ -18,7 +15,8 @@ public class OMDBReferenceTileSource extends RealmDBTileSource {
@Override
public ITileDataSource getDataSource() {
//return new OverzoomTileDataSource(new OMDBReferenceDataSource(), Constant.OVER_ZOOM);
return new OverzoomTileDataSource(omdbReferenceTileSource, Constant.OVER_ZOOM);
// return new OverzoomTileDataSource(omdbReferenceTileSource, Constant.OVER_ZOOM);
return omdbReferenceTileSource;
}
@Override

View File

@ -3,11 +3,9 @@ package com.navinfo.collect.library.map.source;
import android.util.Log;
import com.navinfo.collect.library.data.entity.RenderEntity;
import com.navinfo.collect.library.system.Constant;
import org.oscim.map.Viewport;
import org.oscim.tiling.ITileDataSource;
import org.oscim.tiling.OverzoomTileDataSource;
import io.realm.Realm;
@ -23,7 +21,8 @@ public class OMDBTileSource extends RealmDBTileSource {
@Override
public ITileDataSource getDataSource() {
// return new OverzoomTileDataSource(new OMDBTileDataSource(), Constant.OVER_ZOOM);
return new OverzoomTileDataSource(omdbTileDataSource, Constant.OVER_ZOOM);
// return new OverzoomTileDataSource(omdbTileDataSource, Constant.OVER_ZOOM);
return omdbTileDataSource;
}
@Override

2
vtm

@ -1 +1 @@
Subproject commit c046e788f5c739612a31c308639fca2de639669a
Subproject commit 6a6bb9ab5eaf6bb4c05b3110c612c32ef4c6ef3d