feat: 增加警示信息图标渲染

This commit is contained in:
2023-08-24 14:27:31 +08:00
parent d92a75e2b5
commit 5a9cbd09e6
191 changed files with 4313 additions and 6 deletions

View File

@@ -325,6 +325,39 @@
}
]
},
"4009":{
"table": "OMDB_WARNINGSIGN",
"code": 4009,
"name": "警示信息",
"zoomMin": 15,
"zoomMax": 20,
"transformer": [
{
"k": "geometry",
"v": "~",
"klib": "geometry",
"vlib": "translateRight()"
},
{
"k": "geometry",
"v": "~",
"klib": "geometry",
"vlib": "generateS2EReferenceLine()"
},
{
"k": "geometry",
"v": "~",
"klib": "geometry",
"vlib": "generateDirectReferenceLine('',3)"
},
{
"k": "geometry",
"v": "~",
"klib": "geometry",
"vlib": "obtainReferenceDynamicSrc('assets:omdb/appendix/1105_','_0.svg','typeCode')"
}
]
},
"4010":{
"table": "OMDB_ELECTRONICEYE",
"code": 4010,

View File

@@ -57,7 +57,7 @@ class ImportConfig {
for ((index, value) in params.withIndex()) {
// 前2个参数确定为对象本身和RenderEntity因此自定义参数从index+2开始设置
if (methodParams.size>index+2) {
callByParams[methodParams[index+2]] = value
callByParams[methodParams[index+2]] = value.replace("'", "")
}
}
when(val result = method.callBy(callByParams)) { // 如果方法返回的数据类型是boolean且返回为false则该数据不处理

View File

@@ -146,6 +146,7 @@ class ImportOMDBHelper @AssistedInject constructor(
val realm = Realm.getDefaultInstance()
// 先获取当前配置的所有图层的个数,方便后续计算数据解析进度
var tableNum = 0
var processIndex = 0
for (importConfig in importConfigList) {
tableNum += importConfig.tableMap.size
}
@@ -457,7 +458,7 @@ class ImportOMDBHelper @AssistedInject constructor(
}
}
// 1个文件发送一次flow流
emit("${index + 1}/${tableNum}")
emit("${++processIndex}/${tableNum}")
// 如果当前解析的是OMDB_RD_LINK数据将其缓存在预处理类中以便后续处理其他要素时使用
if (currentConfig.table == "OMDB_RD_LINK") {
importConfig.preProcess.cacheRdLink =

View File

@@ -661,4 +661,85 @@ class ImportPreProcess {
WKTWriter(3).write(GeometryTools.getPolygonGeometry(geometry.coordinates))
}
}
/**
* 生成动态src字段-辅助图层,一般用于显示带角度的图标
* @param renderEntity 要被处理的RenderEntity
* @param prefix 图片的前缀(一般还需要指定图片对应的文件夹)
* @param suffix 图片的后缀根据codeName获取到的code后匹配图片的后缀还包含code码后的其他字符串内容
* @param codeName 数据对应的code字段的字段名
* */
fun obtainReferenceDynamicSrc(renderEntity: RenderEntity, prefix: String, suffix: String, codeName: String) {
if (codeName.isNullOrBlank()) {
return
}
// 根据数据或angle计算方向对应的角度和偏移量
val geometry = renderEntity.wkt
var radian = 0.0 // geometry的角度如果是点获取angle如果是线获取最后两个点的方向
var pointStartArray = mutableListOf<Coordinate>()
if (Geometry.TYPENAME_POINT == geometry?.geometryType) {
val point = Coordinate(geometry?.coordinate)
pointStartArray.add(point)
var angle =
if (renderEntity?.properties?.get("angle") == null) 0.0 else renderEntity?.properties?.get(
"angle"
)?.toDouble()!!
// angle角度为与正北方向的顺时针夹角将其转换为与X轴正方向的逆时针夹角即为正东方向的夹角
angle = (450 - angle) % 360
radian = Math.toRadians(angle)
} else if (Geometry.TYPENAME_LINESTRING == geometry?.geometryType) {
var coordinates = geometry.coordinates
val p1: Coordinate = coordinates.get(coordinates.size - 2)
val p2: Coordinate = coordinates.get(coordinates.size - 1)
// 计算线段的方向
radian = Angle.angle(p1, p2)
pointStartArray.add(p1)
} else if (Geometry.TYPENAME_POLYGON == geometry?.geometryType) {
// 记录下面数据的每一个点位
pointStartArray.addAll(geometry.coordinates)
// 获取当前的面数据对应的方向信息
var angle = if (renderEntity?.properties?.get("angle") == null) {
if (renderEntity?.properties?.get("heading") == null) {
0.0
} else {
renderEntity?.properties?.get("heading")?.toDouble()!!
}
} else renderEntity?.properties?.get("angle")?.toDouble()!!
angle = (450 - angle) % 360
radian = Math.toRadians(angle)
}
// 计算偏移距离
var dx: Double = GeometryTools.convertDistanceToDegree(
defaultTranslateDistance,
geometry?.coordinate?.y!!
) * Math.cos(radian)
var dy: Double = GeometryTools.convertDistanceToDegree(
defaultTranslateDistance,
geometry?.coordinate?.y!!
) * Math.sin(radian)
for (pointStart in pointStartArray) {
val coorEnd = Coordinate(pointStart.getX() + dx, pointStart.getY() + dy, pointStart.z)
val dynamicSrcReference = ReferenceEntity()
dynamicSrcReference.renderEntityId = renderEntity.id
dynamicSrcReference.name = "${renderEntity.name}动态icon"
dynamicSrcReference.table = renderEntity.table
dynamicSrcReference.zoomMin = renderEntity.zoomMin
dynamicSrcReference.zoomMax = renderEntity.zoomMax
dynamicSrcReference.taskId = renderEntity.taskId
dynamicSrcReference.enable = renderEntity.enable
// 与原有方向指向平行的线
dynamicSrcReference.geometry =
WKTWriter(3).write(GeometryTools.createLineString(arrayOf(pointStart, coorEnd)))
dynamicSrcReference.properties["qi_table"] = renderEntity.table
dynamicSrcReference.properties["type"] = "dynamicSrc"
val code = renderEntity.properties[codeName]
dynamicSrcReference.properties["src"] = "${prefix}${code}${suffix}"
Realm.getDefaultInstance().insert(dynamicSrcReference)
}
}
}

View File

@@ -129,7 +129,7 @@ class PersonalCenterFragment(private var indoorDataListener: ((Boolean) -> Unit?
// 定位到指定位置
niMapController.mMapView.vtmMap.animator()
// .animateTo(GeoPoint( 40.05108004733645, 116.29187746293708 ))
.animateTo(GeoPoint( 40.45403725443716, 115.81488271796577))
.animateTo(GeoPoint( 40.45250049995882, 115.85967482434108 ))
}
R.id.personal_center_menu_open_all_layer -> {
MapParamUtils.setDataLayerEnum(DataLayerEnum.SHOW_ALL_LAYERS)

View File

@@ -171,7 +171,7 @@ class PersonalCenterViewModel @Inject constructor(
}
} else {
val newTask = TaskBean()
newTask.id = 9999
newTask.id = -1
importOMDBHelper.importOmdbZipFile(importOMDBHelper.omdbFile, newTask).collect {
Log.d("importOMDBData", it)
}