From 58dfe642272a9f7642ea60e807c3e1e514d42d7a Mon Sep 17 00:00:00 2001 From: xiaoyan Date: Wed, 16 Aug 2023 16:49:38 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=E9=81=93=E8=B7=AF?= =?UTF-8?q?=E5=BD=A2=E6=80=81=E5=9B=BE=E5=B1=82=E5=88=86=E7=BB=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/assets/omdb_config.json | 813 +++++++++--------- .../main/java/com/navinfo/omqs/Constant.kt | 2 +- .../com/navinfo/omqs/db/ImportOMDBHelper.kt | 419 ++++----- .../navinfo/omqs/tools/LayerConfigUtils.kt | 26 +- .../omqs/ui/activity/map/MainViewModel.kt | 19 +- .../src/main/assets/editormarker.xml | 2 +- .../main/assets/omdb/tex_fill_area_3012.png | Bin 2285 -> 2654 bytes 7 files changed, 648 insertions(+), 633 deletions(-) diff --git a/app/src/main/assets/omdb_config.json b/app/src/main/assets/omdb_config.json index 6ece5274..5a0c499c 100644 --- a/app/src/main/assets/omdb_config.json +++ b/app/src/main/assets/omdb_config.json @@ -1,404 +1,413 @@ -{ - "tableMap" : { - "1012": { - "table": "OMDB_CHECKPOINT", - "code": 1012, - "name": "检查点", - "zoomMin": 15, - "zoomMax": 19 - }, - "2001": { - "table": "OMDB_RD_LINK", - "code": 2001, - "name": "道路线", - "zoomMin": 15, - "zoomMax": 17, - "checkLinkId": false - }, - "2002": { - "table": "OMDB_RD_LINK_FUNCTION_CLASS", - "code": 2002, - "name": "道路功能等级", - "zoomMin": 15, - "zoomMax": 17 - }, - "2004": { - "table": "OMDB_LINK_ATTRIBUTE", - "code": 2004, - "name": "道路属性", - "zoomMin": 15, - "zoomMax": 19, - "transformer": [ - { - "k": "geometry", - "v": "~", - "klib": "geometry", - "vlib": "generateRoadText()" - } - ] - }, - "2008": { - "table": "OMDB_RD_LINK_KIND", - "code": 2008, - "name": "道路种别", - "zoomMin": 15, - "zoomMax": 20, - "checkLinkId": false - }, - "2010": { - "table": "OMDB_LINK_DIRECT", - "code": 2010, - "name": "道路方向", - "zoomMin": 15, - "zoomMax": 17, - "checkLinkId": false - }, - "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, - "transformer": [ - { - "k": "geometry", - "v": "~", - "klib": "geometry", - "vlib": "unpackingLaneBoundary()" - } - ] - }, - "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 - }, - "2022": { - "table": "OMDB_CON_ACCESS", - "code": 2022, - "name": "全封闭" - }, - "2037": { - "table": "OMDB_RAMP", - "code": 2037, - "name": "匝道" - }, - "2040": { - "table": "OMDB_MULTI_DIGITIZED", - "code": 2040, - "name": "上下线分离" - }, - "2041":{ - "table": "OMDB_LANE_NUM", - "code": 2041, - "name": "车道数" - }, - "2083":{ - "table": "OMDB_RDBOUND_BOUNDARYTYPE", - "code": 2083, - "name": "道路边界类型", - "zoomMin": 18, - "zoomMax": 20, - "checkLinkId": false - }, - "2201":{ - "table": "OMDB_BRIDGE", - "code": 2201, - "name": "桥", - "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, - "transformer2Code": "" - }, - "2204":{ - "table": "OMDB_ROUNDABOUT", - "code": 2204, - "name": "环岛", - "zoomMin": 15, - "zoomMax": 17, - "transformer": [ - { - "k": "geometry", - "v": "~", - "klib": "geometry", - "vlib": "generateS2EReferencePoint()" - } - ] - }, - "2205":{ - "table": "OMDB_LINK_FORM1", - "code": 2205, - "name": "道路形态1", - "zoomMin": 15, - "zoomMax": 17 - }, - "2206":{ - "table": "OMDB_LINK_FORM2", - "code": 2206, - "name": "道路形态2", - "zoomMin": 15, - "zoomMax": 17, - "transformer2Code": "" - }, - "3012":{ - "table": "OMDB_FILL_AREA", - "code": 3012, - "name": "导流区", - "zoomMin": 16, - "zoomMax": 20 - }, - "4001": { - "table": "OMDB_INTERSECTION", - "code": 4001, - "name": "路口", - "zoomMin": 15, - "zoomMax": 17, - "transformer": [ - { - "k": "geometry", - "v": "~", - "klib": "geometry", - "vlib": "generateIntersectionReference()" - } - ] - }, - "4002": { - "table": "OMDB_SPEEDLIMIT", - "code": 4002, - "name": "常规点限速", - "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": "条件点限速", - "zoomMin": 15, - "zoomMax": 20, - "transformer": [ - { - "k": "maxSpeed", - "v": "0|", - "klib": "maxSpeed", - "vlib": "限" - } - ] - }, - "4004":{ - "table": "OMDB_SPEEDLIMIT_VAR", - "code": 4004, - "name": "可变点限速", - "zoomMin": 15, - "zoomMax": 20, - "transformer": [ - { - "k": "location", - "v": "1", - "klib": "location", - "vlib": "左" - }, - { - "k": "location", - "v": "2", - "klib": "locationlib", - "vlib": "右" - }, - { - "k": "location", - "v": "3", - "klib": "location", - "vlib": "上" - } - ] - }, - "4006":{ - "table": "OMDB_RESTRICTION", - "code": 4006, - "name": "普通交限", - "zoomMin": 15, - "zoomMax": 20, - "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()" - } - ] - }, - "4010":{ - "table": "OMDB_ELECTRONICEYE", - "code": 4010, - "name": "电子眼", - "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": "交通灯", - "zoomMin": 15, - "zoomMax": 20, - "transformer": [ - ] - }, - "4601":{ - "table": "OMDB_LANEINFO", - "code": 4601, - "name": "车信", - "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": "车道中心线", - "zoomMin": 18, - "zoomMax": 20, - "transformer": [ - { - "k": "geometry", - "v": "~", - "klib": "geometry", - "vlib": "generateAddWidthLine()" - } - ] - }, - "5002":{ - "table": "OMDB_AREA", - "code": 5002, - "name": "面测试" +[ + { + "tableGroupName": "普通图层", + "tableMap" : { + "1012": { + "table": "OMDB_CHECKPOINT", + "code": 1012, + "name": "检查点", + "zoomMin": 15, + "zoomMax": 19 + }, + "2001": { + "table": "OMDB_RD_LINK", + "code": 2001, + "name": "道路线", + "zoomMin": 15, + "zoomMax": 17, + "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": 20, + "checkLinkId": false + }, + "2010": { + "table": "OMDB_LINK_DIRECT", + "code": 2010, + "name": "道路方向", + "zoomMin": 15, + "zoomMax": 17, + "checkLinkId": false + }, + "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, + "transformer": [ + { + "k": "geometry", + "v": "~", + "klib": "geometry", + "vlib": "unpackingLaneBoundary()" + } + ] + }, + "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": "道路边界类型", + "zoomMin": 18, + "zoomMax": 20, + "checkLinkId": false + }, + "2201":{ + "table": "OMDB_BRIDGE", + "code": 2201, + "name": "桥", + "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, + "transformer2Code": "" + }, + "3012":{ + "table": "OMDB_FILL_AREA", + "code": 3012, + "name": "导流区", + "zoomMin": 16, + "zoomMax": 20 + }, + "4001": { + "table": "OMDB_INTERSECTION", + "code": 4001, + "name": "路口", + "zoomMin": 15, + "zoomMax": 17, + "transformer": [ + { + "k": "geometry", + "v": "~", + "klib": "geometry", + "vlib": "generateIntersectionReference()" + } + ] + }, + "4002": { + "table": "OMDB_SPEEDLIMIT", + "code": 4002, + "name": "常规点限速", + "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": "条件点限速", + "zoomMin": 15, + "zoomMax": 20, + "transformer": [ + { + "k": "maxSpeed", + "v": "0|", + "klib": "maxSpeed", + "vlib": "限" + } + ] + }, + "4004":{ + "table": "OMDB_SPEEDLIMIT_VAR", + "code": 4004, + "name": "可变点限速", + "zoomMin": 15, + "zoomMax": 20, + "transformer": [ + { + "k": "location", + "v": "1", + "klib": "location", + "vlib": "左" + }, + { + "k": "location", + "v": "2", + "klib": "locationlib", + "vlib": "右" + }, + { + "k": "location", + "v": "3", + "klib": "location", + "vlib": "上" + } + ] + }, + "4006":{ + "table": "OMDB_RESTRICTION", + "code": 4006, + "name": "普通交限", + "zoomMin": 15, + "zoomMax": 20, + "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()" + } + ] + }, + "4010":{ + "table": "OMDB_ELECTRONICEYE", + "code": 4010, + "name": "电子眼", + "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": "交通灯", + "zoomMin": 15, + "zoomMax": 20, + "transformer": [ + ] + }, + "4601":{ + "table": "OMDB_LANEINFO", + "code": 4601, + "name": "车信", + "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": "车道中心线", + "zoomMin": 18, + "zoomMax": 20, + "transformer": [ + { + "k": "geometry", + "v": "~", + "klib": "geometry", + "vlib": "generateAddWidthLine()" + } + ] + }, + "5002":{ + "table": "OMDB_AREA", + "code": 5002, + "name": "面测试" + } + } + }, + { + "tableGroupName": "道路形态", + "tableMap" : { + "2004": { + "table": "OMDB_LINK_ATTRIBUTE", + "code": 2004, + "name": "道路属性", + "zoomMin": 15, + "zoomMax": 19, + "transformer": [ + { + "k": "geometry", + "v": "~", + "klib": "geometry", + "vlib": "generateRoadText()" + } + ] + }, + "2022": { + "table": "OMDB_CON_ACCESS", + "code": 2022, + "name": "全封闭" + }, + "2037": { + "table": "OMDB_RAMP", + "code": 2037, + "name": "匝道" + }, + "2040": { + "table": "OMDB_MULTI_DIGITIZED", + "code": 2040, + "name": "上下线分离" + }, + "2204":{ + "table": "OMDB_ROUNDABOUT", + "code": 2204, + "name": "环岛", + "zoomMin": 15, + "zoomMax": 17, + "transformer": [ + { + "k": "geometry", + "v": "~", + "klib": "geometry", + "vlib": "generateS2EReferencePoint()" + } + ] + }, + "2205":{ + "table": "OMDB_LINK_FORM1", + "code": 2205, + "name": "道路形态1", + "zoomMin": 15, + "zoomMax": 17 + }, + "2206":{ + "table": "OMDB_LINK_FORM2", + "code": 2206, + "name": "道路形态2", + "zoomMin": 15, + "zoomMax": 17, + "transformer2Code": "" + } + } } -} \ No newline at end of file +] \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/Constant.kt b/app/src/main/java/com/navinfo/omqs/Constant.kt index f7f77cce..47a48643 100644 --- a/app/src/main/java/com/navinfo/omqs/Constant.kt +++ b/app/src/main/java/com/navinfo/omqs/Constant.kt @@ -102,7 +102,7 @@ class Constant { const val SELECT_TAKEPHOTO_OR_RECORD = "select_takephoto_or_record" const val OMDB_CONFIG = "omdb_config.json" - const val OTHER_CONFIG = "other_config.json" +// const val OTHER_CONFIG = "other_config.json" val OMDB_LAYER_VISIBLE_LIST: MutableList = mutableListOf() // 记录OMDB数据显示的图层名称列表 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 ba707e60..fbeed81c 100644 --- a/app/src/main/java/com/navinfo/omqs/db/ImportOMDBHelper.kt +++ b/app/src/main/java/com/navinfo/omqs/db/ImportOMDBHelper.kt @@ -50,16 +50,23 @@ class ImportOMDBHelper @AssistedInject constructor( private val configFile: File = File("${Constant.USER_DATA_PATH}", Constant.OMDB_CONFIG) - private val importConfig by lazy { + private val importConfigList by lazy { openConfigFile() } /** * 读取config的配置文件 * */ - fun openConfigFile(): ImportConfig { + fun openConfigFile(): List { + val resultList = mutableListOf() val configStr = configFile.readText() - return gson.fromJson(configStr, ImportConfig::class.java) + val type = object : TypeToken>() {}.type + return try { + val result = gson.fromJson>(configStr, type) + result ?: resultList + } catch (e: Exception) { + resultList + } } /** @@ -135,262 +142,270 @@ class ImportOMDBHelper @AssistedInject constructor( val unZipFiles = ZipUtils.unzipFile(omdbZipFile, unZipFolder) // 将listResult数据插入到Realm数据库中 val realm = Realm.getDefaultInstance() + // 先获取当前配置的所有图层的个数,方便后续计算数据解析进度 + var tableNum = 0 + for (importConfig in importConfigList) { + tableNum += importConfig.tableMap.size + } + realm.beginTransaction() try { // 遍历解压后的文件,读取该数据返回 - for ((index, currentEntry) in importConfig.tableMap.entries.withIndex()) { - val currentConfig = currentEntry.value - val txtFile = unZipFiles.find { - it.name == currentConfig.table - } + for (importConfig in importConfigList) { + for ((index, currentEntry) in importConfig.tableMap.entries.withIndex()) { + val currentConfig = currentEntry.value + val txtFile = unZipFiles.find { + it.name == currentConfig.table + } - val listResult = mutableListOf() - 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 - } - 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_code"] = if (currentConfig.code == 0) currentConfig.code else currentEntry.key - map["qi_zoomMin"] = currentConfig.zoomMin - map["qi_zoomMax"] = currentConfig.zoomMax - - // 先查询这个mesh下有没有数据,如果有则跳过即可 - // val meshEntity = Realm.getDefaultInstance().where(RenderEntity::class.java).equalTo("properties['mesh']", map["mesh"].toString()).findFirst() - 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() - - // 其他数据插入到Properties中 - renderEntity.geometry = map["geometry"].toString() - 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()) + val listResult = mutableListOf() + 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 } - } + 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_code"] = if (currentConfig.code == 0) currentConfig.code else currentEntry.key + map["qi_zoomMin"] = currentConfig.zoomMin + map["qi_zoomMax"] = currentConfig.zoomMax - // 如果properties中不包含name,那么自动将要素名称添加进properties中 - if (!renderEntity.properties.containsKey("name")) { - renderEntity.properties["name"] = renderEntity.name; - } - //遍历判断只显示与任务Link相关的任务数据 - if(currentConfig.checkLinkId){ + // 先查询这个mesh下有没有数据,如果有则跳过即可 + // val meshEntity = Realm.getDefaultInstance().where(RenderEntity::class.java).equalTo("properties['mesh']", map["mesh"].toString()).findFirst() + 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() - if(renderEntity.properties.containsKey("linkPid")){ - - var currentLinkPid = renderEntity.properties["linkPid"] - - if(!currentLinkPid.isNullOrEmpty()&¤tLinkPid!="null"){ - - task.hadLinkDvoList.forEach{ - if(it.linkPid==renderEntity.properties["linkPid"]){ - renderEntity.enable = 1 - Log.e("qj","${renderEntity.name}==包括任务link") - return@forEach - } - } + // 其他数据插入到Properties中 + renderEntity.geometry = map["geometry"].toString() + 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()) } + } - }else if(renderEntity.code == DataCodeEnum.OMDB_RESTRICTION.code && renderEntity.properties.containsKey("linkIn")){ + // 如果properties中不包含name,那么自动将要素名称添加进properties中 + if (!renderEntity.properties.containsKey("name")) { + renderEntity.properties["name"] = renderEntity.name; + } + //遍历判断只显示与任务Link相关的任务数据 + if(currentConfig.checkLinkId){ - if (renderEntity.properties["linkIn"] != null) { + if(renderEntity.properties.containsKey("linkPid")){ - var currentLinkPid = renderEntity.properties["linkIn"] + var currentLinkPid = renderEntity.properties["linkPid"] if(!currentLinkPid.isNullOrEmpty()&¤tLinkPid!="null"){ task.hadLinkDvoList.forEach{ - if(it.linkPid==currentLinkPid){ + if(it.linkPid==renderEntity.properties["linkPid"]){ renderEntity.enable = 1 Log.e("qj","${renderEntity.name}==包括任务link") return@forEach } } } - } - }else if(renderEntity.code == DataCodeEnum.OMDB_INTERSECTION.code && renderEntity.properties.containsKey("linkList")){ - if (renderEntity.properties["linkList"] != null) { + }else if(renderEntity.code == DataCodeEnum.OMDB_RESTRICTION.code && renderEntity.properties.containsKey("linkIn")){ - Log.e("qj", "linkList==开始${renderEntity.name}==${renderEntity.properties["linkList"]}}") + if (renderEntity.properties["linkIn"] != null) { - val linkList = renderEntity.properties["linkList"] + var currentLinkPid = renderEntity.properties["linkIn"] - if (!linkList.isNullOrEmpty()&&linkList!="null") { + if(!currentLinkPid.isNullOrEmpty()&¤tLinkPid!="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){ - for(hadLink in task.hadLinkDvoList){ - if (hadLink.linkPid == link.linkPid) { - renderEntity.enable = 1 - Log.e("qj", "${renderEntity.name}==包括任务link==${renderEntity.geometry}") - break@m - } + task.hadLinkDvoList.forEach{ + if(it.linkPid==currentLinkPid){ + renderEntity.enable = 1 + Log.e("qj","${renderEntity.name}==包括任务link") + return@forEach } } } - }else{ - renderEntity.enable = 2 - Log.e("qj", "简单路口") } + }else if(renderEntity.code == DataCodeEnum.OMDB_INTERSECTION.code && 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){ + for(hadLink in task.hadLinkDvoList){ + if (hadLink.linkPid == link.linkPid) { + renderEntity.enable = 1 + Log.e("qj", "${renderEntity.name}==包括任务link==${renderEntity.geometry}") + break@m + } + } + } + } + }else{ + renderEntity.enable = 2 + Log.e("qj", "简单路口") + } + } + }else{ + renderEntity.enable = 2 + Log.e("qj","${renderEntity.name}==不包括任务linkPid") } }else{ renderEntity.enable = 2 Log.e("qj","${renderEntity.name}==不包括任务linkPid") } - }else{ - renderEntity.enable = 2 - Log.e("qj","${renderEntity.name}==不包括任务linkPid") - } - // 对renderEntity做预处理后再保存 - val resultEntity = importConfig.transformProperties(renderEntity) + // 对renderEntity做预处理后再保存 + val resultEntity = importConfig.transformProperties(renderEntity) - //对code编码需要特殊处理 存在多个属性值时,渲染优先级:SA>PA,存在多个属性值时,渲染优先级:FRONTAGE>MAIN_SIDE_A CCESS - if(renderEntity.code == DataCodeEnum.OMDB_LINK_ATTRIBUTE.code){ + //对code编码需要特殊处理 存在多个属性值时,渲染优先级:SA>PA,存在多个属性值时,渲染优先级:FRONTAGE>MAIN_SIDE_A CCESS + if(renderEntity.code == DataCodeEnum.OMDB_LINK_ATTRIBUTE.code){ - Log.e("qj","道路属性===0") + Log.e("qj","道路属性===0") - var type = renderEntity.properties["sa"] + 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"] + 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_FORNTAGE.code - Log.e("qj","道路属性===3") - }else{ - type = renderEntity.properties["mainSideAccess"] + 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_MAIN_SIDE_ACCESS.code - Log.e("qj","道路属性===4") + renderEntity.code = DataCodeEnum.OMDB_LINK_ATTRIBUTE_FORNTAGE.code + Log.e("qj","道路属性===3") }else{ + type = renderEntity.properties["mainSideAccess"] + if(type!=null&&type=="1"){ + renderEntity.code = DataCodeEnum.OMDB_LINK_ATTRIBUTE_MAIN_SIDE_ACCESS.code + Log.e("qj","道路属性===4") + }else{ + renderEntity.enable=0 + Log.e("qj","过滤不显示数据${renderEntity.table}") + Log.e("qj","道路属性===5") + continue + } + } + } + } + }else if(renderEntity.code == DataCodeEnum.OMDB_RAMP.code){ + /*匝道*/ + var formWay = renderEntity.properties["FORM_OF_WAY"] + if(formWay!=null){ + when (formWay) { + "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 + } + } + }else if(renderEntity.code == DataCodeEnum.OMDB_LINK_FORM1.code){ + /*道路形态1*/ + var formWay = renderEntity.properties["FORM_OF_WAY"] + if(formWay!=null){ + when (formWay) { + "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 + } + } + }else if(renderEntity.code == DataCodeEnum.OMDB_LINK_FORM2.code){ + /*道路形态2*/ + var formWay = renderEntity.properties["FORM_OF_WAY"] + if(formWay!=null){ + when (formWay) { + "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 + } + } + }else if(renderEntity.code == DataCodeEnum.OMDB_LANE_MARK_BOUNDARYTYPE.code){ + var boundaryType = renderEntity.properties["boundaryType"] + if(boundaryType!=null){ + when (boundaryType) { + "0","1","6","8","9"->{ + renderEntity.enable=0 + Log.e("qj","过滤不显示数据${renderEntity.table}") + continue + } + } + } + }else if(renderEntity.code == DataCodeEnum.OMDB_RDBOUND_BOUNDARYTYPE.code){ + //过滤不需要渲染的要素 + var boundaryType = renderEntity.properties["boundaryType"] + if(boundaryType!=null){ + when (boundaryType) { + "0","3","4","5","7","9"->{ renderEntity.enable=0 Log.e("qj","过滤不显示数据${renderEntity.table}") - Log.e("qj","道路属性===5") continue } } } } - }else if(renderEntity.code == DataCodeEnum.OMDB_RAMP.code){ - /*匝道*/ - var formWay = renderEntity.properties["FORM_OF_WAY"] - if(formWay!=null){ - when (formWay) { - "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 - } - } - }else if(renderEntity.code == DataCodeEnum.OMDB_LINK_FORM1.code){ - /*道路形态1*/ - var formWay = renderEntity.properties["FORM_OF_WAY"] - if(formWay!=null){ - when (formWay) { - "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 - } - } - }else if(renderEntity.code == DataCodeEnum.OMDB_LINK_FORM2.code){ - /*道路形态2*/ - var formWay = renderEntity.properties["FORM_OF_WAY"] - if(formWay!=null){ - when (formWay) { - "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 - } - } - }else if(renderEntity.code == DataCodeEnum.OMDB_LANE_MARK_BOUNDARYTYPE.code){ - var boundaryType = renderEntity.properties["boundaryType"] - if(boundaryType!=null){ - when (boundaryType) { - "0","1","6","8","9"->{ - renderEntity.enable=0 - Log.e("qj","过滤不显示数据${renderEntity.table}") - continue - } - } - } - }else if(renderEntity.code == DataCodeEnum.OMDB_RDBOUND_BOUNDARYTYPE.code){ - //过滤不需要渲染的要素 - var boundaryType = renderEntity.properties["boundaryType"] - if(boundaryType!=null){ - when (boundaryType) { - "0","3","4","5","7","9"->{ - renderEntity.enable=0 - Log.e("qj","过滤不显示数据${renderEntity.table}") - continue - } - } - } - } - listResult.add(renderEntity) + listResult.add(renderEntity) - if (resultEntity != null) { - realm.insert(renderEntity) + if (resultEntity != null) { + realm.insert(renderEntity) + } } } } - } - // 1个文件发送一次flow流 - emit("${index + 1}/${importConfig.tableMap.size}") - // 如果当前解析的是OMDB_RD_LINK数据,将其缓存在预处理类中,以便后续处理其他要素时使用 - if (currentConfig.table == "OMDB_RD_LINK") { - importConfig.preProcess.cacheRdLink = - listResult.associateBy { it.properties["linkPid"] } + // 1个文件发送一次flow流 + emit("${index + 1}/${tableNum}") + // 如果当前解析的是OMDB_RD_LINK数据,将其缓存在预处理类中,以便后续处理其他要素时使用 + if (currentConfig.table == "OMDB_RD_LINK") { + importConfig.preProcess.cacheRdLink = + listResult.associateBy { it.properties["linkPid"] } + } } } realm.commitTransaction() diff --git a/app/src/main/java/com/navinfo/omqs/tools/LayerConfigUtils.kt b/app/src/main/java/com/navinfo/omqs/tools/LayerConfigUtils.kt index 1cf4f93c..827a3cb1 100644 --- a/app/src/main/java/com/navinfo/omqs/tools/LayerConfigUtils.kt +++ b/app/src/main/java/com/navinfo/omqs/tools/LayerConfigUtils.kt @@ -6,12 +6,12 @@ import com.google.gson.Gson import com.google.gson.reflect.TypeToken import com.navinfo.omqs.Constant import com.navinfo.omqs.bean.ImportConfig +import com.navinfo.omqs.tools.LayerConfigUtils.Companion.gson import java.io.File class LayerConfigUtils { companion object { private val omdbConfigFile = File("${Constant.USER_DATA_PATH}", Constant.OMDB_CONFIG) - private val otherConfigFile = File("${Constant.USER_DATA_PATH}", Constant.OTHER_CONFIG) private val gson = Gson() fun getLayerConfigList(): List { @@ -20,29 +20,19 @@ class LayerConfigUtils { Constant.LAYER_CONFIG_LIST = getLayerConfigListFromAssetsFile() } return Constant.LAYER_CONFIG_LIST!! -// return SPStaticUtils.getString(Constant.EVENT_LAYER_MANAGER_CHANGE, null).let { -// if (it != null) { -// val result: List = -// gson.fromJson(it, object : TypeToken>() {}.type) -// result -// } else { -// LayerConfigUtils.getLayerConfigListFromAssetsFile() -// } -// } } private fun getLayerConfigListFromAssetsFile(): List { val resultList = mutableListOf() if (omdbConfigFile.exists()) { val omdbConfiStr = FileIOUtils.readFile2String(omdbConfigFile) - val omdbConfig = gson.fromJson(omdbConfiStr, ImportConfig::class.java) - resultList.add(omdbConfig) - } - if (otherConfigFile.exists()) { - val otherConfiStr = FileIOUtils.readFile2String(otherConfigFile) - val otherConfig = - gson.fromJson(otherConfiStr, ImportConfig::class.java) - resultList.add(otherConfig) + val type = object : TypeToken>() {}.type + return try { + val result = gson.fromJson>(omdbConfiStr, type) + result ?: resultList + } catch (e: Exception) { + resultList + } } return resultList } 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 0be0a786..ce9a67b2 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 @@ -742,15 +742,16 @@ class MainViewModel @Inject constructor( fun refreshOMDBLayer(layerConfigList: List) { // 根据获取到的配置信息,筛选未勾选的图层名称 if (layerConfigList != null && !layerConfigList.isEmpty()) { - val omdbVisibleList = layerConfigList.filter { importConfig -> - importConfig.tableGroupName == "OMDB数据" - }.first().tableMap.filter { entry -> - val tableInfo = entry.value - !tableInfo.checked - }.map { entry -> - val tableInfo = entry.value - tableInfo.table - }.toList() + val omdbVisibleList = mutableListOf() + layerConfigList.forEach { + omdbVisibleList.addAll(it.tableMap.filter { entry -> + val tableInfo = entry.value + !tableInfo.checked + }.map { entry -> + val tableInfo = entry.value + tableInfo.table + }.toList()) + } com.navinfo.collect.library.system.Constant.HAD_LAYER_INVISIABLE_ARRAY = omdbVisibleList.toTypedArray() // 刷新地图 diff --git a/collect-library/src/main/assets/editormarker.xml b/collect-library/src/main/assets/editormarker.xml index f33d55a0..d71cfdcb 100644 --- a/collect-library/src/main/assets/editormarker.xml +++ b/collect-library/src/main/assets/editormarker.xml @@ -2277,7 +2277,7 @@ - + diff --git a/collect-library/src/main/assets/omdb/tex_fill_area_3012.png b/collect-library/src/main/assets/omdb/tex_fill_area_3012.png index 405fc2b5a55255d705250e53c747c39cb12a9ca6..fa2c2a3c40f53b1498b0b7c1529275372068eb93 100644 GIT binary patch literal 2654 zcmZXWc{E#jAI2l2ZBP{@>82_wrb%pFj9M~GFp{7;nBbC9%}kr5)y2|Qw5U>LY+2N+ zMP(Av60J1RYVEBmDk?^59i1Ay234XAwY-~tE02wGh@P4$)I&W72H%mh*<+*ewUZ}}jO*leme+ozO;yT8dDY7~ zJ$ZfOWxd$^2+F7ZCE5L*_C?3Hmx>3hHqSfT8YUfoa^S*Q5vy0{`NxIOU7f6nh#daKUfE}0F?z;WF`3r)YMgQYR-Uf^;JS_9dxd%TLLhK)-$mb1eLz$cbt;{P2W>tSU)1Q2;OQ$})+wFY*;jC?lH&FTY z3kUrZ71smkpR#x#k4DSTzX>82Gj?@%n*Ao^g?MfH!4q)QelWbRVXyAMc7{*>Q(7&e zM*irTXcOvK>OMLz|JBOG&Q)ZJRag?+I0nrhq*_)3y2rAnqXxKmDpOc=cqNLip>>|8 zwaw}8dmke`h|JR{L#kSOOHAm)@Sr2(;q~JV&)y#X?N`IPhQ2O?r%t=20TncVgMS7EeOeh6VxZK=>61G5QO^;YH z0P-@rm+HB;jBSL!LdX}>&x#YUdwUcKnD!4LDTtL;F~4 zJk4AJGx=Pfggx|XZaa~3i$and&Ux>~m1eVf9&G`O2E`WQN}7$W<=(9Uid^SQK64S! z6oK_{s0J(A$;h@A4l_}~IZCwT_G8hGWOv-W`UKq&tFViO#M2D#E9}szmv>zC&7w3^ zZAShm`9*O)gV)Sl1b@qlVA6RPqpN^WrqQ!ddL6a(~4c#kn@fRnf9w(HQrSrwK z^eO8vo?yjZDniJyq?H-+xD@_S6zO;LA4Blw&6^o)*U|QjxAI_Z$-kEtrVCXfQbm)zAXm!Bay9DFp#Z|> zQ16;OsS2zsa+A+ea<rob&*TEuP?#2C6NcCt{=W(OC6^@y=Ldx5o; zqkO~3;kG*m0atY9qOBUGQhBp+=ERMs()3j|R<0X@jt1enPiBruW0>I_!qLdK*5P&LF*WBmDLYGrJvpg0l_1Qbyb^}S)h3TwKLp4F|F9k zBk;pg0H$ulO;-j(d37+2E*BUO!=9XYvvB)v<3h5bP7$}@Q}L2*oRefv6F}=&Pz_N5 zS@YWbpZlHmlx&@w{TbT4lcr0Y+q+M!00piZ{O~{JTR|{X#B8O31k|-R5b%k;>&5~U z(`_TV|7edKyVlm%sg_J;CYx<3`n%9rT(gNK6}7pK-!X$WUoCdW)#q>F=Sta-00R$t z5Dc8SUs#DgXC^TVfO)jMCH&bZ^JDe?BDFw3<7vy0i$#@M2q*}7Zq&+_8iKz>M91aT z($`RkEmx2?Hit=6Cx4pv5#>3i@F+N%%^qSH-h2;dW;cLz|UV~SF1#x$UH|!c`hBG2^F2UHB6Y9;J`EPg5?6v(~&QbaZ3f}9YgipQ*?9G zFQkR5G!kqkVOzbYs6OGq+WUL8SVVZ=>n-lKb}USRZ;h2g2xUTCxWgW zvbb)|dTP^jar)r(LtXJuf`-i0CUgKr1bQytrePZmmSkY^zeFSDwTR1F@@n|XFcLXByYF{c$ zBCUk>O^>q=QJ)ObYW0zS%-&v^|9&Ly6}e=l50U3+xJU3K$ILF)L2eNI-%b#$A>71Y zH)$!{#hr->&>Omw=%+_-tJYZa1}(m~o{KDLQIOep6{AiUbZ_OP!igiGONC#9iMjDa zdVzM{s!_-K|2-DYaT}G*3OMFM?nWTd3yMUmAk+pSW4+RpCV2+x>>PK>BF4NqZEsckB8h-T$PFRBW z)vkY6LsWAS5Wb=X9}k-0E9i2oXiC702qPDDz%&$Eh}Btk$qWS<3W6X!|E1v6*$4_F z&gX3R$E%*hLhl2M!> z{+(Op_tRYS_$6Q&W6A{R^u!L$n@gT8t{h^LUKLgQbq{5_8-J91110f literal 2285 zcmeH|YgiLk9>ymLjO=vA#&t$RqBhBTnIx_zKnMs{a#N{1FbNl+}xF=3R<O@+ie`iidhtyZY+NDqQ5{CCYqJ^Whqyl<&NWx_R_x2J@=u+5ybvM?c*%}Hz@ z>yCNkD{lPL!;|XCNeezHdVmd|%P{9nuCw!c=|g?JH_yVU9mu`5g#Z?>b&WpOb2tg@ zS%73U%+()bxmx8O*$}n8f8jA%VknR8|MVyf(=?kr#B6N3^YT4R?^f##xdhPx7ge-% z#+%e(Au>BfY&Kqf@?_0;ozlN>9s*mSgX-nJ2s=JRHD2i{InI@r(o;dOO4I5!+CzDe znzKrjBa{wNsxOw<-=!;(c)SoOSo;~1Il7{SE8Q#L(P$3EwlSh~gX*m4$Ed#@AtEy* z9Y}Hi(E*T33vRi=0HJLEzDqD%-2eU`CCy(SDnb)+7gfs6wM%oTNkf#=(j$BMeGO;N z?p>F1dKOR2jCx|2yUme zNK8z=tw&ba*Y;60)qdd(Vo7yRMcHq*u8)}YS1jrBt0$1hE!p)cwa7NQ#`jjAAQ#hIL5NbUR2q9zq~Q}u0r0mqv~07>~3%Gj5SjfUd+HTmC56dVyehAhH>3Q#nNY%0m%rg0GlI-w?f za=XL?ih^$m8M7b=WrGcx7H>*Os0mVVw4yAbOo!-f^~IH36&Hmli;Z>@?hM@M358Ia z%C*&qlHIwjMvov21+>T5mMnu6{s3~i)vSow7@^g$B6V1vHeqwOtm{#fcd+aEuO&4*g+V2Va(rEZxkXj|IK>BQK5=~{deWb4y3U0-$`w$E0jx`RB7msi_|rpnE<$-M1hXe8|ms`rr>MQ(bVmCC7v3QM6^FNfIE@l5N84DVt@3Q_@O3 z-f)`9apJR#$n;r1j-)UJDfgb?o$>&L%ic+R^zzVLSrF1dzu0*#(Qs}cUD9w4Ltek% zaE*0g+uAO(I|M1vU$v&SASV44Yf2>&Wh*M;^}JZQYis}`XAD;?-Z`mU|7$gPShdS} zF1nKC$&!1~4?qXw2Mj0q01cC;#ci(I)(DUE1oCqgw7M$s2oFvp5LBXG^HT+YhTu-2 z$INR%=aY_-Y_6dmVM8oVy2xUdmcsLG&SEz=!hta$qq!4jvJ`$PEY>s7X{c+A=a{>r8Y0*xuXa7v2NJ zfnaai7xmrq>3QT)Cx0%To~P9-R8iYUWligjm;wi%_PsJRZ@6>QAmww^dH9D5hm(ia zZ;{VR#=5WXZ7p5oEWhIppGkf{=glsFthUsje~hTS<|^LkEfpm&%MI|w>iNxx+>4Q; zC(HZ5fKlol^sPJ&EcYuXJZH{~f2$;CY-^mnGw8Zlo{;trolFciiE{wiZ$XbZ8<6s0 zx&H60$}B}3dK|Qhn_YFSVYn;|siAX8hViNMt({{V4+S!)0Q