2023-11-28 15:53:52 +08:00

2128 lines
85 KiB
Kotlin
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package com.navinfo.omqs.util
import android.util.Log
import com.navinfo.collect.library.data.entity.RenderEntity
import com.navinfo.collect.library.enums.DataCodeEnum
import com.navinfo.collect.library.utils.FootAndDistance
import com.navinfo.collect.library.utils.GeometryTools
import com.navinfo.omqs.R
import com.navinfo.omqs.bean.RoadNameBean
import com.navinfo.omqs.bean.SignBean
import com.navinfo.omqs.db.RoomAppDatabase
import com.navinfo.omqs.ui.activity.map.LaneInfoItem
import com.navinfo.omqs.ui.fragment.signMoreInfo.LaneBoundaryItem
import com.navinfo.omqs.ui.fragment.signMoreInfo.TwoItemAdapter
import com.navinfo.omqs.ui.fragment.signMoreInfo.TwoItemAdapterItem
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import org.json.JSONArray
import org.json.JSONObject
import org.locationtech.jts.geom.Geometry
import org.locationtech.jts.geom.LineString
import org.locationtech.jts.geom.Point
import org.oscim.core.GeoPoint
import java.lang.reflect.Field
/*
* 要素详情解析类及左侧提前显示内容解析说明
* */
class SignUtil {
companion object {
suspend fun createSignBean(
scope: CoroutineScope,
roomAppDatabase: RoomAppDatabase,
element: RenderEntity
): SignBean {
return SignBean(
iconId = getSignIcon(element),
iconText = getSignIconText(element),
linkId = element.linkPid
?: "",
name = getSignNameText(element),
bottomRightText = getSignBottomRightText(
scope,
roomAppDatabase,
element
),
renderEntity = element,
isMoreInfo = isMoreInfo(element),
index = getRoadInfoIndex(element)
)
}
/**
* 获取面板上的文字
*/
fun getSignIconText(data: RenderEntity): String {
return when (data.code) {
//道路功能等级
DataCodeEnum.OMDB_RD_LINK_FUNCTION_CLASS.code -> {
"FC${data.properties["functionClass"]}"
}
//道路种别
DataCodeEnum.OMDB_RD_LINK_KIND.code -> {
"${data.properties["kind"]}"
}
//道路方向
DataCodeEnum.OMDB_LINK_DIRECT.code -> {
when (data.properties["direct"]) {
"0" -> return "不应用"
"1" -> return ""
"2" -> return ""
"3" -> return ""
else -> ""
}
}
//常规线限速
DataCodeEnum.OMDB_LINK_SPEEDLIMIT.code -> {
"${data.properties["maxSpeed"]}"
}
//条件线限速
DataCodeEnum.OMDB_LINK_SPEEDLIMIT_COND.code -> {
"${data.properties["maxSpeed"]}"
}
//全封闭
DataCodeEnum.OMDB_CON_ACCESS.code -> {
if (data.properties["conAccess"] === "1") "全封闭" else ""
}
//匝道
DataCodeEnum.OMDB_RAMP_1.code,
DataCodeEnum.OMDB_RAMP_2.code,
DataCodeEnum.OMDB_RAMP_3.code,
DataCodeEnum.OMDB_RAMP_4.code,
DataCodeEnum.OMDB_RAMP_5.code,
DataCodeEnum.OMDB_RAMP_6.code,
DataCodeEnum.OMDB_RAMP_7.code,
DataCodeEnum.OMDB_RAMP.code -> {
when (data.properties["formOfWay"]) {
"93" -> "普通匝"
"98" -> "高入匝"
"99" -> "高出匝"
"100" -> "高连匝"
"102" -> "直入匝"
"103" -> "直出匝"
"104" -> "出入匝"
else -> ""
}
}
//物理车道数OMDB_PHY_LANENUM
DataCodeEnum.OMDB_LANE_NUM.code,
DataCodeEnum.OMDB_PHY_LANENUM.code -> {
"${data.properties["laneS2e"]}|${data.properties["laneE2s"]}"
}
//常规点限速,条件点限速
DataCodeEnum.OMDB_SPEEDLIMIT.code, DataCodeEnum.OMDB_SPEEDLIMIT_COND.code -> getSpeedLimitMaxText(data)
//上下线分离
DataCodeEnum.OMDB_MULTI_DIGITIZED.code -> {
if (data.properties["multiDigitized"] == "1") "上下线" else " "
}
//桥
DataCodeEnum.OMDB_BRIDGE_1.code,//桥
DataCodeEnum.OMDB_BRIDGE_2.code,//桥
DataCodeEnum.OMDB_BRIDGE.code -> {
when (data.properties["bridgeType"]) {
"1" -> return "固定桥"
"2" -> return "可移桥"
"3" -> return "跨线桥"
else -> ""
}
}
//主辅路出入口
DataCodeEnum.OMDB_LINK_ATTRIBUTE_MAIN_SIDE_ACCESS.code -> "出入口"
//辅路
DataCodeEnum.OMDB_LINK_ATTRIBUTE_FORNTAGE.code -> "辅路"
//SA
DataCodeEnum.OMDB_LINK_ATTRIBUTE_SA.code -> "SA"
//PA
DataCodeEnum.OMDB_LINK_ATTRIBUTE_PA.code -> "PA"
DataCodeEnum.OMDB_LINK_FORM1_1.code -> "U-T"
DataCodeEnum.OMDB_LINK_FORM1_2.code -> "提右"
DataCodeEnum.OMDB_LINK_FORM1_3.code -> "提左"
DataCodeEnum.OMDB_LINK_FORM2_1.code -> "IC"
DataCodeEnum.OMDB_LINK_FORM2_2.code -> "JCT"
DataCodeEnum.OMDB_LINK_FORM2_3.code -> "跨线地"
DataCodeEnum.OMDB_LINK_FORM2_4.code -> "私道"
DataCodeEnum.OMDB_LINK_FORM2_5.code -> "步行街"
DataCodeEnum.OMDB_LINK_FORM2_6.code -> "公交道"
DataCodeEnum.OMDB_LINK_FORM2_7.code -> "POI"
DataCodeEnum.OMDB_LINK_FORM2_8.code -> "区域内"
DataCodeEnum.OMDB_LINK_FORM2_9.code -> "P出入"
DataCodeEnum.OMDB_LINK_FORM2_10.code -> "P虚拟"
DataCodeEnum.OMDB_LINK_FORM2_11.code -> "风景路"
DataCodeEnum.OMDB_LINK_FORM2_12.code -> "测试路"
DataCodeEnum.OMDB_LINK_FORM2_13.code -> "驾考路"
else -> ""
}
}
/**
* 获取要素名称
*/
fun getSignNameText(data: RenderEntity): String {
return when (data.code) {
//道路功能等级
DataCodeEnum.OMDB_RD_LINK_FUNCTION_CLASS.code -> "功能等级"
//道路种别
DataCodeEnum.OMDB_RD_LINK_KIND.code -> "种别"
//道路方向
DataCodeEnum.OMDB_LINK_DIRECT.code -> "方向"
//常规线限速
DataCodeEnum.OMDB_LINK_SPEEDLIMIT.code -> "线限速"
//条件线限速
DataCodeEnum.OMDB_LINK_SPEEDLIMIT_COND.code -> "条件限速"
DataCodeEnum.OMDB_LINK_ATTRIBUTE_MAIN_SIDE_ACCESS.code, DataCodeEnum.OMDB_LINK_ATTRIBUTE_FORNTAGE.code, DataCodeEnum.OMDB_LINK_ATTRIBUTE_SA.code, DataCodeEnum.OMDB_LINK_ATTRIBUTE_PA.code -> "道路属性"
DataCodeEnum.OMDB_LINK_FORM1_1.code, DataCodeEnum.OMDB_LINK_FORM1_2.code, DataCodeEnum.OMDB_LINK_FORM1_3.code, DataCodeEnum.OMDB_LINK_FORM2_1.code, DataCodeEnum.OMDB_LINK_FORM2_2.code, DataCodeEnum.OMDB_LINK_FORM2_3.code, DataCodeEnum.OMDB_LINK_FORM2_4.code, DataCodeEnum.OMDB_LINK_FORM2_5.code, DataCodeEnum.OMDB_LINK_FORM2_6.code, DataCodeEnum.OMDB_LINK_FORM2_7.code, DataCodeEnum.OMDB_LINK_FORM2_8.code, DataCodeEnum.OMDB_LINK_FORM2_9.code, DataCodeEnum.OMDB_LINK_FORM2_10.code, DataCodeEnum.OMDB_LINK_FORM2_11.code, DataCodeEnum.OMDB_LINK_FORM2_12.code, DataCodeEnum.OMDB_LINK_FORM2_13.code -> "道路形态"
else -> DataCodeEnum.findTableNameByCode(data.code)
}
}
/**
* 获取更多信息
*/
fun getMoreInfoAdapter(data: RenderEntity): TwoItemAdapter {
val adapter = TwoItemAdapter()
val list = mutableListOf<TwoItemAdapterItem>()
when (data.code) {
//可变线限速
DataCodeEnum.OMDB_LINK_SPEEDLIMIT_VAR.code -> list.addAll(
getChangeLimitSpeedInfo(
data
)
)
//常规点限速
DataCodeEnum.OMDB_SPEEDLIMIT.code -> list.addAll(getSpeedLimitMoreInfoText(data))
//条件点限速
DataCodeEnum.OMDB_SPEEDLIMIT_COND.code -> list.addAll(
getConditionLimitMoreInfoText(
data
)
)
//到路线
DataCodeEnum.OMDB_RD_LINK.code -> {
list.add(
TwoItemAdapterItem(
title = "linkPid", text = "${data.linkPid}"
)
)
list.add(
TwoItemAdapterItem(
title = "起点号码", text = "${data.properties["snodePid"]}"
)
)
list.add(
TwoItemAdapterItem(
title = "终点号码", text = "${data.properties["enodePid"]}"
)
)
}
//种别
DataCodeEnum.OMDB_RD_LINK_KIND.code -> {
list.add(
TwoItemAdapterItem(
title = "linkPid", text = "${data.linkPid}"
)
)
try {
list.add(
TwoItemAdapterItem(
title = "种别",
text = "${getKindType(data.properties["kind"]!!.toInt())}"
)
)
} catch (e: Throwable) {
}
}
//道路方向
DataCodeEnum.OMDB_LINK_DIRECT.code -> {
list.add(
TwoItemAdapterItem(
title = "linkPid", text = "${data.linkPid}"
)
)
try {
list.add(
TwoItemAdapterItem(
title = "通行方向",
text = "${getRoadDirectionType(data.properties["direct"]!!.toInt())}"
)
)
} catch (e: Throwable) {
}
}
//普通交限
DataCodeEnum.OMDB_RESTRICTION.code -> {
list.add(
TwoItemAdapterItem(
title = "linkIn", text = "${data.properties["linkIn"]}"
)
)
list.add(
TwoItemAdapterItem(
title = "linkOut", text = "${data.properties["linkOut"]}"
)
)
}
//道路功能等级
DataCodeEnum.OMDB_RD_LINK_FUNCTION_CLASS.code -> {
list.add(
TwoItemAdapterItem(
title = "功能等级", text = "等级${data.properties["functionClass"]}"
)
)
}
//常规线限速
DataCodeEnum.OMDB_LINK_SPEEDLIMIT.code -> {
list.addAll(getLinkSpeedLimitMoreInfo(data))
}
//车道数//增加物理车道数DataCodeEnum.OMDB_PHY_LANENUM.code
DataCodeEnum.OMDB_PHY_LANENUM.code,
DataCodeEnum.OMDB_LANE_NUM.code -> {
/* list.add(
TwoItemAdapterItem(
title = "车道总数", text = "${data.properties["laneNum"]}"
)
)*/
list.add(
TwoItemAdapterItem(
title = "顺方向车道数", text = "${data.properties["laneS2e"]}"
)
)
list.add(
TwoItemAdapterItem(
title = "逆方向车道数", text = "${data.properties["laneE2s"]}"
)
)
var str = when (data.properties["laneClass"]) {
"0" -> "未赋值"
"1" -> "一条车道"
"2" -> "两或三条"
"3" -> "四条及以上"
"-99" -> "参考PA"
else -> ""
}
list.add(
TwoItemAdapterItem(
title = "车道数等级", text = str
)
)
}
//路口
DataCodeEnum.OMDB_INTERSECTION.code -> {
val type = when (data.properties["type"]) {
"0" -> "简单路口"
"1" -> "复合路口"
else -> ""
}
list.add(
TwoItemAdapterItem(
title = "路口类型", text = type
)
)
}
//道路施工
DataCodeEnum.OMDB_LINK_CONSTRUCTION.code -> {
list.add(
TwoItemAdapterItem(
title = "linkPid", text = "${data.linkPid}"
)
)
val limitType = when (data.properties["limitType"]) {
"4" -> "施工(全封闭)"
"13" -> "施工(非全封闭)"
else -> ""
}
list.add(
TwoItemAdapterItem(
title = "限制类型", text = limitType
)
)
val validPeriod = data.properties["validPeriod"]
if (validPeriod != null) {
list.add(
TwoItemAdapterItem(
title = "施工时间",
text = "${TimePeriodUtil.getTimePeriod(validPeriod)}"
)
)
}
}
//车道施工
DataCodeEnum.OMDB_LANE_CONSTRUCTION.code -> {
list.add(
TwoItemAdapterItem(
title = "车道号码", text = "${data.properties["laneLinkPid"]}"
)
)
val startTime = data.properties["startTime"]
if (startTime != null) {
list.add(
TwoItemAdapterItem(
title = "施工开始时间",
text = "${TimePeriodUtil.getTimePeriod(startTime)}"
)
)
}
val endTime = data.properties["endTime"]
if (endTime != null) {
list.add(
TwoItemAdapterItem(
title = "施工结束时间", text = "${TimePeriodUtil.getTimePeriod(endTime)}"
)
)
}
}
//警示信息
DataCodeEnum.OMDB_WARNINGSIGN.code -> {
list.add(
TwoItemAdapterItem(
title = "linkPid", text = "${data.linkPid}"
)
)
list.add(
TwoItemAdapterItem(
title = "警示信息号码", text = "${data.properties["warningsignId"]}"
)
)
list.add(
TwoItemAdapterItem(
title = "作用方向", text = when (data.properties["direct"]) {
"2" -> "顺方向"
"3" -> "逆方向"
else -> ""
}
)
)
list.add(
TwoItemAdapterItem(
title = "标牌类型",
text = "${data.properties["typeCode"]}",
code = data.code
)
)
list.add(
TwoItemAdapterItem(
title = "有效距离", text = "${data.properties["validDis"]}"
)
)
list.add(
TwoItemAdapterItem(
title = "预告距离", text = "${data.properties["warnDis"]}"
)
)
val vehicleType = data.properties["warnDis"]
if (vehicleType != null) {
list.add(
TwoItemAdapterItem(
title = "车辆类型",
text = getElectronicEyeVehicleType(vehicleType.toInt())
)
)
}
list.add(
TwoItemAdapterItem(
title = "时间段", text = "${data.properties["validPeriod"]}"
)
)
list.add(
TwoItemAdapterItem(
title = "文字说明", text = "${data.properties["descript"]}"
)
)
}
//停止位置
DataCodeEnum.OMDB_OBJECT_STOPLOCATION.code -> {
list.add(
TwoItemAdapterItem(
title = "对象号码", text = "${data.properties["objectPid"]}"
)
)
list.add(
TwoItemAdapterItem(
title = "宽度", text = "${data.properties["width"]}mm"
)
)
list.add(
TwoItemAdapterItem(
title = "颜色", text = when (data.properties["color"]) {
"1" -> "白色"
"9" -> "其他"
else -> ""
}
)
)
list.add(
TwoItemAdapterItem(
title = "类型", text = when (data.properties["locationType"]) {
"1" -> "停止线"
"2" -> "停车让行线"
"3" -> "减速让行线"
"4" -> "虚拟停止线"
else -> ""
}
)
)
list.add(
TwoItemAdapterItem(
title = "符合高精", text = when (data.properties["compliant"]) {
"0" -> ""
"1" -> ""
else -> ""
}
)
)
}
//人行横道
DataCodeEnum.OMDB_CROSS_WALK.code -> {
list.add(
TwoItemAdapterItem(
title = "对象号码", text = "${data.properties["objectPid"]}"
)
)
list.add(
TwoItemAdapterItem(
title = "颜色", text = when (data.properties["color"]) {
"1" -> "白色"
"9" -> "其他"
else -> ""
}
)
)
list.add(
TwoItemAdapterItem(
title = "符合高精", text = when (data.properties["compliant"]) {
"0" -> ""
"1" -> ""
else -> ""
}
)
)
}
//文字
DataCodeEnum.OMDB_OBJECT_TEXT.code -> {
list.add(
TwoItemAdapterItem(
title = "对象号码", text = "${data.properties["objectPid"]}"
)
)
list.add(
TwoItemAdapterItem(
title = "长度", text = "${data.properties["length"]}mm"
)
)
list.add(
TwoItemAdapterItem(
title = "宽度", text = "${data.properties["width"]}mm"
)
)
list.add(
TwoItemAdapterItem(
title = "颜色", text = when (data.properties["color"]) {
"0" -> "未验证"
"1" -> "白色"
"2" -> "黄色"
"3" -> "红色"
"4" -> "彩色"
"9" -> "其他"
else -> ""
}
)
)
list.add(
TwoItemAdapterItem(
title = "文字内容", text = "${data.properties["textString"]}"
)
)
list.add(
TwoItemAdapterItem(
title = "符合高精", text = when (data.properties["compliant"]) {
"0" -> ""
"1" -> ""
else -> ""
}
)
)
}
//上方障碍物
DataCodeEnum.OMDB_OBJECT_OH_STRUCT.code -> {
list.add(
TwoItemAdapterItem(
title = "对象号码",
text = "${data.properties["objectPid"]}"
)
)
list.add(
TwoItemAdapterItem(
title = "符合高精", text = when (data.properties["compliant"]) {
"0" -> ""
"1" -> ""
else -> ""
}
)
)
list.add(
TwoItemAdapterItem(
title = "车道组", text = "${data.properties["lgId"]}"
)
)
}
//符号
DataCodeEnum.OMDB_OBJECT_SYMBOL.code -> {
list.add(
TwoItemAdapterItem(
title = "对象号码",
text = "${data.properties["objectPid"]}"
)
)
list.add(
TwoItemAdapterItem(
title = "颜色",
text = when (data.properties["color"]) {
"0" -> "未验证"
"1" -> "白色"
"2" -> "黄色"
"3" -> "红色"
"4" -> "彩色"
"9" -> "其他"
else -> ""
}
)
)
list.add(
TwoItemAdapterItem(
title = "符合高精", text = when (data.properties["compliant"]) {
"0" -> ""
"1" -> ""
else -> ""
}
)
)
list.add(
TwoItemAdapterItem(
title = "关联车道中心线", text = "${data.properties["laneLinkPid"]}"
)
)
list.add(
TwoItemAdapterItem(
title = "长度", text = "${data.properties["length"]}mm"
)
)
list.add(
TwoItemAdapterItem(
title = "宽度", text = "${data.properties["width"]}mm"
)
)
}
//杆状物
DataCodeEnum.OMDB_POLE.code -> {
list.add(
TwoItemAdapterItem(
title = "对象号码",
text = "${data.properties["objectPid"]}"
)
)
list.add(
TwoItemAdapterItem(
title = "类型",
text = when (data.properties["poleType"]) {
"1" -> "其他"
"2" -> "树干"
else -> ""
}
)
)
list.add(
TwoItemAdapterItem(
title = "顶面直径",
text = "${data.properties["diameterTop"]}"
)
)
list.add(
TwoItemAdapterItem(
title = "底面直径",
text = "${data.properties["diameterBottom"]}"
)
)
list.add(
TwoItemAdapterItem(
title = "符合高精", text = when (data.properties["compliant"]) {
"0" -> ""
"1" -> ""
else -> ""
}
)
)
list.add(
TwoItemAdapterItem(
title = "车道组", text = "${data.properties["lgList"]}"
)
)
}
//箭头
DataCodeEnum.OMDB_OBJECT_ARROW.code -> {
list.add(
TwoItemAdapterItem(
title = "对象号码",
text = "${data.properties["objectPid"]}"
)
)
list.add(
TwoItemAdapterItem(
title = "颜色",
text = when (data.properties["color"]) {
"0" -> "未验证"
"1" -> "白色"
"2" -> "黄色"
"3" -> "红色"
"4" -> "彩色"
"9" -> "其他"
else -> ""
}
)
)
list.add(
TwoItemAdapterItem(
title = "符合高精", text = when (data.properties["compliant"]) {
"0" -> ""
"1" -> ""
else -> ""
}
)
)
list.add(
TwoItemAdapterItem(
title = "关联车道中心线", text = "${data.properties["laneLinkPid"]}"
)
)
list.add(
TwoItemAdapterItem(
title = "长度", text = "${data.properties["length"]}mm"
)
)
list.add(
TwoItemAdapterItem(
title = "宽度", text = "${data.properties["width"]}mm"
)
)
}
//导流区
DataCodeEnum.OMDB_FILL_AREA.code -> {
list.add(
TwoItemAdapterItem(
title = "对象号码",
text = "${data.properties["objectPid"]}"
)
)
list.add(
TwoItemAdapterItem(
title = "符合高精", text = when (data.properties["compliant"]) {
"0" -> ""
"1" -> ""
else -> ""
}
)
)
list.add(
TwoItemAdapterItem(
title = "关联车道组", text = "${data.properties["lgList"]}"
)
)
}
//物理车道数
DataCodeEnum.OMDB_PHY_LANENUM.code -> {
list.add(
TwoItemAdapterItem(
title = "linkPid", text = "${data.linkPid}"
)
)
list.add(
TwoItemAdapterItem(
title = "要素类型", text = when (data.properties["featureType"]) {
"1" -> "HAD_LINK"
"2" -> "HAD_LINK_PA"
else -> ""
}
)
)
list.add(
TwoItemAdapterItem(title = "顺方向车道数", text = "${data.properties["laneS2e"]}")
)
list.add(
TwoItemAdapterItem(title = "逆方向车道数", text = "${data.properties["laneE2s"]}")
)
}
//车道点限速
DataCodeEnum.OMDB_LANE_SPEEDLIMIT.code -> {
list.add(TwoItemAdapterItem(title = "限速ID", text = "${data.properties["speedId"]}"))
list.add(TwoItemAdapterItem(title = "NodeId", text = "${data.properties["laneNodePid"]}"))
list.add(TwoItemAdapterItem(title = "最高限速", text = "${data.properties["maxSpeed"]}km/h"))
list.add(TwoItemAdapterItem(title = "最低限速", text = "${data.properties["minSpeed"]}km/h"))
}
//立交
DataCodeEnum.OMDB_ZLEVEL.code -> {
list.add(TwoItemAdapterItem(title = "linkPid", text = "${data.linkPid}"))
list.add(TwoItemAdapterItem(title = "立交号码", text = "${data.properties["zlevelId"]}"))
list.add(TwoItemAdapterItem(title = "要素号码", text = "${data.properties["featurePid"]}"))
list.add(
TwoItemAdapterItem(
title = "要素类型", text = when (data.properties["featureType"]) {
"1" -> "HAD_LINK"
"2" -> "RW_LINK"
else -> ""
}
)
)
list.add(TwoItemAdapterItem(title = "形状点号", text = "${data.properties["shpSeqNum"]}"))
list.add(TwoItemAdapterItem(title = "起终点标识", text = "${data.properties["startEnd"]}"))
list.add(TwoItemAdapterItem(title = "高度层次", text = "${data.properties["zlevel"]}"))
}
//道路边界类型
DataCodeEnum.OMDB_RDBOUND_BOUNDARYTYPE.code -> {
list.add(TwoItemAdapterItem(title = "道路边界线ID", text = "${data.properties["roadBoundaryLinkPid"]}"))
list.add(TwoItemAdapterItem(title = "道路边界类型", text = when (data.properties["boundaryType"]?.toInt()) {
0 -> "不应用"
1 -> "无标线无可区分边界"
2 -> "标线"
3 -> "路牙"
4 -> "护栏"
5 -> ""
6 -> "铺设路面边缘"
7 -> "虚拟三角岛"
8 -> "障碍物"
9 -> "杆状障碍物"
else -> ""
}))
}
//车道类型
DataCodeEnum.OMDB_LANE_TYPE_ACCESS.code -> {
list.add(TwoItemAdapterItem(title = "车道中心线ID", text = "${data.properties["laneLinkPid"]}"))
list.add(TwoItemAdapterItem(title = "车道类型", text = getLaneType(data)))
}
//设施分离
DataCodeEnum.OMDB_LINK_SEPARATION.code -> {
list.add(TwoItemAdapterItem(title = "设施分离", text = when (data.properties["separation"]) {
"1" -> "坚固护栏"
"2" -> "非坚固护栏"
else -> ""
}))
}
//中央隔离带
DataCodeEnum.OMDB_LINK_MEDIAN.code -> {
list.add(TwoItemAdapterItem(title = "设施分离", text = when (data.properties["medianSurface"]) {
"0" -> "未铺设"
"1" -> "铺设"
"2" -> "混合"
else -> ""
}))
}
//路牙
DataCodeEnum.OMDB_OBJECT_CURB.code -> {
list.add(TwoItemAdapterItem(title = "是否符合高精地图", text = when (data.properties["compliant"]) {
"0" -> ""
"1" -> ""
else -> ""
}))
}
//平行墙
DataCodeEnum.OMDB_OBJECT_WALL.code -> {
list.add(TwoItemAdapterItem(title = "类型", text = when (data.properties["type"]) {
"1" -> "隧道墙"
"3" -> "其他墙"
else -> ""
}))
}
//警示区
DataCodeEnum.OMDB_OBJECT_WARNING_AREA.code -> {
list.add(TwoItemAdapterItem(title = "颜色", text = when (data.properties["color"]) {
"0" -> "未验证"
"1" -> "白色"
"2" -> "黄色"
"3" -> "红色"
else -> ""
}))
list.add(TwoItemAdapterItem(title = "材质", text = when (data.properties["material"]) {
"1" -> "有突起的材质"
"2" -> "喷漆材质"
else -> ""
}))
}
//护栏
DataCodeEnum.OMDB_OBJECT_BARRIER.code -> {
list.add(TwoItemAdapterItem(title = "护栏类型", text = when (data.properties["barrierType"]) {
"0" -> "护栏"
"1" -> "新泽西护栏"
"2" -> "安全护栏"
"3" -> "围栏"
"4" -> "其他护栏"
else -> ""
}))
}
}
adapter.data = list
return adapter
}
/**
* 获取路口详细信息
*/
fun getTollgateInfo(renderEntity: RenderEntity): List<LaneBoundaryItem> {
val list = mutableListOf<LaneBoundaryItem>()
list.add(
LaneBoundaryItem("linkPid", "${renderEntity.linkPid}", null)
)
list.add(
LaneBoundaryItem("收费站号码", "${renderEntity.properties["tollgatePid"]}", null)
)
list.add(
LaneBoundaryItem(
"作用方向", when (renderEntity.properties["direct"]) {
"2" -> "顺方向"
"3" -> "逆方向"
else -> ""
}, null
)
)
list.add(
LaneBoundaryItem(
"类型", when (renderEntity.properties["tollType"]) {
"0" -> "未调查"
"1" -> "领卡"
"2" -> "交卡付费"
"3" -> "固定收费(次费)"
"4" -> "交卡付费后再领卡"
"5" -> "交卡付费并代收固定费用"
"6" -> "验票(无票收费)值先保留"
"7" -> "领卡并代收固定费用"
"8" -> "持卡打标识不收费"
"9" -> "验票领卡"
"10" -> "交卡不收费"
"11" -> "无收费站建筑物结构但收费"
"12" -> "废弃或非收费通道"
else -> ""
}, null
)
)
list.add(
LaneBoundaryItem("地图代码", "${renderEntity.properties["backimageCode"]}", null)
)
list.add(
LaneBoundaryItem("箭头代码", "${renderEntity.properties["arrowCode"]}", null)
)
try {
val linkList = renderEntity.properties["tollinfoList"]
if (linkList != null && linkList != "" && linkList != "null") {
val jsonArray = JSONArray(linkList)
for (i in 0 until jsonArray.length()) {
val arrayObject: JSONObject = jsonArray[i] as JSONObject
val itemList = mutableListOf<TwoItemAdapterItem>()
try {
itemList.add(
TwoItemAdapterItem("通道号码", "${arrayObject.optString("pid")}")
)
val stringBuffer = StringBuffer()
stringBuffer.setLength(0)
val passageType = arrayObject.getInt("passageType")
for (i in 1 downTo 0) {
val bit = (passageType shr i) and 1
if (bit == 1) {
when (i) {
0 -> stringBuffer.append("称重车道 ")
1 -> stringBuffer.append("绿色通道 ")
}
}
}
itemList.add(
TwoItemAdapterItem("通道类型", stringBuffer.toString())
)
stringBuffer.setLength(0)
val payMethod = arrayObject.getInt("payMethod")
for (i in 8 downTo 0) {
val bit = (payMethod shr i) and 1
if (bit == 1) {
when (i) {
0 -> stringBuffer.append("ETC ")
1 -> stringBuffer.append("现金 ")
2 -> stringBuffer.append("银行卡(借记卡) ")
3 -> stringBuffer.append("信用卡 ")
4 -> stringBuffer.append("IC卡 ")
5 -> stringBuffer.append("预付卡 ")
6 -> stringBuffer.append("微信 ")
7 -> stringBuffer.append("支付宝 ")
8 -> stringBuffer.append("其他APP ")
}
}
}
itemList.add(
TwoItemAdapterItem("收费方式", stringBuffer.toString())
)
stringBuffer.setLength(0)
val cardType = arrayObject.getInt("cardType")
for (i in 2 downTo 0) {
val bit = (cardType shr i) and 1
if (bit == 1) {
when (i) {
0 -> stringBuffer.append("ETC ")
1 -> stringBuffer.append("人工 ")
2 -> stringBuffer.append("自助 ")
}
}
}
itemList.add(
TwoItemAdapterItem("领卡方式", stringBuffer.toString())
)
val seqNum = arrayObject.getInt("seqNum")
list.add(
LaneBoundaryItem(
"车道$seqNum", null, itemList
)
)
} catch (e: Exception) {
Log.e("jingo", "领卡方式 报错 ${e.message}")
}
}
}
} catch (e: Exception) {
}
return list
}
/**
* 获取路口详细信息
*/
fun getIntersectionInfo(renderEntity: RenderEntity): List<LaneBoundaryItem> {
val list = mutableListOf<LaneBoundaryItem>()
list.add(
LaneBoundaryItem(
"路口号码", "${renderEntity.properties["intersectionPid"]}", null
)
)
val type = when (renderEntity.properties["type"]) {
"0" -> "简单路口"
"1" -> "复合路口"
else -> ""
}
list.add(LaneBoundaryItem("路口类型", type, null))
try {
val linkList = renderEntity.properties["linkList"]
if (linkList != null && linkList != "" && linkList != "null") {
val jsonArray = JSONArray(linkList)
for (i in 0 until jsonArray.length()) {
val itemList = mutableListOf<TwoItemAdapterItem>()
val arrayObject: JSONObject = jsonArray[i] as JSONObject
val direct = when (arrayObject.getInt("direct")) {
2 -> "顺方向"
3 -> "逆方向"
else -> ""
}
itemList.add(TwoItemAdapterItem("方向", direct))
val featureType = when (arrayObject.getInt("featureType")) {
1 -> "LINK"
2 -> "LINK PA"
else -> ""
}
itemList.add(TwoItemAdapterItem("要素类型", featureType))
list.add(
LaneBoundaryItem(
"车道标线序号${arrayObject.getInt("markSeqNum")}", null, itemList
)
)
}
}
} catch (e: Exception) {
}
return list
}
/**
* 获取车道边界类型详细信息
*/
fun getLaneBoundaryTypeInfo(renderEntity: RenderEntity): List<LaneBoundaryItem> {
val list = mutableListOf<LaneBoundaryItem>()
list.add(LaneBoundaryItem("车道边界线ID", "${renderEntity.properties["featurePid"]}", null))
val type = renderEntity.properties["boundaryType"]
if (type != null) {
val typeStr = when (type.toInt()) {
0 -> "不应用"
1 -> "无标线无可区分边界"
2 -> "标线"
3 -> "路牙"
4 -> "护栏"
5 -> ""
6 -> "铺设路面边缘"
7 -> "虚拟三角岛"
8 -> "障碍物"
9 -> "杆状障碍物"
else -> ""
}
list.add(LaneBoundaryItem("边界类型", typeStr, null))
}
try {
val shapeList = renderEntity.properties["shapeList"]
if (shapeList != null && shapeList != "" && shapeList != "null") {
val itemList = mutableListOf<TwoItemAdapterItem>()
val jsonArray = JSONArray(shapeList)
for (i in 0 until jsonArray.length()) {
val arrayObject: JSONObject = jsonArray[i] as JSONObject
var markType = when (arrayObject.getInt("markType")) {
0 -> "其他"
1 -> "实线"
2 -> "虚线"
4 -> "Gore(导流区边线)"
5 -> "铺设路面边缘(标线)"
6 -> "菱形减速标线"
7 -> "可变导向标线"
8 -> "短粗虚线"
else -> ""
}
itemList.add(TwoItemAdapterItem("车道标线类型", markType))
val markColor = when (arrayObject.getInt("markColor")) {
0 -> "不应用"
1 -> "白色"
2 -> "黄色"
6 -> "蓝色"
7 -> "绿色"
9 -> "其他"
else -> ""
}
itemList.add(TwoItemAdapterItem("车道标线颜色", markColor))
itemList.add(
TwoItemAdapterItem(
"车道标线宽度(mm)", "${arrayObject.getInt("markWidth")}"
)
)
val markMaterial = when (arrayObject.getInt("markMaterial")) {
0 -> "不应用"
1 -> "油漆"
2 -> "突起"
3 -> "油漆和突起"
else -> ""
}
itemList.add(TwoItemAdapterItem("车道标线材质", markMaterial))
itemList.add(
TwoItemAdapterItem(
"横向偏移(mm)", "${arrayObject.getInt("lateralOffset")}"
)
)
list.add(
LaneBoundaryItem(
"车道标线序号${arrayObject.getInt("markSeqNum")}", null, itemList
)
)
}
}
} catch (e: Exception) {
}
return list
}
/**
* 右下角文字
*/
suspend fun getSignBottomRightText(
scope: CoroutineScope,
roomAppDatabase: RoomAppDatabase,
data: RenderEntity
): String {
return when (data.code) {
//警示信息
DataCodeEnum.OMDB_WARNINGSIGN.code -> {
var describe = ""
val job = scope.launch(Dispatchers.IO) {
val typeCode = data.properties["typeCode"]
if (typeCode != null) {
describe = roomAppDatabase.getScWarningCodeDao()
.findScWarningDescribe(typeCode).toString()
}
}
job.join()
Log.e("jingo", "警示信息 类型: $describe")
return describe
}
//条件点限速
DataCodeEnum.OMDB_SPEEDLIMIT_COND.code -> getConditionLimitText(data)
//电子眼
DataCodeEnum.OMDB_ELECTRONICEYE.code -> data.properties["name"].toString()
//收费站
DataCodeEnum.OMDB_TOLLGATE.code -> {
val tollinfoList = data.properties["tollinfoList"]
try {
val jsonArray = JSONArray(tollinfoList)
return "${jsonArray.length()}"
} catch (e: Exception) {
return ""
}
}
DataCodeEnum.OMDB_TRAFFIC_SIGN.code -> {
var color = data.properties["color"]
if (color != null) {
when (color) {
"0" -> {
return "颜色:未验证"
}
"1" -> {
return "颜色:白色"
}
"2" -> {
return "颜色:黄色"
}
"3" -> {
return "颜色:红色"
}
"5" -> {
return "颜色:棕色"
}
"6" -> {
return "颜色:蓝色"
}
"7" -> {
return "颜色:绿色"
}
"8" -> {
return "颜色:黑色"
}
"9" -> {
return "颜色:其他"
}
}
}
return "颜色:未验证"
}
else -> ""
}
}
/**
* 条件点限速更多信息
*/
fun getConditionLimitMoreInfoText(renderEntity: RenderEntity): List<TwoItemAdapterItem> {
val list = mutableListOf<TwoItemAdapterItem>()
val maxSpeed = renderEntity.properties["maxSpeed"]
if (maxSpeed != null) {
list.add(
TwoItemAdapterItem(
title = "最高限速值(km/h)", text = maxSpeed
)
)
}
list.add(
TwoItemAdapterItem(
title = "限速条件", text = getConditionLimitText(renderEntity)
)
)
val carType = renderEntity.properties["vehicleType"]
list.add(
TwoItemAdapterItem(
title = "车辆类型", text = getElectronicEyeVehicleType(carType!!.toInt())
)
)
val time = renderEntity.properties["validPeriod"]
if (time?.isNotEmpty() == true) {
list.add(
TwoItemAdapterItem(
title = "时间段", text = time
)
)
}
return list
}
/**
* 车道类型
*/
private fun getLaneType(data: RenderEntity): String {
val stringBuffer = StringBuffer()
val dependent = data.properties["laneType"]
dependent?.let {
val dependentInt = it.toInt()
for (i in 31 downTo 0) {
val bit = (dependentInt shr i) and 1
if (bit == 1) {
when (i) {
0 -> stringBuffer.append("常规车道 ")
1 -> stringBuffer.append("复合车道 ")
2 -> stringBuffer.append("加速车道 ")
3 -> stringBuffer.append("减速车道 ")
4 -> stringBuffer.append("满载车道 ")
6 -> stringBuffer.append("慢车道 ")
8 -> stringBuffer.append("路肩车道 ")
10 -> stringBuffer.append("管制车道 ")
13 -> stringBuffer.append("可行使车道 ")
14 -> stringBuffer.append("可行使路肩车道 ")
17 -> stringBuffer.append("紧急停车道 ")
18 -> stringBuffer.append("公交车道 ")
19 -> stringBuffer.append("自行车道 ")
20 -> stringBuffer.append("转向车道 ")
21 -> stringBuffer.append("潮汐车道 ")
23 -> stringBuffer.append("避险车道 ")
24 -> stringBuffer.append("可变车道 ")
25 -> stringBuffer.append("停车车道 ")
26 -> stringBuffer.append("其他 ")
28 -> stringBuffer.append("自动驾驶专用道 ")
}
}
}
}
return stringBuffer.toString()
}
/**
* 条件点限速文字
*/
private fun getConditionLimitText(data: RenderEntity): String {
val stringBuffer = StringBuffer()
try {
val dependent = data.properties["speedDependent"]
dependent?.let {
val dependentInt = it.toInt()
for (i in 31 downTo 0) {
val bit = (dependentInt 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("建议 ")
9 -> stringBuffer.append("")
10 -> stringBuffer.append("其他 ")
}
}
}
}
} catch (e: Exception) {
}
return stringBuffer.toString()
}
private fun isBitSet(number: Int, n: Int): Boolean {
// 创建一个二进制数,只有第 n 个 bit 位是 1其他 bit 位是 0
val mask = 1 shl (n - 1)
// 将原始二进制数与上面创建的二进制数进行位运算
val result = number and mask
// 判断运算结果是否为 0
return result != 0
}
/**
* 获取上下线分离值
*/
private fun getMultiDigitized(data: RenderEntity): String {
val multiDigitized = data.properties["multiDigitized"]
try {
if (multiDigitized?.toInt() == 1) return "上下线"
} catch (e: Throwable) {
}
return ""
}
/**
* 获取限速值文字
*/
private fun getSpeedLimitMaxText(data: RenderEntity): String {
try {
//限速标志 0 限速开始 1 限速解除
val maxSpeed = data.properties["maxSpeed"]
return maxSpeed.toString()
} catch (e: Exception) {
Log.e("jingo", "获取限速面板ICON出错1 $e")
}
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"
}
/**
* 常规点限速更多信息
*/
fun getSpeedLimitMoreInfoText(renderEntity: RenderEntity): List<TwoItemAdapterItem> {
val list = mutableListOf<TwoItemAdapterItem>()
list.add(
TwoItemAdapterItem(
title = "最高限速值(km/h)", text = getSpeedLimitMaxText(renderEntity)
)
)
list.add(
TwoItemAdapterItem(
title = "最低限速值(km/h)", text = getSpeedLimitMinText(renderEntity)
)
)
val direct = renderEntity.properties["direct"]
var str = ""
if (direct == "2") {
str = "顺方向"
} else if (direct == "3") {
str = "逆方向"
}
if (str != "") {
list.add(TwoItemAdapterItem(title = "限速方向", text = str))
}
val speedFlag = renderEntity.properties["speedFlag"]
var flag = ""
if (speedFlag == "0") {
flag = "限速开始"
} else if (speedFlag == "1") {
flag = "限速解除"
}
if (flag != "") {
list.add(TwoItemAdapterItem(title = "限速标志", text = flag))
}
return list
}
/**
* 获取看板图标
*/
fun getSignIcon(data: RenderEntity): Int {
return when (data.code) {
// //道路种别
// 2008 -> getKindCodeIcon(data)
// //道路方向
// 2010 -> getRoadDirection(data)
// //车道数
// 2041 -> getLaneNumIcon(data)
//普通点限速
DataCodeEnum.OMDB_SPEEDLIMIT.code -> {
//限速标志 0 限速开始 1 限速解除
when (data.properties["speedFlag"]) {
"1" -> return R.drawable.icon_speed_limit_off
else -> return R.drawable.icon_speed_limit
}
}
//条件点限速
DataCodeEnum.OMDB_SPEEDLIMIT_COND.code -> {
//限速标志 0 限速开始 1 限速解除
when (data.properties["speedFlag"]) {
"1" -> return R.drawable.icon_conditional_speed_limit_off
else -> return R.drawable.icon_conditional_speed_limit
}
}
//可变点限速
DataCodeEnum.OMDB_SPEEDLIMIT_VAR.code -> R.drawable.icon_change_limit
//电子眼
DataCodeEnum.OMDB_ELECTRONICEYE.code -> R.drawable.icon_electronic_eye
//交通灯
DataCodeEnum.OMDB_TRAFFICLIGHT.code -> R.drawable.icon_traffic_light
//警示信息
DataCodeEnum.OMDB_WARNINGSIGN.code -> {
val typeCode = data.properties["typeCode"]
if (typeCode != null) return typeCode.toInt()
return 0
}
//收费站
DataCodeEnum.OMDB_TOLLGATE.code -> {
var backimageCode = data.properties["backimageCode"]
if (backimageCode != null) {
backimageCode = backimageCode.lowercase()
return getResId(backimageCode, R.drawable::class.java)
}
return 0
}
DataCodeEnum.OMDB_TRAFFIC_SIGN.code -> {
var trafsignShape = data.properties["trafsignShape"]
if (trafsignShape != null) {
trafsignShape =
"icon_${DataCodeEnum.OMDB_TRAFFIC_SIGN.code}_${trafsignShape.lowercase()}"
return getResId(trafsignShape, R.drawable::class.java)
}
return 0
}
else -> 0
}
}
/**
* 获取种别图标
*/
private fun getKindCodeIcon(data: RenderEntity): Int {
try {
val kind = data.properties["kind"]
return when (kind!!.toInt()) {
1 -> R.drawable.icon_kind_code_k1
2 -> R.drawable.icon_kind_code_k2
3 -> R.drawable.icon_kind_code_k3
4 -> R.drawable.icon_kind_code_k4
6 -> R.drawable.icon_kind_code_k6
7 -> R.drawable.icon_kind_code_k7
8 -> R.drawable.icon_kind_code_k8
9 -> R.drawable.icon_kind_code_k9
10 -> R.drawable.icon_kind_code_k10
11 -> R.drawable.icon_kind_code_k11
13 -> R.drawable.icon_kind_code_k13
15 -> R.drawable.icon_kind_code_k15
else -> R.drawable.icon_kind_code
}
} catch (e: Exception) {
Log.e("jingo", "获取种别面板ICON出错 $e")
}
return R.drawable.icon_kind_code
}
/**
* 获取到路线
*/
private fun getLaneNumIcon(data: RenderEntity): Int {
try {
val lineNum = data.properties["laneNum"]
return when (lineNum!!.toInt()) {
1 -> R.drawable.icon_lane_num1
2 -> R.drawable.icon_lane_num2
3 -> R.drawable.icon_lane_num3
4 -> R.drawable.icon_lane_num4
5 -> R.drawable.icon_lane_num5
6 -> R.drawable.icon_lane_num6
7 -> R.drawable.icon_lane_num7
8 -> R.drawable.icon_lane_num8
9 -> R.drawable.icon_lane_num9
10 -> R.drawable.icon_lane_num10
11 -> R.drawable.icon_lane_num11
12 -> R.drawable.icon_lane_num12
else -> R.drawable.icon_lane_num1
}
} catch (e: Exception) {
Log.e("jingo", "获取车道数面板ICON出错 $e")
}
return R.drawable.icon_road_direction
}
/**
* 道路方向
*/
fun getRoadDirectionType(type: Int): String {
return when (type) {
0 -> "不应用"
1 -> "双方向"
2 -> "顺方向"
3 -> "逆方向"
-99 -> "参考PA"
else -> "未定义"
}
}
// private fun getRoadDirection(data: RenderEntity): Int {
// try {
// val direct = data.properties["direct"]
// return when (direct!!.toInt()) {
// 0 -> R.drawable.icon_road_direction
// 1 -> R.drawable.icon_road_direction
// 2 -> R.drawable.icon_road_direction
// 3 -> R.drawable.icon_road_direction
// -99 -> R.drawable.icon_road_direction
// else -> R.drawable.icon_road_direction
// }
// } catch (e: Exception) {
// Log.e("jingo", "获取道路方向面板ICON出错 $e")
// }
// return R.drawable.icon_road_direction
// }
/**
* 获取道路播报语音文字
*/
fun getRoadSpeechText(topSignList: MutableList<SignBean>): String {
if (topSignList.size == 0) return ""
val stringBuffer = StringBuffer()
stringBuffer.append("当前道路")
for (item in topSignList) {
when (item.renderEntity.code) {
DataCodeEnum.OMDB_RD_LINK_FUNCTION_CLASS.code -> stringBuffer.append(
"功能等级${
item.iconText.substring(
2
)
},"
)
DataCodeEnum.OMDB_RD_LINK_KIND.code -> stringBuffer.append("种别${item.iconText},")
DataCodeEnum.OMDB_LINK_DIRECT.code -> stringBuffer.append("${item.iconText},")
/* DataCodeEnum.OMDB_PHY_LANENUM.code,//物理车道数
DataCodeEnum.OMDB_LANE_NUM.code -> stringBuffer.append(
"${
item.iconText.substringBefore(
"|"
)
}车道"
)*/
}
}
return stringBuffer.toString()
}
/**
* 获取道路名列表
*/
fun getRoadNameList(data: RenderEntity): MutableList<RoadNameBean> {
val list = mutableListOf<RoadNameBean>()
try {
val shapeStr = data.properties["shapeList"]
val array = JSONArray(shapeStr)
for (i in 0 until array.length()) {
val jsonObject = array.getJSONObject(i)
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) {
//常规点限速
DataCodeEnum.OMDB_SPEEDLIMIT.code -> getSpeedLimitMinText(element) != "0"
//条件点限速
DataCodeEnum.OMDB_SPEEDLIMIT_COND.code,
//电子眼
DataCodeEnum.OMDB_ELECTRONICEYE.code,
//收费站
DataCodeEnum.OMDB_TOLLGATE.code,
//警示信息
DataCodeEnum.OMDB_WARNINGSIGN.code -> true
else -> false
}
return isMore
}
/**
* 可变点限速详细信息
*/
fun getChangeLimitSpeedInfo(renderEntity: RenderEntity): List<TwoItemAdapterItem> {
val list = mutableListOf<TwoItemAdapterItem>()
val kindCode = renderEntity.properties["location"]
if (kindCode != null) {
when (kindCode.toInt()) {
1 -> list.add(
TwoItemAdapterItem(
title = "标牌位置", text = ""
)
)
2 -> list.add(
TwoItemAdapterItem(
title = "标牌位置", text = ""
)
)
3 -> list.add(
TwoItemAdapterItem(
title = "标牌位置", text = ""
)
)
}
}
return list
}
/**
* 获取电子眼详细信息
*/
fun getElectronicEyeMoreInfo(renderEntity: RenderEntity): List<TwoItemAdapterItem> {
val list = mutableListOf<TwoItemAdapterItem>()
val dir = when (renderEntity.properties["direct"]) {
"2" -> "顺方向"
"3" -> "逆方向"
else -> ""
}
if (dir != "") {
list.add(
TwoItemAdapterItem(
title = "作用方向", text = dir
)
)
}
// val kindUp = when (renderEntity.properties["kindUp"]) {
// "0" -> "未调查"
// "1" -> "限速电子眼"
// "4" -> "区间测速电子眼"
// "5" -> "交通信号灯电子眼"
// "6" -> "专用车道电子眼"
// "7" -> "违章电子眼"
// "11" -> "路况监控电子眼"
// "19" -> "交通标线电子眼"
// "20" -> "专用功能电子眼"
// else -> ""
// }
// list.add(TwoItemAdapterItem(title = "电子眼类型大分类", text = kindUp))
val kindCode = renderEntity.properties["kind"]!!.toInt()
list.add(
TwoItemAdapterItem(
title = "电子眼类型", text = getElectronicEyeKindType(kindCode)
)
)
when (kindCode) {
1, 2, 3, 4, 5, 6, 20, 21 -> {
list.add(
TwoItemAdapterItem(
title = "限速值(km/h)",
text = renderEntity.properties["speedLimit"].toString()
)
)
}
}
val carType = renderEntity.properties["vehicleType"]
if (carType != null && carType != "0") {
list.add(
TwoItemAdapterItem(
title = "车辆类型", text = getElectronicEyeVehicleType(carType.toInt())
)
)
}
val time = renderEntity.properties["validPeriod"]
if (time?.isNotEmpty() == true) {
list.add(
TwoItemAdapterItem(
title = "时间段", text = time
)
)
}
if (kindCode == 20 || kindCode == 21) {
list.add(
TwoItemAdapterItem(
title = "区间测试配对", text = renderEntity.properties["pairEleceyeId"].toString()
)
)
}
list.add(
TwoItemAdapterItem(
title = "照射角度", text = "${renderEntity.properties["angle"]}"
)
)
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()
}
fun getKindType(kind: Int): String {
return when (kind) {
1 -> "高速道路"
2 -> "城市道路"
3 -> "国道"
4 -> "省道"
6 -> "县道"
7 -> "乡镇村道路"
8 -> "其他道路"
9 -> "非引导道路"
10 -> "步行道路"
11 -> "人渡"
13 -> "轮渡"
15 -> "自行车道路"
-99 -> "参考PA"
else -> "未定义"
}
}
/**
* 获取电子眼类型
*/
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): MutableList<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]
val laneInfo = "laneinfo_${itemObject.toString().replace(",", "_")}"
list.add(
LaneInfoItem(
id = getResId(
laneInfo, R.drawable::class.java
), type = type!!.toString().toInt()
)
)
}
}
}
} catch (e: Exception) {
Log.e("jingo", "json 解析失败")
}
return list
}
/**
* 通过字符串名称获取资源id
*/
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
}
}
/**
* 道路信息排序用的
*/
fun getRoadInfoIndex(element: RenderEntity): Int {
return when (element.code) {
DataCodeEnum.OMDB_PHY_LANENUM.code,//物理车道数
DataCodeEnum.OMDB_LANE_NUM.code -> 0
DataCodeEnum.OMDB_RD_LINK_KIND.code -> 1
DataCodeEnum.OMDB_RD_LINK_FUNCTION_CLASS.code -> 2
DataCodeEnum.OMDB_LINK_SPEEDLIMIT.code -> 3
DataCodeEnum.OMDB_LINK_SPEEDLIMIT_COND.code -> 4
DataCodeEnum.OMDB_LINK_DIRECT.code -> 5
else -> 999
}
}
//常规线限速详细信息
private fun getLinkSpeedLimitMoreInfo(data: RenderEntity): List<TwoItemAdapterItem> {
val list = mutableListOf<TwoItemAdapterItem>()
val dir = when (data.properties["direction"]) {
"2" -> "顺方向"
"3" -> "逆方向"
else -> ""
}
if (dir != "") {
list.add(
TwoItemAdapterItem(
title = "限速方向", text = dir
)
)
}
list.add(
TwoItemAdapterItem(
title = "最高限速值(km/h)", text = "${data.properties["maxSpeed"]}"
)
)
var maxStr = when (data.properties["maxSpeedSource"]) {
"0" -> {
"不应用"
}
"1" -> {
"现场"
}
"2" -> {
"理论"
}
else -> ""
}
if (maxStr != "") {
list.add(
TwoItemAdapterItem(
title = "最高限速来源", text = maxStr
)
)
}
list.add(
TwoItemAdapterItem(
title = "最低限速值(km/h)", text = "${data.properties["minSpeed"]}"
)
)
var minStr = when (data.properties["minSpeedSource"]) {
"0" -> {
"不应用"
}
"1" -> {
"现场"
}
"2" -> {
"理论"
}
else -> ""
}
if (minStr != "") {
list.add(
TwoItemAdapterItem(
title = "最低限速来源", text = minStr
)
)
}
var isLaneDependent = when (data.properties["isLaneDependent"]) {
"0" -> {
""
}
"1" -> {
""
}
else -> ""
}
if (isLaneDependent != "") {
list.add(
TwoItemAdapterItem(
title = "是否车道依赖", text = isLaneDependent
)
)
}
return list
}
/**
* 获取交通标牌详细信息
*/
fun getTrafficSignMoreInfo(renderEntity: RenderEntity): List<TwoItemAdapterItem> {
val list = mutableListOf<TwoItemAdapterItem>()
list.add(TwoItemAdapterItem(title = "对象号码", text = "${renderEntity.properties["objectPid"]}"))
val trafsignShape = when (renderEntity.properties["trafsignShape"]) {
"1" -> "不规则形状"
"2" -> "长方形"
"3" -> "三角形"
"4" -> "圆形"
"5" -> "菱形"
"6" -> "倒三角形"
"7" -> "正方形"
"8" -> "八角形"
else -> ""
}
if (trafsignShape != "") {
list.add(
TwoItemAdapterItem(
title = "形状", text = trafsignShape
)
)
}
list.add(TwoItemAdapterItem("类型", "${renderEntity.properties["signType"]}"))
val color = when (renderEntity.properties["color"]) {
"0" -> "未验证"
"1" -> "白色"
"2" -> "黄色"
"3" -> "红色"
"5" -> "棕色"
"6" -> "蓝色"
"7" -> "绿色"
"8" -> "黑色"
"9" -> "其他"
else -> ""
}
list.add(
TwoItemAdapterItem(
title = "颜色", text = color
)
)
list.add(
TwoItemAdapterItem(
title = "朝向", text = "${renderEntity.properties["heading"]}"
)
)
list.add(TwoItemAdapterItem("对象高", "${renderEntity.properties["signType"]}"))
return list
}
/**
* 计算捕捉点到
*/
fun getDistance(
footAndDistance: FootAndDistance,
lineString: Geometry,
element: RenderEntity
): Int {
val itemGeometry = GeometryTools.createGeometry(element.geometry)
if (itemGeometry is Point) {
val itemFoot = GeometryTools.pointToLineDistance(
GeoPoint(itemGeometry.y, itemGeometry.x),
lineString
)
var dis = GeometryTools.getDistance(
footAndDistance.getCoordinate(0).getY(),
footAndDistance.getCoordinate(0).getX(),
itemFoot.getCoordinate(0).getY(),
itemFoot.getCoordinate(0).getX(),
)
return if (footAndDistance.footIndex < itemFoot.footIndex) {
dis.toInt()
} else {
-dis.toInt()
}
} else if (itemGeometry is LineString) {
val itemFoot = GeometryTools.pointToLineDistance(
GeoPoint(
lineString.coordinates[lineString.coordinates.size - 1].y,
lineString.coordinates[lineString.coordinates.size - 1].x
), lineString
)
var dis = GeometryTools.getDistance(
footAndDistance.getCoordinate(0).getY(),
footAndDistance.getCoordinate(0).getX(),
itemFoot.getCoordinate(0).getY(),
itemFoot.getCoordinate(0).getX(),
)
return if (footAndDistance.footIndex < itemFoot.footIndex) {
dis.toInt()
} else {
-dis.toInt()
}
}
return 0
}
}
}