diff --git a/app/src/main/assets/omdb_config.json b/app/src/main/assets/omdb_config.json index 04a238bf..b222b3ff 100644 --- a/app/src/main/assets/omdb_config.json +++ b/app/src/main/assets/omdb_config.json @@ -83,6 +83,7 @@ "name": "车道边界类型", "zoomMin": 18, "zoomMax": 20, + "isDependOnOtherTable": true, "checkLinkId": false, "filterData": true, "catch": true, @@ -154,6 +155,7 @@ "code": 2092, "name": "车道类型", "catch": true, + "isDependOnOtherTable": true, "zoomMin": 18, "zoomMax": 20, "transformer": [ @@ -176,6 +178,7 @@ "name": "桥", "catch": true, "existSubCode": true, + "isDependOnOtherTable": true, "zoomMin": 15, "zoomMax": 20, "transformer": [ @@ -352,6 +355,7 @@ "code": 4001, "name": "路口", "zoomMin": 15, + "isDependOnOtherTable": true, "zoomMax": 17, "catch": true, "transformer": [ @@ -493,6 +497,7 @@ "code": 4009, "name": "警示信息", "catch": true, + "isDependOnOtherTable": true, "zoomMin": 15, "zoomMax": 20, "transformer": [ @@ -581,6 +586,7 @@ "code": 4601, "name": "车信", "catch": true, + "isDependOnOtherTable": true, "zoomMin": 15, "zoomMax": 17, "transformer": [ @@ -609,6 +615,7 @@ "code": 5001, "name": "车道中心线", "catch": false, + "isDependOnOtherTable": true, "checkLinkId": false, "zoomMin": 18, "zoomMax": 20, 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 4896301e..6e07e485 100644 --- a/app/src/main/java/com/navinfo/omqs/bean/ImportConfig.kt +++ b/app/src/main/java/com/navinfo/omqs/bean/ImportConfig.kt @@ -20,14 +20,12 @@ class ImportConfig { @Expose var checked: Boolean = true val preProcess: ImportPreProcess = ImportPreProcess() - fun transformProperties(renderEntity: RenderEntity, realm: Realm): RenderEntity? { + 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}") return renderEntity } - Log.e("qj", "子表转换不为空===${renderEntity.code}") for (transform in transformList) { // 开始执行转换 val key: String = transform.k 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 2f5a6d01..81274955 100644 --- a/app/src/main/java/com/navinfo/omqs/db/ImportOMDBHelper.kt +++ b/app/src/main/java/com/navinfo/omqs/db/ImportOMDBHelper.kt @@ -22,8 +22,12 @@ import dagger.assisted.AssistedInject import io.realm.Realm import io.realm.RealmConfiguration import kotlinx.coroutines.* +import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.FlowCollector +import kotlinx.coroutines.flow.channelFlow import kotlinx.coroutines.flow.flow +import kotlinx.coroutines.sync.Mutex import org.spatialite.database.SQLiteDatabase import java.io.BufferedReader import java.io.File @@ -142,154 +146,187 @@ class ImportOMDBHelper @AssistedInject constructor( * @param configFile 对应的配置文件 * */ suspend fun importOmdbZipFile( - omdbZipFile: File, - task: TaskBean, - scope: CoroutineScope - ): Flow = + omdbZipFile: File, task: TaskBean, scope: CoroutineScope + ): Boolean { + val channel = Channel>(Channel.RENDEZVOUS) - flow { - installTaskid = task.id.toString() - currentInstallTaskFolder = File(Constant.USER_DATA_PATH + "/$installTaskid") - if (!currentInstallTaskFolder.exists()) currentInstallTaskFolder.mkdirs() - currentInstallTaskConfig = - RealmConfiguration.Builder().directory(currentInstallTaskFolder).name("OMQS.realm") - .encryptionKey(Constant.PASSWORD) + installTaskid = task.id.toString() + currentInstallTaskFolder = File(Constant.USER_DATA_PATH + "/$installTaskid") + if (!currentInstallTaskFolder.exists()) currentInstallTaskFolder.mkdirs() + currentInstallTaskConfig = + RealmConfiguration.Builder().directory(currentInstallTaskFolder) + .name("OMQS.realm") + .encryptionKey(Constant.PASSWORD) // .allowQueriesOnUiThread(true) - .schemaVersion(2).build() - val unZipFolder = File(omdbZipFile.parentFile, "result") - if (unZipFolder.exists()) { - unZipFolder.deleteRecursively() - } - unZipFolder.mkdirs() - // 开始解压zip文件 - val unZipFiles = ZipUtils.unzipFile(omdbZipFile, unZipFolder) - // 先获取当前配置的所有图层的个数,方便后续计算数据解析进度 - var tableNum = 0 - var processIndex = 0 + .schemaVersion(2).build() - //单个表要素时间统计 -// var tableImportTime = System.currentTimeMillis() - //总表要素统计时间 -// var dataImportTime = System.currentTimeMillis() -// Realm.compactRealm(currentInstallTaskConfig) + val unZipFolder = File(omdbZipFile.parentFile, "result") + if (unZipFolder.exists()) { + unZipFolder.deleteRecursively() + } + unZipFolder.mkdirs() + // 开始解压zip文件 + val unZipFiles = ZipUtils.unzipFile(omdbZipFile, unZipFolder) + // 先获取当前配置的所有图层的个数,方便后续计算数据解析进度 + var tableNum = 0 + var processIndex = 0 - - for (importConfig in importConfigList) { - tableNum += importConfig.tableMap.size - } - //缓存任务link信息,便于下面与数据进行任务link匹配 - val hashMap: HashMap = HashMap() + for (importConfig in importConfigList) { + tableNum += importConfig.tableMap.size + } + //缓存任务link信息,便于下面与数据进行任务link匹配 + val hashMap: HashMap = HashMap() // val lineList = arrayOfNulls(task.hadLinkDvoList.size) // var index = 0 - task.hadLinkDvoList.forEach { - hashMap[it.linkPid.toLong()] = it + task.hadLinkDvoList.forEach { + hashMap[it.linkPid.toLong()] = it // lineList[index] = GeometryTools.createGeometry(it.geometry) as LineString // index++ - } - - val resHashMap: HashMap = HashMap() //define empty hashmap - - val listDependOnEntry = mutableListOf>() - val listJob = mutableListOf() - try { - - for (importConfig in importConfigList) { - for ((index, currentEntry) in importConfig.tableMap.entries.withIndex()) { - if (currentEntry.value.isDependOnOtherTable) { - listDependOnEntry.add(currentEntry) - continue - } - val job = scope.async { - importData(unZipFiles, currentEntry, task,importConfig) - } - listJob.add(job) - processIndex += 1 - // 1个文件发送一次flow流 - emit("${processIndex}/${tableNum}") + } + //需要关联查询的表 + val listDependOnEntry = + mutableMapOf, ImportConfig>() + //协程池 + val listJob = mutableListOf() + try { + for (importConfig in importConfigList) { + for ((index, currentEntry) in importConfig.tableMap.entries.withIndex()) { + if (currentEntry.value.isDependOnOtherTable) { + listDependOnEntry[currentEntry] = importConfig + continue } + val job = scope.launch(Dispatchers.IO) { + importData( + channel, + unZipFiles, + currentEntry, + task, + importConfig, + hashMap + ) + } + listJob.add(job) + } + } + val channelJob = scope.launch(Dispatchers.IO) { + val iterator = channel.iterator() + while (iterator.hasNext()) { + val next = iterator.next() + val realm = Realm.getInstance(currentInstallTaskConfig) + realm.executeTransaction { + Log.e("jingo", "安装数据 Realm数据插入") + it.copyToRealm(next) + } + realm.close() } - Log.e("qj", "安装结束") - } catch (e: Exception) { - Log.e("jingo", "安装报错 ${e.message}") - throw e } - emit("finish") + + listJob.joinAll() + channel.close() + channelJob.join() + Log.e("jingo", "channel close 等待结束") + for ((currentEntry, importConfig) in listDependOnEntry) { + importData( + channel, + unZipFiles, + currentEntry, + task, + importConfig, + hashMap, + false + ) + } + Log.e("jingo", "安装结束") + } catch (e: Exception) { + Log.e("jingo", "安装报错 ${e.message}") + return false } + +// }.collect() { list -> +// if (list == null) { +// realm.close() +// } else { +// realm.executeTransaction { +// it.copyToRealm(list) +// } +// } + return true + } + private suspend fun importData( + f: Channel>, unZipFiles: List, currentEntry: MutableMap.MutableEntry, task: TaskBean, - importConfig:ImportConfig + importConfig: ImportConfig, + hashMap: HashMap, + isEmit: Boolean = true ) { - val listRenderEntity = mutableListOf() - //下载数据统计 - var dataIndex = 0 - //数据库插入的统计 - var insertIndex = 0 + val resHashMap: HashMap = HashMap() //define empty hashmap + var listRenderEntity = mutableListOf() //单个表要素统计 var elementIndex = 0 - var realm = Realm.getInstance(currentInstallTaskConfig) val currentConfig = currentEntry.value - val txtFile = unZipFiles.find { - it.name == currentConfig.table - } - if (txtFile != null) { - val fileReader = FileReader(txtFile) - val bufferedReader = BufferedReader(fileReader) - var line: String? = bufferedReader.readLine() - realm.beginTransaction() - while (line != null) { - if (line == null || line.trim() == "") { - line = bufferedReader.readLine() - continue - } - elementIndex += 1 - dataIndex += 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() + try { + var realm: Realm? = null + if (!isEmit) { + realm = Realm.getInstance(currentInstallTaskConfig) + realm.beginTransaction() + } + val txtFile = unZipFiles.find { + it.name == currentConfig.table + } + if (txtFile != null) { + val fileReader = FileReader(txtFile) + val bufferedReader = BufferedReader(fileReader) + var line: String? = bufferedReader.readLine() - // 在外层记录当前数据的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 + while (line != null) { + if (line == null || line.trim() == "") { + line = bufferedReader.readLine() + continue } - } + elementIndex += 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 - Log.e( - "jingo", - "安装数据 ${renderEntity.table} ${renderEntity.linkPid} ${elementIndex} ${insertIndex}" - ) - renderEntity.geometry = map["geometry"].toString() + // 先查询这个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 + } + } + + renderEntity.geometry = map["geometry"].toString() // Log.d("ImportOMDBHelper", "解析===1处理3D") - // 其他数据插入到Properties中 - /* if (!currentConfig.is3D) { // 如果是非3d要素,则自动将Z轴坐标全部置为0 + // 其他数据插入到Properties中 + /* if (!currentConfig.is3D) { // 如果是非3d要素,则自动将Z轴坐标全部置为0 val coordinates = renderEntity.wkt?.coordinates?.map { coordinate -> coordinate.z = 0.0 @@ -312,159 +349,154 @@ class ImportOMDBHelper @AssistedInject constructor( renderEntity.geometry = newGeometry.toString() } }*/ - for ((key, value) in map) { - when (value) { - is String -> renderEntity.properties[key] = value - is Int -> renderEntity.properties[key] = - value.toInt().toString() + 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() + is Double -> renderEntity.properties[key] = + value.toDouble().toString() - else -> renderEntity.properties[key] = value.toString() - } - } - // 如果properties中不包含name,那么自动将要素名称添加进properties中 - if (!renderEntity.properties.containsKey("name")) { - renderEntity.properties["name"] = renderEntity.name; - } - - 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 - 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 - 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 - 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)) { - line = bufferedReader.readLine() - continue - } else { - resHashMap[checkMsg] = renderEntity - } - } - } + else -> renderEntity.properties[key] = value.toString() } } + // 如果properties中不包含name,那么自动将要素名称添加进properties中 + if (!renderEntity.properties.containsKey("name")) { + renderEntity.properties["name"] = renderEntity.name; + } - } + if (currentConfig.filterData) { + when (renderEntity.code.toInt()) { - //遍历判断只显示与任务Link相关的任务数据 - if (currentConfig.checkLinkId) { + DataCodeEnum.OMDB_POLE.code.toInt() -> { + //过滤树类型的杆状物,无需导入到数据库中 + val poleType = renderEntity.properties["poleType"] + if (poleType != null && poleType.toInt() == 2) { + line = bufferedReader.readLine() + continue + } + } - if (renderEntity.linkPid.isNotEmpty()) { + 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 + line = bufferedReader.readLine() + continue + } + } + } + } - val currentLinkPid = renderEntity.linkPid + 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 + line = bufferedReader.readLine() + continue + } + } + } + } - if (!currentLinkPid.isNullOrEmpty() && currentLinkPid != "null") { + DataCodeEnum.OMDB_OBJECT_STOPLOCATION.code.toInt() -> { + val locationType = renderEntity.properties["locationType"] + if (locationType != null) { + when (locationType.toInt()) { + 3, 4 -> { + renderEntity.enable = 0 + line = bufferedReader.readLine() + continue + } + } + } + } - val list = currentLinkPid.split(",") - - if (list.isNotEmpty()) { - - m@ for (linkPid in list) { - if (hashMap.containsKey(linkPid.toLong())) { - renderEntity.enable = 1 - break@m + 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)) { + line = bufferedReader.readLine() + continue + } else { + resHashMap[checkMsg] = renderEntity + } } } } } - } else if (renderEntity.code.toInt() == DataCodeEnum.OMDB_INTERSECTION.code.toInt() || renderEntity.code.toInt() == DataCodeEnum.OMDB_LANE_CONSTRUCTION.code.toInt() && renderEntity.properties.containsKey( - "linkList" - ) - ) { + } - if (renderEntity.properties["linkList"] != null) { + //遍历判断只显示与任务Link相关的任务数据 + if (currentConfig.checkLinkId) { - val linkList = renderEntity.properties["linkList"] + if (renderEntity.linkPid.isNotEmpty()) { - if (!linkList.isNullOrEmpty() && linkList != "null") { - val list: List = gson.fromJson( - linkList, - object : TypeToken>() {}.type - ) + val currentLinkPid = renderEntity.linkPid - m@ for (link in list) { - if (hashMap.containsKey(link.linkPid.toLong())) { - renderEntity.enable = 1 - break@m + if (!currentLinkPid.isNullOrEmpty() && currentLinkPid != "null") { + + val list = currentLinkPid.split(",") + + if (list.isNotEmpty()) { + + m@ for (linkPid in list) { + if (hashMap.containsKey(linkPid.toLong())) { + renderEntity.enable = 1 + break@m + } } } } + + } else if (renderEntity.code.toInt() == DataCodeEnum.OMDB_INTERSECTION.code.toInt() || renderEntity.code.toInt() == DataCodeEnum.OMDB_LANE_CONSTRUCTION.code.toInt() && renderEntity.properties.containsKey( + "linkList" + ) + ) { + + if (renderEntity.properties["linkList"] != null) { + + val linkList = renderEntity.properties["linkList"] + + if (!linkList.isNullOrEmpty() && linkList != "null") { + val list: List = gson.fromJson( + linkList, object : TypeToken>() {}.type + ) + + m@ for (link in list) { + if (hashMap.containsKey(link.linkPid.toLong())) { + renderEntity.enable = 1 + break@m + } + } + } + } + } else { + //不包括linkPid直接过滤 + line = bufferedReader.readLine() + continue } + //过滤掉非任务路线上的数据 + if (renderEntity.enable != 1) { + line = bufferedReader.readLine() + continue + } + } else { - //不包括linkPid直接过滤 - line = bufferedReader.readLine() - continue - } - //过滤掉非任务路线上的数据 - if (renderEntity.enable != 1) { - line = bufferedReader.readLine() - continue - } + renderEntity.enable = 1 - } else { - renderEntity.enable = 1 - - /* var geometry = GeometryTools.createGeometry(renderEntity.geometry) + /* var geometry = GeometryTools.createGeometry(renderEntity.geometry) if(multipLine.intersects(geometry)){ renderEntity.enable = 1 }else{ @@ -476,290 +508,296 @@ class ImportOMDBHelper @AssistedInject constructor( } }*/ // Log.e("qj", "${renderEntity.name}==不包括任务linkPid") - } -// Log.d("ImportOMDBHelper", "解析===2任务路线匹配") -// Log.d("ImportOMDBHelper", "解析===1预处理") + } - if (currentConfig.catch) { - renderEntity.catchEnable = 1 - } else { - renderEntity.catchEnable = 0 - } + if (currentConfig.catch) { + renderEntity.catchEnable = 1 + } else { + renderEntity.catchEnable = 0 + } - // 对renderEntity做预处理后再保存 - val resultEntity = - importConfig.transformProperties(renderEntity, realm) - if (resultEntity != null) { + // 对renderEntity做预处理后再保存 + val resultEntity = importConfig.transformProperties(renderEntity, realm) + if (resultEntity != null) { - //对code编码需要特殊处理 存在多个属性值时,渲染优先级:SA>PA,存在多个属性值时,渲染优先级:FRONTAGE>MAIN_SIDE_A CCESS - if (currentConfig.existSubCode) { - when (renderEntity.code.toInt()) { - DataCodeEnum.OMDB_LINK_ATTRIBUTE.code.toInt() -> { + //对code编码需要特殊处理 存在多个属性值时,渲染优先级:SA>PA,存在多个属性值时,渲染优先级:FRONTAGE>MAIN_SIDE_A CCESS + if (currentConfig.existSubCode) { + when (renderEntity.code.toInt()) { + DataCodeEnum.OMDB_LINK_ATTRIBUTE.code.toInt() -> { - var type = renderEntity.properties["sa"] - if (type != null && type == "1") { - renderEntity.code = - DataCodeEnum.OMDB_LINK_ATTRIBUTE_SA.code - } else { - type = renderEntity.properties["pa"] + var type = renderEntity.properties["sa"] if (type != null && type == "1") { renderEntity.code = - DataCodeEnum.OMDB_LINK_ATTRIBUTE_PA.code + DataCodeEnum.OMDB_LINK_ATTRIBUTE_SA.code } else { - type = - renderEntity.properties["frontage"] + type = renderEntity.properties["pa"] if (type != null && type == "1") { renderEntity.code = - DataCodeEnum.OMDB_LINK_ATTRIBUTE_FORNTAGE.code - renderEntity.zoomMin = 15 - renderEntity.zoomMax = 17 + DataCodeEnum.OMDB_LINK_ATTRIBUTE_PA.code } else { - type = - renderEntity.properties["mainSideAccess"] + type = renderEntity.properties["frontage"] if (type != null && type == "1") { renderEntity.code = - DataCodeEnum.OMDB_LINK_ATTRIBUTE_MAIN_SIDE_ACCESS.code + DataCodeEnum.OMDB_LINK_ATTRIBUTE_FORNTAGE.code renderEntity.zoomMin = 15 renderEntity.zoomMax = 17 } else { - renderEntity.enable = 0 - renderEntity.zoomMin = 15 - renderEntity.zoomMax = 17 - line = bufferedReader.readLine() - continue + 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 + } else { + renderEntity.enable = 0 + renderEntity.zoomMin = 15 + renderEntity.zoomMax = 17 + 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_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 + 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 + 98 -> renderEntity.code = + DataCodeEnum.OMDB_RAMP_2.code - 99 -> renderEntity.code = - DataCodeEnum.OMDB_RAMP_3.code + 99 -> renderEntity.code = + DataCodeEnum.OMDB_RAMP_3.code - 100 -> renderEntity.code = - DataCodeEnum.OMDB_RAMP_4.code + 100 -> renderEntity.code = + DataCodeEnum.OMDB_RAMP_4.code - 102 -> renderEntity.code = - DataCodeEnum.OMDB_RAMP_5.code + 102 -> renderEntity.code = + DataCodeEnum.OMDB_RAMP_5.code - 103 -> renderEntity.code = - DataCodeEnum.OMDB_RAMP_6.code + 103 -> renderEntity.code = + DataCodeEnum.OMDB_RAMP_6.code - 104 -> renderEntity.code = - DataCodeEnum.OMDB_RAMP_7.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() -> { + /*道路形态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" } } } - 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 - } + 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 { + line = bufferedReader.readLine() + continue } - } - - DataCodeEnum.OMDB_LINK_FORM2.code.toInt() -> { - /*道路形态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" + } 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 { + 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 { - 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 { - line = bufferedReader.readLine() - continue - } + + //移除该字段,减少数据量 + if (renderEntity.properties.containsKey("geometry")) { + renderEntity.properties.remove("geometry") } - } - ++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() + //移除该字段,减少数据量 + if (renderEntity.properties.containsKey("linkPid")) { + renderEntity.properties.remove("linkPid") } - 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() - ) - listRenderEntity.add(renderEntity) + // 如果当前解析的是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() + ) + listRenderEntity.add(renderEntity) + } + + if (listRenderEntity.size > 20000) { + Log.e( + "jingo", + "安装数据 ${currentConfig.table} $elementIndex ${listRenderEntity.size}" + ) + if (isEmit) { + f.send(listRenderEntity) + delay(100) + } else { + realm!!.copyToRealm(listRenderEntity) + realm!!.commitTransaction() + realm!!.close() + realm = Realm.getInstance(currentInstallTaskConfig) + realm.beginTransaction() + } + listRenderEntity = mutableListOf() +// + } + line = bufferedReader.readLine() } + Log.e( + "jingo", + "安装数据 ${currentConfig.table} $elementIndex ${listRenderEntity.size}" + ) + if (isEmit) { + f.send(listRenderEntity) + delay(100) - if (listRenderEntity.size > 10000) { - Log.e( - "jingo", "10000刷新" - ) - realm.copyToRealm(listRenderEntity) - realm.commitTransaction() - realm.close() - listRenderEntity.clear() - insertIndex = 0 - realm = Realm.getInstance(currentInstallTaskConfig) - realm.beginTransaction() + } else { + bufferedReader.close() + realm!!.copyToRealm(listRenderEntity) + realm!!.commitTransaction() } - line = bufferedReader.readLine() } - bufferedReader.close() + if (!isEmit) { + realm!!.close() + } + } catch (e: Exception) { + Log.e("jingo", "安装报错 ${currentConfig.table} ${elementIndex} ${e.message}") + throw e } - realm.copyToRealm(listRenderEntity) - realm.commitTransaction() - realm.close() - listRenderEntity.clear() + Log.e("jingo", "安装完成 ${currentConfig.table}") } - // 获取指定数据表的列名 - fun getColumns(db: SQLiteDatabase, tableName: String): List { - val columns = mutableListOf() - - // 查询 sqlite_master 表获取指定数据表的元数据信息 - val cursor = db.query( - "sqlite_master", - arrayOf("sql"), - "type='table' AND name=?", - arrayOf(tableName), - null, - null, - null - ) - - // 从元数据信息中解析出列名 - if (cursor.moveToFirst()) { - val sql = cursor.getString(0) - val startIndex = sql.indexOf("(") + 1 - val endIndex = sql.lastIndexOf(")") - val columnDefs = sql.substring(startIndex, endIndex).split(",") - for (columnDef in columnDefs) { - val columnName = columnDef.trim().split(" ")[0] - if (!columnName.startsWith("rowid", true)) { // 排除 rowid 列 - columns.add(columnName) - } - } - } - cursor.close() - return columns - } +// // 获取指定数据表的列名 +// fun getColumns(db: SQLiteDatabase, tableName: String): List { +// val columns = mutableListOf() +// +// // 查询 sqlite_master 表获取指定数据表的元数据信息 +// val cursor = db.query( +// "sqlite_master", +// arrayOf("sql"), +// "type='table' AND name=?", +// arrayOf(tableName), +// null, +// null, +// null +// ) +// +// // 从元数据信息中解析出列名 +// if (cursor.moveToFirst()) { +// val sql = cursor.getString(0) +// val startIndex = sql.indexOf("(") + 1 +// val endIndex = sql.lastIndexOf(")") +// val columnDefs = sql.substring(startIndex, endIndex).split(",") +// for (columnDef in columnDefs) { +// val columnName = columnDef.trim().split(" ")[0] +// if (!columnName.startsWith("rowid", true)) { // 排除 rowid 列 +// columns.add(columnName) +// } +// } +// } +// cursor.close() +// return columns +// } } \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/db/ImportPreProcess.kt b/app/src/main/java/com/navinfo/omqs/db/ImportPreProcess.kt index b394acf0..78de0e22 100644 --- a/app/src/main/java/com/navinfo/omqs/db/ImportPreProcess.kt +++ b/app/src/main/java/com/navinfo/omqs/db/ImportPreProcess.kt @@ -733,6 +733,7 @@ class ImportPreProcess { * 生成车道中心线面宽度 * */ fun generateAddWidthLine(renderEntity: RenderEntity) { + var newTime = 0L // 添加车道中心面渲染原则,根据车道宽度进行渲染 val angleReference = ReferenceEntity() // angleReference.renderEntityId = renderEntity.id @@ -741,6 +742,7 @@ class ImportPreProcess { 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 @@ -753,6 +755,7 @@ class ImportPreProcess { ) listResult.add(angleReference) insertData(listResult) + } @@ -962,11 +965,8 @@ class ImportPreProcess { private fun insertData(list: List) { realm?.let { - Log.e("qj", "子表插入==") if (list != null && list.isNotEmpty()) { - Log.e("qj", "子表插入开始==") it.copyToRealm(list) - Log.e("qj", "子表插入结束==") } } } diff --git a/app/src/main/java/com/navinfo/omqs/http/taskdownload/TaskDownloadScope.kt b/app/src/main/java/com/navinfo/omqs/http/taskdownload/TaskDownloadScope.kt index 1d80863a..e93e47fa 100644 --- a/app/src/main/java/com/navinfo/omqs/http/taskdownload/TaskDownloadScope.kt +++ b/app/src/main/java/com/navinfo/omqs/http/taskdownload/TaskDownloadScope.kt @@ -155,21 +155,20 @@ class TaskDownloadScope( fileNew ) if (task != null) { - importOMDBHelper.importOmdbZipFile(importOMDBHelper.omdbFile, task, this).collect { - Log.e("jingo", "数据安装 $it") - if (it == "finish") { - change(FileDownloadStatus.DONE) - Log.e("jingo", "数据安装结束") - withContext(Dispatchers.Main) { - //任务与当前一致,需要更新渲染图层 - if (MapParamUtils.getTaskId() == taskBean.id) { - downloadManager.mapController.layerManagerHandler.updateOMDBVectorTileLayer() - } + if (importOMDBHelper.importOmdbZipFile(importOMDBHelper.omdbFile, task, this)) { +// if (it == "finish") { + change(FileDownloadStatus.DONE) + Log.e("jingo", "数据安装结束") + withContext(Dispatchers.Main) { + //任务与当前一致,需要更新渲染图层 + if (MapParamUtils.getTaskId() == taskBean.id) { + downloadManager.mapController.layerManagerHandler.updateOMDBVectorTileLayer() } - } else { - change(FileDownloadStatus.IMPORTING, it) } + } else { + change(FileDownloadStatus.IMPORTING, "anzhuang") } +// } } } catch (e: Exception) { Log.e("jingo", "数据安装失败 ${e.toString()}") diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/personalcenter/PersonalCenterViewModel.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/personalcenter/PersonalCenterViewModel.kt index a1d41ff4..8c247086 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/personalcenter/PersonalCenterViewModel.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/personalcenter/PersonalCenterViewModel.kt @@ -1,17 +1,12 @@ package com.navinfo.omqs.ui.fragment.personalcenter import android.net.Uri -import android.os.Build import android.util.Log -import androidx.annotation.RequiresApi import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import com.blankj.utilcode.util.FileIOUtils import com.blankj.utilcode.util.UriUtils -import com.blankj.utilcode.util.ZipUtils -import com.google.gson.Gson -import com.navinfo.collect.library.data.entity.* +import com.navinfo.collect.library.data.entity.TaskBean import com.navinfo.omqs.bean.ScProblemTypeBean import com.navinfo.omqs.bean.ScRootCauseAnalysisBean import com.navinfo.omqs.bean.ScWarningCodeBean @@ -24,7 +19,6 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import org.apache.commons.io.input.BOMInputStream import java.io.* -import java.util.* import javax.inject.Inject @@ -158,16 +152,12 @@ class PersonalCenterViewModel @Inject constructor( viewModelScope.launch(Dispatchers.IO) { Log.d("OMQSApplication", "开始导入数据") if (task != null) { - importOMDBHelper.importOmdbZipFile(importOMDBHelper.omdbFile, task, this).collect { - Log.d("importOMDBData", it) - } + importOMDBHelper.importOmdbZipFile(importOMDBHelper.omdbFile, task, this) } else { val newTask = TaskBean() newTask.id = -1 importOMDBHelper.importOmdbZipFile(importOMDBHelper.omdbFile, newTask, this) - .collect { - Log.d("importOMDBData", it) - } + } Log.d("OMQSApplication", "导入数据完成") } 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 6db848be..84edd079 100644 --- a/app/src/main/java/com/navinfo/omqs/util/NaviEngineNew.kt +++ b/app/src/main/java/com/navinfo/omqs/util/NaviEngineNew.kt @@ -1,20 +1,14 @@ 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, diff --git a/collect-library/src/main/java/com/navinfo/collect/library/utils/GeometryToolsKt.kt b/collect-library/src/main/java/com/navinfo/collect/library/utils/GeometryToolsKt.kt index b626079c..f108e2c4 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/utils/GeometryToolsKt.kt +++ b/collect-library/src/main/java/com/navinfo/collect/library/utils/GeometryToolsKt.kt @@ -49,7 +49,6 @@ class GeometryToolsKt { } } } - println("YGeometry-time:" + (System.currentTimeMillis() - startTime)) } /** @@ -93,7 +92,6 @@ class GeometryToolsKt { } } } - println("XGeometry-time:" + (System.currentTimeMillis() - startTime)) } fun getMasterPoint(wkt: String): String {