Merge branch 'master' of gitlab.navinfo.com:CollectVehicle/OneMapQS
Conflicts: vtm
This commit is contained in:
@@ -2,12 +2,28 @@
|
||||
{
|
||||
"tableGroupName": "普通图层",
|
||||
"tableMap" : {
|
||||
"1007": {
|
||||
"table": "OMDB_NODE_FORM",
|
||||
"code": 1007,
|
||||
"name": "点形态",
|
||||
"zoomMin": 15,
|
||||
"zoomMax": 20,
|
||||
"checkLinkId": false
|
||||
},
|
||||
"1007_PA": {
|
||||
"table": "OMDB_NODE_PA",
|
||||
"code": 1007,
|
||||
"name": "点形态PA",
|
||||
"zoomMin": 15,
|
||||
"zoomMax": 20,
|
||||
"checkLinkId": false
|
||||
},
|
||||
"1012": {
|
||||
"table": "OMDB_CHECKPOINT",
|
||||
"code": 1012,
|
||||
"name": "检查点",
|
||||
"zoomMin": 15,
|
||||
"zoomMax": 19
|
||||
"zoomMax": 20
|
||||
},
|
||||
"2001": {
|
||||
"table": "OMDB_RD_LINK",
|
||||
@@ -72,6 +88,13 @@
|
||||
}
|
||||
]
|
||||
},
|
||||
"2017": {
|
||||
"table": "OMDB_LINK_CONSTRUCTION",
|
||||
"code": 2017,
|
||||
"name": "道路施工",
|
||||
"zoomMin": 15,
|
||||
"zoomMax": 17
|
||||
},
|
||||
"2019": {
|
||||
"table": "OMDB_LINK_SPEEDLIMIT",
|
||||
"code": 2019,
|
||||
@@ -106,6 +129,14 @@
|
||||
"zoomMax": 20,
|
||||
"checkLinkId": false
|
||||
},
|
||||
"2090":{
|
||||
"table": "OMDB_LANE_CONSTRUCTION",
|
||||
"code": 2090,
|
||||
"name": "车道施工",
|
||||
"zoomMin": 18,
|
||||
"zoomMax": 20,
|
||||
"checkLinkId": false
|
||||
},
|
||||
"2201":{
|
||||
"table": "OMDB_BRIDGE",
|
||||
"code": 2201,
|
||||
@@ -129,6 +160,39 @@
|
||||
"zoomMax": 20,
|
||||
"transformer2Code": ""
|
||||
},
|
||||
"3005":{
|
||||
"table": "OMDB_TRAFFIC_SIGN",
|
||||
"code": 3005,
|
||||
"name": "交通标牌",
|
||||
"is3D": true,
|
||||
"transformer": [
|
||||
{
|
||||
"k": "geometry",
|
||||
"v": "~",
|
||||
"klib": "geometry",
|
||||
"vlib": "normalizationTrafficSignHeight()"
|
||||
},{
|
||||
"k": "geometry",
|
||||
"v": "~",
|
||||
"klib": "geometry",
|
||||
"vlib": "generateDirectReferenceLine('', 0.2)"
|
||||
}
|
||||
]
|
||||
},
|
||||
"3006":{
|
||||
"table": "OMDB_POLE",
|
||||
"code": 3006,
|
||||
"name": "杆状物",
|
||||
"is3D": true,
|
||||
"transformer": [
|
||||
{
|
||||
"k": "geometry",
|
||||
"v": "~",
|
||||
"klib": "geometry",
|
||||
"vlib": "normalizationPoleHeight()"
|
||||
}
|
||||
]
|
||||
},
|
||||
"3012":{
|
||||
"table": "OMDB_FILL_AREA",
|
||||
"code": 3012,
|
||||
@@ -141,7 +205,8 @@
|
||||
"code": 3016,
|
||||
"name": "停止位置",
|
||||
"zoomMin": 18,
|
||||
"zoomMax": 20
|
||||
"zoomMax": 20,
|
||||
"checkLinkId": false
|
||||
},
|
||||
"4001": {
|
||||
"table": "OMDB_INTERSECTION",
|
||||
@@ -260,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,
|
||||
@@ -283,7 +381,7 @@
|
||||
"k": "geometry",
|
||||
"v": "~",
|
||||
"klib": "geometry",
|
||||
"vlib": "generateDirectReferenceLine(3)"
|
||||
"vlib": "generateDirectReferenceLine('',3)"
|
||||
},
|
||||
{
|
||||
"k": "geometry",
|
||||
@@ -302,6 +400,15 @@
|
||||
"transformer": [
|
||||
]
|
||||
},
|
||||
"4023": {
|
||||
"table": "OMDB_TOLLGATE",
|
||||
"code": 4023,
|
||||
"name": "收费站",
|
||||
"zoomMin": 15,
|
||||
"zoomMax": 20,
|
||||
"transformer": [
|
||||
]
|
||||
},
|
||||
"4601":{
|
||||
"table": "OMDB_LANEINFO",
|
||||
"code": 4601,
|
||||
@@ -359,7 +466,7 @@
|
||||
"code": 2004,
|
||||
"name": "道路属性",
|
||||
"zoomMin": 15,
|
||||
"zoomMax": 19,
|
||||
"zoomMax": 20,
|
||||
"transformer": [
|
||||
{
|
||||
"k": "geometry",
|
||||
|
||||
@@ -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,则该数据不处理
|
||||
@@ -125,6 +125,7 @@ class TableInfo {
|
||||
val name: String = ""
|
||||
var checked : Boolean = true
|
||||
var transformer: MutableList<Transform> = mutableListOf()
|
||||
var is3D : Boolean = false // 是否支持3D,默认情况下都不支持3D,在数据导入阶段会自动抹去Z轴高程信息
|
||||
}
|
||||
|
||||
class Transform {
|
||||
|
||||
@@ -12,6 +12,7 @@ import com.google.gson.reflect.TypeToken
|
||||
import com.navinfo.collect.library.data.entity.RenderEntity
|
||||
import com.navinfo.collect.library.data.entity.TaskBean
|
||||
import com.navinfo.collect.library.enums.DataCodeEnum
|
||||
import com.navinfo.collect.library.utils.GeometryTools
|
||||
import com.navinfo.omqs.Constant
|
||||
import com.navinfo.omqs.bean.ImportConfig
|
||||
import com.navinfo.omqs.db.deep.LinkList
|
||||
@@ -23,6 +24,7 @@ import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
import kotlinx.coroutines.flow.flow
|
||||
import kotlinx.coroutines.withContext
|
||||
import org.locationtech.jts.geom.Geometry
|
||||
import org.spatialite.database.SQLiteDatabase
|
||||
import java.io.File
|
||||
import javax.inject.Inject
|
||||
@@ -144,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
|
||||
}
|
||||
@@ -173,8 +176,6 @@ class ImportOMDBHelper @AssistedInject constructor(
|
||||
.toMutableMap()
|
||||
map["qi_table"] = currentConfig.table
|
||||
map["qi_name"] = currentConfig.name
|
||||
map["qi_code"] =
|
||||
if (currentConfig.code == 0) currentConfig.code else currentEntry.key
|
||||
map["qi_code"] = if (currentConfig.code == 0) currentConfig.code else currentEntry.key
|
||||
map["qi_zoomMin"] = currentConfig.zoomMin
|
||||
map["qi_zoomMax"] = currentConfig.zoomMax
|
||||
@@ -189,8 +190,26 @@ class ImportOMDBHelper @AssistedInject constructor(
|
||||
renderEntity.zoomMin = map["qi_zoomMin"].toString().toInt()
|
||||
renderEntity.zoomMax = map["qi_zoomMax"].toString().toInt()
|
||||
|
||||
// 其他数据插入到Properties中
|
||||
renderEntity.geometry = map["geometry"].toString()
|
||||
// 其他数据插入到Properties中
|
||||
if (!currentConfig.is3D) { // 如果是非3d要素,则自动将Z轴坐标全部置为0
|
||||
val coordinates = renderEntity.wkt?.coordinates?.map {
|
||||
coordinate -> coordinate.z = 0.0
|
||||
coordinate
|
||||
}?.toTypedArray()
|
||||
var newGeometry: Geometry? = null
|
||||
if (renderEntity.wkt?.geometryType == Geometry.TYPENAME_POINT) {
|
||||
newGeometry = GeometryTools.createPoint(coordinates!![0].x, coordinates!![0].y)
|
||||
} else if (renderEntity.wkt?.geometryType == Geometry.TYPENAME_LINESTRING) {
|
||||
newGeometry = GeometryTools.createLineString(coordinates)
|
||||
} else if (renderEntity.wkt?.geometryType == Geometry.TYPENAME_POLYGON) {
|
||||
newGeometry = GeometryTools.createLineString(coordinates)
|
||||
}
|
||||
if (newGeometry!=null) {
|
||||
renderEntity.geometry = newGeometry.toString()
|
||||
}
|
||||
}
|
||||
|
||||
for ((key, value) in map) {
|
||||
when (value) {
|
||||
is String -> renderEntity.properties.put(key, value)
|
||||
@@ -390,6 +409,44 @@ class ImportOMDBHelper @AssistedInject constructor(
|
||||
}
|
||||
}
|
||||
}
|
||||
}else if(renderEntity.table == DataCodeEnum.OMDB_NODE_FORM.name){//特殊处理,因为code相同,使用表名判断
|
||||
//过滤不需要渲染的要素
|
||||
var formOfWay = renderEntity.properties["formOfWay"]
|
||||
if(formOfWay!=null&&formOfWay=="30"){
|
||||
renderEntity.enable=2
|
||||
renderEntity.code = DataCodeEnum.OMDB_NODE_FORM.code
|
||||
}else{
|
||||
Log.e("qj","过滤不显示数据${renderEntity.table}")
|
||||
continue
|
||||
}
|
||||
}else if(renderEntity.table == DataCodeEnum.OMDB_NODE_PA.name){//特殊处理,因为code相同,使用表名判断
|
||||
//过滤不需要渲染的要素
|
||||
var attributeType = renderEntity.properties["attributeType"]
|
||||
if(attributeType!=null&&attributeType=="30"){
|
||||
renderEntity.enable=2
|
||||
renderEntity.code = DataCodeEnum.OMDB_NODE_PA.code
|
||||
}else{
|
||||
Log.e("qj","过滤不显示数据${renderEntity.table}")
|
||||
continue
|
||||
}
|
||||
}else if(renderEntity.code == DataCodeEnum.OMDB_OBJECT_STOPLOCATION.code){
|
||||
//过滤不需要渲染的要素
|
||||
var locationType = renderEntity.properties["locationType"]
|
||||
if(locationType!=null){
|
||||
when (locationType) {
|
||||
"3","4"->{
|
||||
renderEntity.enable=0
|
||||
Log.e("qj","过滤不显示数据${renderEntity.table}")
|
||||
continue
|
||||
}
|
||||
}
|
||||
}
|
||||
}else if(renderEntity.code == DataCodeEnum.OMDB_LANE_CONSTRUCTION.code){
|
||||
//特殊处理空数据,渲染原则使用
|
||||
var startTime = renderEntity.properties["startTime"]
|
||||
if(startTime==null||startTime=="") {
|
||||
renderEntity.properties["startTime"] = "null"
|
||||
}
|
||||
}
|
||||
|
||||
listResult.add(renderEntity)
|
||||
@@ -401,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 =
|
||||
|
||||
@@ -231,7 +231,11 @@ class ImportPreProcess {
|
||||
if (renderEntity.table == table) {
|
||||
Log.e("qj","generateS2EReferencePoint===开始")
|
||||
if (renderEntity.properties.containsKey(proKey)) {
|
||||
startReference.properties["type"] = "s_2_p_${renderEntity.properties[proKey]}"
|
||||
if(renderEntity.properties[proKey]!=""){
|
||||
startReference.properties["type"] = "s_2_p_${renderEntity.properties[proKey]}"
|
||||
}else{
|
||||
startReference.properties["type"] = "s_2_p_0"
|
||||
}
|
||||
Log.e("qj","generateS2EReferencePoint===s_2_p_${renderEntity.properties[proKey]}")
|
||||
}
|
||||
} else {
|
||||
@@ -258,7 +262,11 @@ class ImportPreProcess {
|
||||
endReference.properties["qi_table"] = renderEntity.table
|
||||
if (renderEntity.table == table) {
|
||||
if (renderEntity.properties.containsKey(proKey)) {
|
||||
endReference.properties["type"] = "e_2_p_${renderEntity.properties[proKey]}"
|
||||
if(renderEntity.properties[proKey]!=""){
|
||||
endReference.properties["type"] = "e_2_p_${renderEntity.properties[proKey]}"
|
||||
}else{
|
||||
endReference.properties["type"] = "e_2_p_0"
|
||||
}
|
||||
}
|
||||
} else {
|
||||
endReference.properties["type"] = "e_2_p"
|
||||
@@ -653,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)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user