diff --git a/app/src/main/assets/omdb_config.json b/app/src/main/assets/omdb_config.json index 250d856a..74dd2ae1 100644 --- a/app/src/main/assets/omdb_config.json +++ b/app/src/main/assets/omdb_config.json @@ -5,42 +5,45 @@ "code": 1012, "name": "检查点", "zoomMin": 16, - "zoomMax": 22 + "zoomMax": 19 }, "2001": { "table": "OMDB_RD_LINK", "code": 2001, "name": "道路线", "zoomMin": 16, - "zoomMax": 22 + "zoomMax": 17 }, "2002": { "table": "OMDB_RD_LINK_FUNCTION_CLASS", "code": 2002, "name": "道路功能等级", "zoomMin": 16, - "zoomMax": 22 + "zoomMax": 19 }, "2008": { "table": "OMDB_RD_LINK_KIND", "code": 2008, "name": "道路种别", "zoomMin": 16, - "zoomMax": 22 + "zoomMax": 19, + "checkLinkId": false }, "2010": { "table": "OMDB_LINK_DIRECT", "code": 2010, "name": "道路方向", "zoomMin": 16, - "zoomMax": 22 + "zoomMax": 19, + "checkLinkId": false }, "2011": { "table": "OMDB_LINK_NAME", "code": 2011, "name": "道路名", "zoomMin": 16, - "zoomMax": 22, + "zoomMax": 19, + "checkLinkId": false, "transformer": [ { "k": "geometry", @@ -54,8 +57,9 @@ "table": "OMDB_LANE_MARK_BOUNDARYTYPE", "code": 2013, "name": "车道边界类型", - "zoomMin": 19, - "zoomMax": 22, + "zoomMin": 18, + "zoomMax": 21, + "checkLinkId": false, "transformer": [ { "k": "geometry", @@ -70,21 +74,21 @@ "code": 2019, "name": "常规线限速", "zoomMin": 16, - "zoomMax": 22 + "zoomMax": 19 }, "2020": { "table": "OMDB_LINK_SPEEDLIMIT_COND", "code": 2020, "name": "条件线限速", "zoomMin": 16, - "zoomMax": 22 + "zoomMax": 19 }, "2021": { "table": "OMDB_LINK_SPEEDLIMIT_VAR", "code": 2021, "name": "可变线限速", "zoomMin": 16, - "zoomMax": 22 + "zoomMax": 19 }, "2022": { "table": "OMDB_CON_ACCESS", @@ -110,20 +114,31 @@ "table": "OMDB_RDBOUND_BOUNDARYTYPE", "code": 2083, "name": "道路边界类型", - "zoomMin": 19, - "zoomMax": 22 + "zoomMin": 18, + "zoomMax": 21, + "checkLinkId": false }, "2201":{ "table": "OMDB_BRIDGE", "code": 2201, - "name": "桥" + "name": "桥", + "zoomMin": 16, + "zoomMax": 21, + "transformer": [ + { + "k": "geometry", + "v": "~", + "klib": "geometry", + "vlib": "generateS2EReferencePoint(bridgeType,OMDB_BRIDGE)" + } + ] }, "2202":{ "table": "OMDB_TUNNEL", "code": 2202, "name": "隧道", "zoomMin": 16, - "zoomMax": 22, + "zoomMax": 21, "transformer": [ { "k": "geometry", @@ -134,11 +149,11 @@ ] }, "4001": { - "table": "OMDB_INTERSECTION", - "code": 4001, - "name": "路口", + "table": "OMDB_INTERSECTION", + "code": 4001, + "name": "路口", "zoomMin": 16, - "zoomMax": 22, + "zoomMax": 19, "transformer": [ { "k": "geometry", @@ -147,13 +162,13 @@ "vlib": "generateIntersectionReference()" } ] - }, + }, "4002": { - "table": "OMDB_SPEEDLIMIT", - "code": 4002, - "name": "常规点限速", + "table": "OMDB_SPEEDLIMIT", + "code": 4002, + "name": "常规点限速", "zoomMin": 16, - "zoomMax": 22, + "zoomMax": 19, "transformer": [ { "k": "maxSpeed", @@ -168,13 +183,13 @@ "vlib": "translateRight()" } ] - }, + }, "4003":{ "table": "OMDB_SPEEDLIMIT_COND", "code": 4003, "name": "条件点限速", "zoomMin": 16, - "zoomMax": 22, + "zoomMax": 19, "transformer": [ { "k": "maxSpeed", @@ -189,7 +204,7 @@ "code": 4004, "name": "可变点限速", "zoomMin": 16, - "zoomMax": 22, + "zoomMax": 19, "transformer": [ { "k": "location", @@ -216,7 +231,7 @@ "code": 4006, "name": "普通交限", "zoomMin": 16, - "zoomMax": 22, + "zoomMax": 21, "transformer": [ { "k": "geometry", @@ -255,7 +270,7 @@ "code": 4010, "name": "电子眼", "zoomMin": 16, - "zoomMax": 22, + "zoomMax": 21, "transformer": [ { "k": "geometry", @@ -273,7 +288,7 @@ "k": "geometry", "v": "~", "klib": "geometry", - "vlib": "generateDirectReferenceLine()" + "vlib": "generateDirectReferenceLine(3)" }, { "k": "geometry", @@ -288,7 +303,7 @@ "code": 4022, "name": "交通灯", "zoomMin": 16, - "zoomMax": 22, + "zoomMax": 21, "transformer": [ ] }, @@ -297,7 +312,7 @@ "code": 4601, "name": "车信", "zoomMin": 16, - "zoomMax": 22, + "zoomMax": 19, "transformer": [ { "k": "geometry", @@ -319,12 +334,12 @@ } ] }, - "5001":{ - "table": "OMDB_LANE_LINK_LG", - "code": 5001, - "name": "车道中心线", - "zoomMin": 19, - "zoomMax": 22, + "5001":{ + "table": "OMDB_LANE_LINK_LG", + "code": 5001, + "name": "车道中心线", + "zoomMin": 18, + "zoomMax": 21, "transformer": [ { "k": "geometry", @@ -333,42 +348,11 @@ "vlib": "generateAddWidthLine()" } ] - }, + }, "5002":{ "table": "OMDB_AREA", "code": 5002, "name": "面测试" - }, - "3005":{ - "table": "OMDB_TRAFFIC_SIGN", - "code": 3005, - "name": "交通标牌", - "transformer": [ - { - "k": "geometry", - "v": "~", - "klib": "geometry", - "vlib": "normalizationTrafficSignHeight()" - },{ - "k": "geometry", - "v": "~", - "klib": "geometry", - "vlib": "generateDirectReferenceLine('', 0.2)" - } - ] - }, - "3006":{ - "table": "OMDB_POLE", - "code": 3006, - "name": "杆状物", - "transformer": [ - { - "k": "geometry", - "v": "~", - "klib": "geometry", - "vlib": "normalizationPoleHeight()" - } - ] } } } \ No newline at end of file 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 f025b62b..e58488f2 100644 --- a/app/src/main/java/com/navinfo/omqs/bean/ImportConfig.kt +++ b/app/src/main/java/com/navinfo/omqs/bean/ImportConfig.kt @@ -121,6 +121,7 @@ class TableInfo { val code: Int = 0 val zoomMin: Int = 16 val zoomMax: Int = 21 + val checkLinkId: Boolean = true//是否需要校验linkid val name: String = "" var checked : Boolean = true var transformer: MutableList = mutableListOf() 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 a22adad6..1d357452 100644 --- a/app/src/main/java/com/navinfo/omqs/db/ImportOMDBHelper.kt +++ b/app/src/main/java/com/navinfo/omqs/db/ImportOMDBHelper.kt @@ -11,6 +11,7 @@ import com.google.gson.Gson import com.google.gson.reflect.TypeToken import com.navinfo.collect.library.data.entity.ReferenceEntity import com.navinfo.collect.library.data.entity.RenderEntity +import com.navinfo.collect.library.data.entity.TaskBean import com.navinfo.omqs.Constant import com.navinfo.omqs.bean.ImportConfig import com.navinfo.omqs.hilt.OMDBDataBaseHiltFactory @@ -101,10 +102,13 @@ class ImportOMDBHelper @AssistedInject constructor( FIELD_TYPE_NULL -> rowMap[columnName] = "" FIELD_TYPE_INTEGER -> rowMap[columnName] = getInt(columnIndex) + FIELD_TYPE_FLOAT -> rowMap[columnName] = getFloat(columnIndex) + FIELD_TYPE_BLOB -> rowMap[columnName] = String(getBlob(columnIndex), Charsets.UTF_8) + else -> rowMap[columnName] = getString(columnIndex) } } @@ -123,99 +127,132 @@ class ImportOMDBHelper @AssistedInject constructor( * @param omdbZipFile omdb数据抽取生成的Zip文件 * @param configFile 对应的配置文件 * */ - suspend fun importOmdbZipFile(omdbZipFile: File, taskId: Int): Flow = withContext(Dispatchers.IO) { - val unZipFolder = File(omdbZipFile.parentFile, "result") - flow { - if (unZipFolder.exists()) { - unZipFolder.deleteRecursively() - } - unZipFolder.mkdirs() - // 开始解压zip文件 - val unZipFiles = ZipUtils.unzipFile(omdbZipFile, unZipFolder) - // 将listResult数据插入到Realm数据库中 - val realm = Realm.getDefaultInstance() - realm.beginTransaction() - try { - // 遍历解压后的文件,读取该数据返回 - for ((index, currentEntry) in importConfig.tableMap.entries.withIndex()) { - val currentConfig = currentEntry.value - val txtFile = unZipFiles.find { - it.name == currentConfig.table - } + suspend fun importOmdbZipFile(omdbZipFile: File, task: TaskBean): Flow = + withContext(Dispatchers.IO) { + val unZipFolder = File(omdbZipFile.parentFile, "result") + flow { + if (unZipFolder.exists()) { + unZipFolder.deleteRecursively() + } + unZipFolder.mkdirs() + // 开始解压zip文件 + val unZipFiles = ZipUtils.unzipFile(omdbZipFile, unZipFolder) + // 将listResult数据插入到Realm数据库中 + val realm = Realm.getDefaultInstance() + realm.beginTransaction() + try { + // 遍历解压后的文件,读取该数据返回 + 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().toInt() - renderEntity.name = map["qi_name"].toString() - renderEntity.table = map["qi_table"].toString() - renderEntity.taskId = taskId - 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 } - } - listResult.add(renderEntity) - // 对renderEntity做预处理后再保存 - val resultEntity = importConfig.transformProperties(renderEntity) - if (resultEntity != null) { - realm.insert(renderEntity) + 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().toInt() + 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[key] = value + + is Int -> renderEntity.properties[key] = value.toInt().toString() + + is Double -> renderEntity.properties[key] = value.toDouble().toString() + + else -> renderEntity.properties[key] = value.toString() + } + } + + //如果要素不包括linkPid,需要从其他字段获得 + if(!renderEntity.properties.containsKey("linkPid")){ + //交限从进入线获取 + if(renderEntity.properties.containsKey("linkIn")){ + renderEntity.properties["linkPid"]= renderEntity.properties["linkIn"] + } + } + + //遍历判断只显示与任务Link相关的任务数据 + if (currentConfig.checkLinkId && renderEntity.properties.containsKey("linkPid")) { + + var currentLinkPid = renderEntity.properties["linkPid"] + + 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", "${renderEntity.name}==不包括任务linkPid") + } + + listResult.add(renderEntity) + + // 对renderEntity做预处理后再保存 + val resultEntity = importConfig.transformProperties(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}/${importConfig.tableMap.size}") - // 如果当前解析的是OMDB_RD_LINK数据,将其缓存在预处理类中,以便后续处理其他要素时使用 - if (currentConfig.table == "OMDB_RD_LINK") { - importConfig.preProcess.cacheRdLink = - listResult.associateBy { it.properties["linkPid"] } - } + realm.commitTransaction() + realm.close() + } catch (e: Exception) { + realm.cancelTransaction() + throw e } - realm.commitTransaction() - realm.close() - } catch (e: Exception) { - realm.cancelTransaction() - throw e + emit("finish") } - emit("finish") } - } // 获取指定数据表的列名 fun getColumns(db: SQLiteDatabase, tableName: String): List { 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 767d31d0..2cdbd5d9 100644 --- a/app/src/main/java/com/navinfo/omqs/db/ImportPreProcess.kt +++ b/app/src/main/java/com/navinfo/omqs/db/ImportPreProcess.kt @@ -21,20 +21,26 @@ class ImportPreProcess { val defaultTranslateDistance = 3.0 fun checkCircleRoad(renderEntity: RenderEntity): Boolean { - val linkInId = renderEntity.properties["linkIn"] - val linkOutId = renderEntity.properties["linkOut"] + 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")}") + 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"]) { + 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 } + /** * 计算指定数据指定方向的坐标 * @param direction 判断当前数据是否为逆向,给定的应该是一个a=b的表达式,a为对应的properties的key,b为对应的值 @@ -47,17 +53,20 @@ class ImportPreProcess { var isReverse = false // 是否为逆向 if (direction.isNotEmpty()) { val paramDirections = direction.split("=") - if (paramDirections.size>=2 && renderEntity.properties[paramDirections[0].trim()] == paramDirections[1].trim()) { + if (paramDirections.size >= 2 && renderEntity.properties[paramDirections[0].trim()] == paramDirections[1].trim()) { isReverse = true; } } if (Geometry.TYPENAME_POINT == geometry?.geometryType) { // angle为与正北方向的顺时针夹角 - var angle = if(renderEntity?.properties?.get("angle") == null) 0.0 else renderEntity?.properties?.get("angle")?.toDouble()!! + var angle = + if (renderEntity?.properties?.get("angle") == null) 0.0 else renderEntity?.properties?.get( + "angle" + )?.toDouble()!! // if (isReverse) { // angle += 180 // } // angle角度为与正北方向的顺时针夹角,将其转换为与X轴正方向的逆时针夹角,即为正东方向的夹角 - angle=(450-angle)%360 + angle = (450 - angle) % 360 radian = Math.toRadians(angle) } else if (Geometry.TYPENAME_LINESTRING == geometry?.geometryType) { var coordinates = geometry.coordinates @@ -72,8 +81,14 @@ class ImportPreProcess { } // 计算偏移距离 - val dx: Double = GeometryTools.convertDistanceToDegree(defaultTranslateDistance, geometry?.coordinate?.y!!) * Math.cos(radian) - val dy: Double = GeometryTools.convertDistanceToDegree(defaultTranslateDistance, geometry?.coordinate?.y!!) * Math.sin(radian) + val dx: Double = GeometryTools.convertDistanceToDegree( + defaultTranslateDistance, + geometry?.coordinate?.y!! + ) * Math.cos(radian) + val dy: Double = GeometryTools.convertDistanceToDegree( + defaultTranslateDistance, + geometry?.coordinate?.y!! + ) * Math.sin(radian) // 计算偏移后的点 val coord = @@ -81,11 +96,13 @@ class ImportPreProcess { // 记录偏移后的点位或线数据,如果数据为线时,记录的偏移后数据为倒数第二个点右移后,方向与线的最后两个点平行同向的单位向量 if (Geometry.TYPENAME_POINT == geometry?.geometryType) { - val geometryTranslate: Geometry = GeometryTools.createGeometry(doubleArrayOf(coord.x, coord.y)) + val geometryTranslate: Geometry = + GeometryTools.createGeometry(doubleArrayOf(coord.x, coord.y)) renderEntity.geometry = geometryTranslate.toString() } else { - val coorEnd = Coordinate(coord.x+dx, coord.y+dy) - val geometryTranslate: Geometry = GeometryTools.createLineString(arrayOf(coord, coorEnd)) + val coorEnd = Coordinate(coord.x + dx, coord.y + dy) + val geometryTranslate: Geometry = + GeometryTools.createLineString(arrayOf(coord, coorEnd)) renderEntity.geometry = geometryTranslate.toString() } } @@ -99,19 +116,22 @@ class ImportPreProcess { var isReverse = false // 是否为逆向 if (direction.isNotEmpty()) { val paramDirections = direction.split("=") - if (paramDirections.size>=2 && renderEntity.properties[paramDirections[0].trim()] == paramDirections[1].trim()) { + if (paramDirections.size >= 2 && renderEntity.properties[paramDirections[0].trim()] == paramDirections[1].trim()) { isReverse = true; } } var radian = 0.0 // geometry的角度,如果是点,获取angle,如果是线,获取最后两个点的方向 var point = Coordinate(geometry?.coordinate) if (Geometry.TYPENAME_POINT == geometry?.geometryType) { - var angle = if(renderEntity?.properties?.get("angle") == null) 0.0 else renderEntity?.properties?.get("angle")?.toDouble()!! + var angle = + if (renderEntity?.properties?.get("angle") == null) 0.0 else renderEntity?.properties?.get( + "angle" + )?.toDouble()!! // if (isReverse) { // angle += 180 // } // angle角度为与正北方向的顺时针夹角,将其转换为与X轴正方向的逆时针夹角,即为正东方向的夹角 - angle=(450-angle)%360 + angle = (450 - angle) % 360 radian = Math.toRadians(angle) } else if (Geometry.TYPENAME_LINESTRING == geometry?.geometryType) { var coordinates = geometry.coordinates @@ -126,15 +146,22 @@ class ImportPreProcess { } // 计算偏移距离 - val dx: Double = GeometryTools.convertDistanceToDegree(defaultTranslateDistance, geometry?.coordinate?.y!!) * Math.cos(radian) - val dy: Double = GeometryTools.convertDistanceToDegree(defaultTranslateDistance, geometry?.coordinate?.y!!) * Math.sin(radian) + val dx: Double = GeometryTools.convertDistanceToDegree( + defaultTranslateDistance, + geometry?.coordinate?.y!! + ) * Math.cos(radian) + val dy: Double = GeometryTools.convertDistanceToDegree( + defaultTranslateDistance, + geometry?.coordinate?.y!! + ) * Math.sin(radian) // 计算偏移后的点 val coord = Coordinate(point.getX() - dx, point.getY() - dy) // 将这个点记录在数据中 - val geometryTranslate: Geometry = GeometryTools.createGeometry(doubleArrayOf(coord.x, coord.y)) + val geometryTranslate: Geometry = + GeometryTools.createGeometry(doubleArrayOf(coord.x, coord.y)) renderEntity.geometry = geometryTranslate.toString() } @@ -146,13 +173,17 @@ class ImportPreProcess { val translateGeometry = renderEntity.wkt val startGeometry = GeometryTools.createGeometry(renderEntity.properties["geometry"]) - var pointEnd = translateGeometry!!.coordinates[translateGeometry.numPoints-1] // 获取这个geometry对应的结束点坐标 - var pointStart = startGeometry!!.coordinates[startGeometry.numPoints-1] // 获取这个geometry对应的结束点坐标 + var pointEnd = + translateGeometry!!.coordinates[translateGeometry.numPoints - 1] // 获取这个geometry对应的结束点坐标 + var pointStart = + startGeometry!!.coordinates[startGeometry.numPoints - 1] // 获取这个geometry对应的结束点坐标 if (translateGeometry.geometryType == Geometry.TYPENAME_LINESTRING) { // 如果是线数据,则取倒数第二个点作为偏移的起止点 - pointEnd = translateGeometry!!.coordinates[translateGeometry.numPoints-2] // 获取这个geometry对应的结束点坐标 + pointEnd = + translateGeometry!!.coordinates[translateGeometry.numPoints - 2] // 获取这个geometry对应的结束点坐标 } if (startGeometry.geometryType == Geometry.TYPENAME_LINESTRING) { // 如果是线数据,则取倒数第二个点作为偏移的起止点 - pointStart = startGeometry!!.coordinates[startGeometry.numPoints-2] // 获取这个geometry对应的结束点坐标 + pointStart = + startGeometry!!.coordinates[startGeometry.numPoints - 2] // 获取这个geometry对应的结束点坐标 } // 将这个起终点的线记录在数据中 @@ -163,60 +194,91 @@ class ImportPreProcess { startEndReference.zoomMin = renderEntity.zoomMin startEndReference.zoomMax = renderEntity.zoomMax startEndReference.taskId = renderEntity.taskId - + startEndReference.enable = renderEntity.enable // 起终点坐标组成的线 - startEndReference.geometry = GeometryTools.createLineString(arrayOf(pointStart, pointEnd)).toString() + startEndReference.geometry = + GeometryTools.createLineString(arrayOf(pointStart, pointEnd)).toString() startEndReference.properties["qi_table"] = renderEntity.table startEndReference.properties["type"] = "s_2_e" Realm.getDefaultInstance().insert(startEndReference) } - fun generateS2EReferencePoint(renderEntity: RenderEntity) { + fun generateS2EReferencePoint( + renderEntity: RenderEntity, + proKey: String = "", + table: String = "" + ) { val geometry = GeometryTools.createGeometry(renderEntity.properties["geometry"]) - val pointEnd = geometry!!.coordinates[geometry.numPoints-1] // 获取这个geometry对应的结束点坐标 + val pointEnd = geometry!!.coordinates[geometry.numPoints - 1] // 获取这个geometry对应的结束点坐标 val pointStart = geometry!!.coordinates[0] // 获取这个geometry对应的起点 // 将这个起终点的线记录在数据中 val startReference = ReferenceEntity() startReference.renderEntityId = renderEntity.id - startReference.name = "${renderEntity.name}参考线" + startReference.name = "${renderEntity.name}参考点" startReference.table = renderEntity.table startReference.zoomMin = renderEntity.zoomMin startReference.zoomMax = renderEntity.zoomMax startReference.taskId = renderEntity.taskId + startReference.enable = renderEntity.enable // 起点坐标 - startReference.geometry = GeometryTools.createGeometry(GeoPoint(pointStart.y,pointStart.x)).toString() + startReference.geometry = + GeometryTools.createGeometry(GeoPoint(pointStart.y, pointStart.x)).toString() + startReference.properties = renderEntity.properties startReference.properties["qi_table"] = renderEntity.table - startReference.properties["type"] = "s_2_p" + Log.e("qj","generateS2EReferencePoint===$table===$proKey") + if (renderEntity.table == table) { + Log.e("qj","generateS2EReferencePoint===开始") + if (renderEntity.properties.containsKey(proKey)) { + startReference.properties["type"] = "s_2_p_${renderEntity.properties[proKey]}" + Log.e("qj","generateS2EReferencePoint===s_2_p_${renderEntity.properties[proKey]}") + } + } else { + startReference.properties["type"] = "s_2_p" + } + Realm.getDefaultInstance().insert(startReference) val endReference = ReferenceEntity() endReference.renderEntityId = renderEntity.id - endReference.name = "${renderEntity.name}参考线" + endReference.name = "${renderEntity.name}参考点" endReference.table = renderEntity.table endReference.zoomMin = renderEntity.zoomMin endReference.zoomMax = renderEntity.zoomMax endReference.taskId = renderEntity.taskId + endReference.enable = renderEntity.enable // 终点坐标 - endReference.geometry = GeometryTools.createGeometry(GeoPoint(pointEnd.y,pointEnd.x)).toString() + endReference.geometry = + GeometryTools.createGeometry(GeoPoint(pointEnd.y, pointEnd.x)).toString() + endReference.properties = renderEntity.properties endReference.properties["qi_table"] = renderEntity.table - endReference.properties["type"] = "e_2_p" + if (renderEntity.table == table) { + if (renderEntity.properties.containsKey(proKey)) { + endReference.properties["type"] = "e_2_p_${renderEntity.properties[proKey]}" + } + } else { + endReference.properties["type"] = "e_2_p" + } Realm.getDefaultInstance().insert(endReference) } /** * 生成与对应方向相同的方向线,用以绘制方向箭头 * */ - fun generateDirectReferenceLine(renderEntity: RenderEntity, direction: String = "", distance: String = "") { + fun generateDirectReferenceLine( + renderEntity: RenderEntity, + direction: String = "", + distance: String = "" + ) { // 根据数据或angle计算方向对应的角度和偏移量 val geometry = renderEntity.wkt var isReverse = false // 是否为逆向 if (direction.isNotEmpty()) { val paramDirections = direction.split("=") - if (paramDirections.size>=2 && renderEntity.properties[paramDirections[0].trim()] == paramDirections[1].trim()) { + if (paramDirections.size >= 2 && renderEntity.properties[paramDirections[0].trim()] == paramDirections[1].trim()) { isReverse = true } } @@ -225,9 +287,12 @@ class ImportPreProcess { if (Geometry.TYPENAME_POINT == geometry?.geometryType) { val point = Coordinate(geometry?.coordinate) pointStartArray.add(point) - var angle = if(renderEntity?.properties?.get("angle") == null) 0.0 else renderEntity?.properties?.get("angle")?.toDouble()!! + var angle = + if (renderEntity?.properties?.get("angle") == null) 0.0 else renderEntity?.properties?.get( + "angle" + )?.toDouble()!! // angle角度为与正北方向的顺时针夹角,将其转换为与X轴正方向的逆时针夹角,即为正东方向的夹角 - angle=(450-angle)%360 + angle = (450 - angle) % 360 radian = Math.toRadians(angle) } else if (Geometry.TYPENAME_LINESTRING == geometry?.geometryType) { var coordinates = geometry.coordinates @@ -243,7 +308,7 @@ class ImportPreProcess { // 记录下面数据的每一个点位 pointStartArray.addAll(geometry.coordinates) // 获取当前的面数据对应的方向信息 - var angle = if(renderEntity?.properties?.get("angle") == null) { + var angle = if (renderEntity?.properties?.get("angle") == null) { if (renderEntity?.properties?.get("heading") == null) { 0.0 } else { @@ -251,16 +316,28 @@ class ImportPreProcess { } } else renderEntity?.properties?.get("angle")?.toDouble()!! - angle=(450-angle)%360 + angle = (450 - angle) % 360 radian = Math.toRadians(angle) } // 计算偏移距离 - var dx: Double = GeometryTools.convertDistanceToDegree(defaultTranslateDistance, geometry?.coordinate?.y!!) * Math.cos(radian) - var dy: Double = GeometryTools.convertDistanceToDegree(defaultTranslateDistance, geometry?.coordinate?.y!!) * Math.sin(radian) + var dx: Double = GeometryTools.convertDistanceToDegree( + defaultTranslateDistance, + geometry?.coordinate?.y!! + ) * Math.cos(radian) + var dy: Double = GeometryTools.convertDistanceToDegree( + defaultTranslateDistance, + geometry?.coordinate?.y!! + ) * Math.sin(radian) if (distance.isNotEmpty()) { - dx = GeometryTools.convertDistanceToDegree(distance.toDouble(), geometry?.coordinate?.y!!) * Math.cos(radian) - dy = GeometryTools.convertDistanceToDegree(distance.toDouble(), geometry?.coordinate?.y!!) * Math.sin(radian) + dx = GeometryTools.convertDistanceToDegree( + distance.toDouble(), + geometry?.coordinate?.y!! + ) * Math.cos(radian) + dy = GeometryTools.convertDistanceToDegree( + distance.toDouble(), + geometry?.coordinate?.y!! + ) * Math.sin(radian) } for (pointStart in pointStartArray) { @@ -273,8 +350,10 @@ class ImportPreProcess { angleReference.zoomMin = renderEntity.zoomMin angleReference.zoomMax = renderEntity.zoomMax angleReference.taskId = renderEntity.taskId + angleReference.enable = renderEntity.enable // 与原有方向指向平行的线 - angleReference.geometry = WKTWriter(3).write(GeometryTools.createLineString(arrayOf(pointStart, coorEnd))) + angleReference.geometry = + WKTWriter(3).write(GeometryTools.createLineString(arrayOf(pointStart, coorEnd))) angleReference.properties["qi_table"] = renderEntity.table angleReference.properties["type"] = "angle" Realm.getDefaultInstance().insert(angleReference) @@ -284,10 +363,10 @@ class ImportPreProcess { fun addAngleFromGeometry(renderEntity: RenderEntity): String { if (!renderEntity.properties.containsKey("angle")) { - if (renderEntity.wkt!=null) { + if (renderEntity.wkt != null) { val geometry = renderEntity.wkt var angle: String = "90" - if (geometry?.numPoints!!>=2) { + if (geometry?.numPoints!! >= 2) { val p1: Coordinate = geometry?.coordinates?.get(geometry.coordinates.size - 2)!! val p2: Coordinate = geometry?.coordinates?.get(geometry.coordinates.size - 1)!! // 弧度转角度 @@ -307,16 +386,18 @@ class ImportPreProcess { * 解析车道边线数据二级属性 * */ fun unpackingLaneBoundary(renderEntity: RenderEntity) { - var shape:JSONObject = JSONObject(mapOf( - "lateralOffset" to 0, - "markType" to 1, - "markColor" to 0, - "markMaterial" to 1, - "markSeqNum" to 1, - "markWidth" to 10, - "markingCount" to 1 - )) - if (renderEntity.code == 2013&&!renderEntity.properties["shapeList"].isNullOrEmpty()&&renderEntity.properties["shapeList"]!="null") { + var shape: JSONObject = JSONObject( + mapOf( + "lateralOffset" to 0, + "markType" to 1, + "markColor" to 0, + "markMaterial" to 1, + "markSeqNum" to 1, + "markWidth" to 10, + "markingCount" to 1 + ) + ) + if (renderEntity.code == 2013 && !renderEntity.properties["shapeList"].isNullOrEmpty() && renderEntity.properties["shapeList"] != "null") { // 解析shapeList,将数组中的属性放会properties val shapeList = JSONArray(renderEntity.properties["shapeList"]) for (i in 0 until shapeList.length()) { @@ -336,9 +417,12 @@ class ImportPreProcess { * */ fun unpackingLaneInfo(renderEntity: RenderEntity) { if (renderEntity.code == 4601) { - if (!renderEntity.properties["laneinfoGroup"].isNullOrEmpty()&&renderEntity.properties["laneinfoGroup"]!="null") { + if (!renderEntity.properties["laneinfoGroup"].isNullOrEmpty() && renderEntity.properties["laneinfoGroup"] != "null") { // 解析laneinfoGroup,将数组中的属性放会properties - val laneinfoGroup = JSONArray(renderEntity.properties["laneinfoGroup"].toString().replace("{", "[").replace("}", "]")) + val laneinfoGroup = JSONArray( + renderEntity.properties["laneinfoGroup"].toString().replace("{", "[") + .replace("}", "]") + ) // 分别获取两个数组中的数据,取第一个作为主数据,另外两个作为辅助渲染数据 val laneInfoDirectArray = JSONArray(laneinfoGroup[0].toString()) val laneInfoTypeArray = JSONArray(laneinfoGroup[1].toString()) @@ -352,9 +436,12 @@ class ImportPreProcess { // 与原数据使用相同的geometry referenceEntity.geometry = renderEntity.geometry.toString() referenceEntity.properties["qi_table"] = renderEntity.table - referenceEntity.properties["currentDirect"] = laneInfoDirectArray[i].toString().split(",").distinct().joinToString("_") - referenceEntity.properties["currentType"] = laneInfoTypeArray[i].toString().split(",").distinct().joinToString("_") - referenceEntity.properties["symbol"] = "assets:omdb/4601/bus/1301_"+referenceEntity.properties["currentDirect"]+".svg" + referenceEntity.properties["currentDirect"] = + laneInfoDirectArray[i].toString().split(",").distinct().joinToString("_") + referenceEntity.properties["currentType"] = + laneInfoTypeArray[i].toString().split(",").distinct().joinToString("_") + referenceEntity.properties["symbol"] = + "assets:omdb/4601/bus/1301_" + referenceEntity.properties["currentDirect"] + ".svg" Log.d("unpackingLaneInfo", referenceEntity.properties["symbol"].toString()) Realm.getDefaultInstance().insert(referenceEntity) } @@ -368,25 +455,27 @@ class ImportPreProcess { * */ fun generateRoadName(renderEntity: RenderEntity) { // LinkName的真正名称数据,是保存在properties的shapeList中的,因此需要解析shapeList数据 - var shape :JSONObject? = null + var shape: JSONObject? = null if (renderEntity.properties.containsKey("shapeList")) { val shapeListJsonArray: JSONArray = JSONArray(renderEntity.properties["shapeList"]) for (i in 0 until shapeListJsonArray.length()) { val shapeJSONObject = shapeListJsonArray.getJSONObject(i) - if (shapeJSONObject["nameClass"]==1) { + if (shapeJSONObject["nameClass"] == 1) { if (shape == null) { shape = shapeJSONObject } // 获取第一官方名 //("名称分类"NAME_CLASS =“1 官方名”,且名称序号SEQ_NUM 最小者) - if (shapeJSONObject["seqNum"].toString().toInt()< shape!!["seqNum"].toString().toInt()) { + if (shapeJSONObject["seqNum"].toString().toInt() < shape!!["seqNum"].toString() + .toInt() + ) { shape = shapeJSONObject } } } } // 获取最小的shape值,将其记录增加记录在properties的name属性下 - if(shape!=null) { + if (shape != null) { renderEntity.properties["name"] = shape["name"].toString() } else { renderEntity.properties["name"] = "" @@ -398,9 +487,10 @@ class ImportPreProcess { * */ fun generateElectronName(renderEntity: RenderEntity) { // 解析电子眼的kind,将其转换为渲染的简要名称 - var shape :JSONObject? = null + var shape: JSONObject? = null if (renderEntity.properties.containsKey("kind")) { - renderEntity.properties["name"] = code2NameMap.electronEyeKindMap[renderEntity.properties["kind"].toString().toInt()] + renderEntity.properties["name"] = + code2NameMap.electronEyeKindMap[renderEntity.properties["kind"].toString().toInt()] } else { renderEntity.properties["name"] = "" } @@ -421,38 +511,41 @@ class ImportPreProcess { angleReference.zoomMin = renderEntity.zoomMin angleReference.zoomMax = renderEntity.zoomMax angleReference.taskId = renderEntity.taskId + angleReference.enable = renderEntity.enable Realm.getDefaultInstance().insert(angleReference) } -// /** -// * 生成默认路口数据的参考数据 -// * */ -// fun generateIntersectionReference(renderEntity: RenderEntity) { -// // 路口数据的其他点位,是保存在nodeList对应的数组下 -// if (renderEntity.properties.containsKey("nodeList")) { -// val nodeListJsonArray: JSONArray = JSONArray(renderEntity.properties["nodeList"]) -// for (i in 0 until nodeListJsonArray.length()) { -// val nodeJSONObject = nodeListJsonArray.getJSONObject(i) -// val intersectionReference = ReferenceEntity() -// intersectionReference.renderEntityId = renderEntity.id -// intersectionReference.name = "${renderEntity.name}参考点" -// intersectionReference.table = renderEntity.table -// intersectionReference.zoomMin = renderEntity.zoomMin -// intersectionReference.zoomMax = renderEntity.zoomMax -// intersectionReference.taskId = renderEntity.taskId -// // 与原有方向指向平行的线 -// intersectionReference.geometry = GeometryTools.createGeometry(nodeJSONObject["geometry"].toString()).toString() -// intersectionReference.properties["qi_table"] = renderEntity.table -// intersectionReference.properties["type"] = "node" -// Realm.getDefaultInstance().insert(intersectionReference) -// } -// } -// } /** * 生成默认路口数据的参考数据 * */ fun generateIntersectionReference(renderEntity: RenderEntity) { + // 路口数据的其他点位,是保存在nodeList对应的数组下 + if (renderEntity.properties.containsKey("nodeList")) { + val nodeListJsonArray: JSONArray = JSONArray(renderEntity.properties["nodeList"]) + for (i in 0 until nodeListJsonArray.length()) { + val nodeJSONObject = nodeListJsonArray.getJSONObject(i) + val intersectionReference = ReferenceEntity() + intersectionReference.renderEntityId = renderEntity.id + intersectionReference.name = "${renderEntity.name}参考点" + intersectionReference.table = renderEntity.table + intersectionReference.zoomMin = renderEntity.zoomMin + intersectionReference.zoomMax = renderEntity.zoomMax + intersectionReference.taskId = renderEntity.taskId + intersectionReference.enable = renderEntity.enable + // 与原有方向指向平行的线 + intersectionReference.geometry = + GeometryTools.createGeometry(nodeJSONObject["geometry"].toString()).toString() + intersectionReference.properties["qi_table"] = renderEntity.table + intersectionReference.properties["type"] = "node" + Realm.getDefaultInstance().insert(intersectionReference) + } + } + } + /** + * 生成默认路口数据的参考数据 + * */ + fun generateIntersectionDynamic(renderEntity: RenderEntity) { // 路口数据的其他点位,是保存在nodeList对应的数组下 if (renderEntity.properties.containsKey("type")) { if (renderEntity.properties["type"] == "0") { @@ -469,14 +562,14 @@ class ImportPreProcess { fun normalizationPoleHeight(renderEntity: RenderEntity) { // 获取杆状物的高程数据 val geometry = renderEntity.wkt - if (geometry!=null) { - var minHeight=Double.MAX_VALUE - var maxHeight=Double.MIN_VALUE + if (geometry != null) { + var minHeight = Double.MAX_VALUE + var maxHeight = Double.MIN_VALUE for (coordinate in geometry.coordinates) { - if (coordinate.zmaxHeight) { + if (coordinate.z > maxHeight) { maxHeight = coordinate.z } } @@ -488,7 +581,8 @@ class ImportPreProcess { coordinate.z = 40.0 } } - renderEntity.geometry = WKTWriter(3).write(GeometryTools.createLineString(geometry.coordinates)) + renderEntity.geometry = + WKTWriter(3).write(GeometryTools.createLineString(geometry.coordinates)) } } @@ -498,24 +592,25 @@ class ImportPreProcess { fun normalizationTrafficSignHeight(renderEntity: RenderEntity) { // 获取交通标牌的高程数据 val geometry = renderEntity.wkt - if (geometry!=null) { + if (geometry != null) { // 获取所有的高程信息,计算高程的中位数,方便对高程做定制化处理 - var midHeight=0.0 + var midHeight = 0.0 var countHeight = 0.0 for (coordinate in geometry.coordinates) { - countHeight+=coordinate.z + countHeight += coordinate.z } - midHeight = countHeight/geometry.coordinates.size + midHeight = countHeight / geometry.coordinates.size // 对高程数据做特殊处理 for (coordinate in geometry.coordinates) { - if (coordinate.z>=midHeight) { + if (coordinate.z >= midHeight) { coordinate.z = 40.0 } else { coordinate.z = 30.0 } } - renderEntity.geometry = WKTWriter(3).write(GeometryTools.getPolygonGeometry(geometry.coordinates)) + renderEntity.geometry = + WKTWriter(3).write(GeometryTools.getPolygonGeometry(geometry.coordinates)) } } } \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/db/RealmOperateHelper.kt b/app/src/main/java/com/navinfo/omqs/db/RealmOperateHelper.kt index a1a02fd4..69ec2c9e 100644 --- a/app/src/main/java/com/navinfo/omqs/db/RealmOperateHelper.kt +++ b/app/src/main/java/com/navinfo/omqs/db/RealmOperateHelper.kt @@ -121,20 +121,36 @@ class RealmOperateHelper() { suspend fun queryLink(linkPid: String): RenderEntity? { var link: RenderEntity? = null - withContext(Dispatchers.IO) { - val realm = Realm.getDefaultInstance() - val realmR = realm.where(RenderEntity::class.java) - .equalTo("table", "OMDB_RD_LINK") - .and() - .equalTo("properties['${LinkTable.linkPid}']", linkPid) - .findFirst() - if (realmR != null) { - link = realm.copyFromRealm(realmR) - } + val realm = Realm.getDefaultInstance() + val realmR = realm.where(RenderEntity::class.java) + .equalTo("table", "OMDB_RD_LINK") + .and() + .equalTo("properties['${LinkTable.linkPid}']", linkPid) + .findFirst() + if (realmR != null) { + link = realm.copyFromRealm(realmR) } return link } + suspend fun queryLinkToMutableRenderEntityList(linkPid: String): MutableList? { + val resultList = mutableListOf() + + val realm = Realm.getDefaultInstance() + + val realmR = realm.where(RenderEntity::class.java) + .equalTo("properties['${LinkTable.linkPid}']", linkPid) + .findAll() + + val dataList = realm.copyFromRealm(realmR) + + dataList.forEach { + resultList.add(it) + } + + return resultList + } + /** * 根据当前点位查询匹配的除Link外的其他要素数据 * @param point 点位经纬度信息 @@ -150,38 +166,38 @@ class RealmOperateHelper() { sort: Boolean = true ): MutableList { val result = mutableListOf() - withContext(Dispatchers.IO) { - val polygon = getPolygonFromPoint(point, buffer, bufferType) - // 根据polygon查询相交的tile号 - val tileXSet = mutableSetOf() - tileXSet.toString() - GeometryToolsKt.getTileXByGeometry(polygon.toString(), tileXSet) - val tileYSet = mutableSetOf() - GeometryToolsKt.getTileYByGeometry(polygon.toString(), tileYSet) + val polygon = getPolygonFromPoint(point, buffer, bufferType) + // 根据polygon查询相交的tile号 + val tileXSet = mutableSetOf() + tileXSet.toString() + GeometryToolsKt.getTileXByGeometry(polygon.toString(), tileXSet) + val tileYSet = mutableSetOf() + GeometryToolsKt.getTileYByGeometry(polygon.toString(), tileYSet) - // 对tileXSet和tileYSet查询最大最小值 - val xStart = tileXSet.stream().min(Comparator.naturalOrder()).orElse(null) - val xEnd = tileXSet.stream().max(Comparator.naturalOrder()).orElse(null) - val yStart = tileYSet.stream().min(Comparator.naturalOrder()).orElse(null) - val yEnd = tileYSet.stream().max(Comparator.naturalOrder()).orElse(null) - // 查询realm中对应tile号的数据 - val realmList = Realm.getDefaultInstance().where(RenderEntity::class.java) - .notEqualTo("table", "OMDB_RD_LINK") - .and() - .rawPredicate("tileX>=$xStart and tileX<=$xEnd and tileY>=$yStart and tileY<=$yEnd") - .findAll() - // 将获取到的数据和查询的polygon做相交,只返回相交的数据 - val queryResult = realmList?.stream()?.filter { - polygon.intersects(it.wkt) - }?.toList() - queryResult?.let { - result.addAll(queryResult) - } + // 对tileXSet和tileYSet查询最大最小值 + val xStart = tileXSet.stream().min(Comparator.naturalOrder()).orElse(null) + val xEnd = tileXSet.stream().max(Comparator.naturalOrder()).orElse(null) + val yStart = tileYSet.stream().min(Comparator.naturalOrder()).orElse(null) + val yEnd = tileYSet.stream().max(Comparator.naturalOrder()).orElse(null) + val realm = Realm.getDefaultInstance() + // 查询realm中对应tile号的数据 + val realmList = realm.where(RenderEntity::class.java) + .notEqualTo("table", "OMDB_RD_LINK") + .and() + .rawPredicate("tileX>=$xStart and tileX<=$xEnd and tileY>=$yStart and tileY<=$yEnd") + .findAll() + // 将获取到的数据和查询的polygon做相交,只返回相交的数据 + val queryResult = realmList?.stream()?.filter { + polygon.intersects(it.wkt) + }?.toList() + queryResult?.let { if (sort) { - result.clear() - result.addAll(sortRenderEntity(point, result)) + result.addAll(sortRenderEntity(point, realm.copyFromRealm(it))) + } else { + result.addAll(realm.copyFromRealm(it)) } } + return result } @@ -213,8 +229,7 @@ class RealmOperateHelper() { @RequiresApi(Build.VERSION_CODES.N) fun sortRenderEntity(point: Point, unSortList: List): List { val sortList = unSortList.stream().sorted { renderEntity, renderEntity2 -> - val near = point.distance(renderEntity.wkt) - point.distance(renderEntity2.wkt) - if (near < 0) -1 else 1 + point.distance(renderEntity.wkt).compareTo(point.distance(renderEntity2.wkt)) }.toList() return sortList } 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 5e45f2d6..61d6135b 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 @@ -77,7 +77,7 @@ class TaskDownloadScope( downloadJob = launch() { FileManager.checkOMDBFileInfo(taskBean) if (taskBean.status == FileDownloadStatus.IMPORT) { - importData(taskId = taskBean.id) + importData(task = taskBean) } else { download() } @@ -127,7 +127,7 @@ class TaskDownloadScope( /** * 导入数据 */ - private suspend fun importData(file: File? = null, taskId: Int? = 0) { + private suspend fun importData(file: File? = null, task: TaskBean? = null) { try { Log.e("jingo", "importData SSS") change(FileDownloadStatus.IMPORTING) @@ -138,8 +138,8 @@ class TaskDownloadScope( downloadManager.context, fileNew ) - if (taskId != null) { - importOMDBHelper.importOmdbZipFile(importOMDBHelper.omdbFile, taskId).collect { + if (task != null) { + importOMDBHelper.importOmdbZipFile(importOMDBHelper.omdbFile, task).collect { Log.e("jingo", "数据安装 $it") if (it == "finish") { change(FileDownloadStatus.DONE) @@ -187,7 +187,7 @@ class TaskDownloadScope( startPosition = 0 } if (fileTemp.length() > 0 && taskBean.fileSize > 0 && fileTemp.length() == taskBean.fileSize) { - importData(fileTemp, taskBean.id) + importData(fileTemp, taskBean) return } @@ -228,7 +228,7 @@ class TaskDownloadScope( randomAccessFile?.close() inputStream = null randomAccessFile = null - importData(taskId = taskBean.id) + importData(task = taskBean) } else { change(FileDownloadStatus.PAUSE) } diff --git a/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainActivity.kt b/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainActivity.kt index 7457dbf9..63029bb0 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainActivity.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainActivity.kt @@ -406,7 +406,7 @@ class MainActivity : BaseActivity() { this ).setTitle("坐标定位").setView(view) val editText = view.findViewById(R.id.dialog_edittext) - editText.hint = "请输入经纬度例如:\n116.1234567,39.1234567\n116.1234567 39.1234567" + editText.hint = "请输入经纬度例如:116.1234567,39.1234567" inputDialog.setNegativeButton("取消") { dialog, _ -> dialog.dismiss() } @@ -505,7 +505,7 @@ class MainActivity : BaseActivity() { * 点击搜索 */ fun onClickSearch() { - + jumpPosition() } /** 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 a3860287..58602999 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 @@ -199,7 +199,7 @@ class MainViewModel @Inject constructor( Map.SCALE_EVENT, Map.MOVE_EVENT, Map.ROTATE_EVENT -> liveDataCenterPoint.value = mapPosition } - if(mapController.mMapView.vtmMap.mapPosition.zoomLevel>=16){ + if (mapController.mMapView.vtmMap.mapPosition.zoomLevel >= 16) { } currentMapZoomLevel = mapController.mMapView.vtmMap.mapPosition.zoomLevel @@ -219,7 +219,7 @@ class MainViewModel @Inject constructor( object : OnGeoPointClickListener { override fun onMapClick(tag: String, point: GeoPoint) { if (tag == TAG) { - viewModelScope.launch(Dispatchers.Default) { + viewModelScope.launch(Dispatchers.IO) { //线选择状态 if (bSelectRoad) { captureLink(point) @@ -280,6 +280,8 @@ class MainViewModel @Inject constructor( initNILocationData() } sharedPreferences.registerOnSharedPreferenceChangeListener(this) + com.navinfo.collect.library.system.Constant.TASK_ID = + sharedPreferences.getInt(Constant.SELECT_TASK_ID, -1) socketServer = SocketServer(mapController, traceDataBase, sharedPreferences) } @@ -455,8 +457,8 @@ class MainViewModel @Inject constructor( ) ) - if(itemList.size == 1){ - SignUtil.getSignNameText(itemList[0]) + if (itemList.size > 0) { + liveDataSignMoreInfo.postValue(itemList[0]) } } } diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/personalcenter/PersonalCenterFragment.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/personalcenter/PersonalCenterFragment.kt index 0309351b..35f27ab1 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/personalcenter/PersonalCenterFragment.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/personalcenter/PersonalCenterFragment.kt @@ -15,7 +15,6 @@ import com.blankj.utilcode.util.UriUtils import com.github.k1rakishou.fsaf.FileChooser import com.github.k1rakishou.fsaf.callback.FSAFActivityCallbacks import com.github.k1rakishou.fsaf.callback.FileChooserCallback -import com.navinfo.collect.library.data.entity.TaskBean import com.navinfo.collect.library.map.NIMapController import com.navinfo.omqs.Constant import com.navinfo.omqs.R @@ -23,10 +22,8 @@ import com.navinfo.omqs.databinding.FragmentPersonalCenterBinding import com.navinfo.omqs.db.ImportOMDBHelper import com.navinfo.omqs.hilt.ImportOMDBHiltFactory import com.navinfo.omqs.tools.CoroutineUtils -import com.navinfo.omqs.ui.activity.map.MainActivity import com.navinfo.omqs.ui.fragment.BaseFragment import com.navinfo.omqs.ui.activity.scan.QrCodeActivity -import com.navinfo.omqs.ui.fragment.console.ConsoleFragment import com.permissionx.guolindev.PermissionX import dagger.hilt.android.AndroidEntryPoint import org.oscim.core.GeoPoint 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 04093b8f..d20db0cf 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 @@ -162,11 +162,11 @@ class PersonalCenterViewModel @Inject constructor( /** * 导入OMDB数据 * */ - fun importOMDBData(importOMDBHelper: ImportOMDBHelper,taskId:Int?=0) { + fun importOMDBData(importOMDBHelper: ImportOMDBHelper, task: TaskBean? =null) { viewModelScope.launch(Dispatchers.IO) { Log.d("OMQSApplication", "开始导入数据") - if (taskId != null) { - importOMDBHelper.importOmdbZipFile(importOMDBHelper.omdbFile, taskId).collect { + if (task != null) { + importOMDBHelper.importOmdbZipFile(importOMDBHelper.omdbFile, task).collect { Log.d("importOMDBData", it) } } diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/signMoreInfo/LaneBoundaryAdapter.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/signMoreInfo/LaneBoundaryAdapter.kt new file mode 100644 index 00000000..59f8bddc --- /dev/null +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/signMoreInfo/LaneBoundaryAdapter.kt @@ -0,0 +1,103 @@ +package com.navinfo.omqs.ui.fragment.signMoreInfo + +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import androidx.recyclerview.widget.RecyclerView.ViewHolder +import com.navinfo.omqs.R +import com.navinfo.omqs.databinding.AdapterLaneBoundaryBinding +import com.navinfo.omqs.databinding.AdapterTwoItemBinding +import com.navinfo.omqs.ui.other.BaseViewHolder +import com.navinfo.omqs.ui.other.anim.ExpandableViewHoldersUtil +import com.navinfo.omqs.ui.other.anim.ExpandableViewHoldersUtil.Expandable + + +data class LaneBoundaryItem( + val title: String, val text: String?, val itemList: MutableList? +) + +class LaneBoundaryAdapter : RecyclerView.Adapter() { + private val keepOne: ExpandableViewHoldersUtil.KeepOneH = + ExpandableViewHoldersUtil.KeepOneH() + + private var dataList = mutableListOf() + + class ExpandViewHolder( + val viewBinding: AdapterLaneBoundaryBinding, + private val keepOne: ExpandableViewHoldersUtil.KeepOneH + ) : ViewHolder(viewBinding.root), + View.OnClickListener, Expandable { + + init { + viewBinding.root.setOnClickListener(this) + } + + fun bind(pos: Int, laneBoundaryItem: LaneBoundaryItem) { + viewBinding.contactName.text = laneBoundaryItem.title + if (laneBoundaryItem.itemList != null) { + for (item in laneBoundaryItem.itemList) { + var view = LayoutInflater.from(viewBinding.root.context) + .inflate(R.layout.adapter_two_item, null, false) + view.findViewById(R.id.title).text = item.title + view.findViewById(R.id.text).text = item.text + viewBinding.infos.addView(view) + } + } + keepOne.bind(this, pos) + } + + override fun onClick(v: View) { + keepOne.toggle(this,viewBinding.expandIcon) + } + + override val expandView: View + get() = viewBinding.infos + + } + + override + + fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { + return if (viewType == 1) { + val viewBinding = AdapterLaneBoundaryBinding.inflate( + LayoutInflater.from(parent.context), parent, false + ) + ExpandViewHolder(viewBinding, keepOne) + } else { + val viewBinding = + AdapterTwoItemBinding.inflate(LayoutInflater.from(parent.context), parent, false) + BaseViewHolder(viewBinding) + } + } + + override fun getItemCount(): Int { + return dataList.size + } + + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + if (holder is ExpandViewHolder) { + holder.bind(position, dataList[position]) + } else if (holder is BaseViewHolder) { + val binding: AdapterTwoItemBinding = holder.viewBinding as AdapterTwoItemBinding + val item = dataList[position] + binding.title.text = item.title + binding.text.text = item.text + } + } + + override fun getItemViewType(position: Int): Int { + return if (dataList[position].itemList != null) 1 + else 0 + } + + fun refreshData(list: List) { + dataList.clear() + dataList.addAll(list) + notifyDataSetChanged() + } +} + + + diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/signMoreInfo/SignMoreInfoFragment.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/signMoreInfo/SignMoreInfoFragment.kt index 3a77f5c8..67d73a25 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/signMoreInfo/SignMoreInfoFragment.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/signMoreInfo/SignMoreInfoFragment.kt @@ -55,15 +55,27 @@ class SignMoreInfoFragment : BaseFragment() { binding.signInfoRecyclerview.adapter = adapter adapter.refreshData(SignUtil.getRoadNameList(it)) } + //车道边界类型 + 2013 -> { + val adapter = LaneBoundaryAdapter() + binding.signInfoRecyclerview.adapter = adapter + adapter.refreshData(SignUtil.getLaneBoundaryTypeInfo(it)) + } + //可变点限速 + 2021 -> { + val adapter = TwoItemAdapter() + binding.signInfoRecyclerview.adapter = adapter + adapter.refreshData(SignUtil.getChangeLimitSpeedInfo(it)) + } //常规点限速 4002 -> { - val adapter = ElectronicEyeInfoAdapter() + val adapter = TwoItemAdapter() binding.signInfoRecyclerview.adapter = adapter adapter.refreshData(SignUtil.getSpeedLimitMoreInfoText(it)) } //条件点限速 4003 -> { - val adapter = ElectronicEyeInfoAdapter() + val adapter = TwoItemAdapter() binding.signInfoRecyclerview.adapter = adapter adapter.refreshData(SignUtil.getConditionLimitMoreInfoText(it)) } @@ -80,11 +92,14 @@ class SignMoreInfoFragment : BaseFragment() { binding.signInfoTitle.setCompoundDrawables( drawable, null, null, null ) - val adapter = ElectronicEyeInfoAdapter() + val adapter = TwoItemAdapter() binding.signInfoRecyclerview.adapter = adapter adapter.refreshData(SignUtil.getElectronicEyeMoreInfo(it)) } - + else -> { + val adapter = TwoItemAdapter() + binding.signInfoRecyclerview.adapter = adapter + } } } diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/signMoreInfo/ElectronicEyeInfoAdapter.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/signMoreInfo/TwoItemAdapter.kt similarity index 58% rename from app/src/main/java/com/navinfo/omqs/ui/fragment/signMoreInfo/ElectronicEyeInfoAdapter.kt rename to app/src/main/java/com/navinfo/omqs/ui/fragment/signMoreInfo/TwoItemAdapter.kt index 50a95962..516644b2 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/signMoreInfo/ElectronicEyeInfoAdapter.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/signMoreInfo/TwoItemAdapter.kt @@ -2,27 +2,26 @@ package com.navinfo.omqs.ui.fragment.signMoreInfo import android.view.LayoutInflater import android.view.ViewGroup -import com.navinfo.omqs.R -import com.navinfo.omqs.databinding.AdapterElectronicEyeBinding +import com.navinfo.omqs.databinding.AdapterTwoItemBinding import com.navinfo.omqs.ui.other.BaseRecyclerViewAdapter import com.navinfo.omqs.ui.other.BaseViewHolder -data class ElectronicEyeMoreInfoAdapterItem( +data class TwoItemAdapterItem( val title: String, val text: String ) -class ElectronicEyeInfoAdapter : BaseRecyclerViewAdapter() { +class TwoItemAdapter : BaseRecyclerViewAdapter() { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseViewHolder { val viewBinding = - AdapterElectronicEyeBinding.inflate(LayoutInflater.from(parent.context), parent, false) + AdapterTwoItemBinding.inflate(LayoutInflater.from(parent.context), parent, false) return BaseViewHolder(viewBinding) } override fun onBindViewHolder(holder: BaseViewHolder, position: Int) { - val binding: AdapterElectronicEyeBinding = - holder.viewBinding as AdapterElectronicEyeBinding + val binding: AdapterTwoItemBinding = + holder.viewBinding as AdapterTwoItemBinding val item = data[position] binding.title.text = item.title binding.text.text = item.text diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklink/TaskLinkMiddleAdapter.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklink/TaskLinkMiddleAdapter.kt index 2536192a..ce1b2ffa 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklink/TaskLinkMiddleAdapter.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklink/TaskLinkMiddleAdapter.kt @@ -1,11 +1,8 @@ package com.navinfo.omqs.ui.fragment.tasklink -import android.os.Build import android.view.LayoutInflater import android.view.ViewGroup -import androidx.annotation.RequiresApi import com.navinfo.omqs.R -import com.navinfo.omqs.databinding.AdapterElectronicEyeBinding import com.navinfo.omqs.databinding.AdapterTaskLinkInfoBinding import com.navinfo.omqs.ui.other.BaseRecyclerViewAdapter import com.navinfo.omqs.ui.other.BaseViewHolder diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListAdapter.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListAdapter.kt index 9f017d33..351b6000 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListAdapter.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListAdapter.kt @@ -180,10 +180,10 @@ class TaskListAdapter( binding.taskUploadBtn.visibility = View.INVISIBLE } if (taskBean.syncStatus == FileUploadStatus.DONE) { - binding.taskUploadBtn.setProgress(0) +// binding.taskUploadBtn.setProgress(0) binding.taskUploadBtn.setBackgroundColor(binding.root.resources.getColor(R.color.ripple_end_color)) } else { - binding.taskUploadBtn.setProgress(100) +// binding.taskUploadBtn.setProgress(100) binding.taskUploadBtn.setBackgroundColor(Color.parseColor("#888FB3")) } binding.taskDownloadBtn.tag = position @@ -301,7 +301,7 @@ class TaskListAdapter( binding.taskDownloadBtn.setTextColor(Color.WHITE) } - if (taskBean.fileSize > 0L) { + if (taskBean.fileSize > 0L && taskBean.status != FileDownloadStatus.DONE) { val progress = (taskBean.currentSize * 100 / taskBean.fileSize).toInt() binding.taskProgressText.text = "$progress%" diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskViewModel.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskViewModel.kt index d9fcb382..81e646eb 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskViewModel.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskViewModel.kt @@ -5,7 +5,6 @@ import android.content.SharedPreferences import android.content.SharedPreferences.OnSharedPreferenceChangeListener import android.os.Build import android.view.View -import android.widget.Toast import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope @@ -19,7 +18,6 @@ import com.navinfo.collect.library.map.OnGeoPointClickListener import com.navinfo.collect.library.utils.GeometryTools import com.navinfo.omqs.Constant import com.navinfo.omqs.db.RealmOperateHelper -import com.navinfo.omqs.http.NetResult import com.navinfo.omqs.http.NetworkService import com.navinfo.omqs.tools.FileManager import com.navinfo.omqs.ui.dialog.FirstDialog @@ -27,7 +25,6 @@ import com.navinfo.omqs.util.DateTimeUtil import dagger.hilt.android.lifecycle.HiltViewModel import io.realm.Realm import kotlinx.coroutines.* -import kotlinx.coroutines.flow.collectLatest import org.oscim.core.GeoPoint import javax.inject.Inject @@ -144,6 +141,10 @@ class TaskViewModel @Inject constructor( liveDataTaskLinks.value = taskBean.hadLinkDvoList showTaskLinks(taskBean) + com.navinfo.collect.library.system.Constant.TASK_ID = taskBean.id + mapController.layerManagerHandler.omdbLayersClear() + mapController.mMapView.updateMap(true) + } private fun showTaskLinks(taskBean: TaskBean) { @@ -420,8 +421,21 @@ class TaskViewModel @Inject constructor( r.copyToRealmOrUpdate(hadLinkDvoBean) r.copyToRealmOrUpdate(currentSelectTaskBean!!) } + //根据Link数据查询对应数据上要素,对要素进行显示重置 + l.properties["linkPid"]?.let { + realmOperateHelper.queryLinkToMutableRenderEntityList(it) + ?.forEach { renderEntity -> + if(renderEntity.enable!=1){ + renderEntity.enable = 1 + realm.executeTransaction { r -> + r.copyToRealmOrUpdate(renderEntity) + } + } + } + } liveDataTaskLinks.postValue(currentSelectTaskBean!!.hadLinkDvoList) mapController.lineHandler.addTaskLink(hadLinkDvoBean) + mapController.mMapView.vtmMap.updateMap(true) } } } @@ -460,7 +474,23 @@ class TaskViewModel @Inject constructor( ) { dialog, _ -> dialog.dismiss() viewModelScope.launch(Dispatchers.IO) { + val realm = Realm.getDefaultInstance() + + //重置数据为隐藏 + if(hadLinkDvoBean.linkStatus==2){ + realmOperateHelper.queryLinkToMutableRenderEntityList(hadLinkDvoBean.linkPid) + ?.forEach { renderEntity -> + if(renderEntity.enable==1){ + renderEntity.enable = 0 + realm.executeTransaction { r -> + r.copyToRealmOrUpdate(renderEntity) + } + } + } + mapController.mMapView.vtmMap.updateMap(true) + } + realm.executeTransaction { for (link in currentSelectTaskBean!!.hadLinkDvoList) { if (link.linkPid == hadLinkDvoBean.linkPid) { @@ -475,8 +505,8 @@ class TaskViewModel @Inject constructor( .equalTo("linkId", hadLinkDvoBean.linkPid) .and().equalTo("taskId", hadLinkDvoBean.taskId) .findAll() - if(markers != null){ - for(marker in markers){ + if (markers != null) { + for (marker in markers) { mapController.markerHandle.removeQsRecordMark(marker) } markers.deleteAllFromRealm() diff --git a/app/src/main/java/com/navinfo/omqs/ui/other/BaseViewHolder.kt b/app/src/main/java/com/navinfo/omqs/ui/other/BaseViewHolder.kt index 35e78452..7127a482 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/other/BaseViewHolder.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/other/BaseViewHolder.kt @@ -1,6 +1,5 @@ package com.navinfo.omqs.ui.other -import android.util.Log import android.view.View import androidx.lifecycle.Lifecycle import androidx.lifecycle.LifecycleOwner diff --git a/app/src/main/java/com/navinfo/omqs/ui/other/anim/ExpandableViewHoldersUtil.kt b/app/src/main/java/com/navinfo/omqs/ui/other/anim/ExpandableViewHoldersUtil.kt new file mode 100644 index 00000000..4db8463f --- /dev/null +++ b/app/src/main/java/com/navinfo/omqs/ui/other/anim/ExpandableViewHoldersUtil.kt @@ -0,0 +1,119 @@ +package com.navinfo.omqs.ui.other.anim + +import android.R.attr.animation +import android.animation.Animator +import android.animation.AnimatorListenerAdapter +import android.animation.ObjectAnimator +import android.animation.ValueAnimator +import android.os.Build +import android.view.View +import android.view.animation.DecelerateInterpolator +import android.widget.ImageView +import androidx.recyclerview.widget.RecyclerView +import com.navinfo.omqs.ui.other.anim.ViewHolderAnimator.ViewHolderAnimatorListener + + +object ExpandableViewHoldersUtil { + + //自定义处理列表中右侧图标,这里是一个旋转动画 + fun rotateExpandIcon(mImage: ImageView, from: Float, to: Float) { + val valueAnimator: ValueAnimator = ValueAnimator.ofFloat(from, to) //属性动画 + valueAnimator.duration = 500 + valueAnimator.interpolator = DecelerateInterpolator() + valueAnimator.addUpdateListener { valueAnimator -> + mImage.rotation = valueAnimator.animatedValue as Float + } + valueAnimator.start() + } + + //参数介绍:1、holder对象 2、展开部分的View,由holder.getExpandView()方法获取 3、animate参数为true,则有动画效果 + fun openH(holder: RecyclerView.ViewHolder, expandView: View, animate: Boolean) { + if (animate) { + expandView.visibility = View.VISIBLE + //改变高度的动画 + val animator = ViewHolderAnimator.ofItemViewHeight(holder) + //扩展的动画,结束后透明度动画开始 + animator!!.addListener(object : AnimatorListenerAdapter() { + override fun onAnimationEnd(animation: Animator) { + val alphaAnimator = ObjectAnimator.ofFloat(expandView, View.ALPHA, 1f) + alphaAnimator.addListener(ViewHolderAnimatorListener(holder)) + alphaAnimator.start() + } + }) + animator.start() + } else {//为false时直接显示 + expandView.visibility = View.VISIBLE + expandView.alpha = 1f + } + } + + //类似于打开的方法 + fun closeH(holder: RecyclerView.ViewHolder, expandView: View, animate: Boolean) { + if (animate) { + expandView.visibility = View.GONE + val animator = ViewHolderAnimator.ofItemViewHeight(holder) + expandView.visibility = View.VISIBLE + animator!!.addListener(object : AnimatorListenerAdapter() { + override fun onAnimationEnd(animation: Animator) { + expandView.visibility = View.GONE + expandView.alpha = 0f + } + + override fun onAnimationCancel(animation: Animator) { + expandView.visibility = View.GONE + expandView.alpha = 0f + } + }) + animator.start() + } else { + expandView.visibility = View.GONE + expandView.alpha = 0f + } + } + + //获取展开部分的View + interface Expandable { + val expandView: View + } + + class KeepOneH where VH : RecyclerView.ViewHolder, VH : Expandable? { + //-1表示所有item是关闭状态,opend为pos值的表示pos位置的item为展开的状态 + private var _opened = -1 + + /** + * 此方法是在Adapter的onBindViewHolder()方法中调用 + * + * @param holder holder对象 + * @param pos 下标 + */ + fun bind(holder: VH, pos: Int) { + if (pos == _opened) openH(holder, holder!!.expandView, false) else closeH( + holder, + holder!!.expandView, + false + ) + } + + /** + * 响应ViewHolder的点击事件 + * + * @param holder holder对象 + * @param imageView 这里我传入了一个ImageView对象,为了处理图片旋转的动画,为了处理内部业务 + */ + fun toggle(holder: VH, imageView: ImageView) { + if (_opened == holder!!.position) { + _opened = -1 + rotateExpandIcon(imageView, 180F, 0F); + closeH(holder, holder.expandView, true) + } else { + val previous = _opened + _opened = holder.position + rotateExpandIcon(imageView, 0F, 180F); + openH(holder, holder.expandView, true) + val oldHolder = + (holder.itemView.parent as RecyclerView).findViewHolderForPosition(previous) as VH? + if (oldHolder != null) closeH(oldHolder, oldHolder.expandView, true) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/ui/other/anim/LayoutAnimator.kt b/app/src/main/java/com/navinfo/omqs/ui/other/anim/LayoutAnimator.kt new file mode 100644 index 00000000..214bec0c --- /dev/null +++ b/app/src/main/java/com/navinfo/omqs/ui/other/anim/LayoutAnimator.kt @@ -0,0 +1,22 @@ +package com.navinfo.omqs.ui.other.anim + +import android.animation.Animator +import android.animation.ValueAnimator +import android.view.View + +object LayoutAnimator { + fun ofHeight(view: View, start: Int, end: Int): Animator { + val animator = ValueAnimator.ofInt(start, end) + animator.addUpdateListener(LayoutHeightUpdateListener(view)) + return animator + } + + class LayoutHeightUpdateListener(private val _view: View) : + ValueAnimator.AnimatorUpdateListener { + override fun onAnimationUpdate(animation: ValueAnimator) { + val lp = _view.layoutParams + lp.height = animation.animatedValue as Int + _view.layoutParams = lp + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/ui/other/anim/ViewHolderAnimator.kt b/app/src/main/java/com/navinfo/omqs/ui/other/anim/ViewHolderAnimator.kt new file mode 100644 index 00000000..9bda09ab --- /dev/null +++ b/app/src/main/java/com/navinfo/omqs/ui/other/anim/ViewHolderAnimator.kt @@ -0,0 +1,60 @@ +package com.navinfo.omqs.ui.other.anim + +import android.animation.Animator +import android.animation.AnimatorListenerAdapter +import android.view.View +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView + +object ViewHolderAnimator { + fun ofItemViewHeight(holder: RecyclerView.ViewHolder): Animator? { + val parent = holder.itemView.parent as View + ?: throw IllegalStateException("Cannot animate the layout of a view that has no parent") + val start = holder.itemView.measuredHeight + holder.itemView.measure( + View.MeasureSpec.makeMeasureSpec( + parent.measuredWidth, + View.MeasureSpec.AT_MOST + ), View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED) + ) + val end = holder.itemView.measuredHeight + val animator = LayoutAnimator.ofHeight(holder.itemView, start, end) + animator!!.addListener(ViewHolderAnimatorListener(holder)) + animator.addListener( + LayoutParamsAnimatorListener( + holder.itemView, + ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.WRAP_CONTENT + ) + ) + return animator + } + + class ViewHolderAnimatorListener(private val _holder: RecyclerView.ViewHolder) : + AnimatorListenerAdapter() { + override fun onAnimationStart(animation: Animator) { + _holder.setIsRecyclable(false) + } + + override fun onAnimationEnd(animation: Animator) { + _holder.setIsRecyclable(true) + } + + override fun onAnimationCancel(animation: Animator) { + _holder.setIsRecyclable(true) + } + } + + class LayoutParamsAnimatorListener( + private val _view: View, + private val _paramsWidth: Int, + private val _paramsHeight: Int + ) : AnimatorListenerAdapter() { + override fun onAnimationEnd(animation: Animator) { + val params = _view.layoutParams + params.width = _paramsWidth + params.height = _paramsHeight + _view.layoutParams = params + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/ui/widget/SignUtil.kt b/app/src/main/java/com/navinfo/omqs/ui/widget/SignUtil.kt index 7be5686c..f0b50afc 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/widget/SignUtil.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/widget/SignUtil.kt @@ -6,8 +6,10 @@ import com.navinfo.omqs.R import com.navinfo.omqs.bean.RoadNameBean import com.navinfo.omqs.bean.SignBean import com.navinfo.omqs.ui.activity.map.LaneInfoItem -import com.navinfo.omqs.ui.fragment.signMoreInfo.ElectronicEyeMoreInfoAdapterItem +import com.navinfo.omqs.ui.fragment.signMoreInfo.LaneBoundaryItem +import com.navinfo.omqs.ui.fragment.signMoreInfo.TwoItemAdapterItem import org.json.JSONArray +import org.json.JSONObject import java.lang.reflect.Field class SignUtil { @@ -104,6 +106,96 @@ class SignUtil { } } + /** + * 获取车道边界类型详细信息 + */ + + fun getLaneBoundaryTypeInfo(renderEntity: RenderEntity): List { + val list = mutableListOf() + list.add(LaneBoundaryItem("车道边界线ID", "${renderEntity.properties["featurePid"]}", null)) + val type = renderEntity.properties["boundaryType"] + if (type != null) { + val typeStr = when (type.toInt()) { + 0 -> "不应用" + 1 -> "无标线无可区分边界" + 2 -> "标线" + 3 -> "路牙" + 4 -> "护栏" + 5 -> "墙" + 6 -> "铺设路面边缘" + 7 -> "虚拟三角岛" + 8 -> "障碍物" + 9 -> "杆状障碍物" + else -> "" + } + list.add(LaneBoundaryItem("边界类型", typeStr, null)) + } + try { + val shapeList = renderEntity.properties["shapeList"] + if (shapeList != null && shapeList != "" && shapeList != "null") { + val itemList = mutableListOf() + val jsonArray = JSONArray(shapeList) + for (i in 0 until jsonArray.length()) { + val arrayObject: JSONObject = jsonArray[i] as JSONObject + var markType = when (arrayObject.getInt("markType")) { + 0 -> "其他" + 1 -> "实线" + 2 -> "虚线" + 4 -> "Gore(导流区边线)" + 5 -> "铺设路面边缘(标线)" + 6 -> "菱形减速标线" + 7 -> "可变导向标线" + 8 -> "短粗虚线" + else -> "" + } + itemList.add(TwoItemAdapterItem("车道标线类型", markType)) + + val markColor = when (arrayObject.getInt("markColor")) { + 0 -> "不应用" + 1 -> "白色" + 2 -> "黄色" + 6 -> "蓝色" + 7 -> "绿色" + 9 -> "其他" + else -> "" + } + itemList.add(TwoItemAdapterItem("车道标线颜色", markColor)) + itemList.add( + TwoItemAdapterItem( + "车道标线宽度(mm)", + "${arrayObject.getInt("markWidth")}" + ) + ) + + val markMaterial = when (arrayObject.getInt("markMaterial")) { + 0 -> "不应用" + 1 -> "油漆" + 2 -> "突起" + 3 -> "油漆和突起" + else -> "" + } + itemList.add(TwoItemAdapterItem("车道标线材质", markMaterial)) + itemList.add( + TwoItemAdapterItem( + "横向偏移(mm)", + "${arrayObject.getInt("lateralOffset")}" + ) + ) + list.add( + LaneBoundaryItem( + "车道标线序号${arrayObject.getInt("markSeqNum")}", + null, + itemList + ) + ) + } + } + } catch (e: Exception) { + + } + return list + } + /** * 右下角文字 */ @@ -121,26 +213,26 @@ class SignUtil { /** * 条件点限速更多信息 */ - fun getConditionLimitMoreInfoText(renderEntity: RenderEntity): List { + fun getConditionLimitMoreInfoText(renderEntity: RenderEntity): List { - val list = mutableListOf() + val list = mutableListOf() val maxSpeed = renderEntity.properties["maxSpeed"] if (maxSpeed != null) { list.add( - ElectronicEyeMoreInfoAdapterItem( + TwoItemAdapterItem( title = "最高限速值(km/h)", text = maxSpeed ) ) } list.add( - ElectronicEyeMoreInfoAdapterItem( + TwoItemAdapterItem( title = "限速条件", text = getConditionLimitText(renderEntity) ) ) val carType = renderEntity.properties["vehicleType"] if (carType != "0") { list.add( - ElectronicEyeMoreInfoAdapterItem( + TwoItemAdapterItem( title = "车辆类型", text = getElectronicEyeVehicleType(carType!!.toInt()) ) ) @@ -148,7 +240,7 @@ class SignUtil { val time = renderEntity.properties["validPeriod"] if (time?.isNotEmpty() == true) { list.add( - ElectronicEyeMoreInfoAdapterItem( + TwoItemAdapterItem( title = "时间段", text = time ) ) @@ -241,16 +333,16 @@ class SignUtil { /** * 常规点限速更多信息 */ - fun getSpeedLimitMoreInfoText(renderEntity: RenderEntity): List { + fun getSpeedLimitMoreInfoText(renderEntity: RenderEntity): List { - val list = mutableListOf() + val list = mutableListOf() list.add( - ElectronicEyeMoreInfoAdapterItem( + TwoItemAdapterItem( title = "最高限速值(km/h)", text = getSpeedLimitMaxText(renderEntity) ) ) list.add( - ElectronicEyeMoreInfoAdapterItem( + TwoItemAdapterItem( title = "最低限速值(km/h)", text = getSpeedLimitMinText(renderEntity) ) ) @@ -406,13 +498,6 @@ class SignUtil { return stringBuffer.toString() } - /** - * 获取车道边界线详细信息 - */ - fun getLaneBoundaryInfo(data:RenderEntity){ - - } - /** * 获取道路名列表 */ @@ -466,21 +551,49 @@ class SignUtil { return isMore } + /** + * 可变点限速详细信息 + */ + fun getChangeLimitSpeedInfo(renderEntity: RenderEntity): List { + val list = mutableListOf() + val kindCode = renderEntity.properties["location"] + if (kindCode != null) { + when (kindCode.toInt()) { + 1 -> list.add( + TwoItemAdapterItem( + title = "标牌位置", text = "左" + ) + ) + 2 -> list.add( + TwoItemAdapterItem( + title = "标牌位置", text = "右" + ) + ) + 3 -> list.add( + TwoItemAdapterItem( + title = "标牌位置", text = "上" + ) + ) + } + } + return list + + } /** * 获取电子眼详细信息 */ - fun getElectronicEyeMoreInfo(renderEntity: RenderEntity): List { - val list = mutableListOf() + fun getElectronicEyeMoreInfo(renderEntity: RenderEntity): List { + val list = mutableListOf() val kindCode = renderEntity.properties["kind"]!!.toInt() - val kind = ElectronicEyeMoreInfoAdapterItem( + val kind = TwoItemAdapterItem( title = "电子眼类型", text = getElectronicEyeKindType(kindCode) ) list.add(kind) when (kindCode) { 1, 2, 3, 4, 5, 6, 20, 21 -> { list.add( - ElectronicEyeMoreInfoAdapterItem( + TwoItemAdapterItem( title = "限速值(km/h)", text = renderEntity.properties["speedLimit"].toString() ) @@ -490,23 +603,22 @@ class SignUtil { val carType = renderEntity.properties["vehicleType"] if (carType != null && carType != "0") { list.add( - ElectronicEyeMoreInfoAdapterItem( - title = "车辆类型", - text = getElectronicEyeVehicleType(carType.toInt()) + TwoItemAdapterItem( + title = "车辆类型", text = getElectronicEyeVehicleType(carType.toInt()) ) ) } val time = renderEntity.properties["validPeriod"] if (time?.isNotEmpty() == true) { list.add( - ElectronicEyeMoreInfoAdapterItem( + TwoItemAdapterItem( title = "时间段", text = time ) ) } if (kindCode == 20 || kindCode == 21) { list.add( - ElectronicEyeMoreInfoAdapterItem( + TwoItemAdapterItem( title = "区间测试配对", text = renderEntity.properties["pairEleceyeId"].toString() ) ) diff --git a/app/src/main/res/drawable-v24/baseline_arrow_drop_down_24.xml b/app/src/main/res/drawable-v24/baseline_arrow_drop_down_24.xml new file mode 100644 index 00000000..3dbfedba --- /dev/null +++ b/app/src/main/res/drawable-v24/baseline_arrow_drop_down_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable-v24/baseline_arrow_left_24.xml b/app/src/main/res/drawable-v24/baseline_arrow_left_24.xml new file mode 100644 index 00000000..2f4e0f27 --- /dev/null +++ b/app/src/main/res/drawable-v24/baseline_arrow_left_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable-xxhdpi/measuring_tool_angle.png b/app/src/main/res/drawable-xxhdpi/measuring_tool_angle.png new file mode 100644 index 00000000..239603b0 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/measuring_tool_angle.png differ diff --git a/app/src/main/res/drawable-xxhdpi/measuring_tool_area.png b/app/src/main/res/drawable-xxhdpi/measuring_tool_area.png new file mode 100644 index 00000000..2ced646a Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/measuring_tool_area.png differ diff --git a/app/src/main/res/drawable-xxhdpi/measuring_tool_distance.png b/app/src/main/res/drawable-xxhdpi/measuring_tool_distance.png new file mode 100644 index 00000000..981e7809 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/measuring_tool_distance.png differ diff --git a/app/src/main/res/drawable-xxhdpi/measuring_tool_select_point.png b/app/src/main/res/drawable-xxhdpi/measuring_tool_select_point.png new file mode 100644 index 00000000..ba5f1d1c Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/measuring_tool_select_point.png differ diff --git a/app/src/main/res/drawable/shape_rect_transparent_blue_6dp_bg.xml b/app/src/main/res/drawable/shape_rect_transparent_blue_6dp_bg.xml new file mode 100644 index 00000000..3be9fc1b --- /dev/null +++ b/app/src/main/res/drawable/shape_rect_transparent_blue_6dp_bg.xml @@ -0,0 +1,14 @@ + + + + + + + + + diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index ecc86505..84a4c048 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -90,7 +90,7 @@ + + + + + + + + + diff --git a/app/src/main/res/layout/adapter_electronic_eye.xml b/app/src/main/res/layout/adapter_two_item.xml similarity index 90% rename from app/src/main/res/layout/adapter_electronic_eye.xml rename to app/src/main/res/layout/adapter_two_item.xml index ecd17bd3..d6fe4328 100644 --- a/app/src/main/res/layout/adapter_electronic_eye.xml +++ b/app/src/main/res/layout/adapter_two_item.xml @@ -5,7 +5,7 @@ android:layout_height="wrap_content" android:paddingTop="5dp" android:paddingBottom="5dp" - tools:context="com.navinfo.omqs.ui.fragment.signMoreInfo.ElectronicEyeInfoAdapter"> + tools:context="com.navinfo.omqs.ui.fragment.signMoreInfo.TwoItemAdapter"> \ No newline at end of file diff --git a/app/src/main/res/layout/main_measuring_tool.xml b/app/src/main/res/layout/main_measuring_tool.xml new file mode 100644 index 00000000..38140f92 --- /dev/null +++ b/app/src/main/res/layout/main_measuring_tool.xml @@ -0,0 +1,119 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/menu/personal_center_menu.xml b/app/src/main/res/menu/personal_center_menu.xml index 9e3aa4ae..6df98415 100644 --- a/app/src/main/res/menu/personal_center_menu.xml +++ b/app/src/main/res/menu/personal_center_menu.xml @@ -38,7 +38,7 @@ + android:title="版本:ONE_23QE4_V1.1.0_20230804_A" /> diff --git a/collect-library/src/main/assets/editormarker.xml b/collect-library/src/main/assets/editormarker.xml index fff26fcb..54fa63a9 100644 --- a/collect-library/src/main/assets/editormarker.xml +++ b/collect-library/src/main/assets/editormarker.xml @@ -1482,10 +1482,10 @@ - - - - + + + + @@ -1969,7 +1969,7 @@ - + @@ -1988,6 +1988,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/icon_2201_0.svg b/collect-library/src/main/assets/omdb/icon_2201_0.svg new file mode 100644 index 00000000..8dcf2ac1 --- /dev/null +++ b/collect-library/src/main/assets/omdb/icon_2201_0.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/collect-library/src/main/assets/omdb/icon_2201_1.svg b/collect-library/src/main/assets/omdb/icon_2201_1.svg new file mode 100644 index 00000000..c56a7a34 --- /dev/null +++ b/collect-library/src/main/assets/omdb/icon_2201_1.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/icon_2201_1_1.svg b/collect-library/src/main/assets/omdb/icon_2201_1_1.svg new file mode 100644 index 00000000..bea3afae --- /dev/null +++ b/collect-library/src/main/assets/omdb/icon_2201_1_1.svg @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/icon_2201_1_2.svg b/collect-library/src/main/assets/omdb/icon_2201_1_2.svg new file mode 100644 index 00000000..a9311650 --- /dev/null +++ b/collect-library/src/main/assets/omdb/icon_2201_1_2.svg @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/icon_2201_2_1.svg b/collect-library/src/main/assets/omdb/icon_2201_2_1.svg new file mode 100644 index 00000000..9f3bfdc5 --- /dev/null +++ b/collect-library/src/main/assets/omdb/icon_2201_2_1.svg @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/icon_2201_2_2.svg b/collect-library/src/main/assets/omdb/icon_2201_2_2.svg new file mode 100644 index 00000000..989c7966 --- /dev/null +++ b/collect-library/src/main/assets/omdb/icon_2201_2_2.svg @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/icon_2201_3_1.svg b/collect-library/src/main/assets/omdb/icon_2201_3_1.svg new file mode 100644 index 00000000..10a22c4d --- /dev/null +++ b/collect-library/src/main/assets/omdb/icon_2201_3_1.svg @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/icon_2201_3_2.svg b/collect-library/src/main/assets/omdb/icon_2201_3_2.svg new file mode 100644 index 00000000..0b103e24 --- /dev/null +++ b/collect-library/src/main/assets/omdb/icon_2201_3_2.svg @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/ttt.svg b/collect-library/src/main/assets/omdb/ttt.svg new file mode 100644 index 00000000..9c9c0bb8 --- /dev/null +++ b/collect-library/src/main/assets/omdb/ttt.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/java/com/navinfo/collect/library/data/entity/ReferenceEntity.kt b/collect-library/src/main/java/com/navinfo/collect/library/data/entity/ReferenceEntity.kt index 78fb98a7..60bc8056 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/data/entity/ReferenceEntity.kt +++ b/collect-library/src/main/java/com/navinfo/collect/library/data/entity/ReferenceEntity.kt @@ -1,6 +1,5 @@ package com.navinfo.collect.library.data.entity -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 @@ -8,9 +7,7 @@ import io.realm.RealmObject import io.realm.RealmSet import io.realm.annotations.Ignore import io.realm.annotations.PrimaryKey -import org.locationtech.jts.geom.Coordinate import org.locationtech.jts.geom.Geometry -import org.oscim.core.MercatorProjection import java.util.* /** @@ -26,6 +23,8 @@ open class ReferenceEntity() : RealmObject() { var zoomMin: Int = 18 //显示最小级别 var zoomMax: Int = 23 //显示最大级别 var taskId: Int = 0 //任务ID + var enable:Int = 0 // 默认0不是显示 1为渲染显示 + var geometry: String = "" // 要素渲染参考的geometry,该数据可能会在导入预处理环节被修改,原始geometry会保存在properties的geometry字段下 get() { wkt = GeometryTools.createGeometry(field) @@ -63,5 +62,4 @@ open class ReferenceEntity() : RealmObject() { constructor(name: String): this() { this.name = name } - } \ No newline at end of file diff --git a/collect-library/src/main/java/com/navinfo/collect/library/data/entity/RenderEntity.kt b/collect-library/src/main/java/com/navinfo/collect/library/data/entity/RenderEntity.kt index 2d2c0f81..49594be9 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/data/entity/RenderEntity.kt +++ b/collect-library/src/main/java/com/navinfo/collect/library/data/entity/RenderEntity.kt @@ -62,6 +62,7 @@ open class RenderEntity() : RealmObject(), Parcelable { var taskId: Int = 0 //任务ID var zoomMin: Int = 18 //显示最小级别 var zoomMax: Int = 23 //显示最大级别 + var enable:Int = 0 // 默认0不是显示 1为渲染显示 2为常显 constructor(name: String) : this() { this.name = name diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LayerManagerHandler.kt b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LayerManagerHandler.kt index eafd7dea..4e47ae87 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LayerManagerHandler.kt +++ b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LayerManagerHandler.kt @@ -24,7 +24,7 @@ import java.io.File */ class LayerManagerHandler(context: AppCompatActivity, mapView: NIMapView, tracePath: String) : BaseHandler(context, mapView) { - private var baseGroupLayer // 用于盛放所有基础底图的图层组,便于统一管理 + private var baseGroupLayer // 用于盛放所有基础底图的图层组,便于统一管理LabelTileLoaderHook : GroupLayer? = null private val mTracePath: String = tracePath @@ -216,11 +216,11 @@ class LayerManagerHandler(context: AppCompatActivity, mapView: NIMapView, traceP labelNiLocationLayer.isEnabled = false } - fun omdbLayersUpdate(){ -// omdbVectorTileLayer + fun omdbLayersClear(){ +// omdbVectorTileLayer. // omdbReferenceTileLayer. - omdbLabelLayer.update() - omdbReferenceLabelLayer.update() + omdbLabelLayer.clearLabels() + omdbReferenceLabelLayer.clearLabels() } } diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBDataDecoder.java b/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBDataDecoder.java index d7c54a2c..08146a9b 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBDataDecoder.java +++ b/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBDataDecoder.java @@ -71,12 +71,13 @@ public class OMDBDataDecoder extends TileDecoder { listResult.stream().iterator().forEachRemaining(new Consumer() { @Override public void accept(RenderEntity renderEntity) { + if(!(mapLevelrenderEntity.getZoomMax())){ Map properties= new HashMap<>(renderEntity.getProperties().size()); properties.putAll(renderEntity.getProperties()); parseGeometry(renderEntity.getTable(), renderEntity.getWkt(), properties); }else{ - Log.e("qj","render"+renderEntity.name+"=="+renderEntity.getZoomMin()+"==="+renderEntity.getZoomMax()); + Log.e("qj","render"+renderEntity.name+"=="+renderEntity.getZoomMin()+"==="+renderEntity.getZoomMax()+"==="+renderEntity.getEnable()); } } }); diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBReferenceDataSource.java b/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBReferenceDataSource.java index 652d9694..6b8d6c64 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBReferenceDataSource.java +++ b/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBReferenceDataSource.java @@ -1,6 +1,7 @@ package com.navinfo.collect.library.map.source; import android.os.Build; +import android.util.Log; import androidx.annotation.RequiresApi; @@ -29,27 +30,28 @@ public class OMDBReferenceDataSource implements ITileDataSource { @Override public void query(MapTile tile, ITileDataSink mapDataSink) { // 获取tile对应的坐标范围 - if (tile.zoomLevel>=Constant.OMDB_MIN_ZOOM&&tile.zoomLevel<=Constant.OVER_ZOOM) { - int m = Constant.OVER_ZOOM-tile.zoomLevel; - int xStart = (int)tile.tileX<= Constant.OMDB_MIN_ZOOM && tile.zoomLevel <= Constant.OVER_ZOOM) { + int m = Constant.OVER_ZOOM - tile.zoomLevel; + int xStart = (int) tile.tileX << m; + int xEnd = (int) ((tile.tileX + 1) << m); + int yStart = (int) tile.tileY << m; + int yEnd = (int) ((tile.tileY + 1) << m); + Log.e("jingo", Constant.TASK_ID + " " + xStart + " " + xEnd + " " + yStart + " " + yEnd); RealmQuery realmQuery = Realm.getDefaultInstance().where(ReferenceEntity.class) - .rawPredicate("tileX>="+xStart+" and tileX<="+xEnd+" and tileY>="+yStart+" and tileY<="+yEnd); + .rawPredicate("taskId=" + Constant.TASK_ID + " and tileX>=" + xStart + " and tileX<=" + xEnd + " and tileY>=" + yStart + " and tileY<=" + yEnd + " and enable>=1"); // 筛选不显示的数据 - if (Constant.HAD_LAYER_INVISIABLE_ARRAY!=null&&Constant.HAD_LAYER_INVISIABLE_ARRAY.length>0) { + if (Constant.HAD_LAYER_INVISIABLE_ARRAY != null && Constant.HAD_LAYER_INVISIABLE_ARRAY.length > 0) { realmQuery.beginGroup(); - for (String type: Constant.HAD_LAYER_INVISIABLE_ARRAY) { + for (String type : Constant.HAD_LAYER_INVISIABLE_ARRAY) { realmQuery.notEqualTo("table", type); } realmQuery.endGroup(); } List listResult = realmQuery/*.distinct("id")*/.findAll(); if (!listResult.isEmpty()) { - mThreadLocalDecoders.get().decode(tile.zoomLevel,tile, mapDataSink, listResult); + mThreadLocalDecoders.get().decode(tile.zoomLevel, tile, mapDataSink, listResult); } + Log.e("jingo",listResult.size() + "条数据"); mapDataSink.completed(QueryResult.SUCCESS); // Log.d("RealmDBTileDataSource", "tile:"+tile.getBoundingBox().toString()); } else { diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBTileDataSource.java b/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBTileDataSource.java index 1a0aea1c..0a37ab79 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBTileDataSource.java +++ b/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBTileDataSource.java @@ -38,8 +38,8 @@ public class OMDBTileDataSource implements ITileDataSource { int xEnd = (int) ((tile.tileX + 1) << m); int yStart = (int) tile.tileY << m; int yEnd = (int) ((tile.tileY + 1) << m); - - RealmQuery realmQuery = Realm.getDefaultInstance().where(RenderEntity.class).rawPredicate("tileX>=" + xStart + " and tileX<=" + xEnd + " and tileY>=" + yStart + " and tileY<=" + yEnd); + Log.e("jingo", Constant.TASK_ID + " " + xStart + " " + xEnd + " " + yStart + " " + yEnd); + RealmQuery realmQuery = Realm.getDefaultInstance().where(RenderEntity.class).rawPredicate("tileX>=" + xStart + " and tileX<=" + xEnd + " and tileY>=" + yStart + " and tileY<=" + yEnd + " and enable>=1"); // 筛选不显示的数据 if (Constant.HAD_LAYER_INVISIABLE_ARRAY != null && Constant.HAD_LAYER_INVISIABLE_ARRAY.length > 0) { realmQuery.beginGroup(); @@ -50,9 +50,10 @@ public class OMDBTileDataSource implements ITileDataSource { } List listResult = realmQuery/*.distinct("id")*/.findAll(); if (!listResult.isEmpty()) { - Log.e("qj","查询数据=="+listResult.size()+"==地图级别"+tile.zoomLevel); - mThreadLocalDecoders.get().decode(tile.zoomLevel,tile, mapDataSink, listResult); + Log.e("qj", "查询数据==" + listResult.size() + "==地图级别" + tile.zoomLevel); + mThreadLocalDecoders.get().decode(tile.zoomLevel, tile, mapDataSink, listResult); } + Log.e("jingo",listResult.size() + "条数据 主"); mapDataSink.completed(QueryResult.SUCCESS); // Log.d("RealmDBTileDataSource", "tile:"+tile.getBoundingBox().toString()); } else { diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/source/RealmDBTileDataSource.java b/collect-library/src/main/java/com/navinfo/collect/library/map/source/RealmDBTileDataSource.java index 5c91adc8..fe5546b3 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/map/source/RealmDBTileDataSource.java +++ b/collect-library/src/main/java/com/navinfo/collect/library/map/source/RealmDBTileDataSource.java @@ -41,7 +41,7 @@ public class RealmDBTileDataSource implements ITileDataSource { int yStart = (int)tile.tileY< realmQuery = Realm.getInstance(RealmUtils.getInstance().getRealmConfiguration()).where(GeometryFeatureEntity.class) + RealmQuery realmQuery = Realm.getDefaultInstance().where(GeometryFeatureEntity.class) .rawPredicate("tileX>="+xStart+" and tileX<="+xEnd+" and tileY>="+yStart+" and tileY<="+yEnd); // 筛选不显示的数据 if (Constant.HAD_LAYER_INVISIABLE_ARRAY!=null&&Constant.HAD_LAYER_INVISIABLE_ARRAY.length>0) { diff --git a/collect-library/src/main/java/com/navinfo/collect/library/system/Constant.java b/collect-library/src/main/java/com/navinfo/collect/library/system/Constant.java index 3f45cf37..18f6d962 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/system/Constant.java +++ b/collect-library/src/main/java/com/navinfo/collect/library/system/Constant.java @@ -17,10 +17,10 @@ public class Constant { public static String MAP_PATH = Environment.getExternalStorageDirectory() + "/map/"; public static void setVisibleTypeMap(Map visibleTypeMap) { - Map HD_LAYER_VISIABLE_MAP= new HashMap<>(); + Map HD_LAYER_VISIABLE_MAP = new HashMap<>(); // 只记录不显示的类型 - if (visibleTypeMap!=null&&!visibleTypeMap.isEmpty()) { - for (Map.Entry e:visibleTypeMap.entrySet()) { + if (visibleTypeMap != null && !visibleTypeMap.isEmpty()) { + for (Map.Entry e : visibleTypeMap.entrySet()) { if (!e.getValue()) { HD_LAYER_VISIABLE_MAP.put(e.getKey(), e.getValue()); } @@ -28,11 +28,13 @@ public class Constant { } HAD_LAYER_INVISIABLE_ARRAY = HD_LAYER_VISIABLE_MAP.keySet().toArray(new String[HD_LAYER_VISIABLE_MAP.keySet().size()]); } + public static String[] HAD_LAYER_INVISIABLE_ARRAY; public static final int OVER_ZOOM = 22; public static final int MAX_ZOOM = 22; public static final int OMDB_MIN_ZOOM = 16; + public static int TASK_ID = -1; /** * 服务器地址 */ diff --git a/vtm b/vtm index c2434827..0b3c9340 160000 --- a/vtm +++ b/vtm @@ -1 +1 @@ -Subproject commit c2434827f1201a16a2120db777cd0aa8209c4682 +Subproject commit 0b3c93403228c41607d8f2d40a9c0f6a86403c34