提交代码,修复交通标牌不显示,增加车道、道路边界类型杆状障碍物渲染

This commit is contained in:
qiji4215
2023-11-21 17:05:35 +08:00
parent 3de8ce6a39
commit 796ced9243
25 changed files with 3602 additions and 1671 deletions

View File

@@ -65,8 +65,8 @@
"table": "OMDB_LINK_NAME",
"code": 2011,
"name": "道路名",
"zoomMin": 15,
"zoomMax": 17,
"zoomMin": 18,
"zoomMax": 20,
"checkLinkId": false,
"transformer": [
{
@@ -110,14 +110,54 @@
"code": 2019,
"name": "常规线限速",
"zoomMin": 15,
"zoomMax": 17
"zoomMax": 17,
"transformer": [
{
"k": "geometry",
"v": "~",
"klib": "geometry",
"vlib": "translateRight()"
},
{
"k": "geometry",
"v": "~",
"klib": "geometry",
"vlib": "generateS2EReferenceLine()"
},
{
"k": "geometry",
"v": "~",
"klib": "geometry",
"vlib": "generateDirectReferenceLine()"
}
]
},
"2020": {
"table": "OMDB_LINK_SPEEDLIMIT_COND",
"code": 2020,
"name": "条件线限速",
"zoomMin": 15,
"zoomMax": 17
"zoomMax": 17,
"transformer": [
{
"k": "geometry",
"v": "~",
"klib": "geometry",
"vlib": "translateRight()"
},
{
"k": "geometry",
"v": "~",
"klib": "geometry",
"vlib": "generateS2EReferenceLine()"
},
{
"k": "geometry",
"v": "~",
"klib": "geometry",
"vlib": "generateDirectReferenceLine()"
}
]
},
"2021": {
"table": "OMDB_LINK_SPEEDLIMIT_VAR",
@@ -134,7 +174,15 @@
"filterData": true,
"zoomMin": 18,
"zoomMax": 20,
"catch": true
"catch": true,
"transformer": [
{
"k": "geometry",
"v": "~",
"klib": "geometry",
"vlib": "dengfenLineString()"
}
]
},
"2090": {
"table": "OMDB_LANE_CONSTRUCTION",
@@ -387,6 +435,18 @@
"v": "~",
"klib": "geometry",
"vlib": "translateRight()"
},
{
"k": "geometry",
"v": "~",
"klib": "geometry",
"vlib": "generateS2EReferenceLine()"
},
{
"k": "geometry",
"v": "~",
"klib": "geometry",
"vlib": "generateDirectReferenceLine()"
}
]
},

View File

@@ -455,7 +455,7 @@ class ImportOMDBHelper @AssistedInject constructor(
val boundaryType = renderEntity.properties["boundaryType"]
if (boundaryType != null) {
when (boundaryType.toInt()) {
0, 1, 6, 8, 9 -> {
0, 1, 7, 8 -> {
renderEntity.enable = 0
line = bufferedReader.readLine()
continue
@@ -468,7 +468,7 @@ class ImportOMDBHelper @AssistedInject constructor(
val boundaryType = renderEntity.properties["boundaryType"]
if (boundaryType != null) {
when (boundaryType.toInt()) {
0, 1, 3, 4, 5, 7, 9 -> {
0, 1, 2, 7, 8 -> {
renderEntity.enable = 0
line = bufferedReader.readLine()
continue
@@ -770,8 +770,8 @@ class ImportOMDBHelper @AssistedInject constructor(
renderEntity.properties.remove("linkPid")
}
//去掉暂用控件较大的字段多余属性字段
if (renderEntity.properties.containsKey("shapeList")) {
//去掉暂用控件较大的字段多余属性字段,保留道路名用于展示详情
if (renderEntity.code!=DataCodeEnum.OMDB_LINK_NAME.code&&renderEntity.properties.containsKey("shapeList")) {
renderEntity.properties.remove("shapeList")
}

View File

@@ -95,7 +95,6 @@ class ImportPreProcess {
) != null
) {
// 带有angle字段的数据也有可能是线需要判断是否需要根据指定字段判断数据是否为逆向
var angle = renderEntity?.properties?.get("angle")?.toDouble()!!
// angle角度为与正北方向的顺时针夹角将其转换为与X轴正方向的逆时针夹角即为正东方向的夹角
angle = ((450 - angle) % 360)
@@ -226,7 +225,6 @@ class ImportPreProcess {
// 将这个起终点的线记录在数据中
val startEndReference = ReferenceEntity()
// startEndReference.renderEntityId = renderEntity.id
startEndReference.name = "${renderEntity.name}参考线"
startEndReference.table = renderEntity.table
startEndReference.code = renderEntity.code
@@ -239,11 +237,8 @@ class ImportPreProcess {
GeometryTools.createLineString(arrayOf<Coordinate>(pointStart, pointEnd)).toString()
startEndReference.properties["qi_table"] = renderEntity.table
startEndReference.properties["type"] = "s_2_e"
val listResult = mutableListOf<ReferenceEntity>()
startEndReference.propertiesDb = DeflaterUtil.zipString(JSON.toJSONString(startEndReference.properties))
renderEntity.referenceEntitys?.add(startEndReference)
//listResult.add(startEndReference)
//insertData(listResult)
renderEntity.referenceEntitys.add(startEndReference)
}
/**
@@ -306,7 +301,7 @@ class ImportPreProcess {
endReference.properties["qi_table"] = renderEntity.table
endReference.properties["type"] = "e${if (renderEntity.properties["laneType"]!!.toInt() and (0b1000)>0) "_dec" else "_acc"}"
endReference.properties["geometry"] = endReference.geometry
renderEntity.referenceEntitys?.add(endReference)
renderEntity.referenceEntitys.add(endReference)
//listResult.add(endReference)
//insertData(listResult)
}
@@ -325,7 +320,6 @@ class ImportPreProcess {
// 将这个起终点的线记录在数据中
val startReference = ReferenceEntity()
// startReference.renderEntityId = renderEntity.id
startReference.name = "${renderEntity.name}参考点"
startReference.code = renderEntity.code
startReference.table = renderEntity.table
@@ -363,7 +357,6 @@ class ImportPreProcess {
Log.e("qj", "generateS2EReferencePoint===1")
val endReference = ReferenceEntity()
// endReference.renderEntityId = renderEntity.id
endReference.name = "${renderEntity.name}参考点"
endReference.code = renderEntity.code
endReference.table = renderEntity.table
@@ -393,10 +386,8 @@ class ImportPreProcess {
}
endReference.properties["geometry"] = endReference.geometry
endReference.propertiesDb = DeflaterUtil.zipString(JSON.toJSONString(endReference.properties))
renderEntity.referenceEntitys?.add(endReference)
//listResult.add(endReference)
renderEntity.referenceEntitys.add(endReference)
Log.e("qj", "generateS2EReferencePoint===4")
//insertData(listResult)
}
/**
@@ -407,6 +398,7 @@ class ImportPreProcess {
direction: String = "",
distance: String = ""
) {
Log.e("qj", "generateDirectReferenceLine===0==${renderEntity.code}")
// 根据数据或angle计算方向对应的角度和偏移量
val geometry = renderEntity.wkt
var isReverse = false // 是否为逆向
@@ -473,13 +465,11 @@ class ImportPreProcess {
geometry?.coordinate?.y!!
) * Math.sin(radian)
}
val listResult = mutableListOf<ReferenceEntity>()
for (pointStart in pointStartArray) {
val coorEnd = Coordinate(pointStart.getX() + dx, pointStart.getY() + dy, pointStart.z)
val angleReference = ReferenceEntity()
// angleReference.renderEntityId = renderEntity.id
angleReference.name = "${renderEntity.name}参考方向"
angleReference.table = renderEntity.table
angleReference.code = renderEntity.code
@@ -493,10 +483,9 @@ class ImportPreProcess {
angleReference.properties["qi_table"] = renderEntity.table
angleReference.properties["type"] = "angle"
angleReference.propertiesDb = DeflaterUtil.zipString(JSON.toJSONString(angleReference.properties))
renderEntity.referenceEntitys?.add(angleReference)
//listResult.add(angleReference)
renderEntity.referenceEntitys.add(angleReference)
}
//insertData(listResult)
Log.e("qj", "generateDirectReferenceLine===1")
}
fun addAngleFromGeometry(renderEntity: RenderEntity): String {
@@ -574,6 +563,8 @@ class ImportPreProcess {
renderEntityTemp.zoomMax = renderEntity.zoomMax
renderEntityTemp.enable = renderEntity.enable
renderEntityTemp.taskId = renderEntity.taskId
renderEntityTemp.linkPid = renderEntity.linkPid
renderEntity.linkRelation = renderEntity.linkRelation
renderEntityTemp.catchEnable = renderEntity.catchEnable
var dis = -lateralOffset.toDouble() / 100000000
//最小值取10厘米否正渲染太近无法显示
@@ -607,6 +598,37 @@ class ImportPreProcess {
if (listResult.size > 0) {
insertData(listResult)
}
}else if(boundaryType.toInt() == 9){//根据线型平分为点数据用于渲染3D标
dengfenLineString(renderEntity)
}
}
}
}
fun dengfenLineString(renderEntity: RenderEntity){
if (renderEntity.code == DataCodeEnum.OMDB_LANE_MARK_BOUNDARYTYPE.code||renderEntity.code == DataCodeEnum.OMDB_RDBOUND_BOUNDARYTYPE.code){
val boundaryType = renderEntity.properties["boundaryType"]
if (boundaryType != null) {
if(boundaryType.toInt()==9){
Log.e("qj","杆状物转换开始")
val geopointList = GeometryTools.getLineToDengGeoPints(renderEntity.wkt,5.0)
geopointList.forEach{
val referenceEntity = ReferenceEntity()
referenceEntity.name = "${renderEntity.name}线转点坐标"
referenceEntity.table = renderEntity.table
referenceEntity.code = renderEntity.code
referenceEntity.geometry = GeometryTools.createGeometry(it).toString()
Log.e("jingo", "几何转换结束")
referenceEntity.properties["qi_table"] = renderEntity.table
referenceEntity.properties["boundaryType"] = "pole"
referenceEntity.zoomMin = renderEntity.zoomMin
referenceEntity.zoomMax = renderEntity.zoomMax
referenceEntity.taskId = renderEntity.taskId
referenceEntity.enable = renderEntity.enable
referenceEntity.propertiesDb = DeflaterUtil.zipString(JSON.toJSONString(referenceEntity.properties))
renderEntity.referenceEntitys.add(referenceEntity)
}
Log.e("qj","杆状物转换结束")
}
}
}
@@ -652,11 +674,9 @@ class ImportPreProcess {
"assets:omdb/4601/${type}/1301_${referenceEntity.properties["currentDirect"]}.svg"
Log.d("unpackingLaneInfo", referenceEntity.properties["symbol"].toString())
referenceEntity.propertiesDb = DeflaterUtil.zipString(JSON.toJSONString(referenceEntity.properties))
renderEntity.referenceEntitys?.add(referenceEntity)
renderEntity.referenceEntitys.add(referenceEntity)
Log.e("qj", "车信===插入车信箭头")
//listResult.add(referenceEntity)
}
//insertData(listResult)
}
//将主表线转化为单个点,按点要素实现捕捉
if (Geometry.TYPENAME_LINESTRING == renderEntity.wkt?.geometryType) {
@@ -774,7 +794,7 @@ class ImportPreProcess {
angleReference.enable = renderEntity.enable
val listResult = mutableListOf<ReferenceEntity>()
angleReference.propertiesDb = DeflaterUtil.zipString(JSON.toJSONString(angleReference.properties))
renderEntity.referenceEntitys?.add(angleReference)
renderEntity.referenceEntitys.add(angleReference)
//listResult.add(angleReference)
//insertData(listResult)
}
@@ -806,7 +826,7 @@ class ImportPreProcess {
intersectionReference.properties["qi_table"] = renderEntity.table
intersectionReference.properties["type"] = "node"
intersectionReference.propertiesDb = DeflaterUtil.zipString(JSON.toJSONString(intersectionReference.properties))
renderEntity.referenceEntitys?.add(intersectionReference)
renderEntity.referenceEntitys.add(intersectionReference)
//listResult.add(intersectionReference)
}
//insertData(listResult)
@@ -992,7 +1012,7 @@ class ImportPreProcess {
val code = renderEntity.properties[codeName]
dynamicSrcReference.properties["src"] = "${prefix}${code}${suffix}"
dynamicSrcReference.propertiesDb = DeflaterUtil.zipString(JSON.toJSONString(dynamicSrcReference.properties))
renderEntity.referenceEntitys?.add(dynamicSrcReference)
renderEntity.referenceEntitys.add(dynamicSrcReference)
//listResult.add(dynamicSrcReference)
}
//insertData(listResult)

View File

@@ -181,7 +181,7 @@ class RealmOperateHelper() {
var nearLast: Double = 99999.99
for (link in realmList) {
if (polygon.intersects(GeometryTools.createGeometry(link.geometry))) {
val near = point.distance(GeometryTools.createGeoPoint(link.geometry))
val near = GeometryTools.createGeometry(link.geometry).distance(GeometryTools.createGeometry(point))
if (near < nearLast) {
nearLast = near
linkBean = link
@@ -302,6 +302,7 @@ class RealmOperateHelper() {
// 将获取到的数据和查询的polygon做相交只返回相交的数据
val queryResult = realmList?.stream()?.filter {
if (Constant.MapCatchLine) {
Log.e("qj",it.code+"捕捉要素编码"+it.enable+"==="+it.catchEnable)
polygon.intersects(it.wkt) && it.wkt?.geometryType?.uppercase()
.equals("LINESTRING") || it.wkt?.geometryType?.uppercase().equals("POLYGON")
} else {

View File

@@ -127,6 +127,7 @@ class LoginActivity : CheckPermissionsActivity() {
private fun initView() {
//登录校验,初始化成功
viewModel.loginStatus.observe(this, loginObserve)
viewModel.lastLoginUserInfo(this)
}
/**

View File

@@ -87,10 +87,17 @@ class LoginViewModel @Inject constructor(
var sharedPreferences: SharedPreferences? = null
init {
loginUser.value = LoginUserBean(userCode = "lixiaoming00427", passWord = "123456")
}
fun lastLoginUserInfo(context: Context){
sharedPreferences =
context.getSharedPreferences("USER_SHAREDPREFERENCES", Context.MODE_PRIVATE)
val userNameCache = sharedPreferences?.getString("userName", "lixiaoming00427")
val passwordCache = sharedPreferences?.getString("passWord", "123456")
loginUser.value = LoginUserBean(userCode = "$userNameCache", passWord = "$passwordCache")
}
/**
* 处理注册按钮
*/

View File

@@ -22,8 +22,6 @@ import androidx.recyclerview.widget.RecyclerView
import com.blankj.utilcode.util.ClipboardUtils
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.google.android.material.tabs.TabLayout
import com.navinfo.collect.library.data.entity.RenderEntity
import com.navinfo.collect.library.enums.DataCodeEnum
import com.navinfo.collect.library.map.NIMapController
import com.navinfo.collect.library.map.handler.MeasureLayerHandler
import com.navinfo.collect.library.utils.DeflaterUtil
@@ -688,7 +686,7 @@ class MainActivity : BaseActivity() {
index = p0.position
editText.text = null
//清理已绘制线
mapController.lineHandler.removeLine()
mapController.lineHandler.removeAllLine()
mapController.markerHandle.removeMarker("location")
when (p0.position) {
0 -> editText.hint = "请输入LinkPid例如12345678"
@@ -819,35 +817,15 @@ class MainActivity : BaseActivity() {
* zoomOut
*/
fun zoomOutOnclick(view: View) {
/* val result = mutableListOf<RenderEntity>()
for (i in 0 until 10) {
var renderEntity: RenderEntity = RenderEntity()
renderEntity.code = "3005"
renderEntity.geometry = "POINT(116.2694${i}13016946 40.0844${i}5791644373 0)"
result.add(renderEntity)
val lineString =
"LINESTRING(115.92708317758513 40.42230758745775 0, 115.9272990153405 40.422317981061205 0, 115.92750895192124 40.42232797132084 0, 115.9277199918031 40.422337964543026 0)"
val geometry = GeometryTools.createGeometry(lineString)
//定位
mapController.animationHandler.animationByLatLon(geometry.centroid.y,geometry.centroid.x,500)
GeometryTools.getLineToDengGeoPints(geometry, 5.0)?.forEach {
mapController.markerHandle.addMarker(it, it.toString())
}
var renderEntity: RenderEntity = RenderEntity()
renderEntity.code = "3006"
renderEntity.geometry = "POINT(116.269413016946 40.08445791644373 0)"
result.add(renderEntity)
var renderEntity1: RenderEntity = RenderEntity()
renderEntity1.code = "3007"
renderEntity1.geometry = "POINT(116.269413016946 40.08445791644373 0)"
result.add(renderEntity1)
//计算后
var index = 0
Log.e("qj","====计算开始")
var lastRender:RenderEntity = RenderEntity()
GeometryTools.groupByDistance(DataCodeEnum.OMDB_TRAFFIC_SIGN.code,result, 5.0)?.forEach {
if(lastRender!=null&&lastRender.geometry!=null&& lastRender.geometry != ""){
if(it.geometry!=lastRender.geometry){
Log.e("qj","${index++}====计算后"+it.geometry)
}
}
lastRender = it
}*/
Log.e("qj","====计算结束")
mapController.lineHandler.showLine(geometry.toString())
mapController.animationHandler.zoomOut()
}

View File

@@ -1340,9 +1340,9 @@ class MainViewModel @Inject constructor(
)
}
if (data.wkt != null) {
/* if (data.wkt != null) {
mapController.markerHandle.removeMarker("moreInfo")
mapController.lineHandler.removeLine()
mapController.lineHandler.removeAllLine()
when (data.wkt!!.geometryType) {
Geometry.TYPENAME_POINT -> {
val geoPoint = GeometryTools.createGeoPoint(data.wkt!!.toText())
@@ -1350,10 +1350,10 @@ class MainViewModel @Inject constructor(
}
Geometry.TYPENAME_LINESTRING -> {
mapController.lineHandler.showLine(data.wkt!!.toText())
mapController.lineHandler.showSubLine(data.wkt!!.toText())
}
}
}
}*/
}
fun sendServerCommand(

View File

@@ -12,6 +12,7 @@ import android.widget.Toast
import androidx.activity.result.ActivityResult
import androidx.activity.result.ActivityResultLauncher
import androidx.activity.result.contract.ActivityResultContracts
import androidx.annotation.RequiresApi
import androidx.databinding.DataBindingUtil
import androidx.navigation.NavOptions
import androidx.navigation.findNavController
@@ -75,6 +76,7 @@ class EvaluationResultFragment : BaseFragment(), View.OnClickListener {
return binding.root
}
@RequiresApi(Build.VERSION_CODES.N)
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
//// 设置 RecyclerView 的固定大小,避免在滚动时重新计算视图大小和布局,提高性能
@@ -178,6 +180,8 @@ class EvaluationResultFragment : BaseFragment(), View.OnClickListener {
try {
signBean = it.getParcelable("SignBean")
autoSave = it.getBoolean("AutoSave")
//高亮数据几何
signBean?.let { it1 -> viewModel.show(it1.renderEntity) }
} catch (_: java.lang.Exception) {
}
}

View File

@@ -45,7 +45,9 @@ import io.realm.RealmList
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import org.locationtech.jts.geom.Geometry
import org.oscim.core.GeoPoint
import org.oscim.core.GeometryBuffer.GeometryType
import java.io.File
import java.io.FileOutputStream
import java.util.*
@@ -73,6 +75,8 @@ class EvaluationResultViewModel @Inject constructor(
private val TAG = "点选marker"
private val ELEMENT_MARKER = "elementMarker"
/**
* 操作结束,销毁页面
*/
@@ -155,8 +159,10 @@ class EvaluationResultViewModel @Inject constructor(
override fun onCleared() {
super.onCleared()
mapController.mMapView.removeOnNIMapClickListener(TAG)
//移除要素marker
mapController.markerHandle.removeMarker(ELEMENT_MARKER)
mapController.markerHandle.removeMarker()
mapController.lineHandler.removeLine()
mapController.lineHandler.removeAllLine()
}
@@ -204,7 +210,7 @@ class EvaluationResultViewModel @Inject constructor(
}
} else {
liveDataQsRecordBean.value?.run {
elementId = bean.renderEntity.code
elementId = bean.renderEntity.id
linkId = bean.linkId
if (linkId.isNotEmpty()) {
viewModelScope.launch {
@@ -495,6 +501,7 @@ class EvaluationResultViewModel @Inject constructor(
* 根据数据id查询数据
*/
@RequiresApi(Build.VERSION_CODES.N)
fun initData(id: String) {
Log.e("jingo", "捕捉到的要素 id = $id")
viewModelScope.launch(Dispatchers.Main) {
@@ -545,14 +552,21 @@ class EvaluationResultViewModel @Inject constructor(
// 显示语音数据到界面
getChatMsgEntityList()
realm.close()
if (it.elementId == DataCodeEnum.OMDB_LANEINFO.code) {
//增加要素高亮
if(it.elementId!=null){
val realm2 = realmOperateHelper.getSelectTaskRealmInstance()
val r = realm2.where(RenderEntity::class.java)
.equalTo("table", DataCodeEnum.OMDB_LANEINFO.name)
.equalTo("linkPid", it.linkId).findFirst()
if (r != null) {
renderEntity = realm2.copyFromRealm(r)
laneInfoList = SignUtil.getLineInfoIcons(renderEntity!!)
val rEntity = realm2.where(RenderEntity::class.java).equalTo("id",it.elementId).findFirst()
if(rEntity!=null){
show(rEntity!!)
}
if (it.classCode == DataCodeEnum.OMDB_LANEINFO.code) {
val r = realm2.where(RenderEntity::class.java)
.equalTo("table", DataCodeEnum.OMDB_LANEINFO.name)
.equalTo("linkPid", it.linkId).findFirst()
if (r != null) {
renderEntity = realm2.copyFromRealm(r)
laneInfoList = SignUtil.getLineInfoIcons(renderEntity!!)
}
}
realm2.close()
}
@@ -561,8 +575,27 @@ class EvaluationResultViewModel @Inject constructor(
liveDataToastMessage.postValue("数据读取失败")
realm.close()
}
}
}
fun show(renderEntity: RenderEntity) {
if (renderEntity != null) {
if (renderEntity.wkt != null) {
mapController.markerHandle.removeMarker(ELEMENT_MARKER)
mapController.lineHandler.removeElementLine()
when (renderEntity.wkt!!.geometryType) {
Geometry.TYPENAME_POINT -> {
val geoPoint = GeometryTools.createGeoPoint(renderEntity.wkt!!.toText())
mapController.markerHandle.addMarker(geoPoint, ELEMENT_MARKER)
}
Geometry.TYPENAME_LINESTRING -> {
mapController.lineHandler.showElementLine(renderEntity.wkt!!.toText())
}
Geometry.TYPENAME_POLYGON -> {
mapController.lineHandler.showElementLine(renderEntity.wkt!!.toText())
}
}
}
}
}

View File

@@ -444,7 +444,7 @@ class TaskViewModel @Inject constructor(
override fun onCleared() {
mapController.mMapView.removeOnNIMapClickListener(TAG)
mapController.lineHandler.removeLine()
mapController.lineHandler.removeAllLine()
sharedPreferences.unregisterOnSharedPreferenceChangeListener(this)
super.onCleared()
}

View File

@@ -1858,7 +1858,7 @@ class SignUtil {
"3" -> "三角形"
"4" -> "圆形"
"5" -> "菱形"
"6" -> "三角形"
"6" -> "三角形"
"7" -> "正方形"
"8" -> "八角形"
else -> ""