Conflicts:
	vtm
This commit is contained in:
qiji4215 2023-06-28 11:14:12 +08:00
commit b9d85640aa
82 changed files with 2165 additions and 431 deletions

View File

@ -101,7 +101,12 @@
"code": 4001, "code": 4001,
"name": "路口", "name": "路口",
"transformer": [ "transformer": [
{
"k": "geometry",
"v": "~",
"klib": "geometry",
"vlib": "generateIntersectionReference()"
}
] ]
}, },
"4002": { "4002": {
@ -170,7 +175,31 @@
"k": "geometry", "k": "geometry",
"v": "~", "v": "~",
"klib": "geometry", "klib": "geometry",
"vlib": "generateRestrictionRerference()" "vlib": "checkCircleRoad()"
},
{
"k": "geometry",
"v": "~",
"klib": "geometry",
"vlib": "translateBack()"
},
{
"k": "geometry",
"v": "~",
"klib": "geometry",
"vlib": "translateRight()"
},
{
"k": "geometry",
"v": "~",
"klib": "geometry",
"vlib": "generateS2EReferenceLine()"
},
{
"k": "geometry",
"v": "~",
"klib": "geometry",
"vlib": "generateDirectReferenceLine()"
} }
] ]
}, },
@ -179,7 +208,30 @@
"code": 4010, "code": 4010,
"name": "电子眼", "name": "电子眼",
"transformer": [ "transformer": [
{
"k": "geometry",
"v": "~",
"klib": "geometry",
"vlib": "translateRight()"
},
{
"k": "geometry",
"v": "~",
"klib": "geometry",
"vlib": "generateS2EReferenceLine()"
},
{
"k": "geometry",
"v": "~",
"klib": "geometry",
"vlib": "generateDirectReferenceLine(direct=3)"
},
{
"k": "geometry",
"v": "~",
"klib": "geometry",
"vlib": "generateElectronName()"
}
] ]
}, },
"4022": { "4022": {
@ -187,12 +239,6 @@
"code": 4022, "code": 4022,
"name": "交通灯", "name": "交通灯",
"transformer": [ "transformer": [
{
"k": "angle",
"v": "~",
"klib": "angle",
"vlib": "0"
}
] ]
}, },
"4601":{ "4601":{
@ -200,7 +246,24 @@
"code": 4601, "code": 4601,
"name": "车信", "name": "车信",
"transformer": [ "transformer": [
{
"k": "geometry",
"v": "~",
"klib": "geometry",
"vlib": "translateBack()"
},
{
"k": "geometry",
"v": "~",
"klib": "geometry",
"vlib": "translateRight()"
},
{
"k": "geometry",
"v": "~",
"klib": "geometry",
"vlib": "generateDirectReferenceLine()"
}
] ]
}, },
"5001":{ "5001":{

View File

@ -2,6 +2,8 @@ package com.navinfo.omqs.bean
import com.navinfo.collect.library.data.entity.RenderEntity import com.navinfo.collect.library.data.entity.RenderEntity
import com.navinfo.omqs.db.ImportPreProcess import com.navinfo.omqs.db.ImportPreProcess
import kotlin.reflect.KFunction
import kotlin.reflect.KParameter
import kotlin.reflect.full.declaredMemberFunctions import kotlin.reflect.full.declaredMemberFunctions
@ -11,7 +13,7 @@ class ImportConfig {
var checked : Boolean = true var checked : Boolean = true
val preProcess: ImportPreProcess = ImportPreProcess() val preProcess: ImportPreProcess = ImportPreProcess()
fun transformProperties(renderEntity: RenderEntity): RenderEntity { fun transformProperties(renderEntity: RenderEntity): RenderEntity? {
val transformList = tableMap[renderEntity.code.toString()]?.transformer val transformList = tableMap[renderEntity.code.toString()]?.transformer
if (transformList.isNullOrEmpty()) { if (transformList.isNullOrEmpty()) {
return renderEntity return renderEntity
@ -29,23 +31,66 @@ class ImportConfig {
// 如果key和value都为空说明当前数据需要增加一个新字段 // 如果key和value都为空说明当前数据需要增加一个新字段
if (key.isNullOrEmpty()&&value.isNullOrEmpty()&&!renderEntity.properties.containsKey(keylib)) { if (key.isNullOrEmpty()&&value.isNullOrEmpty()&&!renderEntity.properties.containsKey(keylib)) {
renderEntity.properties[keylib] = valuelib renderEntity.properties[keylib] = valuelib
continue
} }
// 开始解析key和value并对数据进行匹配 // 开始解析key和value并对数据进行匹配
m@ for (k in processKeyOrValue(key)) { m@ for (k in processKeyOrValue(key)) {
if (renderEntity.properties.containsKey(k)) { // json配置的key可以匹配到数据 if (renderEntity.properties.containsKey(k)) { // json配置的key可以匹配到数据
for (v in processKeyOrValue(value)) { for (v in processKeyOrValue(value)) {
if ("~" == v ) { // ~符可以匹配任意元素 if ("~" == v ) { // ~符可以匹配任意元素
if (valuelib.endsWith("()")) { // 以()结尾说明该value配置是一个function需要通过反射调用指定方法 if (valuelib.endsWith(")")) { // 以()结尾说明该value配置是一个function需要通过反射调用指定方法
val method = preProcess::class.declaredMemberFunctions.first { it.name == valuelib.replace("()", "") } // 获取方法名
method.call(preProcess, renderEntity) val methodName = valuelib.substringBefore("(")
// 获取参数
val params: List<String> = valuelib.substringAfter("(").substringBefore(")").split(",").filter{ it.isNotEmpty() }.map { it.trim() }
val method = preProcess::class.members.filter { it.name == methodName }.first() as KFunction<*>
val methodParams = method.parameters
val callByParams = mutableMapOf<KParameter, Any>(
methodParams[0] to preProcess,
methodParams[1] to renderEntity
)
for ((index, value) in params.withIndex()) {
// 前2个参数确定为对象本身和RenderEntity因此自定义参数从index+2开始设置
if (methodParams.size>index+2) {
callByParams[methodParams[index+2]] = value
}
}
when(val result = method.callBy(callByParams)) { // 如果方法返回的数据类型是boolean且返回为false则该数据不处理
is Boolean ->
if (!result) {
return null
}
}
} else { } else {
renderEntity.properties[keylib] = valuelib renderEntity.properties[keylib] = valuelib
} }
break@m break@m
} else if (renderEntity.properties[k] == v) { // 完全匹配 } else if (renderEntity.properties[k] == v) { // 完全匹配
if (valuelib.endsWith("()")) { // 以()结尾说明该value配置是一个function需要通过反射调用指定方法 if (valuelib.endsWith(")")) { // 以()结尾说明该value配置是一个function需要通过反射调用指定方法
val method = preProcess::class.declaredMemberFunctions.first { it.name == valuelib.replace("()", "") } // 获取方法名
method.call(preProcess, renderEntity) val methodName = valuelib.substringBefore("(")
// 获取参数
val params: List<String> = valuelib.substringAfter("(").substringBefore(")").split(",").filter{ it.isNotEmpty() }.map { it.trim() }
val method = preProcess::class.members.filter { it.name == methodName }.first() as KFunction<*>
val methodParams = method.parameters
val callByParams = mutableMapOf<KParameter, Any>(
methodParams[0] to preProcess,
methodParams[1] to renderEntity
)
for ((index, value) in params.withIndex()) {
// 前2个参数确定为对象本身和RenderEntity因此自定义参数从index+2开始设置
if (methodParams.size>index+2) {
callByParams[methodParams[index+2]] = value
}
}
when(val result = method.callBy(callByParams)) {
is Boolean ->
if (!result) {
return null
}
}
} else { } else {
renderEntity.properties[keylib] = valuelib renderEntity.properties[keylib] = valuelib
} }

View File

@ -0,0 +1,49 @@
package com.navinfo.omqs.bean
data class RoadNameBean(
/**
* 道路名称
*/
val name: String = "",
/**
* 0 普通
* 1 立交桥名连接路
* 2 立交桥名 主路
* 3 风景线路
* 5 隧道
* 6 虚拟名称
*/
val type: Int = 0,
/**
* 1 不论名称分类是官方名别名还是曾用名都统一从1开始递增
* 2 若取第一官方名时需判断名称分类 [nameClass]=="官方名"[seqNum] 最小的
*/
val seqNum: Int = 1,
/**
* 1 官方名
* 2 别名
* 3 曾用名
*/
val nameClass: Int = 1,
) {
fun getNameClassStr(): String {
when (nameClass) {
1 -> return "官方名"
2 -> return "别名"
3 -> return "曾用名"
}
return ""
}
fun getTypeStr(): String {
when (type) {
0 -> return "普通"
1 -> return "立交桥名(连接路)"
2 -> return "立交桥名(主路)"
3 -> return "风景线路"
5 -> return "隧道"
6 -> return "虚拟名称"
}
return ""
}
}

View File

@ -1,6 +1,7 @@
package com.navinfo.omqs.bean package com.navinfo.omqs.bean
import android.os.Parcelable import android.os.Parcelable
import com.navinfo.collect.library.data.entity.RenderEntity
import kotlinx.parcelize.Parcelize import kotlinx.parcelize.Parcelize
@Parcelize @Parcelize
@ -11,20 +12,14 @@ data class SignBean(
val distance: Int = 0, val distance: Int = 0,
//左上图标中的文字 //左上图标中的文字
val iconText: String = "", val iconText: String = "",
//绑定的要素id
val elementId: String = "",
//绑定的linkid //绑定的linkid
val linkId: String, val linkId: String,
//坐标
val geometry: String,
//名称 //名称
val name: String, val name: String,
//是否要展示详细信息
val isMoreInfo: Boolean = false,
//底部右侧文字 //底部右侧文字
val bottomRightText: String = "", val bottomRightText: String = "",
//要素code类型 //捕捉数据
val elementCode: Int, val renderEntity: RenderEntity
//需要展示更多的内容
val moreText: String = "",
//左上角信息
val topRightText: String = ""
) : Parcelable ) : Parcelable

View File

@ -0,0 +1,43 @@
package com.navinfo.omqs.db
class Code2NameMap {
val electronEyeKindMap = mapOf(
1 to "超高",
2 to "超低",
3 to "移动",
4 to "可变",
5 to "分车道",
6 to "分车种",
7 to "车灯",
8 to "占车道",
9 to "过路口",
10 to "闯红灯",
11 to "路况",
12 to "单行",
13 to "非机动",
14 to "出入口",
15 to "公交",
16 to "禁转",
17 to "掉头",
18 to "应急",
19 to "标线",
20 to "区间S",
21 to "区间E",
22 to "停车",
23 to "尾号",
24 to "环保",
25 to "安全带",
26 to "手机",
27 to "行人",
28 to "禁令",
29 to "鸣笛",
30 to "年检",
31 to "尾气",
32 to "交通灯",
33 to "专用",
34 to "标线",
35 to "违章",
36 to "卡车",
37 to "限时长",
)
}

View File

@ -146,7 +146,7 @@ class ImportOMDBHelper @AssistedInject constructor(
it.name == currentConfig.table it.name == currentConfig.table
} }
val listResult = mutableListOf<Map<String, Any>>() val listResult = mutableListOf<RenderEntity>()
currentConfig?.let { currentConfig?.let {
val list = FileIOUtils.readFile2List(txtFile, "UTF-8") val list = FileIOUtils.readFile2List(txtFile, "UTF-8")
Log.d("ImportOMDBHelper", "开始解析:${txtFile?.name}") Log.d("ImportOMDBHelper", "开始解析:${txtFile?.name}")
@ -159,33 +159,38 @@ class ImportOMDBHelper @AssistedInject constructor(
map["qi_table"] = currentConfig.table map["qi_table"] = currentConfig.table
map["qi_name"] = currentConfig.name 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
listResult.add(map)
// 先查询这个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()
// 其他数据插入到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())
}
}
listResult.add(renderEntity)
// 对renderEntity做预处理后再保存
val resultEntity = importConfig.transformProperties(renderEntity)
if (resultEntity!=null) {
Realm.getDefaultInstance().insert(renderEntity)
}
} }
} }
} }
for (map in listResult) { // 每一个map就是Realm的一条数据
// 先查询这个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()
// 其他数据插入到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())
}
}
// 对renderEntity做预处理后再保存
importConfig.transformProperties(renderEntity)
Realm.getDefaultInstance().copyToRealm(renderEntity)
}
// 1个文件发送一次flow流 // 1个文件发送一次flow流
emit("${index + 1}/${importConfig.tableMap.size}") emit("${index + 1}/${importConfig.tableMap.size}")
// 如果当前解析的是OMDB_RD_LINK数据将其缓存在预处理类中以便后续处理其他要素时使用
if (currentConfig.table == "OMDB_RD_LINK") {
importConfig.preProcess.cacheRdLink = listResult.associateBy { it.properties["linkPid"] }
}
} }
Realm.getDefaultInstance().commitTransaction() Realm.getDefaultInstance().commitTransaction()
} catch (e: Exception) { } catch (e: Exception) {

View File

@ -0,0 +1,5 @@
package com.navinfo.omqs.db
class ImportPreCacheData {
}

View File

@ -1,5 +1,6 @@
package com.navinfo.omqs.db package com.navinfo.omqs.db
import android.util.Log
import com.navinfo.collect.library.data.entity.ReferenceEntity import com.navinfo.collect.library.data.entity.ReferenceEntity
import com.navinfo.collect.library.data.entity.RenderEntity import com.navinfo.collect.library.data.entity.RenderEntity
import com.navinfo.collect.library.utils.GeometryTools import com.navinfo.collect.library.utils.GeometryTools
@ -13,29 +14,55 @@ import org.oscim.core.GeoPoint
class ImportPreProcess { class ImportPreProcess {
/** val code2NameMap = Code2NameMap()
* 预处理所需要的函数 lateinit var cacheRdLink: Map<String?, RenderEntity>
* */
fun foo(renderEntity: RenderEntity): RenderEntity {
println("foo")
renderEntity.properties["foo"] = "bar"
return renderEntity
}
fun checkCircleRoad(renderEntity: RenderEntity): Boolean {
val linkInId = renderEntity.properties["linkIn"]
val linkOutId = renderEntity.properties["linkOut"]
// 根据linkIn和linkOut获取对应的link数据
val linkInEntity = cacheRdLink[linkInId]
val linkOutEntity = cacheRdLink[linkOutId]
Log.d("checkCircleRoad", "LinkInEntity: ${linkInId}- ${linkInEntity?.properties?.get("snodePid")}LinkOutEntity: ${linkOutId}- ${linkOutEntity?.properties?.get("enodePid")}")
// 查询linkIn的sNode和linkOut的eNode是否相同如果相同认为数据是环形路口返回false
if (linkInEntity!=null&&linkOutEntity!=null) {
if (linkInEntity.properties["snodePid"] == linkOutEntity.properties["enodePid"] || linkInEntity.properties["enodePid"] == linkOutEntity.properties["snodePid"]
|| linkInEntity.properties["snodePid"] == linkOutEntity.properties["snodePid"]|| linkInEntity.properties["enodePid"] == linkOutEntity.properties["enodePid"])
return false
}
return true
}
/** /**
* 计算指定数据指定方向的坐标 * 计算指定数据指定方向的坐标
* @param direction 判断当前数据是否为逆向给定的应该是一个a=b的表达式a为对应的properties的keyb为对应的值
* */ * */
fun translateRight(renderEntity: RenderEntity): RenderEntity { fun translateRight(renderEntity: RenderEntity, direction: String = "") {
// 获取当前renderEntity的geometry // 获取当前renderEntity的geometry
val geometry = renderEntity.wkt val geometry = renderEntity.wkt
var radian = 0.0 // geometry的角度如果是点获取angle如果是线获取最后两个点的方向 var radian = 0.0 // geometry的角度如果是点获取angle如果是线获取最后两个点的方向
var point = Coordinate(geometry?.coordinate) var point = Coordinate(geometry?.coordinate)
if (Geometry.TYPENAME_POINT == geometry?.geometryType) { var isReverse = false // 是否为逆向
val angle = if(renderEntity?.properties?.get("angle") == null) 0.0 else renderEntity?.properties?.get("angle")?.toDouble()!! if (direction.isNotEmpty()) {
val paramDirections = direction.split("=")
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()!!
if (isReverse) {
angle += 180
}
// angle角度为与正北方向的顺时针夹角将其转换为与X轴正方向的逆时针夹角即为正东方向的夹角
angle=(450-angle)%360
radian = Math.toRadians(angle) radian = Math.toRadians(angle)
} else if (Geometry.TYPENAME_LINESTRING == geometry?.geometryType) { } else if (Geometry.TYPENAME_LINESTRING == geometry?.geometryType) {
val p1: Coordinate = geometry.coordinates.get(geometry.coordinates.size - 2) var coordinates = geometry.coordinates
val p2: Coordinate = geometry.coordinates.get(geometry.coordinates.size - 1) if (isReverse) {
coordinates = coordinates.reversedArray()
}
val p1: Coordinate = coordinates.get(coordinates.size - 2)
val p2: Coordinate = coordinates.get(coordinates.size - 1)
// 计算线段的方向 // 计算线段的方向
radian = Angle.angle(p1, p2) radian = Angle.angle(p1, p2)
point = p2 point = p2
@ -52,46 +79,130 @@ class ImportPreProcess {
// 将这个点记录在数据中 // 将这个点记录在数据中
val geometryTranslate: Geometry = GeometryTools.createGeometry(doubleArrayOf(coord.x, coord.y)) val geometryTranslate: Geometry = GeometryTools.createGeometry(doubleArrayOf(coord.x, coord.y))
renderEntity.geometry = geometryTranslate.toString() renderEntity.geometry = geometryTranslate.toString()
return renderEntity
} }
/** /**
* 将要素按照点位角度的垂直方向右移5米并生成一个按照垂直角度指向方向的线段用以显示有方向的图标 * 向方向对应的反方向偏移
* */ * */
fun translateRightWithAngle(renderEntity: RenderEntity): RenderEntity { fun translateBack(renderEntity: RenderEntity, direction: String = "") {
// 获取当前renderEntity的geometry // 获取当前renderEntity的geometry
val geometry = renderEntity.wkt 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()) {
isReverse = true;
}
}
var radian = 0.0 // geometry的角度如果是点获取angle如果是线获取最后两个点的方向 var radian = 0.0 // geometry的角度如果是点获取angle如果是线获取最后两个点的方向
var point = Coordinate(geometry?.coordinate) var point = Coordinate(geometry?.coordinate)
if (Geometry.TYPENAME_POINT == geometry?.geometryType) { 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()!!
angle-=90 if (isReverse) {
angle += 180
}
// angle角度为与正北方向的顺时针夹角将其转换为与X轴正方向的逆时针夹角即为正东方向的夹角
angle=(450-angle)%360
radian = Math.toRadians(angle) radian = Math.toRadians(angle)
} else if (Geometry.TYPENAME_LINESTRING == geometry?.geometryType) { } else if (Geometry.TYPENAME_LINESTRING == geometry?.geometryType) {
val p1: Coordinate = geometry.coordinates.get(geometry.coordinates.size - 2) var coordinates = geometry.coordinates
val p2: Coordinate = geometry.coordinates.get(geometry.coordinates.size - 1) if (isReverse) {
coordinates = coordinates.reversedArray()
}
val p1: Coordinate = coordinates.get(coordinates.size - 2)
val p2: Coordinate = coordinates.get(coordinates.size - 1)
// 计算线段的方向 // 计算线段的方向
radian = Angle.angle(p1, p2) radian = Angle.angle(p1, p2)
point = p2 point = p2
} }
// 根据角度计算偏移距离 // 计算偏移距离
val dx: Double = GeometryTools.convertDistanceToDegree(3.0, geometry?.coordinate?.y!!) * Math.cos(radian) val dx: Double = GeometryTools.convertDistanceToDegree(3.0, geometry?.coordinate?.y!!) * Math.cos(radian)
val dy: Double = GeometryTools.convertDistanceToDegree(3.0, geometry?.coordinate?.y!!) * Math.sin(radian) val dy: Double = GeometryTools.convertDistanceToDegree(3.0, geometry?.coordinate?.y!!) * Math.sin(radian)
// 计算偏移后的点 // 计算偏移后的点
// val coordMid = val coord =
// Coordinate(point.getX() + dy, point.getY() - dx) Coordinate(point.getX() - dx, point.getY() - dy)
// 计算指定距离外与当前位置成90度夹角的点位
val pointStart = GeoPoint(point.getY() - dx, point.getX() + dy)
// val pointStart = GeoPoint(pointMid.latitude-dy, pointMid.longitude-dx)
val pointEnd = GeoPoint(pointStart.latitude- dx, pointStart.longitude+ dy)
// 将这个线记录在数据中 // 将这个点记录在数据中
val geometryTranslate: Geometry = GeometryTools.createLineString(listOf(pointStart, pointEnd)) val geometryTranslate: Geometry = GeometryTools.createGeometry(doubleArrayOf(coord.x, coord.y))
renderEntity.geometry = geometryTranslate.toString() renderEntity.geometry = geometryTranslate.toString()
return renderEntity }
/**
* 生成偏移后数据的起终点参考线
* */
fun generateS2EReferenceLine(renderEntity: RenderEntity) {
// 获取当前renderEntity的geometry该坐标为偏移后坐标即为终点
val translateGeometry = renderEntity.wkt
val startGeometry = GeometryTools.createGeometry(renderEntity.properties["geometry"])
val pointEnd = translateGeometry!!.coordinates[translateGeometry.numPoints-1] // 获取这个geometry对应的结束点坐标
val pointStart = startGeometry!!.coordinates[startGeometry.numPoints-1] // 获取这个geometry对应的结束点坐标
// 将这个起终点的线记录在数据中
val startEndReference = ReferenceEntity()
startEndReference.renderEntityId = renderEntity.id
startEndReference.name = "${renderEntity.name}参考线"
startEndReference.table = renderEntity.table
// 起终点坐标组成的线
startEndReference.geometry = GeometryTools.createLineString(arrayOf<Coordinate>(pointStart, pointEnd)).toString()
startEndReference.properties["qi_table"] = renderEntity.table
startEndReference.properties["type"] = "s_2_e"
Realm.getDefaultInstance().insert(startEndReference)
}
/**
* 生成与对应方向相同的方向线用以绘制方向箭头
* */
fun generateDirectReferenceLine(renderEntity: RenderEntity, direction: 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()) {
isReverse = true;
}
}
var radian = 0.0 // geometry的角度如果是点获取angle如果是线获取最后两个点的方向
var point = Coordinate(geometry?.coordinate)
if (Geometry.TYPENAME_POINT == geometry?.geometryType) {
point = Coordinate(geometry?.coordinate)
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
radian = Math.toRadians(angle)
} else if (Geometry.TYPENAME_LINESTRING == geometry?.geometryType) {
var coordinates = geometry.coordinates
if (isReverse) {
coordinates = coordinates.reversedArray()
}
val p1: Coordinate = coordinates.get(coordinates.size - 2)
val p2: Coordinate = coordinates.get(coordinates.size - 1)
// 计算线段的方向
radian = Angle.angle(p1, p2)
point = p2
}
// 计算偏移距离
val dx: Double = GeometryTools.convertDistanceToDegree(3.0, geometry?.coordinate?.y!!) * Math.cos(radian)
val dy: Double = GeometryTools.convertDistanceToDegree(3.0, geometry?.coordinate?.y!!) * Math.sin(radian)
val coorEnd = Coordinate(point.getX() + dx, point.getY() + dy)
val angleReference = ReferenceEntity()
angleReference.renderEntityId = renderEntity.id
angleReference.name = "${renderEntity.name}参考方向"
angleReference.table = renderEntity.table
// 与原有方向指向平行的线
angleReference.geometry = GeometryTools.createLineString(arrayOf(point, coorEnd)).toString()
angleReference.properties["qi_table"] = renderEntity.table
angleReference.properties["type"] = "angle"
Realm.getDefaultInstance().insert(angleReference)
} }
fun addAngleFromGeometry(renderEntity: RenderEntity): String { fun addAngleFromGeometry(renderEntity: RenderEntity): String {
@ -143,54 +254,11 @@ class ImportPreProcess {
} }
} }
/** /**
* 自动生成普通交限的参考数据 * 生成默认道路名数据
* */ * */
fun generateRestrictionRerference(renderEntity: RenderEntity) {
// 获取当前renderEntity的geometry
val geometry = renderEntity.wkt
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()!!
radian = Math.toRadians(angle)
}
// 计算偏移距离
val dx: Double = GeometryTools.convertDistanceToDegree(3.0, geometry?.coordinate?.y!!) * Math.sin(radian)
val dy: Double = GeometryTools.convertDistanceToDegree(3.0, geometry?.coordinate?.y!!) * Math.cos(radian)
// 计算偏移后的点
val pointTranS =
GeoPoint(point.getY() - dx, point.getX() + dy) // 向右偏移的点
// 计算与原有方向平行的终点坐标
val pointTranE = GeoPoint(pointTranS.latitude + dy, pointTranS.longitude + dx)
renderEntity.geometry = GeometryTools.createGeometry(pointTranS).toString()
// 将这个点记录在数据中
val startEndReference = ReferenceEntity()
startEndReference.renderEntityId = renderEntity.id
startEndReference.name = "普通交限参考线"
startEndReference.table = renderEntity.table
// 起终点坐标组成的线
startEndReference.geometry = GeometryTools.createLineString(listOf(GeoPoint(point.y, point.x), pointTranS)).toString()
startEndReference.properties["qi_table"] = renderEntity.table
startEndReference.properties["type"] = "s_2_e"
Realm.getDefaultInstance().insert(startEndReference)
val angleReference = ReferenceEntity()
angleReference.renderEntityId = renderEntity.id
angleReference.name = "普通交限参考方向"
angleReference.table = renderEntity.table
// 与原有方向指向平行的线
angleReference.geometry = GeometryTools.createLineString(listOf(pointTranS, pointTranE)).toString()
angleReference.properties["qi_table"] = renderEntity.table
angleReference.properties["type"] = "angle"
Realm.getDefaultInstance().insert(angleReference)
}
fun generateRoadName(renderEntity: RenderEntity) { fun generateRoadName(renderEntity: RenderEntity) {
// LinkName的真正名称数据是保存在properties的shapeList中的因此需要解析shapeList数据 // LinkName的真正名称数据是保存在properties的shapeList中的因此需要解析shapeList数据
var shape :JSONObject? = null var shape :JSONObject? = null
@ -217,4 +285,39 @@ class ImportPreProcess {
renderEntity.properties["name"] = "" renderEntity.properties["name"] = ""
} }
} }
/**
* 生成电子眼对应的渲染名称
* */
fun generateElectronName(renderEntity: RenderEntity) {
// 解析电子眼的kind将其转换为渲染的简要名称
var shape :JSONObject? = null
if (renderEntity.properties.containsKey("kind")) {
renderEntity.properties["name"] = code2NameMap.electronEyeKindMap[renderEntity.properties["kind"].toString().toInt()]
} else {
renderEntity.properties["name"] = ""
}
}
/**
* 生成默认路口数据的参考数据
* */
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.geometry = GeometryTools.createGeometry(nodeJSONObject["geometry"].toString()).toString()
intersectionReference.properties["qi_table"] = renderEntity.table
intersectionReference.properties["type"] = "node"
Realm.getDefaultInstance().insert(intersectionReference)
}
}
}
} }

View File

@ -44,7 +44,7 @@ class RealmOperateHelper() {
) )
// 根据polygon查询相交的tile号 // 根据polygon查询相交的tile号
val tileXSet = mutableSetOf<Int>() val tileXSet = mutableSetOf<Int>()
tileXSet.toString()
GeometryToolsKt.getTileXByGeometry(polygon.toString(), tileXSet) GeometryToolsKt.getTileXByGeometry(polygon.toString(), tileXSet)
val tileYSet = mutableSetOf<Int>() val tileYSet = mutableSetOf<Int>()
GeometryToolsKt.getTileYByGeometry(polygon.toString(), tileYSet) GeometryToolsKt.getTileYByGeometry(polygon.toString(), tileYSet)

View File

@ -31,6 +31,7 @@ import com.navinfo.omqs.ui.activity.BaseActivity
import com.navinfo.omqs.ui.fragment.console.ConsoleFragment import com.navinfo.omqs.ui.fragment.console.ConsoleFragment
import com.navinfo.omqs.ui.fragment.offlinemap.OfflineMapFragment import com.navinfo.omqs.ui.fragment.offlinemap.OfflineMapFragment
import com.navinfo.omqs.ui.fragment.qsrecordlist.QsRecordListFragment import com.navinfo.omqs.ui.fragment.qsrecordlist.QsRecordListFragment
import com.navinfo.omqs.ui.fragment.signMoreInfo.SignMoreInfoFragment
import com.navinfo.omqs.ui.fragment.tasklist.TaskManagerFragment import com.navinfo.omqs.ui.fragment.tasklist.TaskManagerFragment
import com.navinfo.omqs.ui.widget.RecyclerViewSpacesItemDecoration import com.navinfo.omqs.ui.widget.RecyclerViewSpacesItemDecoration
import com.navinfo.omqs.util.FlowEventBus import com.navinfo.omqs.util.FlowEventBus
@ -56,10 +57,11 @@ class MainActivity : BaseActivity() {
*/ */
private var leftFragment: Fragment? = null private var leftFragment: Fragment? = null
/** /**
* 是否开启右侧面板 * 是否开启右侧面板
*/ */
var switchFragment = false private var switchFragment = false
/** /**
* 检测是否含有tts插件 * 检测是否含有tts插件
@ -88,6 +90,7 @@ class MainActivity : BaseActivity() {
*/ */
private val signAdapter by lazy { private val signAdapter by lazy {
SignAdapter(object : OnSignAdapterClickListener { SignAdapter(object : OnSignAdapterClickListener {
//点击看板进去问题反馈面板
override fun onItemClick(signBean: SignBean) { override fun onItemClick(signBean: SignBean) {
rightController.currentDestination?.let { rightController.currentDestination?.let {
if (it.id == R.id.RightEmptyFragment) { if (it.id == R.id.RightEmptyFragment) {
@ -99,14 +102,15 @@ class MainActivity : BaseActivity() {
} }
} }
//点击详细信息
override fun onMoreInfoClick(selectTag: String, tag: String, signBean: SignBean) { override fun onMoreInfoClick(selectTag: String, tag: String, signBean: SignBean) {
if (binding.mainActivitySignMoreInfoGroup.visibility != View.VISIBLE || selectTag != tag) { viewModel.showSignMoreInfo(signBean.renderEntity)
binding.mainActivitySignMoreInfoGroup.visibility = View.VISIBLE val fragment =
binding.mainActivitySignMoreInfoTitle.text = signBean.name supportFragmentManager.findFragmentById(R.id.main_activity_sign_more_info_fragment)
binding.mainActivitySignMoreInfoText1.text = signBean.bottomRightText if (fragment == null) {
binding.mainActivitySignMoreInfoText2.text = signBean.moreText supportFragmentManager.beginTransaction()
} else { .replace(R.id.main_activity_sign_more_info_fragment, SignMoreInfoFragment())
binding.mainActivitySignMoreInfoGroup.visibility = View.GONE .commit()
} }
} }
@ -120,10 +124,6 @@ class MainActivity : BaseActivity() {
} }
} }
} }
override fun onHideMoreInfoView() {
binding.mainActivitySignMoreInfoGroup.visibility = View.GONE
}
}) })
} }
@ -182,12 +182,12 @@ class MainActivity : BaseActivity() {
} }
v?.onTouchEvent(event) ?: true v?.onTouchEvent(event) ?: true
} }
//捕捉列表变化回调
viewModel.liveDataQsRecordIdList.observe(this) { viewModel.liveDataQsRecordIdList.observe(this) {
//处理页面跳转 //处理页面跳转
viewModel.navigationRightFragment(this, it) viewModel.navigationRightFragment(this, it)
} }
//右上角菜单是否被点击
viewModel.liveDataMenuState.observe(this) { viewModel.liveDataMenuState.observe(this) {
binding.mainActivityMenu.isSelected = it binding.mainActivityMenu.isSelected = it
if (it == true) { if (it == true) {
@ -196,6 +196,17 @@ class MainActivity : BaseActivity() {
binding.mainActivityMenuGroup.visibility = View.INVISIBLE binding.mainActivityMenuGroup.visibility = View.INVISIBLE
} }
} }
//道路绑定,名称变化
viewModel.liveDataRoadName.observe(this) {
if (it != null) {
binding.mainActivityRoadName.text = it.properties["name"]
if (binding.mainActivityRoadName.visibility != View.VISIBLE) binding.mainActivityRoadName.visibility =
View.VISIBLE
} else {
if (binding.mainActivityRoadName.visibility != View.GONE) binding.mainActivityRoadName.visibility =
View.GONE
}
}
//道路属性面板 //道路属性面板
binding.mainActivityTopSignRecyclerview.layoutManager = LinearLayoutManager( binding.mainActivityTopSignRecyclerview.layoutManager = LinearLayoutManager(
@ -226,15 +237,14 @@ class MainActivity : BaseActivity() {
viewModel.liveDataTopSignList.observe(this) { viewModel.liveDataTopSignList.observe(this) {
topSignAdapter.refreshData(it) topSignAdapter.refreshData(it)
} }
//监听地图中点变化 //监听地图中点变化
viewModel.liveDataCenterPoint.observe(this) { viewModel.liveDataCenterPoint.observe(this) {
Log.e("qj", "${it.longitude}")
try { try {
if (it != null && it.longitude != null && it.latitude != null) { if (it != null && it.longitude != null && it.latitude != null) {
binding.mainActivityGeometry.text = "经纬度:${ binding.mainActivityGeometry.text = "经纬度:${
BigDecimal(it.longitude).setScale( BigDecimal(it.longitude).setScale(
7, 7, RoundingMode.HALF_UP
RoundingMode.HALF_UP
) )
},${BigDecimal(it.latitude).setScale(7, RoundingMode.HALF_UP)}" },${BigDecimal(it.latitude).setScale(7, RoundingMode.HALF_UP)}"
} }
@ -243,6 +253,16 @@ class MainActivity : BaseActivity() {
} }
} }
viewModel.liveDataSignMoreInfo.observe(this){
val fragment =
supportFragmentManager.findFragmentById(R.id.main_activity_sign_more_info_fragment)
if (fragment == null) {
supportFragmentManager.beginTransaction()
.replace(R.id.main_activity_sign_more_info_fragment, SignMoreInfoFragment())
.commit()
}
}
lifecycleScope.launch { lifecycleScope.launch {
// 初始化地图图层控制接收器 // 初始化地图图层控制接收器
FlowEventBus.subscribe<List<ImportConfig>>( FlowEventBus.subscribe<List<ImportConfig>>(
@ -473,8 +493,7 @@ class MainActivity : BaseActivity() {
} }
leftFragment = TaskManagerFragment { leftFragment = TaskManagerFragment {
binding.mainActivityLeftFragment.visibility = View.GONE binding.mainActivityLeftFragment.visibility = View.GONE
supportFragmentManager.beginTransaction() supportFragmentManager.beginTransaction().remove(leftFragment!!).commit()
.remove(leftFragment!!).commit()
leftFragment = null leftFragment = null
null null
} }
@ -494,8 +513,7 @@ class MainActivity : BaseActivity() {
} }
leftFragment = QsRecordListFragment { leftFragment = QsRecordListFragment {
binding.mainActivityLeftFragment.visibility = View.GONE binding.mainActivityLeftFragment.visibility = View.GONE
supportFragmentManager.beginTransaction() supportFragmentManager.beginTransaction().remove(leftFragment!!).commit()
.remove(leftFragment!!).commit()
leftFragment = null leftFragment = null
null null
} }
@ -522,8 +540,7 @@ class MainActivity : BaseActivity() {
} }
leftFragment = OfflineMapFragment { leftFragment = OfflineMapFragment {
binding.mainActivityLeftFragment.visibility = View.GONE binding.mainActivityLeftFragment.visibility = View.GONE
supportFragmentManager.beginTransaction() supportFragmentManager.beginTransaction().remove(leftFragment!!).commit()
.remove(leftFragment!!).commit()
leftFragment = null leftFragment = null
null null
} }
@ -531,4 +548,13 @@ class MainActivity : BaseActivity() {
.replace(R.id.main_activity_left_fragment, leftFragment!!).commit() .replace(R.id.main_activity_left_fragment, leftFragment!!).commit()
} }
} }
/**
* 打开道路名称属性看板选择的道路在viewmodel里记录不用
*/
fun openRoadNameFragment() {
if (viewModel.liveDataRoadName.value != null) {
viewModel.showSignMoreInfo(viewModel.liveDataRoadName.value!!)
}
}
} }

View File

@ -31,6 +31,7 @@ import com.navinfo.collect.library.utils.GeometryToolsKt
import com.navinfo.omqs.Constant import com.navinfo.omqs.Constant
import com.navinfo.omqs.R import com.navinfo.omqs.R
import com.navinfo.omqs.bean.ImportConfig import com.navinfo.omqs.bean.ImportConfig
import com.navinfo.omqs.bean.RoadNameBean
import com.navinfo.omqs.bean.SignBean import com.navinfo.omqs.bean.SignBean
import com.navinfo.omqs.db.RealmOperateHelper import com.navinfo.omqs.db.RealmOperateHelper
import com.navinfo.omqs.ui.dialog.CommonDialog import com.navinfo.omqs.ui.dialog.CommonDialog
@ -76,6 +77,14 @@ class MainViewModel @Inject constructor(
//顶部看板数据 //顶部看板数据
val liveDataTopSignList = MutableLiveData<List<SignBean>>() val liveDataTopSignList = MutableLiveData<List<SignBean>>()
//道路名
val liveDataRoadName = MutableLiveData<RenderEntity?>()
/**
* 当前选中的要展示的详细信息的要素
*/
val liveDataSignMoreInfo = MutableLiveData<RenderEntity>()
// var testPoint = GeoPoint(0, 0) // var testPoint = GeoPoint(0, 0)
//uuid标识用于记录轨迹组 //uuid标识用于记录轨迹组
@ -93,6 +102,7 @@ class MainViewModel @Inject constructor(
var menuState: Boolean = false var menuState: Boolean = false
val liveDataMenuState = MutableLiveData<Boolean>() val liveDataMenuState = MutableLiveData<Boolean>()
val liveDataCenterPoint = MutableLiveData<MapPosition>() val liveDataCenterPoint = MutableLiveData<MapPosition>()
@ -107,8 +117,8 @@ class MainViewModel @Inject constructor(
init { init {
mapController.mMapView.vtmMap.events.bind(Map.UpdateListener { e, mapPosition -> mapController.mMapView.vtmMap.events.bind(Map.UpdateListener { e, mapPosition ->
when (e) { when (e) {
Map.SCALE_EVENT, Map.MOVE_EVENT, Map.ROTATE_EVENT -> Map.SCALE_EVENT, Map.MOVE_EVENT, Map.ROTATE_EVENT -> liveDataCenterPoint.value =
liveDataCenterPoint.value = mapPosition mapPosition
} }
}) })
@ -213,6 +223,7 @@ class MainViewModel @Inject constructor(
val linkList = realmOperateHelper.queryLink( val linkList = realmOperateHelper.queryLink(
point = point, point = point,
) )
var hisRoadName = false
if (linkList.isNotEmpty()) { if (linkList.isNotEmpty()) {
//看板数据 //看板数据
val signList = mutableListOf<SignBean>() val signList = mutableListOf<SignBean>()
@ -225,11 +236,17 @@ class MainViewModel @Inject constructor(
if (linkIdCache != linkId) { if (linkIdCache != linkId) {
Log.e("jingo", "捕捉到的linkid $linkId ${link.geometry}")
mapController.lineHandler.showLine(link.geometry) mapController.lineHandler.showLine(link.geometry)
linkId?.let { linkId?.let {
var elementList = realmOperateHelper.queryLinkByLinkPid(it) var elementList = realmOperateHelper.queryLinkByLinkPid(it)
for (element in elementList) { for (element in elementList) {
if (element.code == 2011) {
hisRoadName = true
liveDataRoadName.postValue(element)
continue
}
val distance = GeometryTools.distanceToDouble( val distance = GeometryTools.distanceToDouble(
point, GeometryTools.createGeoPoint(element.geometry) point, GeometryTools.createGeoPoint(element.geometry)
) )
@ -238,20 +255,18 @@ class MainViewModel @Inject constructor(
iconId = SignUtil.getSignIcon(element), iconId = SignUtil.getSignIcon(element),
iconText = SignUtil.getSignIconText(element), iconText = SignUtil.getSignIconText(element),
distance = distance.toInt(), distance = distance.toInt(),
elementId = element.id,
linkId = linkId, linkId = linkId,
geometry = element.geometry,
name = SignUtil.getSignNameText(element), name = SignUtil.getSignNameText(element),
bottomRightText = SignUtil.getSignBottomRightText(element), bottomRightText = SignUtil.getSignBottomRightText(element),
elementCode = element.code, renderEntity = element,
moreText = SignUtil.getMoreInfoText(element) isMoreInfo = SignUtil.isMoreInfo(element)
) )
Log.e("jingo", "捕捉到的数据code ${element.code}")
when (element.code) { when (element.code) {
2002, 2008, 2010, 2041 -> topSignList.add( 2002, 2008, 2010, 2041 -> topSignList.add(
signBean signBean
) )
4002, 4003, 4004, 4022 -> signList.add( 4002, 4003, 4004, 4010, 4022, 4601 -> signList.add(
signBean signBean
) )
} }
@ -260,33 +275,26 @@ class MainViewModel @Inject constructor(
val realm = Realm.getDefaultInstance() val realm = Realm.getDefaultInstance()
val entity = realm.where(RenderEntity::class.java) val entity = realm.where(RenderEntity::class.java)
.equalTo("table", "OMDB_RESTRICTION") .equalTo("table", "OMDB_RESTRICTION").and().equalTo(
.and() "properties['linkIn']", it
.equalTo(
"properties['linkIn']",
it
).findFirst() ).findFirst()
if (entity != null) { if (entity != null) {
val outLink = entity.properties["linkOut"] val outLink = entity.properties["linkOut"]
val linkOutEntity = realm.where(RenderEntity::class.java) val linkOutEntity = realm.where(RenderEntity::class.java)
.equalTo("table", "OMDB_RD_LINK") .equalTo("table", "OMDB_RD_LINK").and().equalTo(
.and()
.equalTo(
"properties['${RenderEntity.Companion.LinkTable.linkPid}']", "properties['${RenderEntity.Companion.LinkTable.linkPid}']",
outLink outLink
).findFirst() ).findFirst()
if (linkOutEntity != null) { if (linkOutEntity != null) {
mapController.lineHandler.linksLayer.addLine( mapController.lineHandler.linksLayer.addLine(
linkOutEntity.geometry, linkOutEntity.geometry, 0x7DFF0000
0x7DFF0000
) )
Log.e("jingo", "捕捉到的linkid $outLink ${linkOutEntity.geometry}")
} }
} }
} }
liveDataTopSignList.postValue(topSignList.distinctBy { it.elementCode }) liveDataTopSignList.postValue(topSignList.distinctBy { it.distance })
liveDataSignList.postValue(signList.distinctBy { it.elementCode }) liveDataSignList.postValue(signList.sortedBy { it.distance })
val speechText = SignUtil.getRoadSpeechText(topSignList) val speechText = SignUtil.getRoadSpeechText(topSignList)
withContext(Dispatchers.Main) { withContext(Dispatchers.Main) {
speakMode?.speakText(speechText) speakMode?.speakText(speechText)
@ -297,6 +305,10 @@ class MainViewModel @Inject constructor(
mapController.lineHandler.removeLine() mapController.lineHandler.removeLine()
linkIdCache = "" linkIdCache = ""
} }
//如果没有捕捉到道路名
if (!hisRoadName) {
liveDataRoadName.postValue(null)
}
} }
} }
@ -488,8 +500,19 @@ class MainViewModel @Inject constructor(
} }
} }
/**
* 是否开启了线选择
*/
fun isSelectRoad(): Boolean { fun isSelectRoad(): Boolean {
return bSelectRoad return bSelectRoad
} }
/**
* 要展示的要素详细信息
*/
fun showSignMoreInfo(data: RenderEntity) {
liveDataSignMoreInfo.value = data
}
} }

View File

@ -1,63 +1,133 @@
package com.navinfo.omqs.ui.activity.map package com.navinfo.omqs.ui.activity.map
import android.graphics.PorterDuff
import android.graphics.PorterDuffColorFilter
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.ImageView
import com.navinfo.omqs.R import com.navinfo.omqs.R
import com.navinfo.omqs.bean.SignBean import com.navinfo.omqs.bean.SignBean
import com.navinfo.omqs.databinding.AdapterSignBinding import com.navinfo.omqs.databinding.AdapterSignBinding
import com.navinfo.omqs.databinding.AdapterSignLaneinfoBinding
import com.navinfo.omqs.ui.other.BaseRecyclerViewAdapter import com.navinfo.omqs.ui.other.BaseRecyclerViewAdapter
import com.navinfo.omqs.ui.other.BaseViewHolder import com.navinfo.omqs.ui.other.BaseViewHolder
import com.navinfo.omqs.ui.widget.SignUtil
interface OnSignAdapterClickListener { interface OnSignAdapterClickListener {
fun onItemClick(signBean: SignBean) fun onItemClick(signBean: SignBean)
fun onMoreInfoClick(selectTag: String, tag: String, signBean: SignBean) fun onMoreInfoClick(selectTag: String, tag: String, signBean: SignBean)
fun onErrorClick(signBean: SignBean) fun onErrorClick(signBean: SignBean)
fun onHideMoreInfoView()
} }
data class LaneInfoItem(val id: Int, val type: Int)
class SignAdapter(private var listener: OnSignAdapterClickListener?) : class SignAdapter(private var listener: OnSignAdapterClickListener?) :
BaseRecyclerViewAdapter<SignBean>() { BaseRecyclerViewAdapter<SignBean>() {
/** /**
* 选中的详细信息按钮的tag标签 * 选中的详细信息按钮的tag标签
*/ */
private var selectMoreInfoTag: String = "" private var selectMoreInfoTag: String = ""
override fun getItemViewRes(position: Int): Int {
return R.layout.adapter_sign override fun getItemViewType(position: Int): Int {
if (data.isNotEmpty() && data[position].renderEntity.code == 4601) {
return 4601
}
return 0
} }
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseViewHolder { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseViewHolder {
val viewBinding = return if (viewType == 4601) {
AdapterSignBinding.inflate(LayoutInflater.from(parent.context), parent, false) val viewBinding =
return BaseViewHolder(viewBinding) AdapterSignLaneinfoBinding.inflate(
LayoutInflater.from(parent.context),
parent,
false
)
BaseViewHolder(viewBinding)
} else {
val viewBinding =
AdapterSignBinding.inflate(LayoutInflater.from(parent.context), parent, false)
BaseViewHolder(viewBinding)
}
} }
override fun onBindViewHolder(holder: BaseViewHolder, position: Int) { override fun onBindViewHolder(holder: BaseViewHolder, position: Int) {
val bd = holder.viewBinding as AdapterSignBinding val context = holder.viewBinding.root.context
val item = data[position] val item = data[position]
if (item.iconId != 0) bd.signMainIconBg.setImageResource(item.iconId) if (holder.viewBinding is AdapterSignBinding) {
bd.signMainIcon.text = item.iconText val bd = holder.viewBinding
bd.signBottomText.text = item.name
holder.tag = item.name + position
//点击错误按钮
bd.signMainFastError.setOnClickListener {
listener?.onErrorClick(item)
}
bd.signBottomRightText.text = item.bottomRightText
bd.root.setOnClickListener { if (item.iconId != 0) bd.signMainIconBg.setImageResource(item.iconId)
bd.signMainIcon.text = item.iconText
bd.signBottomText.text = item.name
//点击错误按钮
bd.signMainFastError.setOnClickListener {
listener?.onErrorClick(item)
}
bd.signBottomRightText.text = item.bottomRightText
if (item.isMoreInfo) {
bd.signMainInfo.visibility = View.VISIBLE
bd.signMainInfo.setOnClickListener {
listener?.onMoreInfoClick(selectMoreInfoTag, holder.tag, item)
selectMoreInfoTag = holder.tag
}
} else {
bd.signMainInfo.visibility = View.GONE
}
bd.signSecondIcon.text = ""
if (item.renderEntity.code == 4002) {
val minSpeed = SignUtil.getSpeedLimitMinText(item.renderEntity)
if (minSpeed != "0") {
bd.signSecondIcon.text = minSpeed
}
}
} else if (holder.viewBinding is AdapterSignLaneinfoBinding) {
val bd = holder.viewBinding
bd.signMoreIconsLayout.removeAllViews()
bd.signBottomText.text = item.name
bd.signBottomRightText.text = item.distance.toString()
val list = SignUtil.getLineInfoIcons(item.renderEntity)
val lineViewS = View(context)
lineViewS.layoutParams = ViewGroup.LayoutParams(24, 80)
lineViewS.background = context.getDrawable(R.drawable.shape_vertical_dashed_line)
bd.signMoreIconsLayout.addView(lineViewS, lineViewS.layoutParams)
for (i in list.indices) {
val laneInfo = list[i]
val imageView = ImageView(context)
val drawable = context.getDrawable(laneInfo.id)
var color = when (laneInfo.type) {
1 -> bd.root.resources.getColor(R.color.lane_info_1)
2 -> bd.root.resources.getColor(R.color.lane_info_2)
else -> bd.root.resources.getColor(R.color.white)
}
// 创建 PorterDuffColorFilter 对象
val colorFilter = PorterDuffColorFilter(color, PorterDuff.Mode.SRC_IN)
// 将 PorterDuffColorFilter 设置给 Drawable
drawable!!.colorFilter = colorFilter
// 将 Drawable 设置给 ImageView
imageView.background = drawable
// 将 ImageView 的颜色设置为红色
imageView.setColorFilter(color, PorterDuff.Mode.SRC_IN)
imageView.layoutParams = ViewGroup.LayoutParams(35, 100)
bd.signMoreIconsLayout.addView(imageView, imageView.layoutParams)
if (i < list.size - 1) {
val lineView = View(context)
lineView.layoutParams = ViewGroup.LayoutParams(24, 80)
lineView.background = context.getDrawable(R.drawable.shape_vertical_dashed_line)
bd.signMoreIconsLayout.addView(lineView, lineView.layoutParams)
}
}
val lineViewE = View(context)
lineViewE.layoutParams = ViewGroup.LayoutParams(24, 80)
lineViewE.background = context.getDrawable(R.drawable.shape_vertical_dashed_line)
bd.signMoreIconsLayout.addView(lineViewE, lineViewE.layoutParams)
}
holder.viewBinding.root.setOnClickListener {
listener?.onItemClick(item) listener?.onItemClick(item)
} }
if (item.moreText.isNotEmpty()) { holder.tag = item.name + position
bd.signMainInfo.visibility = View.VISIBLE
//点击更多信息按钮
bd.signMainInfo.setOnClickListener {
listener?.onMoreInfoClick(selectMoreInfoTag, holder.tag, item)
selectMoreInfoTag = holder.tag
}
} else bd.signMainInfo.visibility = View.GONE
} }
override fun refreshData(newData: List<SignBean>) { override fun refreshData(newData: List<SignBean>) {
@ -67,7 +137,6 @@ class SignAdapter(private var listener: OnSignAdapterClickListener?) :
return return
} }
} }
listener?.onHideMoreInfoView()
} }
} }

View File

@ -11,9 +11,6 @@ import com.navinfo.omqs.ui.other.BaseViewHolder
class TopSignAdapter(private var itemListener: ((Int, SignBean) -> Unit?)? = null) : class TopSignAdapter(private var itemListener: ((Int, SignBean) -> Unit?)? = null) :
BaseRecyclerViewAdapter<SignBean>() { BaseRecyclerViewAdapter<SignBean>() {
override fun getItemViewRes(position: Int): Int {
return R.layout.adapter_top_sign
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseViewHolder { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseViewHolder {
val viewBinding = val viewBinding =

View File

@ -1,13 +1,8 @@
package com.navinfo.omqs.ui.fragment package com.navinfo.omqs.ui.fragment
import android.os.Bundle import android.os.Bundle
import android.view.KeyEvent
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.activity.OnBackPressedCallback import androidx.activity.OnBackPressedCallback
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.navigation.fragment.findNavController
abstract class BaseFragment : Fragment() { abstract class BaseFragment : Fragment() {
// override fun onCreateView( // override fun onCreateView(
@ -49,8 +44,8 @@ abstract class BaseFragment : Fragment() {
// savedInstanceState: Bundle? // savedInstanceState: Bundle?
// ): View // ): View
fun onBackPressed(): Boolean{ open fun onBackPressed(): Boolean{
findNavController().navigateUp() // findNavController().navigateUp()
return true return true
} }

View File

@ -20,6 +20,7 @@ import com.navinfo.omqs.ui.fragment.BaseFragment
import com.navinfo.omqs.ui.other.shareViewModels import com.navinfo.omqs.ui.other.shareViewModels
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import androidx.navigation.findNavController import androidx.navigation.findNavController
import androidx.navigation.fragment.findNavController
import com.navinfo.omqs.ui.dialog.FirstDialog import com.navinfo.omqs.ui.dialog.FirstDialog
@AndroidEntryPoint @AndroidEntryPoint
@ -70,12 +71,12 @@ class EvaluationResultFragment : BaseFragment(), View.OnClickListener {
val mDialog = FirstDialog(context) val mDialog = FirstDialog(context)
mDialog.setTitle("提示?") mDialog.setTitle("提示?")
mDialog.setMessage("是否退出,请确认!") mDialog.setMessage("是否退出,请确认!")
mDialog.setPositiveButton("确定", object : FirstDialog.OnClickListener { mDialog.setPositiveButton(
override fun onClick(dialog: Dialog?, which: Int) { "确定"
mDialog.dismiss() ) { _, _ ->
onBackPressed() mDialog.dismiss()
} onBackPressed()
}) }
mDialog.setNegativeButton("取消", null) mDialog.setNegativeButton("取消", null)
mDialog.show() mDialog.show()
} }
@ -315,4 +316,9 @@ class EvaluationResultFragment : BaseFragment(), View.OnClickListener {
} }
} }
override fun onBackPressed(): Boolean {
findNavController().navigateUp()
return true
}
} }

View File

@ -137,7 +137,7 @@ class EvaluationResultViewModel @Inject constructor(
} }
} else { } else {
liveDataQsRecordBean.value?.run { liveDataQsRecordBean.value?.run {
elementId = bean.elementId elementId = bean.renderEntity.code.toString()
linkId = bean.linkId linkId = bean.linkId
if (linkId.isNotEmpty()) { if (linkId.isNotEmpty()) {
viewModelScope.launch { viewModelScope.launch {
@ -149,7 +149,7 @@ class EvaluationResultViewModel @Inject constructor(
} }
} }
} }
val point = GeometryTools.createGeoPoint(bean.geometry) val point = GeometryTools.createGeoPoint(bean.renderEntity.geometry)
this.geometry = GeometryTools.createGeometry(point).toText() this.geometry = GeometryTools.createGeometry(point).toText()
mapController.animationHandler.animationByLatLon(point.latitude, point.longitude) mapController.animationHandler.animationByLatLon(point.latitude, point.longitude)
mapController.markerHandle.addMarker(point, markerTitle) mapController.markerHandle.addMarker(point, markerTitle)
@ -198,7 +198,7 @@ class EvaluationResultViewModel @Inject constructor(
liveDataLeftTypeList.postValue(it) liveDataLeftTypeList.postValue(it)
if (bean != null) { if (bean != null) {
val classType2 = roomAppDatabase.getScProblemTypeDao() val classType2 = roomAppDatabase.getScProblemTypeDao()
.findClassTypeByCode(bean.elementCode) .findClassTypeByCode(bean.renderEntity.code)
if (classType2 != null) { if (classType2 != null) {
classType = classType2 classType = classType2
} }

View File

@ -13,9 +13,6 @@ class LeftAdapter(private var itemListener: ((Int, String) -> Unit?)? = null) :
BaseRecyclerViewAdapter<String>() { BaseRecyclerViewAdapter<String>() {
private var selectTitle = "" private var selectTitle = ""
override fun getItemViewRes(position: Int): Int {
return R.layout.text_item_select
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseViewHolder { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseViewHolder {
val viewBinding = val viewBinding =

View File

@ -13,9 +13,6 @@ class MiddleAdapter(private var itemListener: ((Int, String) -> Unit?)? = null)
BaseRecyclerViewAdapter<String>() { BaseRecyclerViewAdapter<String>() {
private var selectTitle = "" private var selectTitle = ""
override fun getItemViewRes(position: Int): Int {
return R.layout.text_item_select
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseViewHolder { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseViewHolder {
val viewBinding = val viewBinding =

View File

@ -11,9 +11,6 @@ class RightGroupHeaderAdapter(private var itemListener: ((Int, RightBean) -> Uni
BaseRecyclerViewAdapter<RightBean>() { BaseRecyclerViewAdapter<RightBean>() {
private var selectTitle = "" private var selectTitle = ""
private var groupTitleList = mutableListOf<String>() private var groupTitleList = mutableListOf<String>()
override fun getItemViewRes(position: Int): Int {
return R.layout.text_item_select2
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseViewHolder { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseViewHolder {
val viewBinding = val viewBinding =

View File

@ -224,10 +224,6 @@ class SoundtListAdapter(
} }
} }
override fun getItemViewRes(position: Int): Int {
return R.layout.adapter_sound_list
}
} }

View File

@ -131,10 +131,6 @@ class OfflineMapCityListAdapter(
} }
} }
} }
override fun getItemViewRes(position: Int): Int {
return R.layout.adapter_offline_map_city
}
} }

View File

@ -115,7 +115,7 @@ class PersonalCenterFragment(private var backListener: (() -> Unit?)? = null) :
viewModel.readRealmData() viewModel.readRealmData()
// 定位到指定位置 // 定位到指定位置
niMapController.mMapView.vtmMap.animator() niMapController.mMapView.vtmMap.animator()
.animateTo(GeoPoint( 39.80392140200183, 116.51446703352337 )) .animateTo(GeoPoint( 39.799624915997725, 116.51407667184905 ))
} }
// R.id.personal_center_menu_task_list -> { // R.id.personal_center_menu_task_list -> {
// findNavController().navigate(R.id.TaskManagerFragment) // findNavController().navigate(R.id.TaskManagerFragment)

View File

@ -58,9 +58,6 @@ class QsRecordListAdapter(
binding.qsRecordTime.text = qsRecordBean.checkTime binding.qsRecordTime.text = qsRecordBean.checkTime
} }
override fun getItemViewRes(position: Int): Int {
return R.layout.adapter_qs_record_list
}
// 提供set方法 // 提供set方法
fun setOnKotlinItemClickListener(itemClickListener: IKotlinItemClickListener) { fun setOnKotlinItemClickListener(itemClickListener: IKotlinItemClickListener) {

View File

@ -0,0 +1,30 @@
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.ui.other.BaseRecyclerViewAdapter
import com.navinfo.omqs.ui.other.BaseViewHolder
data class ElectronicEyeMoreInfoAdapterItem(
val title: String,
val text: String
)
class ElectronicEyeInfoAdapter : BaseRecyclerViewAdapter<ElectronicEyeMoreInfoAdapterItem>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseViewHolder {
val viewBinding =
AdapterElectronicEyeBinding.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 item = data[position]
binding.title.text = item.title
binding.text.text = item.text
}
}

View File

@ -0,0 +1,27 @@
package com.navinfo.omqs.ui.fragment.signMoreInfo
import android.view.LayoutInflater
import android.view.ViewGroup
import com.navinfo.omqs.R
import com.navinfo.omqs.bean.RoadNameBean
import com.navinfo.omqs.databinding.AdapterRoadNameBinding
import com.navinfo.omqs.ui.other.BaseRecyclerViewAdapter
import com.navinfo.omqs.ui.other.BaseViewHolder
class RoadNameInfoAdapter : BaseRecyclerViewAdapter<RoadNameBean>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseViewHolder {
val viewBinding =
AdapterRoadNameBinding.inflate(LayoutInflater.from(parent.context), parent, false)
return BaseViewHolder(viewBinding)
}
override fun onBindViewHolder(holder: BaseViewHolder, position: Int) {
val binding: AdapterRoadNameBinding =
holder.viewBinding as AdapterRoadNameBinding
val bean = data[position]
binding.title.text = bean.getNameClassStr()
binding.name.text = bean.name
binding.type.text = bean.getTypeStr()
}
}

View File

@ -0,0 +1,100 @@
package com.navinfo.omqs.ui.fragment.signMoreInfo
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.activityViewModels
import androidx.recyclerview.widget.LinearLayoutManager
import com.navinfo.omqs.R
import com.navinfo.omqs.databinding.FragmentSignInfoBinding
import com.navinfo.omqs.ui.activity.map.MainViewModel
import com.navinfo.omqs.ui.fragment.BaseFragment
import com.navinfo.omqs.ui.widget.SignUtil
class SignMoreInfoFragment : BaseFragment() {
private var _binding: FragmentSignInfoBinding? = null
private val binding get() = _binding!!
private val viewModel by activityViewModels<MainViewModel>()
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
): View {
_binding = FragmentSignInfoBinding.inflate(inflater, container, false)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val layoutManager = LinearLayoutManager(context)
//// 设置 RecyclerView 的固定大小,避免在滚动时重新计算视图大小和布局,提高性能
binding.signInfoRecyclerview.setHasFixedSize(true)
binding.signInfoRecyclerview.layoutManager = layoutManager
viewModel.liveDataSignMoreInfo.observe(viewLifecycleOwner) {
binding.signInfoTitle.text = it.name
val drawable = resources.getDrawable(R.drawable.icon_main_moreinfo_text_left, null);
drawable.setBounds(
0,
0,
drawable.minimumWidth,
drawable.minimumHeight
);//必须设置图片大小,否则不显示
binding.signInfoTitle.setCompoundDrawables(
drawable, null, null, null
)
when (it.code) {
//道路名
2011 -> {
val adapter = RoadNameInfoAdapter()
binding.signInfoRecyclerview.adapter = adapter
adapter.refreshData(SignUtil.getRoadNameList(it))
}
//常规点限速
4002->{
val adapter = ElectronicEyeInfoAdapter()
binding.signInfoRecyclerview.adapter = adapter
adapter.refreshData(SignUtil.getSpeedLimitMoreInfoText(it))
}
//条件点限速
4003 -> {
val adapter = ElectronicEyeInfoAdapter()
binding.signInfoRecyclerview.adapter = adapter
adapter.refreshData(SignUtil.getConditionLimitMoreInfoText(it))
}
//电子眼
4010
-> {
val drawable = resources.getDrawable(R.drawable.icon_electronic_eye_left, null);
drawable.setBounds(
0,
0,
drawable.minimumWidth,
drawable.minimumHeight
);//必须设置图片大小,否则不显示
binding.signInfoTitle.setCompoundDrawables(
drawable, null, null, null
)
val adapter = ElectronicEyeInfoAdapter()
binding.signInfoRecyclerview.adapter = adapter
adapter.refreshData(SignUtil.getElectronicEyeMoreInfo(it))
}
}
}
binding.signInfoCancel.setOnClickListener {
activity?.run {
supportFragmentManager.beginTransaction().remove(this@SignMoreInfoFragment)
.commit()
}
}
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
}

View File

@ -58,9 +58,6 @@ class TaskAdapter(
} }
} }
override fun getItemViewRes(position: Int): Int {
return R.layout.adapter_task
}
fun resetSelect() { fun resetSelect() {
selectPosition = -1 selectPosition = -1

View File

@ -282,10 +282,6 @@ class TaskListAdapter(
} }
} }
} }
override fun getItemViewRes(position: Int): Int {
return R.layout.adapter_task_list
}
} }

View File

@ -15,7 +15,8 @@ import dagger.hilt.android.AndroidEntryPoint
* 评测任务viewpager管理页面 * 评测任务viewpager管理页面
*/ */
@AndroidEntryPoint @AndroidEntryPoint
class TaskManagerFragment(private var backListener: ((TaskManagerFragment) -> Unit?)? = null) : BaseFragment() { class TaskManagerFragment(private var backListener: ((TaskManagerFragment) -> Unit?)? = null) :
BaseFragment() {
private var _binding: FragmentTaskManagerBinding? = null private var _binding: FragmentTaskManagerBinding? = null
private val binding get() = _binding!! private val binding get() = _binding!!

View File

@ -1,11 +1,6 @@
package com.navinfo.omqs.ui.other package com.navinfo.omqs.ui.other
import android.view.LayoutInflater
import android.view.View.OnClickListener
import android.view.ViewGroup
import androidx.databinding.DataBindingUtil
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import com.navinfo.omqs.R
/** /**
* RecyclerView 适配器基础类 * RecyclerView 适配器基础类
@ -27,10 +22,10 @@ abstract class BaseRecyclerViewAdapter<T>(var data: List<T> = listOf()) :
// ) // )
// } // }
abstract fun getItemViewRes(position: Int): Int // abstract fun getItemViewRes(position: Int): Int
//
override fun getItemViewType(position: Int): Int { open override fun getItemViewType(position: Int): Int {
return getItemViewRes(position) return 0
} }
override fun getItemCount(): Int { override fun getItemCount(): Int {

View File

@ -0,0 +1,54 @@
//package com.navinfo.omqs.ui.other
//
//import androidx.lifecycle.*
//
//val vMStoreMap = HashMap<String, VMStoreClass>()
//
//inline fun <reified VM : ViewModel> LifecycleOwner.shareViewModels(
// scopeName: String,
// factory: ViewModelProvider.Factory? = null
//): Lazy<VM> {
// val store: VMStoreClass
// if (vMStoreMap.keys.contains(scopeName)) {
// store = vMStoreMap[scopeName]!!
// } else {
// store = VMStoreClass()
// vMStoreMap[scopeName] = store
// }
// store.register(this)
// return ViewModelLazy(VM::class,
// { store.viewModelStore },
// { factory ?: ViewModelProvider.NewInstanceFactory() })
//}
//
//class VMStoreClass : ViewModelStoreOwner {
//
// private val bindTargets = ArrayList<LifecycleOwner>()
// private var vmStore: ViewModelStore? = null
//
// fun register(host: LifecycleOwner) {
// if (!bindTargets.contains(host)) {
// bindTargets.add(host)
// host.lifecycle.addObserver(object : LifecycleEventObserver {
// override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) {
// if (event == Lifecycle.Event.ON_DESTROY) {
// host.lifecycle.removeObserver(this)
// bindTargets.remove(host)
// if (bindTargets.isEmpty()) {//如果当前商店没有关联对象,则释放资源
// vMStoreMap.entries.find { it.value == this@VMStoreClass }?.also {
// vmStore?.clear()
// vMStoreMap.remove(it.key)
// }
// }
// }
// }
// })
// }
// }
//
// override fun getViewModelStore(): ViewModelStore {
// if (vmStore == null)
// vmStore = ViewModelStore()
// return vmStore!!
// }
//}

View File

@ -3,7 +3,12 @@ package com.navinfo.omqs.ui.widget
import android.util.Log import android.util.Log
import com.navinfo.collect.library.data.entity.RenderEntity import com.navinfo.collect.library.data.entity.RenderEntity
import com.navinfo.omqs.R import com.navinfo.omqs.R
import com.navinfo.omqs.bean.RoadNameBean
import com.navinfo.omqs.bean.SignBean import com.navinfo.omqs.bean.SignBean
import com.navinfo.omqs.ui.activity.map.LaneInfoItem
import com.navinfo.omqs.ui.fragment.signMoreInfo.ElectronicEyeMoreInfoAdapterItem
import org.json.JSONArray
import java.lang.reflect.Field
class SignUtil { class SignUtil {
companion object { companion object {
@ -22,7 +27,7 @@ class SignUtil {
//车道数 //车道数
2041 -> getLaneNumText(data) 2041 -> getLaneNumText(data)
//常规点限速,条件点限速 //常规点限速,条件点限速
4002, 4003 -> getSpeedLimitText(data) 4002, 4003 -> getSpeedLimitMaxText(data)
else -> "" else -> ""
} }
} }
@ -76,8 +81,12 @@ class SignUtil {
4004 -> "可变点限速" 4004 -> "可变点限速"
//普通交限 //普通交限
4006 -> "普通交限" 4006 -> "普通交限"
//电子眼
4010 -> "电子眼"
//交通灯 //交通灯
4022 -> "交通灯" 4022 -> "交通灯"
//交限
4601 -> "车信"
else -> "" else -> ""
} }
} }
@ -93,24 +102,45 @@ class SignUtil {
} }
} }
/**
* 更多信息展示文字
*/
fun getMoreInfoText(data: RenderEntity): String {
return when (data.code) {
//条件点限速
4003 -> getConditionLimitMoreInfoText(data)
else -> ""
}
}
/** /**
* 条件点限速更多信息 * 条件点限速更多信息
*/ */
private fun getConditionLimitMoreInfoText(data: RenderEntity): String { fun getConditionLimitMoreInfoText(renderEntity: RenderEntity): List<ElectronicEyeMoreInfoAdapterItem> {
return data.properties["validPeriod"].toString()
val list = mutableListOf<ElectronicEyeMoreInfoAdapterItem>()
val maxSpeed = renderEntity.properties["maxSpeed"]
if (maxSpeed != null) {
list.add(
ElectronicEyeMoreInfoAdapterItem(
title = "最高限速值(km/h)", text = maxSpeed
)
)
}
list.add(
ElectronicEyeMoreInfoAdapterItem(
title = "限速条件", text = getConditionLimitText(renderEntity)
)
)
val carType = renderEntity.properties["vehicleType"]
if (carType != "0") {
list.add(
ElectronicEyeMoreInfoAdapterItem(
title = "车辆类型", text = getElectronicEyeVehicleType(carType!!.toInt())
)
)
}
val time = renderEntity.properties["validPeriod"]
if (time?.isNotEmpty() == true) {
list.add(
ElectronicEyeMoreInfoAdapterItem(
title = "时间段", text = time
)
)
}
return list
} }
/** /**
* 条件点限速文字 * 条件点限速文字
*/ */
@ -160,21 +190,31 @@ class SignUtil {
/** /**
* 获取限速值文字 * 获取限速值文字
*/ */
private fun getSpeedLimitText(data: RenderEntity): String { private fun getSpeedLimitMaxText(data: RenderEntity): String {
try { try {
//限速标志 0 限速开始 1 限速解除 //限速标志 0 限速开始 1 限速解除
val maxSpeed = data.properties["maxSpeed"] val maxSpeed = data.properties["maxSpeed"]
val minSpeed = data.properties["minSpeed"] return maxSpeed.toString()
return if (maxSpeed != "0")
maxSpeed.toString()
else
minSpeed.toString()
} catch (e: Exception) { } catch (e: Exception) {
Log.e("jingo", "获取限速面板ICON出错1 $e") Log.e("jingo", "获取限速面板ICON出错1 $e")
} }
return "" return ""
} }
/**
* 获取限速值文字
*/
fun getSpeedLimitMinText(data: RenderEntity): String {
try {
//限速标志 0 限速开始 1 限速解除
val minSpeed = data.properties["minSpeed"]
return minSpeed.toString()
} catch (e: Exception) {
Log.e("jingo", "获取限速面板ICON出错1 $e")
}
return "0"
}
/** /**
* 获取种别名称 * 获取种别名称
*/ */
@ -182,6 +222,25 @@ class SignUtil {
return data.properties["kind"].toString() return data.properties["kind"].toString()
} }
/**
* 常规点限速更多信息
*/
fun getSpeedLimitMoreInfoText(renderEntity: RenderEntity): List<ElectronicEyeMoreInfoAdapterItem> {
val list = mutableListOf<ElectronicEyeMoreInfoAdapterItem>()
list.add(
ElectronicEyeMoreInfoAdapterItem(
title = "最高限速值(km/h)", text = getSpeedLimitMaxText(renderEntity)
)
)
list.add(
ElectronicEyeMoreInfoAdapterItem(
title = "最低限速值(km/h)", text = getSpeedLimitMinText(renderEntity)
)
)
return list
}
/** /**
* 限速图标 * 限速图标
*/ */
@ -232,6 +291,8 @@ class SignUtil {
4003 -> getConditionalSpeedLimitIcon(data) 4003 -> getConditionalSpeedLimitIcon(data)
//可变点限速 //可变点限速
4004 -> R.drawable.icon_change_limit 4004 -> R.drawable.icon_change_limit
//电子眼
4010 -> R.drawable.icon_electronic_eye
//交通灯 //交通灯
4022 -> R.drawable.icon_traffic_light 4022 -> R.drawable.icon_traffic_light
else -> 0 else -> 0
@ -315,12 +376,11 @@ class SignUtil {
* 获取道路播报语音文字 * 获取道路播报语音文字
*/ */
fun getRoadSpeechText(topSignList: MutableList<SignBean>): String { fun getRoadSpeechText(topSignList: MutableList<SignBean>): String {
if (topSignList.size == 0) if (topSignList.size == 0) return ""
return ""
val stringBuffer = StringBuffer() val stringBuffer = StringBuffer()
stringBuffer.append("当前道路") stringBuffer.append("当前道路")
for (item in topSignList) { for (item in topSignList) {
when (item.elementCode) { when (item.renderEntity.code) {
2002 -> stringBuffer.append("功能等级${item.iconText.substring(2)}级,") 2002 -> stringBuffer.append("功能等级${item.iconText.substring(2)}级,")
2008 -> stringBuffer.append("种别${item.iconText},") 2008 -> stringBuffer.append("种别${item.iconText},")
2010 -> stringBuffer.append("${item.iconText},") 2010 -> stringBuffer.append("${item.iconText},")
@ -329,5 +389,230 @@ class SignUtil {
} }
return stringBuffer.toString() return stringBuffer.toString()
} }
fun getRoadNameList(data: RenderEntity): MutableList<RoadNameBean> {
val list = mutableListOf<RoadNameBean>()
if (data.code == 2011) {
try {
val shapeStr = data.properties["shapeList"]
val array = JSONArray(shapeStr)
for (i in 0 until array.length()) {
val jsonObject = array.getJSONObject(0)
val name = jsonObject.optString("name", "")
val type = jsonObject.optInt("nameType", 0)
val seqNum = jsonObject.optInt("seqNum", 1)
val nameClass = jsonObject.optInt("nameClass", 1)
val bean = RoadNameBean(
name = name, type = type, seqNum = seqNum, nameClass = nameClass
)
list.add(bean)
}
/**
* 排序
*/
list.sortWith { n1, n2 ->
if (n1.nameClass != n2.nameClass) {
n1.nameClass.compareTo(n2.nameClass)
} else {
n1.seqNum.compareTo(n2.seqNum)
}
}
} catch (e: Exception) {
}
}
return list
}
/**
* 是否要有详细信息需要展示
*/
fun isMoreInfo(element: RenderEntity): Boolean {
val isMore = when (element.code) {
//常规点限速
4002 -> getSpeedLimitMinText(element) != "0"
//条件点限速
4003 -> true
//电子眼
4010 -> true
else -> false
}
Log.e("jingo", "更多信息:${element.code} $isMore")
return isMore
}
/**
* 获取电子眼详细信息
*/
fun getElectronicEyeMoreInfo(renderEntity: RenderEntity): List<ElectronicEyeMoreInfoAdapterItem> {
val list = mutableListOf<ElectronicEyeMoreInfoAdapterItem>()
val kindCode = renderEntity.properties["kind"]!!.toInt()
val kind = ElectronicEyeMoreInfoAdapterItem(
title = "电子眼类型", text = getElectronicEyeKindType(kindCode)
)
list.add(kind)
when (kindCode) {
1, 2, 3, 4, 5, 6, 20, 21 -> {
list.add(
ElectronicEyeMoreInfoAdapterItem(
title = "限速值(km/h)",
text = renderEntity.properties["speedLimit"].toString()
)
)
}
}
val carType = renderEntity.properties["vehicleType"]
if (carType != null && carType != "0") {
list.add(
ElectronicEyeMoreInfoAdapterItem(
title = "车辆类型",
text = getElectronicEyeVehicleType(carType.toInt())
)
)
}
val time = renderEntity.properties["validPeriod"]
if (time?.isNotEmpty() == true) {
list.add(
ElectronicEyeMoreInfoAdapterItem(
title = "时间段", text = time
)
)
}
if (kindCode == 20 || kindCode == 21) {
list.add(
ElectronicEyeMoreInfoAdapterItem(
title = "区间测试配对", text = renderEntity.properties["pairEleceyeId"].toString()
)
)
}
return list
}
/**
* 获取电子眼车辆类型
*/
private fun getElectronicEyeVehicleType(type: Int): String {
var stringBuffer = StringBuffer()
for (i in 31 downTo 0) {
val bit = (type shr i) and 1
if (bit == 1) {
when (i) {
0 -> stringBuffer.append("其他 ")
1 -> stringBuffer.append("小汽车 ")
2 -> stringBuffer.append("公交车 ")
3 -> stringBuffer.append("多人乘坐车辆 ")
4 -> stringBuffer.append("配送车 ")
5 -> stringBuffer.append("摩托车 ")
6 -> stringBuffer.append("行人 ")
7 -> stringBuffer.append("自行车 ")
8 -> stringBuffer.append("出租车 ")
10 -> stringBuffer.append("紧急车辆 ")
11 -> stringBuffer.append("运输卡车 ")
}
}
}
return stringBuffer.toString()
}
/**
* 获取电子眼类型
*/
private fun getElectronicEyeKindType(kind: Int): String {
return when (kind) {
0 -> "未调查"
1 -> "超高速"
2 -> "超低速"
3 -> "移动式测速"
4 -> "可变限速"
5 -> "分车道限速"
6 -> "分车种限速"
7 -> "违规用灯"
8 -> "违规占车道"
9 -> "违规过路口"
10 -> "机动车闯红灯"
11 -> "路况监控"
12 -> "单行线"
13 -> "占用非机动车道"
14 -> "出入口"
15 -> "占用公交车专用道"
16 -> "禁止左右转"
17 -> "禁止掉头"
18 -> "占用应急车道"
19 -> "违反禁止标线"
20 -> "区间测速开始"
21 -> "区间测速结束"
22 -> "违章停车"
23 -> "尾号限行"
24 -> "环保限行"
25 -> "不系安全带"
26 -> "开车打手机"
27 -> "礼让行人"
28 -> "违反禁令标志"
29 -> "禁止鸣笛"
30 -> "车辆未按规定年检"
31 -> "车辆尾气超标"
32 -> "ETC拍照计费电子眼"
33 -> "专用车道电子眼预留"
34 -> "交通标线电子眼预留"
35 -> "违章电子眼预留"
36 -> "卡车超限电子眼"
37 -> "限时长停车电子眼"
else -> "无效类型"
}
}
/**
* 获取车信图标
*/
fun getLineInfoIcons(renderEntity: RenderEntity): List<LaneInfoItem> {
val list = mutableListOf<LaneInfoItem>()
try {
var laneinfoGroup = renderEntity.properties["laneinfoGroup"]
if (laneinfoGroup != null) {
laneinfoGroup = laneinfoGroup.substring(1, laneinfoGroup.length - 1)
laneinfoGroup = "[$laneinfoGroup]"
}
val jsonArray = JSONArray(laneinfoGroup)
if (jsonArray.length() == 2) {
val itemArray = jsonArray[0]
val typeArray = jsonArray[1]
if ((itemArray is JSONArray) && (typeArray is JSONArray) && itemArray.length() == typeArray.length()) {
for (i in 0 until itemArray.length()) {
val itemObject = itemArray[i]
val type = typeArray[i]
var laneInfo = "laneinfo_${itemObject.toString().replace(",", "_")}"
Log.e("jingo", "车信图标 $laneInfo")
list.add(
LaneInfoItem(
id = getResId(
laneInfo, R.drawable::class.java
), type = type!!.toString().toInt()
)
)
}
}
}
} catch (e: Exception) {
Log.e("jingo", "json 解析失败")
}
return list
}
/**
* 通过字符串名称获取资源id
*/
private fun getResId(variableName: String, c: Class<*>): Int {
return try {
val idField: Field = c.getDeclaredField(variableName)
idField.getInt(idField)
} catch (e: java.lang.Exception) {
e.printStackTrace()
R.drawable.laneinfo_0
}
}
} }
} }

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

View File

@ -0,0 +1,11 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:tint="#91909A"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="@android:color/white"
android:pathData="M13,7zM12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM12,20c-4.41,0 -8,-3.59 -8,-8s3.59,-8 8,-8 8,3.59 8,8 -3.59,8 -8,8z,M12,2zM17,15.59L15.59,17 12,13.41 8.41,17 7,15.59 10.59,12 7,8.41 8.41,7 12,10.59 15.59,7 17,8.41 13.41,12 17,15.59z" />
</vector>

View File

@ -0,0 +1,18 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="10dp"
android:height="30dp"
android:viewportWidth="10"
android:viewportHeight="30">
<path
android:pathData="M0.604,0.667h8.792v28.667h-8.792z"
android:strokeWidth="1"
android:fillColor="#FFFFFF"
android:fillType="nonZero"
android:strokeColor="#00000000"/>
<path
android:pathData="M2.604,2.833h4.899v24.395h-4.899z"
android:strokeWidth="1"
android:fillColor="#00C800"
android:fillType="nonZero"
android:strokeColor="#00000000"/>
</vector>

View File

@ -0,0 +1,12 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="10dp"
android:height="28dp"
android:viewportWidth="12"
android:viewportHeight="30">
<path
android:pathData="M7.341,29.432l-0.03,-24.586l4.399,3.566l0.079,-3.273l-5.723,-4.571l-5.856,4.564l0.088,3.485l4.672,-3.972l0.015,24.785z"
android:strokeWidth="1"
android:fillColor="#00C800"
android:fillType="nonZero"
android:strokeColor="#00000000"/>
</vector>

View File

@ -0,0 +1,18 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="18dp"
android:height="30dp"
android:viewportWidth="18"
android:viewportHeight="30">
<path
android:pathData="M13.399,29.168l0.015,-25.164l3.677,3.127l0.069,-2.744l-4.61,-3.594l-4.504,3.599l0.063,2.577l3.463,-2.855l-0.012,25.094z"
android:strokeWidth="1"
android:fillColor="#00C800"
android:fillType="nonZero"
android:strokeColor="#00000000"/>
<path
android:pathData="M11.776,17.839C11.797,17.422 11.543,15.976 10.416,15.185C9.29,14.393 7.37,14.529 7.37,14.529L4.05,14.544L7.178,18.221L4.437,18.291L0.84,13.68L4.441,9.176L7.019,9.238L4.164,12.701L7.17,12.689C7.17,12.689 9.013,12.637 10.061,13.123C11.106,13.608 12.461,14.723 12.606,15.132C12.885,15.948 11.751,18.237 11.776,17.839Z"
android:strokeWidth="1"
android:fillColor="#00C800"
android:fillType="nonZero"
android:strokeColor="#00000000"/>
</vector>

View File

@ -0,0 +1,24 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="26dp"
android:height="30dp"
android:viewportWidth="26"
android:viewportHeight="30">
<path
android:pathData="M12.653,16.041C12.51,15.631 11.395,14.759 10.348,14.273C9.302,13.787 7.094,13.84 7.094,13.84L4.084,13.852L6.942,10.387L4.362,10.325L0.761,14.831L4.357,19.444L7.103,19.375L3.974,15.696L7.294,15.68C7.294,15.68 9.158,15.43 10.285,16.222C11.412,17.014 12.669,18.363 12.676,18.749C12.689,19.521 12.94,16.859 12.653,16.041Z"
android:strokeWidth="1"
android:fillColor="#00C800"
android:fillType="nonZero"
android:strokeColor="#00000000"/>
<path
android:pathData="M14.058,29.084l-0.026,-24.425l3.847,3.12l0.069,-2.864l-5.002,-3.999l-5.122,3.994l0.078,3.049l4.084,-3.475l0.014,24.6z"
android:strokeWidth="1"
android:fillColor="#00C800"
android:fillType="nonZero"
android:strokeColor="#00000000"/>
<path
android:pathData="M13.348,16.041C13.492,15.631 14.606,14.759 15.653,14.273C16.699,13.787 18.906,13.84 18.906,13.84L21.915,13.852L19.058,10.387L21.637,10.325L25.239,14.831L21.643,19.444L18.897,19.375L22.026,15.696L18.705,15.68C18.705,15.68 16.843,15.43 15.714,16.222C14.587,17.014 13.33,18.363 13.324,18.749C13.312,19.521 13.061,16.859 13.348,16.041Z"
android:strokeWidth="1"
android:fillColor="#00C800"
android:fillType="nonZero"
android:strokeColor="#00000000"/>
</vector>

View File

@ -0,0 +1,24 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="18dp"
android:height="30dp"
android:viewportWidth="18"
android:viewportHeight="30">
<path
android:pathData="M12.059,12.145C11.915,11.735 10.799,10.862 9.752,10.375C8.705,9.889 6.495,9.942 6.495,9.942L3.484,9.953L6.343,6.485L3.762,6.422L0.158,10.932L3.758,15.55L6.506,15.48L3.374,11.797L6.698,11.782C6.698,11.782 8.563,11.532 9.691,12.324C10.819,13.117 12.077,14.467 12.083,14.854C12.095,15.629 12.346,12.965 12.059,12.145Z"
android:strokeWidth="1"
android:fillColor="#00C800"
android:fillType="nonZero"
android:strokeColor="#00000000"/>
<path
android:pathData="M13.74,20.555C13.472,15.211 3.833,15.203 3.932,20.672L3.958,26.174L0.455,23.086L0.389,25.144L5.016,29.037L9.436,25.17L9.442,22.912L5.951,26.08L5.968,21.073C6.051,17.487 11.694,17.618 11.879,20.979L13.74,20.555Z"
android:strokeWidth="1"
android:fillColor="#00C800"
android:fillType="nonZero"
android:strokeColor="#00000000"/>
<path
android:pathData="M13.95,29.096l-0.026,-24.447l3.851,3.124l0.068,-2.867l-5.007,-4.002l-5.126,3.998l0.078,3.051l4.088,-3.478l0.014,24.621z"
android:strokeWidth="1"
android:fillColor="#00C800"
android:fillType="nonZero"
android:strokeColor="#00000000"/>
</vector>

View File

@ -0,0 +1,24 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="18dp"
android:height="30dp"
android:viewportWidth="18"
android:viewportHeight="30">
<path
android:pathData="M14.042,29.168l0.015,-25.164l3.678,3.127l0.068,-2.744l-4.609,-3.594l-4.504,3.598l0.063,2.577l3.463,-2.855l-0.012,25.094z"
android:strokeWidth="1"
android:fillColor="#00C800"
android:fillType="nonZero"
android:strokeColor="#00000000"/>
<path
android:pathData="M12.42,22.839C12.442,22.422 12.187,20.976 11.06,20.185C9.934,19.393 8.014,19.529 8.014,19.529L4.695,19.544L7.823,23.221L5.081,23.291L1.485,18.68L5.085,14.176L7.663,14.238L4.808,17.701L7.815,17.689C7.815,17.689 9.657,17.637 10.705,18.123C11.75,18.608 13.105,19.723 13.25,20.132C13.529,20.947 12.396,23.236 12.42,22.839Z"
android:strokeWidth="1"
android:fillColor="#00C800"
android:fillType="nonZero"
android:strokeColor="#00000000"/>
<path
android:pathData="M13.922,14.333l-10.542,-6.516l4.596,-1.476l-2.296,-1.506l-5.483,2.023l0.684,5.724l2.222,1.305l-0.6,-4.448l10.823,6.681z"
android:strokeWidth="1"
android:fillColor="#00C800"
android:fillType="nonZero"
android:strokeColor="#00000000"/>
</vector>

View File

@ -0,0 +1,24 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="26dp"
android:height="30dp"
android:viewportWidth="26"
android:viewportHeight="30">
<path
android:pathData="M13.37,29.208l-0.012,-25.095l3.463,2.855l0.063,-2.577l-4.504,-3.599l-4.609,3.595l0.068,2.744l3.678,-3.127l0.015,25.164z"
android:strokeWidth="1"
android:fillColor="#00C800"
android:fillType="nonZero"
android:strokeColor="#00000000"/>
<path
android:pathData="M12.249,16.121l10.823,-6.681l-0.6,4.448l2.222,-1.305l0.684,-5.724l-5.483,-2.023l-2.296,1.506l4.596,1.476l-10.542,6.516z"
android:strokeWidth="1"
android:fillColor="#00C800"
android:fillType="nonZero"
android:strokeColor="#00000000"/>
<path
android:pathData="M11.558,16.964C11.579,16.547 11.325,15.101 10.198,14.31C9.072,13.518 7.152,13.654 7.152,13.654L3.832,13.669L6.96,17.346L4.218,17.416L0.622,12.805L4.223,8.301L6.8,8.363L3.946,11.826L6.952,11.814C6.952,11.814 8.794,11.762 9.842,12.248C10.887,12.733 12.243,13.848 12.387,14.257C12.668,15.071 11.533,17.361 11.558,16.964Z"
android:strokeWidth="1"
android:fillColor="#00C800"
android:fillType="nonZero"
android:strokeColor="#00000000"/>
</vector>

View File

@ -0,0 +1,18 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="18dp"
android:height="30dp"
android:viewportWidth="18"
android:viewportHeight="30">
<path
android:pathData="M6.439,29.208l-0.014,-25.095l3.465,2.855l0.063,-2.577l-4.504,-3.599l-4.61,3.594l0.069,2.744l3.677,-3.127l0.017,25.164z"
android:strokeWidth="1"
android:fillColor="#00C800"
android:fillType="nonZero"
android:strokeColor="#00000000"/>
<path
android:pathData="M5.398,15.129C5.541,14.72 6.898,13.605 7.943,13.12C8.99,12.634 10.832,12.686 10.832,12.686L13.838,12.698L10.984,9.235L13.562,9.173L17.161,13.677L13.566,18.288L10.823,18.218L13.951,14.541L10.63,14.525C10.63,14.525 8.71,14.389 7.584,15.181C6.457,15.972 6.2,17.418 6.226,17.835C6.245,18.236 5.111,15.946 5.398,15.129Z"
android:strokeWidth="1"
android:fillColor="#00C800"
android:fillType="nonZero"
android:strokeColor="#00000000"/>
</vector>

View File

@ -0,0 +1,24 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="30dp"
android:viewportWidth="24"
android:viewportHeight="30">
<path
android:pathData="M12.909,29.208l-0.014,-25.095l3.465,2.855l0.062,-2.577l-4.504,-3.599l-4.61,3.594l0.069,2.744l3.677,-3.127l0.017,25.164z"
android:strokeWidth="1"
android:fillColor="#00C800"
android:fillType="nonZero"
android:strokeColor="#00000000"/>
<path
android:pathData="M11.867,15.131C12.011,14.722 13.367,13.607 14.413,13.122C15.459,12.636 17.301,12.688 17.301,12.688L20.307,12.7L17.453,9.237L20.031,9.175L23.63,13.679L20.036,18.29L17.292,18.22L20.419,14.543L17.1,14.528C17.1,14.528 15.18,14.392 14.054,15.184C12.927,15.975 12.67,17.421 12.696,17.838C12.716,18.237 11.581,15.948 11.867,15.131Z"
android:strokeWidth="1"
android:fillColor="#00C800"
android:fillType="nonZero"
android:strokeColor="#00000000"/>
<path
android:pathData="M12.728,16.487C12.462,11.151 3.809,11.142 3.909,16.603L3.934,24.524L0.437,21.441L0.37,23.496L4.991,27.383L9.404,23.523L9.409,21.268L5.924,24.432L5.943,17.005C6.026,13.423 10.929,13.555 11.117,16.911L12.728,16.487Z"
android:strokeWidth="1"
android:fillColor="#00C800"
android:fillType="nonZero"
android:strokeColor="#00000000"/>
</vector>

View File

@ -0,0 +1,24 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="26dp"
android:height="30dp"
android:viewportWidth="26"
android:viewportHeight="30">
<path
android:pathData="M14.467,29.168l0.016,-25.164l3.677,3.127l0.069,-2.744l-4.61,-3.594l-4.504,3.599l0.063,2.577l3.463,-2.855l-0.013,25.094z"
android:strokeWidth="1"
android:fillColor="#00C800"
android:fillType="nonZero"
android:strokeColor="#00000000"/>
<path
android:pathData="M14.347,14.333l-10.542,-6.516l4.596,-1.476l-2.296,-1.506l-5.484,2.023l0.685,5.724l2.222,1.305l-0.601,-4.448l10.823,6.681z"
android:strokeWidth="1"
android:fillColor="#00C800"
android:fillType="nonZero"
android:strokeColor="#00000000"/>
<path
android:pathData="M13.615,14.256C13.759,13.847 15.115,12.732 16.16,12.247C17.208,11.761 19.05,11.813 19.05,11.813L22.057,11.825L19.202,8.362L21.779,8.3L25.379,12.804L21.782,17.416L19.04,17.346L22.168,13.669L18.849,13.654C18.849,13.654 16.929,13.518 15.802,14.31C14.675,15.101 14.419,16.547 14.443,16.964C14.465,17.361 13.331,15.072 13.615,14.256Z"
android:strokeWidth="1"
android:fillColor="#00C800"
android:fillType="nonZero"
android:strokeColor="#00000000"/>
</vector>

View File

@ -0,0 +1,24 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="18dp"
android:height="30dp"
android:viewportWidth="18"
android:viewportHeight="30">
<path
android:pathData="M5.796,29.208l-0.012,-25.095l3.463,2.855l0.063,-2.577l-4.504,-3.599l-4.609,3.595l0.068,2.744l3.678,-3.127l0.015,25.164z"
android:strokeWidth="1"
android:fillColor="#00C800"
android:fillType="nonZero"
android:strokeColor="#00000000"/>
<path
android:pathData="M4.754,20.131C4.899,19.722 6.254,18.607 7.299,18.122C8.347,17.636 10.19,17.688 10.19,17.688L13.196,17.7L10.341,14.237L12.919,14.175L16.519,18.679L12.923,23.29L10.181,23.22L13.309,19.543L9.99,19.528C9.99,19.528 8.07,19.392 6.944,20.184C5.817,20.975 5.56,22.421 5.584,22.838C5.604,23.236 4.469,20.946 4.754,20.131Z"
android:strokeWidth="1"
android:fillColor="#00C800"
android:fillType="nonZero"
android:strokeColor="#00000000"/>
<path
android:pathData="M4.674,16.121l10.823,-6.681l-0.6,4.448l2.222,-1.305l0.684,-5.724l-5.483,-2.024l-2.296,1.506l4.596,1.476l-10.542,6.516z"
android:strokeWidth="1"
android:fillColor="#00C800"
android:fillType="nonZero"
android:strokeColor="#00000000"/>
</vector>

View File

@ -0,0 +1,18 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="18dp"
android:height="30dp"
android:viewportWidth="18"
android:viewportHeight="30">
<path
android:pathData="M13.663,17.172C13.392,11.782 3.671,11.773 3.772,17.289L3.796,22.839L0.263,19.724L0.198,21.8L4.865,25.726L9.322,21.826L9.328,19.548L5.807,22.744L5.826,17.693C5.909,14.076 11.597,14.209 11.788,17.598L13.663,17.172Z"
android:strokeWidth="1"
android:fillColor="#00C800"
android:fillType="nonZero"
android:strokeColor="#00000000"/>
<path
android:pathData="M13.875,29.218l-0.026,-24.657l3.885,3.15l0.067,-2.892l-5.05,-4.037l-5.17,4.031l0.078,3.078l4.124,-3.508l0.014,24.833z"
android:strokeWidth="1"
android:fillColor="#00C800"
android:fillType="nonZero"
android:strokeColor="#00000000"/>
</vector>

View File

@ -0,0 +1,18 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="18dp"
android:height="30dp"
android:viewportWidth="18"
android:viewportHeight="30">
<path
android:pathData="M14.042,29.168l0.015,-25.164l3.678,3.127l0.068,-2.744l-4.609,-3.594l-4.504,3.599l0.063,2.577l3.463,-2.855l-0.012,25.094z"
android:strokeWidth="1"
android:fillColor="#00C800"
android:fillType="nonZero"
android:strokeColor="#00000000"/>
<path
android:pathData="M13.921,14.333l-10.542,-6.516l4.596,-1.476l-2.295,-1.506l-5.484,2.023l0.684,5.724l2.222,1.305l-0.6,-4.448l10.823,6.681z"
android:strokeWidth="1"
android:fillColor="#00C800"
android:fillType="nonZero"
android:strokeColor="#00000000"/>
</vector>

View File

@ -0,0 +1,18 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="18dp"
android:height="30dp"
android:viewportWidth="18"
android:viewportHeight="30">
<path
android:pathData="M5.796,29.208l-0.012,-25.095l3.463,2.855l0.063,-2.577l-4.504,-3.599l-4.609,3.595l0.068,2.744l3.678,-3.127l0.015,25.164z"
android:strokeWidth="1"
android:fillColor="#00C800"
android:fillType="nonZero"
android:strokeColor="#00000000"/>
<path
android:pathData="M4.674,16.119l10.823,-6.681l-0.6,4.448l2.222,-1.305l0.684,-5.724l-5.483,-2.024l-2.296,1.506l4.596,1.476l-10.542,6.516z"
android:strokeWidth="1"
android:fillColor="#00C800"
android:fillType="nonZero"
android:strokeColor="#00000000"/>
</vector>

View File

@ -0,0 +1,18 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="17dp"
android:height="30dp"
android:viewportWidth="17"
android:viewportHeight="30">
<path
android:pathData="M5.909,29.208l-0.014,-25.095l3.465,2.855l0.062,-2.577l-4.504,-3.599l-4.61,3.594l0.069,2.744l3.677,-3.127l0.017,25.164z"
android:strokeWidth="1"
android:fillColor="#00C800"
android:fillType="nonZero"
android:strokeColor="#00000000"/>
<path
android:pathData="M5.81,17.908C5.85,16.247 7.134,15.699 8.5,15.699C9.075,15.699 9.806,15.785 10.261,16C10.753,16.232 10.89,16.497 10.934,16.756C11.006,17.178 11.006,19.768 10.934,24.524L7.437,21.441L7.37,23.496L11.991,27.383L16.404,23.523L16.409,21.268L12.924,24.432L12.943,17.005C11.991,12.082 3.929,13.555 4.117,16.911L5.81,17.908Z"
android:strokeWidth="1"
android:fillColor="#00C800"
android:fillType="nonZero"
android:strokeColor="#00000000"/>
</vector>

View File

@ -0,0 +1,18 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="14dp"
android:height="30dp"
android:viewportWidth="14"
android:viewportHeight="30">
<path
android:pathData="M11.215,29.041l-0.015,-20.829l2.037,0.136l0.029,20.687z"
android:strokeWidth="1"
android:fillColor="#00C800"
android:fillType="nonZero"
android:strokeColor="#00000000"/>
<path
android:pathData="M13.148,8.08C13.525,8.766 11.227,10.283 11.222,9.895C11.214,9.508 11.171,7.913 10.04,7.118C8.909,6.323 7.285,6.33 7.285,6.33L3.955,6.346L7.094,10.036L4.34,10.105L0.734,5.479L4.346,0.959L6.933,1.021L4.067,4.496L7.085,4.484C7.085,4.484 8.883,4.561 9.982,4.919C11.559,5.428 12.494,6.524 13.148,8.08Z"
android:strokeWidth="1"
android:fillColor="#00C800"
android:fillType="nonZero"
android:strokeColor="#00000000"/>
</vector>

View File

@ -0,0 +1,24 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="26dp"
android:height="30dp"
android:viewportWidth="26"
android:viewportHeight="30">
<path
android:pathData="M11.82,29.099l0.027,-21.84l2.354,-0.14l-0.018,21.987z"
android:strokeWidth="1"
android:fillColor="#00C800"
android:fillType="nonZero"
android:strokeColor="#00000000"/>
<path
android:pathData="M13.017,7.058C12.87,6.634 11.462,5.48 10.38,4.978C9.298,4.476 7.391,4.53 7.391,4.53L4.282,4.542L7.237,0.958L4.569,0.894L0.842,5.556L4.563,10.329L7.405,10.257L4.169,6.451L7.605,6.434C7.605,6.434 9.283,6.428 10.449,7.247C11.615,8.067 11.91,9.713 11.917,10.112C11.923,10.91 13.312,7.904 13.017,7.058Z"
android:strokeWidth="1"
android:fillColor="#00C800"
android:fillType="nonZero"
android:strokeColor="#00000000"/>
<path
android:pathData="M12.985,7.058C13.131,6.634 14.538,5.48 15.62,4.978C16.702,4.476 18.609,4.53 18.609,4.53L21.719,4.542L18.763,0.958L21.431,0.894L25.159,5.556L21.439,10.329L18.596,10.257L21.833,6.451L18.397,6.434C18.397,6.434 16.719,6.428 15.552,7.247C14.386,8.067 14.091,9.713 14.085,10.112C14.077,10.91 12.685,7.904 12.985,7.058Z"
android:strokeWidth="1"
android:fillColor="#00C800"
android:fillType="nonZero"
android:strokeColor="#00000000"/>
</vector>

View File

@ -0,0 +1,30 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="26dp"
android:height="30dp"
android:viewportWidth="26"
android:viewportHeight="30">
<path
android:pathData="M11.82,29.099l0.028,-21.84l2.354,-0.14l-0.018,21.987z"
android:strokeWidth="1"
android:fillColor="#00C800"
android:fillType="nonZero"
android:strokeColor="#00000000"/>
<path
android:pathData="M13.017,7.058C12.87,6.634 11.463,5.48 10.381,4.978C9.299,4.476 7.392,4.53 7.392,4.53L4.283,4.542L7.238,0.958L4.57,0.894L0.842,5.556L4.563,10.329L7.405,10.257L4.168,6.451L7.604,6.434C7.604,6.434 9.282,6.428 10.448,7.247C11.614,8.067 11.908,9.713 11.915,10.112C11.923,10.91 13.313,7.904 13.017,7.058Z"
android:strokeWidth="1"
android:fillColor="#00C800"
android:fillType="nonZero"
android:strokeColor="#00000000"/>
<path
android:pathData="M12.984,7.058C13.13,6.634 14.537,5.48 15.619,4.978C16.701,4.476 18.608,4.53 18.608,4.53L21.718,4.542L18.762,0.958L21.43,0.894L25.158,5.556L21.436,10.329L18.595,10.258L21.832,6.452L18.395,6.434C18.395,6.434 16.719,6.428 15.553,7.247C14.387,8.067 14.092,9.713 14.086,10.112C14.076,10.91 12.686,7.904 12.984,7.058Z"
android:strokeWidth="1"
android:fillColor="#00C800"
android:fillType="nonZero"
android:strokeColor="#00000000"/>
<path
android:pathData="M13.875,17.759C13.6,12.236 4.64,12.227 4.744,17.879L4.768,26.079L1.151,22.887L1.082,25.014L5.864,29.037L10.429,25.041L10.435,22.707L6.83,25.982L6.848,18.294C6.933,14.587 11.759,14.724 11.952,18.197L13.875,17.759Z"
android:strokeWidth="1"
android:fillColor="#00C800"
android:fillType="nonZero"
android:strokeColor="#00000000"/>
</vector>

View File

@ -0,0 +1,24 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="14dp"
android:height="30dp"
android:viewportWidth="14"
android:viewportHeight="30">
<path
android:pathData="M11.217,29.181l0.029,-20.904l2.058,-0.137l-0.015,21.047z"
android:strokeWidth="1"
android:fillColor="#00C800"
android:fillType="nonZero"
android:strokeColor="#00000000"/>
<path
android:pathData="M10.055,4.814C8.943,4.452 7.126,4.376 7.126,4.376L4.078,4.387L6.974,0.876L4.361,0.813L0.713,5.38L4.357,10.055L7.14,9.985L3.97,6.256L7.334,6.24C7.334,6.24 8.978,6.234 10.119,7.036C11.262,7.839 11.305,9.452 11.308,9.843C11.314,10.234 13.636,8.7 13.255,8.008C12.593,6.434 11.645,5.329 10.055,4.814Z"
android:strokeWidth="1"
android:fillColor="#00C800"
android:fillType="nonZero"
android:strokeColor="#00000000"/>
<path
android:pathData="M13.229,18.072C12.96,12.661 4.183,12.653 4.286,18.19L4.31,26.223L0.765,23.096L0.696,25.18L5.384,29.121L9.858,25.206L9.864,22.918L6.332,26.127L6.349,18.595C6.433,14.963 11.162,15.096 11.349,18.5L13.229,18.072Z"
android:strokeWidth="1"
android:fillColor="#00C800"
android:fillType="nonZero"
android:strokeColor="#00000000"/>
</vector>

View File

@ -0,0 +1,24 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="14dp"
android:height="30dp"
android:viewportWidth="14"
android:viewportHeight="30">
<path
android:pathData="M11.429,29.262l0.032,-18.901l2.048,-0.838l-0.034,19.755z"
android:strokeWidth="1"
android:fillColor="#00C800"
android:fillType="nonZero"
android:strokeColor="#00000000"/>
<path
android:pathData="M13.51,9.521l-9.535,-5.817l4.597,-1.476l-2.297,-1.506l-5.483,2.023l0.684,5.724l2.223,1.305l-0.601,-4.448l10.101,6.226z"
android:strokeWidth="1"
android:fillColor="#00C800"
android:fillType="nonZero"
android:strokeColor="#00000000"/>
<path
android:pathData="M11.425,19.516C11.447,19.099 11.192,17.653 10.065,16.862C8.939,16.07 7.019,16.206 7.019,16.206L3.7,16.221L6.828,19.898L4.086,19.968L0.49,15.357L4.09,10.853L6.668,10.915L3.813,14.378L6.82,14.366C6.82,14.366 8.662,14.314 9.71,14.8C10.755,15.285 12.111,16.4 12.255,16.809C12.536,17.626 11.401,19.915 11.425,19.516Z"
android:strokeWidth="1"
android:fillColor="#00C800"
android:fillType="nonZero"
android:strokeColor="#00000000"/>
</vector>

View File

@ -0,0 +1,24 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="30dp"
android:viewportWidth="24"
android:viewportHeight="30">
<path
android:pathData="M11.116,29.278l-0.033,-19.755l2.048,0.838l0.032,18.901z"
android:strokeWidth="1"
android:fillColor="#00C800"
android:fillType="nonZero"
android:strokeColor="#00000000"/>
<path
android:pathData="M11.393,11.553l10.101,-6.226l-0.601,4.448l2.223,-1.305l0.684,-5.724l-5.483,-2.023l-2.297,1.505l4.597,1.476l-9.535,5.817z"
android:strokeWidth="1"
android:fillColor="#00C800"
android:fillType="nonZero"
android:strokeColor="#00000000"/>
<path
android:pathData="M11.135,19.578C11.158,19.161 10.903,17.715 9.776,16.924C8.649,16.132 6.729,16.268 6.729,16.268L3.41,16.283L6.538,19.96L3.796,20.03L0.2,15.419L3.8,10.915L6.378,10.977L3.523,14.44L6.53,14.428C6.53,14.428 8.372,14.376 9.42,14.862C10.465,15.347 11.821,16.462 11.965,16.871C12.248,17.688 11.112,19.976 11.135,19.578Z"
android:strokeWidth="1"
android:fillColor="#00C800"
android:fillType="nonZero"
android:strokeColor="#00000000"/>
</vector>

View File

@ -0,0 +1,18 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="14dp"
android:height="30dp"
android:viewportWidth="14"
android:viewportHeight="30">
<path
android:pathData="M0.734,29.033l0.028,-20.686l2.036,-0.136l-0.016,20.829z"
android:strokeWidth="1"
android:fillColor="#00C800"
android:fillType="nonZero"
android:strokeColor="#00000000"/>
<path
android:pathData="M4.019,4.92C5.119,4.562 6.915,4.485 6.915,4.485L9.935,4.497L7.069,1.022L9.656,0.96L13.267,5.48L9.661,10.106L6.907,10.037L10.046,6.347L6.716,6.331C6.716,6.331 5.091,6.324 3.96,7.119C2.829,7.914 2.786,9.509 2.78,9.896C2.775,10.284 0.475,8.767 0.853,8.081C1.505,6.524 2.443,5.428 4.019,4.92Z"
android:strokeWidth="1"
android:fillColor="#00C800"
android:fillType="nonZero"
android:strokeColor="#00000000"/>
</vector>

View File

@ -0,0 +1,15 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="30dp"
android:viewportWidth="24"
android:viewportHeight="30">
<path
android:pathData="M10.947,29.277l-0.034,-19.755l2.048,0.838l0.032,18.901z"
android:fillColor="#00C800"/>
<path
android:pathData="M11.226,11.553l10.101,-6.226l-0.601,4.448l2.223,-1.305l0.684,-5.724l-5.484,-2.023l-2.296,1.506l4.597,1.476l-9.535,5.817z"
android:fillColor="#00C800"/>
<path
android:pathData="M12.769,18.262C12.502,12.908 3.819,12.899 3.917,18.379L3.943,26.328L0.432,23.234L0.367,25.297L5.004,29.196L9.432,25.322L9.439,23.058L5.942,26.233L5.96,18.779C6.043,15.185 10.721,15.318 10.908,18.685L12.769,18.262Z"
android:fillColor="#00C800"/>
</vector>

View File

@ -0,0 +1,24 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="30dp"
android:viewportWidth="24"
android:viewportHeight="30">
<path
android:pathData="M10.836,29.262l0.032,-18.901l2.048,-0.838l-0.034,19.755z"
android:strokeWidth="1"
android:fillColor="#00C800"
android:fillType="nonZero"
android:strokeColor="#00000000"/>
<path
android:pathData="M12.917,9.521l-9.535,-5.817l4.597,-1.476l-2.297,-1.506l-5.483,2.023l0.684,5.724l2.223,1.305l-0.601,-4.448l10.101,6.226z"
android:strokeWidth="1"
android:fillColor="#00C800"
android:fillType="nonZero"
android:strokeColor="#00000000"/>
<path
android:pathData="M12.036,16.871C12.18,16.462 13.536,15.347 14.581,14.862C15.629,14.376 17.471,14.428 17.471,14.428L20.478,14.44L17.623,10.977L20.201,10.915L23.801,15.419L20.205,20.03L17.463,19.96L20.591,16.283L17.272,16.268C17.272,16.268 15.352,16.132 14.225,16.924C13.098,17.715 12.842,19.161 12.866,19.578C12.886,19.977 11.751,17.688 12.036,16.871Z"
android:strokeWidth="1"
android:fillColor="#00C800"
android:fillType="nonZero"
android:strokeColor="#00000000"/>
</vector>

View File

@ -0,0 +1,24 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="14dp"
android:height="30dp"
android:viewportWidth="14"
android:viewportHeight="30">
<path
android:pathData="M0.523,29.278l-0.033,-19.755l2.048,0.838l0.032,18.901z"
android:strokeWidth="1"
android:fillColor="#00C800"
android:fillType="nonZero"
android:strokeColor="#00000000"/>
<path
android:pathData="M0.801,11.553l10.1,-6.227l-0.601,4.448l2.223,-1.305l0.684,-5.724l-5.483,-2.023l-2.297,1.506l4.597,1.476l-9.534,5.817z"
android:strokeWidth="1"
android:fillColor="#00C800"
android:fillType="nonZero"
android:strokeColor="#00000000"/>
<path
android:pathData="M1.745,16.809C1.889,16.4 3.245,15.285 4.29,14.8C5.338,14.314 7.18,14.366 7.18,14.366L10.187,14.378L7.332,10.915L9.91,10.853L13.51,15.357L9.914,19.968L7.172,19.898L10.3,16.221L6.981,16.206C6.981,16.206 5.061,16.07 3.935,16.862C2.808,17.653 2.552,19.099 2.575,19.516C2.597,19.915 1.463,17.626 1.745,16.809Z"
android:strokeWidth="1"
android:fillColor="#00C800"
android:fillType="nonZero"
android:strokeColor="#00000000"/>
</vector>

View File

@ -0,0 +1,12 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="20dp"
android:height="28dp"
android:viewportWidth="20"
android:viewportHeight="28">
<path
android:pathData="M19.104,5.358C19.1,-1.893 5.711,-1.692 5.629,5.504L5.661,23.316L0.979,19.457L0.896,22.94L6.984,27.804L13.218,22.947L13.122,19.239L8.151,23.199L8.172,6.006C8.315,0.933 16.333,1.474 16.473,5.889L16.428,27.974L19.083,27.987L19.104,5.358Z"
android:strokeWidth="1"
android:fillColor="#00C800"
android:fillType="nonZero"
android:strokeColor="#00000000"/>
</vector>

View File

@ -0,0 +1,24 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="14dp"
android:height="30dp"
android:viewportWidth="14"
android:viewportHeight="30">
<path
android:pathData="M11.278,29.261l0.032,-18.901l2.048,-0.838l-0.034,19.755z"
android:strokeWidth="1"
android:fillColor="#00C800"
android:fillType="nonZero"
android:strokeColor="#00000000"/>
<path
android:pathData="M13.359,9.52l-9.535,-5.817l4.597,-1.476l-2.297,-1.506l-5.483,2.023l0.684,5.724l2.223,1.305l-0.601,-4.448l10.101,6.226z"
android:strokeWidth="1"
android:fillColor="#00C800"
android:fillType="nonZero"
android:strokeColor="#00000000"/>
<path
android:pathData="M13.163,18.345C12.896,12.991 4.213,12.982 4.311,18.462L4.337,26.411L0.826,23.317L0.761,25.38L5.398,29.279L9.826,25.405L9.832,23.141L6.336,26.316L6.354,18.862C6.437,15.268 11.115,15.401 11.302,18.768L13.163,18.345Z"
android:strokeWidth="1"
android:fillColor="#00C800"
android:fillType="nonZero"
android:strokeColor="#00000000"/>
</vector>

View File

@ -0,0 +1,15 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="30dp"
android:viewportWidth="24"
android:viewportHeight="30">
<path
android:pathData="M10.947,29.277l-0.034,-19.755l2.048,0.838l0.032,18.901z"
android:fillColor="#00C800"/>
<path
android:pathData="M11.226,11.553l10.101,-6.226l-0.601,4.448l2.223,-1.305l0.684,-5.724l-5.484,-2.023l-2.296,1.506l4.597,1.476l-9.535,5.817z"
android:fillColor="#00C800"/>
<path
android:pathData="M12.769,18.262C12.502,12.908 3.819,12.899 3.917,18.379L3.943,26.328L0.432,23.234L0.367,25.297L5.004,29.196L9.432,25.322L9.439,23.058L5.942,26.233L5.96,18.779C6.043,15.185 10.721,15.318 10.908,18.685L12.769,18.262Z"
android:fillColor="#00C800"/>
</vector>

View File

@ -0,0 +1,18 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="14dp"
android:height="30dp"
android:viewportWidth="14"
android:viewportHeight="30">
<path
android:pathData="M11.278,29.262l0.032,-18.901l2.048,-0.838l-0.034,19.755z"
android:strokeWidth="1"
android:fillColor="#00C800"
android:fillType="nonZero"
android:strokeColor="#00000000"/>
<path
android:pathData="M13.359,9.521l-9.535,-5.817l4.597,-1.476l-2.297,-1.506l-5.483,2.023l0.684,5.724l2.223,1.305l-0.601,-4.448l10.101,6.226z"
android:strokeWidth="1"
android:fillColor="#00C800"
android:fillType="nonZero"
android:strokeColor="#00000000"/>
</vector>

View File

@ -0,0 +1,24 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="26dp"
android:height="30dp"
android:viewportWidth="26"
android:viewportHeight="30">
<path
android:pathData="M13.608,9.595l-9.534,-5.817l4.597,-1.476l-2.297,-1.506l-5.483,2.023l0.684,5.724l2.223,1.305l-0.601,-4.448l10.101,6.226z"
android:strokeWidth="1"
android:fillColor="#00C800"
android:fillType="nonZero"
android:strokeColor="#00000000"/>
<path
android:pathData="M11.777,29.413l-0.034,-19.755l2.049,0.838l0.031,18.901z"
android:strokeWidth="1"
android:fillColor="#00C800"
android:fillType="nonZero"
android:strokeColor="#00000000"/>
<path
android:pathData="M12.702,11.417l10.101,-6.226l-0.601,4.448l2.223,-1.305l0.684,-5.724l-5.483,-2.023l-2.297,1.506l4.597,1.476l-9.535,5.817z"
android:strokeWidth="1"
android:fillColor="#00C800"
android:fillType="nonZero"
android:strokeColor="#00000000"/>
</vector>

View File

@ -0,0 +1,18 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="14dp"
android:height="30dp"
android:viewportWidth="14"
android:viewportHeight="30">
<path
android:pathData="M0.674,29.277l-0.034,-19.755l2.048,0.838l0.032,18.901z"
android:strokeWidth="1"
android:fillColor="#00C800"
android:fillType="nonZero"
android:strokeColor="#00000000"/>
<path
android:pathData="M0.953,11.553l10.101,-6.226l-0.601,4.448l2.223,-1.305l0.684,-5.724l-5.483,-2.023l-2.297,1.506l4.597,1.476l-9.535,5.817z"
android:strokeWidth="1"
android:fillColor="#00C800"
android:fillType="nonZero"
android:strokeColor="#00000000"/>
</vector>

View File

@ -0,0 +1,12 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="18dp"
android:height="28dp"
android:viewportWidth="18"
android:viewportHeight="28">
<path
android:pathData="M2.676,10.345C2.671,8.227 2.441,6.999 2.676,5.876C3.359,2.607 5.252,2.578 6.627,2.547C7.633,2.524 9.049,2.69 9.706,3.801C10.314,4.828 10.201,6.729 10.201,8.491L10.233,12.303L5.551,8.444L5.468,11.927L11.556,16.791L17.79,11.934L17.694,8.226L12.723,12.186L12.744,5.993C12.723,0.845 9.405,-0.087 6.151,0C2.986,0.085 0,1.805 0.045,5.876L0,27.961L2.655,27.974L2.676,10.345Z"
android:strokeWidth="1"
android:fillColor="#00C800"
android:fillType="nonZero"
android:strokeColor="#00000000"/>
</vector>

View File

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="line">
<stroke
android:width="1dp"
android:color="@color/white"
android:dashWidth="6dp"
android:dashGap="6dp" />
<size android:width="1dp" />
</shape>

View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="#BA0C122B" />
<corners
android:bottomLeftRadius="6dp"
android:bottomRightRadius="6dp"
android:topLeftRadius="6dp"
android:topRightRadius="6dp" />
</shape>

View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:left="-300dp"
android:right="-300dp">
<rotate
android:drawable="@drawable/shape_dashed_line"
android:fromDegrees="90" />
</item>
</layer-list>

View File

@ -44,79 +44,35 @@
app:layout_constraintRight_toRightOf="parent" app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" /> app:layout_constraintTop_toTopOf="parent" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/main_activity_top_sign_recyclerview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="2dp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<androidx.recyclerview.widget.RecyclerView <androidx.recyclerview.widget.RecyclerView
android:id="@+id/main_activity_sign_recyclerview" android:id="@+id/main_activity_sign_recyclerview"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginLeft="20dp" android:layout_marginLeft="20dp"
android:layout_marginTop="20dp" android:layout_marginTop="2dp"
android:maxHeight="350dp" android:maxHeight="350dp"
app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent" /> app:layout_constraintTop_toTopOf="parent" />
<ImageView
android:id="@+id/main_activity_sign_more_info_bg" <androidx.recyclerview.widget.RecyclerView
android:id="@+id/main_activity_top_sign_recyclerview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="280dp"
android:layout_marginTop="2dp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<FrameLayout
android:id="@+id/main_activity_sign_more_info_fragment"
android:layout_width="240dp" android:layout_width="240dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginLeft="260dp" android:layout_marginTop="80dp"
android:layout_marginTop="40dp"
android:background="@drawable/main_sign_moreinfo_bg"
android:minHeight="140dp" android:minHeight="140dp"
app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintLeft_toLeftOf="@id/main_activity_top_sign_recyclerview"
app:layout_constraintTop_toBottomOf="@id/main_activity_top_sign_recyclerview" /> app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/main_activity_sign_more_info_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:layout_marginTop="10dp"
android:drawableLeft="@drawable/icon_main_moreinfo_text_left"
android:drawablePadding="4dp"
android:text="条件点限速"
android:textColor="@color/orange"
app:layout_constraintLeft_toLeftOf="@id/main_activity_sign_more_info_bg"
app:layout_constraintTop_toTopOf="@id/main_activity_sign_more_info_bg" />
<TextView
android:id="@+id/main_activity_sign_more_info_text1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="10dp"
android:text="条件点限速"
android:textColor="@color/white"
app:layout_constraintRight_toRightOf="@id/main_activity_sign_more_info_bg"
app:layout_constraintTop_toBottomOf="@id/main_activity_sign_more_info_title" />
<TextView
android:id="@+id/main_activity_sign_more_info_text2"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:layout_marginTop="10dp"
android:layout_marginRight="10dp"
android:singleLine="false"
android:text="条件点限速"
android:textColor="@color/white"
app:layout_constraintLeft_toLeftOf="@id/main_activity_sign_more_info_bg"
app:layout_constraintRight_toRightOf="@id/main_activity_sign_more_info_bg"
app:layout_constraintTop_toBottomOf="@id/main_activity_sign_more_info_text1" />
<androidx.constraintlayout.widget.Group
android:id="@+id/main_activity_sign_more_info_group"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="gone"
app:constraint_referenced_ids="main_activity_sign_more_info_bg,main_activity_sign_more_info_text2,main_activity_sign_more_info_text1,main_activity_sign_more_info_title" />
<androidx.constraintlayout.helper.widget.Flow <androidx.constraintlayout.helper.widget.Flow
android:id="@+id/main_activity_flow" android:id="@+id/main_activity_flow"
@ -296,6 +252,23 @@
app:layout_constraintBottom_toTopOf="@id/main_activity_bottom_sheet_bg" app:layout_constraintBottom_toTopOf="@id/main_activity_bottom_sheet_bg"
app:layout_constraintRight_toLeftOf="@id/main_activity_middle_fragment" /> app:layout_constraintRight_toLeftOf="@id/main_activity_middle_fragment" />
<TextView
android:id="@+id/main_activity_road_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/shape_road_name_bg"
android:onClick="@{()->mainActivity.openRoadNameFragment()}"
android:paddingLeft="10dp"
android:paddingTop="4dp"
android:paddingRight="10dp"
android:paddingBottom="4dp"
android:textColor="@color/white"
android:textSize="16sp"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="@id/main_activity_geometry"
app:layout_constraintLeft_toLeftOf="@id/main_activity_top_sign_recyclerview" />
<ImageButton <ImageButton
android:id="@+id/main_activity_zoom_out" android:id="@+id/main_activity_zoom_out"
android:layout_width="@dimen/zoom_btns_w" android:layout_width="@dimen/zoom_btns_w"
@ -488,9 +461,9 @@
android:id="@+id/main_bottom_route" android:id="@+id/main_bottom_route"
style="@style/main_activity_bottom_sheet_icon" style="@style/main_activity_bottom_sheet_icon"
android:background="@drawable/icon_main_bottom_route" android:background="@drawable/icon_main_bottom_route"
android:onClick="@{()->mainActivity.onClickRouteFragment()}"
app:layout_constraintBottom_toTopOf="@id/main_bottom_route_text" app:layout_constraintBottom_toTopOf="@id/main_bottom_route_text"
app:layout_constraintLeft_toRightOf="@id/main_bottom_offline_map" app:layout_constraintLeft_toRightOf="@id/main_bottom_offline_map"
android:onClick="@{()->mainActivity.onClickRouteFragment()}"
app:layout_constraintRight_toRightOf="@id/main_activity_bottom_sheet_bg" app:layout_constraintRight_toRightOf="@id/main_activity_bottom_sheet_bg"
app:layout_constraintTop_toTopOf="@id/main_bottom_task" app:layout_constraintTop_toTopOf="@id/main_bottom_task"
app:layout_constraintVertical_chainStyle="packed" /> app:layout_constraintVertical_chainStyle="packed" />
@ -499,10 +472,10 @@
android:id="@+id/main_bottom_route_text" android:id="@+id/main_bottom_route_text"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:onClick="@{()->mainActivity.onClickRouteFragment()}"
android:text="路径规划" android:text="路径规划"
android:textColor="@color/blue" android:textColor="@color/blue"
android:textSize="10sp" android:textSize="10sp"
android:onClick="@{()->mainActivity.onClickRouteFragment()}"
app:layout_constraintBottom_toBottomOf="@id/main_activity_bottom_sheet_bg" app:layout_constraintBottom_toBottomOf="@id/main_activity_bottom_sheet_bg"
app:layout_constraintLeft_toLeftOf="@id/main_bottom_route" app:layout_constraintLeft_toLeftOf="@id/main_bottom_route"
app:layout_constraintRight_toRightOf="@id/main_bottom_route" app:layout_constraintRight_toRightOf="@id/main_bottom_route"

View File

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="5dp"
android:paddingBottom="5dp"
tools:context="com.navinfo.omqs.ui.fragment.signMoreInfo.ElectronicEyeInfoAdapter">
<TextView
android:id="@+id/title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="3"
android:textColor="@color/white" />
<TextView
android:id="@+id/text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:layout_toRightOf="@id/title"
android:layout_weight="2"
android:textColor="@color/white" />
</LinearLayout>

View File

@ -0,0 +1,26 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/white" />
<TextView
android:id="@+id/name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:layout_toRightOf="@id/title"
android:textColor="@color/white" />
<TextView
android:id="@+id/type"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:textColor="@color/white" />
</RelativeLayout>

View File

@ -29,6 +29,16 @@
android:textColor="#2F2F2F" android:textColor="#2F2F2F"
android:textSize="16sp" /> android:textSize="16sp" />
<TextView
android:id="@+id/sign_second_icon"
android:layout_width="40dp"
android:layout_height="40dp"
android:gravity="center"
android:layout_marginTop="10dp"
android:layout_toRightOf="@id/sign_main_icon"
android:text=""
android:textColor="@color/white"
android:textSize="16sp" />
<TextView <TextView
android:id="@+id/sign_bottom_text" android:id="@+id/sign_bottom_text"
android:layout_width="wrap_content" android:layout_width="wrap_content"
@ -46,10 +56,10 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_alignTop="@id/sign_bottom_text" android:layout_alignTop="@id/sign_bottom_text"
android:layout_alignRight="@id/sign_main_bg"
android:layout_marginRight="15dp" android:layout_marginRight="15dp"
android:gravity="center" android:gravity="center"
android:text="其他信息" android:text="其他信息"
android:layout_alignRight="@id/sign_main_bg"
android:textColor="@color/white" android:textColor="@color/white"
android:textSize="14sp" /> android:textSize="14sp" />
@ -65,11 +75,12 @@
<ImageView <ImageView
android:id="@+id/sign_main_fast_error" android:id="@+id/sign_main_fast_error"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_marginLeft="172dp" android:layout_marginLeft="172dp"
android:layout_marginTop="4dp" android:layout_marginTop="4dp"
android:layout_alignParentTop="true" android:visibility="gone"
android:background="@drawable/icon_evaluation" android:background="@drawable/icon_evaluation" />
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</RelativeLayout> </RelativeLayout>

View File

@ -0,0 +1,41 @@
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="193dp"
android:layout_height="78dp"
android:background="@drawable/bg_sign_laneinfo"
android:orientation="vertical"
tools:context="com.navinfo.omqs.ui.activity.map.SignAdapter">
<LinearLayout
android:id="@+id/sign_more_icons_layout"
android:layout_width="match_parent"
android:layout_height="50dp"
android:gravity="center"
android:orientation="horizontal"
android:paddingLeft="15dp"
android:paddingRight="15dp" />
<TextView
android:id="@+id/sign_bottom_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_marginLeft="15dp"
android:layout_marginBottom="5dp"
android:gravity="center"
android:text="道路名"
android:textColor="@color/white"
android:textSize="14sp" />
<TextView
android:id="@+id/sign_bottom_right_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignTop="@id/sign_bottom_text"
android:layout_alignParentRight="true"
android:layout_marginRight="15dp"
android:gravity="center"
android:text="其他信息"
android:textColor="@color/white"
android:textSize="14sp" />
</RelativeLayout>

View File

@ -0,0 +1,35 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:clickable="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/main_sign_moreinfo_bg"
android:padding="8dp"
tools:context=".ui.fragment.signMoreInfo.SignMoreInfoFragment">
<TextView
android:id="@+id/sign_info_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:drawableLeft="@drawable/icon_main_moreinfo_text_left"
android:drawablePadding="4dp"
android:text="电子眼"
android:textColor="@color/orange" />
<ImageView
android:id="@+id/sign_info_cancel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignTop="@id/sign_info_title"
android:layout_alignBottom="@id/sign_info_title"
android:layout_alignParentRight="true"
android:src="@drawable/baseline_cancel_24" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/sign_info_recyclerview"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/sign_info_title"
android:layout_marginTop="5dp" />
</RelativeLayout>

View File

@ -1,6 +1,10 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<color name="lane_info_0" comment="车信普通道路">#FF2271FF</color>
<color name="lane_info_1" comment="车信附加道路">#FF00C800</color>
<color name="lane_info_2" comment="车信公交道路">#FFFFB400</color>
<color name="white" comment="主要按钮,背景等颜色">#FFFFFF</color> <!--白色 --> <color name="white" comment="主要按钮,背景等颜色">#FFFFFF</color> <!--白色 -->
<color name="button_press_color" comment="默认的按钮按下去时的背景颜色">#F1EBEB</color> <color name="button_press_color" comment="默认的按钮按下去时的背景颜色">#F1EBEB</color>
<color name="default_button_blue_color" comment="蓝色到紫色的渐变开始颜色">#4954ED</color> <color name="default_button_blue_color" comment="蓝色到紫色的渐变开始颜色">#4954ED</color>

View File

@ -79,7 +79,7 @@ dependencies {
implementation "net.sf.kxml:kxml2:2.3.0" implementation "net.sf.kxml:kxml2:2.3.0"
implementation 'org.slf4j:slf4j-api:2.0.7' implementation 'org.slf4j:slf4j-api:2.0.7'
implementation project(":vtm-themes") implementation project(":vtm-themes")
implementation project(":vtm-android") api project(":vtm-android")
implementation project(':vtm-extras') implementation project(':vtm-extras')
implementation project(":vtm-http") implementation project(":vtm-http")
// implementation "org.mapsforge:vtm-themes:$vtmVersion" // implementation "org.mapsforge:vtm-themes:$vtmVersion"
@ -109,10 +109,8 @@ dependencies {
implementation "com.google.protobuf:protobuf-java:3.6.1" implementation "com.google.protobuf:protobuf-java:3.6.1"
implementation "com.wdtinc:mapbox-vector-tile:3.1.0" implementation "com.wdtinc:mapbox-vector-tile:3.1.0"
implementation "com.caverock:androidsvg:1.4"
implementation "com.badlogicgames.gdx:gdx:1.11.0" implementation "com.badlogicgames.gdx:gdx:1.11.0"
implementation "com.badlogicgames.gdx:gdx-backend-android:1.11.0" implementation "com.badlogicgames.gdx:gdx-backend-android:1.11.0"
implementation "com.caverock:androidsvg:1.4"
// api "org.mapsforge:vtm-jts:$vtmVersion" // api "org.mapsforge:vtm-jts:$vtmVersion"
api project(":vtm-jts") api project(":vtm-jts")
api 'org.locationtech.jts:jts-core:1.19.0' api 'org.locationtech.jts:jts-core:1.19.0'

View File

@ -174,7 +174,8 @@
<!-- omdb --> <!-- omdb -->
<style-line id="boundaryType" stipple-width="0.1" width="0.1" /> <style-line id="boundaryType" stipple-width="0.1" width="0.1" />
<style-line id="s2e" dasharray="1,1" repeat-gap="3" repeat-start="0" stroke="#14582c"
width="0.1" />
<!--###### ASSIGNMENT ######--> <!--###### ASSIGNMENT ######-->
<m e="way" k="natural" v="issea|sea"> <m e="way" k="natural" v="issea|sea">
@ -1478,83 +1479,83 @@
</m> </m>
</m> </m>
<!-- 自定义渲染样式 --> <!-- &lt;!&ndash; 自定义渲染样式 &ndash;&gt;-->
<m k="navi_type" zoom-max="22" zoom-min="15"> <!-- <m k="navi_type" zoom-max="22" zoom-min="15">-->
<!-- 车道中心线 --> <!-- &lt;!&ndash; 车道中心线 &ndash;&gt;-->
<m v="had_lane_link"> <!-- <m v="had_lane_link">-->
<line dasharray="20,20" fix="true" stipple-stroke="#00000000" stroke="#ff0000" <!-- <line dasharray="20,20" fix="true" stipple-stroke="#00000000" stroke="#ff0000"-->
width="0.3" /> <!-- width="0.3" />-->
</m> <!-- </m>-->
<!-- 车道边线 --> <!-- &lt;!&ndash; 车道边线 &ndash;&gt;-->
<m v="had_lane_mark_link"> <!-- <m v="had_lane_mark_link">-->
<line stipple-width="0.5" stroke="#0000ff" width="0.1" /> <!-- <line stipple-width="0.5" stroke="#0000ff" width="0.1" />-->
</m> <!-- </m>-->
<!--道路箭头 objectArrow--> <!-- &lt;!&ndash;道路箭头 objectArrow&ndash;&gt;-->
<m v="object_arrow"> <!-- <m v="object_arrow">-->
<area fade="5" fill="#88aaaa00" stroke="#ff0000" stroke-width="0.1"></area> <!-- <area fade="5" fill="#88aaaa00" stroke="#ff0000" stroke-width="0.1"></area>-->
</m> <!-- </m>-->
<!--人行横道 objectcrosswalk--> <!-- &lt;!&ndash;人行横道 objectcrosswalk&ndash;&gt;-->
<m v="object_crosswalk"> <!-- <m v="object_crosswalk">-->
<area fill="#88800080" stroke="#ff0000" stroke-width="0.2"></area> <!-- <area fill="#88800080" stroke="#ff0000" stroke-width="0.2"></area>-->
<caption style="bold" dy="12" fill="#4D2F08" k="name" size="14" stroke="#ffffff" <!-- <caption style="bold" dy="12" fill="#4D2F08" k="name" size="14" stroke="#ffffff"-->
stroke-width="2.0" /> <!-- stroke-width="2.0" />-->
<caption style="bold" dy="-12" fill="#4D2F08" k="ele" size="12" stroke="#ffffff" <!-- <caption style="bold" dy="-12" fill="#4D2F08" k="ele" size="12" stroke="#ffffff"-->
stroke-width="2.0" /> <!-- stroke-width="2.0" />-->
</m> <!-- </m>-->
<!--杆状物 objectpole--> <!-- &lt;!&ndash;杆状物 objectpole&ndash;&gt;-->
<m v="object_pole"> <!-- <m v="object_pole">-->
<line stipple-width="0.5" stroke="#8800aaaa" width="0.1" /> <!-- <line stipple-width="0.5" stroke="#8800aaaa" width="0.1" />-->
</m> <!-- </m>-->
<!--对象标志 objectsymbol--> <!-- &lt;!&ndash;对象标志 objectsymbol&ndash;&gt;-->
<m v="object_symbol"> <!-- <m v="object_symbol">-->
<area fill="#880000cc" stroke="#0000cc" stroke-width="0.2"></area> <!-- <area fill="#880000cc" stroke="#0000cc" stroke-width="0.2"></area>-->
</m> <!-- </m>-->
<!--交通信号灯 objectTrfficLights--> <!-- &lt;!&ndash;交通信号灯 objectTrfficLights&ndash;&gt;-->
<m v="object_trrfic"> <!-- <m v="object_trrfic">-->
<area fill="#8800cc00" stroke="#00cc00" stroke-width="0.2"></area> <!-- <area fill="#8800cc00" stroke="#00cc00" stroke-width="0.2"></area>-->
</m> <!-- </m>-->
<m zoom-max="19" zoom-min="15"> <!-- <m zoom-max="19" zoom-min="15">-->
<text use="ferry" /> <!-- <text use="ferry" />-->
</m> <!-- </m>-->
<!--道路方向--> <!-- &lt;!&ndash;道路方向&ndash;&gt;-->
<m v="symbol_object_arrow"> <!-- <m v="symbol_object_arrow">-->
<symbol use="oneway"></symbol> <!-- <symbol use="oneway"></symbol>-->
</m> <!-- </m>-->
<!--杆状物--> <!-- &lt;!&ndash;杆状物&ndash;&gt;-->
<m v="symbol_object_pole"> <!-- <m v="symbol_object_pole">-->
<symbol src="assets:symbols/gondola.svg" /> <!-- <symbol src="assets:symbols/gondola.svg" />-->
</m> <!-- </m>-->
<!--对象标志--> <!-- &lt;!&ndash;对象标志&ndash;&gt;-->
<m v="symbol_object_symbol"> <!-- <m v="symbol_object_symbol">-->
<symbol src="assets:symbols/peak.svg" /> <!-- <symbol src="assets:symbols/peak.svg" />-->
</m> <!-- </m>-->
<!--交通信号灯--> <!-- &lt;!&ndash;交通信号灯&ndash;&gt;-->
<m v="symbol_object_traffic"> <!-- <m v="symbol_object_traffic">-->
<symbol src="assets:symbols/traffic_signal.svg" /> <!-- <symbol src="assets:symbols/traffic_signal.svg" />-->
</m> <!-- </m>-->
</m> <!-- </m>-->
<m k="nav_style"> <!-- <m k="nav_style">-->
<m v="symbol_object_line"> <!-- <m v="symbol_object_line">-->
<m k="rule" zoom-max="22" zoom-min="15"> <!-- <m k="rule" zoom-max="22" zoom-min="15">-->
<!-- 蓝色黑色间隔线 --> <!-- &lt;!&ndash; 蓝色黑色间隔线 &ndash;&gt;-->
<m v="blue_link"> <!-- <m v="blue_link">-->
<line dasharray="20,20" fix="true" stipple-stroke="#00000000" stroke="#00000000" <!-- <line dasharray="20,20" fix="true" stipple-stroke="#00000000" stroke="#00000000"-->
width="0.1" /> <!-- width="0.1" />-->
</m> <!-- </m>-->
<!-- 黄色线 --> <!-- &lt;!&ndash; 黄色线 &ndash;&gt;-->
<m v="yellow_link"> <!-- <m v="yellow_link">-->
<line stipple-width="0.1" stroke="#f4ea2a" width="0.1" /> <!-- <line stipple-width="0.1" stroke="#f4ea2a" width="0.1" />-->
</m> <!-- </m>-->
</m> <!-- </m>-->
<line stipple-width="0.5" stroke="#33aaaa" width="0.3" /> <!-- <line stipple-width="0.5" stroke="#33aaaa" width="0.3" />-->
</m> <!-- </m>-->
<m v="symbol_track_point" zoom-max="25" zoom-min="10"> <!-- <m v="symbol_track_point" zoom-max="25" zoom-min="10">-->
<symbol src="assets:symbols/dot_blue.svg" /> <!-- <symbol src="assets:symbols/dot_blue.svg" />-->
</m> <!-- </m>-->
</m> <!-- </m>-->
<m k="qi_table"> <m k="qi_table">
<!--车道数--> <!--车道数-->
@ -1799,13 +1800,41 @@
symbol-width="76"></symbol> symbol-width="76"></symbol>
</m> </m>
<m k="type" v="s_2_e"> <m k="type" v="s_2_e">
<line dasharray="1,1" repeat-gap="3" repeat-start="0" stroke="#14582c" <line use="s2e" />
width="0.1" /> </m>
</m>
<!--电子眼-->
<m v="OMDB_ELECTRONICEYE">
<m k="angle">
<symbol repeat="false" repeat-start="0" rotate="false"
src="assets:symbols/volcano.svg" symbol-height="69" symbol-width="69"></symbol>
</m>
<caption k="name" fill="#000000" priority="0" size="14" stroke="#ffffff" stroke-width="1.0" dy="-30"></caption>
<m k="type" v="angle">
<symbol repeat="false" repeat-gap="2000" repeat-start="0" rotate="true"
src="assets:omdb/icon_arrow_right.svg" symbol-height="76"
symbol-width="76"></symbol>
</m>
<m k="type" v="s_2_e">
<line use="s2e" />
</m>
</m>
<!-- 路口 -->
<m v="OMDB_INTERSECTION">
<m k="type" v="node">
<symbol src="assets:symbols/dot_blue_dark.svg"></symbol>
</m>
<m k="intersectionPid">
<symbol src="assets:symbols/dot_magenta.svg"></symbol>
</m> </m>
</m> </m>
<!-- 道路名 --> <!-- 道路名 -->
<m v="OMDB_LINK_NAME"> <m v="OMDB_LINK_NAME">
<text use="road"></text> <text use="road"></text>
</m> </m>
<!-- 车信 -->
<m v="OMDB_LANEINFO">
<text use="road"></text>
</m>
</m> </m>
</rendertheme> </rendertheme>

View File

@ -1,5 +1,6 @@
package com.navinfo.collect.library.data.entity package com.navinfo.collect.library.data.entity
import android.os.Parcelable
import com.navinfo.collect.library.system.Constant import com.navinfo.collect.library.system.Constant
import com.navinfo.collect.library.utils.GeometryTools import com.navinfo.collect.library.utils.GeometryTools
import com.navinfo.collect.library.utils.GeometryToolsKt import com.navinfo.collect.library.utils.GeometryToolsKt
@ -8,6 +9,7 @@ import io.realm.RealmObject
import io.realm.RealmSet import io.realm.RealmSet
import io.realm.annotations.Ignore import io.realm.annotations.Ignore
import io.realm.annotations.PrimaryKey import io.realm.annotations.PrimaryKey
import kotlinx.parcelize.Parcelize
import org.locationtech.jts.geom.Coordinate import org.locationtech.jts.geom.Coordinate
import org.locationtech.jts.geom.Geometry import org.locationtech.jts.geom.Geometry
import org.oscim.core.MercatorProjection import org.oscim.core.MercatorProjection
@ -16,13 +18,15 @@ import java.util.*
/** /**
* 渲染要素对应的实体 * 渲染要素对应的实体
* */ * */
open class RenderEntity() : RealmObject() { @Parcelize
open class RenderEntity() : RealmObject(), Parcelable {
@PrimaryKey @PrimaryKey
var id: String = UUID.randomUUID().toString() // id var id: String = UUID.randomUUID().toString() // id
lateinit var name: String //要素名 lateinit var name: String //要素名
lateinit var table: String //要素表名 lateinit var table: String //要素表名
var code: Int = 0 // 要素编码 var code: Int = 0 // 要素编码
var geometry: String = "" // 要素渲染参考的geometry该数据可能会在导入预处理环节被修改原始geometry会保存在properties的geometry字段下 var geometry: String =
"" // 要素渲染参考的geometry该数据可能会在导入预处理环节被修改原始geometry会保存在properties的geometry字段下
get() { get() {
wkt = GeometryTools.createGeometry(field) wkt = GeometryTools.createGeometry(field)
return field return field
@ -56,7 +60,7 @@ open class RenderEntity() : RealmObject() {
var tileX: RealmSet<Int> = RealmSet() // x方向的tile编码 var tileX: RealmSet<Int> = RealmSet() // x方向的tile编码
var tileY: RealmSet<Int> = RealmSet() // y方向的tile编码 var tileY: RealmSet<Int> = RealmSet() // y方向的tile编码
constructor(name: String): this() { constructor(name: String) : this() {
this.name = name this.name = name
} }
@ -65,9 +69,11 @@ open class RenderEntity() : RealmObject() {
//道路linkId //道路linkId
const val linkPid = "linkPid" const val linkPid = "linkPid"
} }
object LimitTable { object LimitTable {
const val linkPid = "linkPid" const val linkPid = "linkPid"
} }
object KindCodeTable { object KindCodeTable {
const val linkPid = "linkPid" const val linkPid = "linkPid"
} }

View File

@ -293,7 +293,7 @@ public class GeometryTools {
* @param coords [] * @param coords []
* @return Geometry * @return Geometry
*/ */
public LineString createLineString(Coordinate[] coords) { public static LineString createLineString(Coordinate[] coords) {
LineString lineString = null; LineString lineString = null;
GeometryFactory factory = new GeometryFactory(); GeometryFactory factory = new GeometryFactory();
lineString = factory.createLineString(coords); lineString = factory.createLineString(coords);