From 796ced9243033afbba871434fdbcd363369f5c33 Mon Sep 17 00:00:00 2001 From: qiji4215 Date: Tue, 21 Nov 2023 17:05:35 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E4=BB=A3=E7=A0=81=EF=BC=8C?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=BA=A4=E9=80=9A=E6=A0=87=E7=89=8C=E4=B8=8D?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=EF=BC=8C=E5=A2=9E=E5=8A=A0=E8=BD=A6=E9=81=93?= =?UTF-8?q?=E3=80=81=E9=81=93=E8=B7=AF=E8=BE=B9=E7=95=8C=E7=B1=BB=E5=9E=8B?= =?UTF-8?q?=E6=9D=86=E7=8A=B6=E9=9A=9C=E7=A2=8D=E7=89=A9=E6=B8=B2=E6=9F=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/assets/omdb_config.json | 70 +- .../com/navinfo/omqs/db/ImportOMDBHelper.kt | 8 +- .../com/navinfo/omqs/db/ImportPreProcess.kt | 66 +- .../com/navinfo/omqs/db/RealmOperateHelper.kt | 3 +- .../omqs/ui/activity/login/LoginActivity.kt | 1 + .../omqs/ui/activity/login/LoginViewModel.kt | 9 +- .../omqs/ui/activity/map/MainActivity.kt | 40 +- .../omqs/ui/activity/map/MainViewModel.kt | 8 +- .../EvaluationResultFragment.kt | 4 + .../EvaluationResultViewModel.kt | 53 +- .../ui/fragment/tasklist/TaskViewModel.kt | 2 +- .../java/com/navinfo/omqs/util/SignUtil.kt | 2 +- .../src/main/assets/editormarker.xml | 66 +- .../src/main/assets/omdb/icon_2013_3.svg | 4592 +++++++++++------ .../src/main/assets/omdb/icon_2083_0.svg | 10 +- .../src/main/assets/omdb/icon_2083_8.svg | 19 +- .../src/main/assets/omdb/icon_4002_1.svg | 42 +- .../src/main/assets/omdb/icon_5005_0.png | Bin 0 -> 206 bytes .../main/assets/omdb/icon_pole_barrier.svg | 92 + .../library/data/entity/ReferenceEntity.kt | 1 - .../library/map/handler/LineHandler.kt | 62 + .../library/map/handler/MarkHandler.kt | 20 + .../library/map/source/OMDBDataDecoder.java | 15 +- .../map/source/OMDBTileDataSource.java | 1 - .../collect/library/utils/GeometryTools.java | 87 +- 25 files changed, 3602 insertions(+), 1671 deletions(-) create mode 100644 collect-library/src/main/assets/omdb/icon_5005_0.png create mode 100644 collect-library/src/main/assets/omdb/icon_pole_barrier.svg diff --git a/app/src/main/assets/omdb_config.json b/app/src/main/assets/omdb_config.json index c190b36a..60af4139 100644 --- a/app/src/main/assets/omdb_config.json +++ b/app/src/main/assets/omdb_config.json @@ -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()" } ] }, diff --git a/app/src/main/java/com/navinfo/omqs/db/ImportOMDBHelper.kt b/app/src/main/java/com/navinfo/omqs/db/ImportOMDBHelper.kt index dbe16498..93b43012 100644 --- a/app/src/main/java/com/navinfo/omqs/db/ImportOMDBHelper.kt +++ b/app/src/main/java/com/navinfo/omqs/db/ImportOMDBHelper.kt @@ -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") } diff --git a/app/src/main/java/com/navinfo/omqs/db/ImportPreProcess.kt b/app/src/main/java/com/navinfo/omqs/db/ImportPreProcess.kt index bc2c081a..dab99990 100644 --- a/app/src/main/java/com/navinfo/omqs/db/ImportPreProcess.kt +++ b/app/src/main/java/com/navinfo/omqs/db/ImportPreProcess.kt @@ -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(pointStart, pointEnd)).toString() startEndReference.properties["qi_table"] = renderEntity.table startEndReference.properties["type"] = "s_2_e" - val listResult = mutableListOf() 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() 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() 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) diff --git a/app/src/main/java/com/navinfo/omqs/db/RealmOperateHelper.kt b/app/src/main/java/com/navinfo/omqs/db/RealmOperateHelper.kt index 6bff40d4..4efea6ca 100644 --- a/app/src/main/java/com/navinfo/omqs/db/RealmOperateHelper.kt +++ b/app/src/main/java/com/navinfo/omqs/db/RealmOperateHelper.kt @@ -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 { diff --git a/app/src/main/java/com/navinfo/omqs/ui/activity/login/LoginActivity.kt b/app/src/main/java/com/navinfo/omqs/ui/activity/login/LoginActivity.kt index 75801d42..df0242e8 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/activity/login/LoginActivity.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/activity/login/LoginActivity.kt @@ -127,6 +127,7 @@ class LoginActivity : CheckPermissionsActivity() { private fun initView() { //登录校验,初始化成功 viewModel.loginStatus.observe(this, loginObserve) + viewModel.lastLoginUserInfo(this) } /** diff --git a/app/src/main/java/com/navinfo/omqs/ui/activity/login/LoginViewModel.kt b/app/src/main/java/com/navinfo/omqs/ui/activity/login/LoginViewModel.kt index 17fd470e..fbb663f4 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/activity/login/LoginViewModel.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/activity/login/LoginViewModel.kt @@ -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") + } + /** * 处理注册按钮 */ diff --git a/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainActivity.kt b/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainActivity.kt index d4ed3009..9f7d09de 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainActivity.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainActivity.kt @@ -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() - 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() } diff --git a/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainViewModel.kt b/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainViewModel.kt index 405b9fc3..0499fe54 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainViewModel.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainViewModel.kt @@ -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( diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultFragment.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultFragment.kt index 2096ddf7..a4034382 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultFragment.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultFragment.kt @@ -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) { } } diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultViewModel.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultViewModel.kt index ffffb51d..000fd2b8 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultViewModel.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultViewModel.kt @@ -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()) + } + } + } } } diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskViewModel.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskViewModel.kt index 4b9a84b7..69924944 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskViewModel.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskViewModel.kt @@ -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() } diff --git a/app/src/main/java/com/navinfo/omqs/util/SignUtil.kt b/app/src/main/java/com/navinfo/omqs/util/SignUtil.kt index 432ac0f7..a3d234fe 100644 --- a/app/src/main/java/com/navinfo/omqs/util/SignUtil.kt +++ b/app/src/main/java/com/navinfo/omqs/util/SignUtil.kt @@ -1858,7 +1858,7 @@ class SignUtil { "3" -> "三角形" "4" -> "圆形" "5" -> "菱形" - "6" -> "到三角形" + "6" -> "倒三角形" "7" -> "正方形" "8" -> "八角形" else -> "" diff --git a/collect-library/src/main/assets/editormarker.xml b/collect-library/src/main/assets/editormarker.xml index e01a721b..9e113d24 100644 --- a/collect-library/src/main/assets/editormarker.xml +++ b/collect-library/src/main/assets/editormarker.xml @@ -1615,24 +1615,29 @@ src="assets:omdb/icon_4023_0.svg" symbol-height="56" symbol-width="56"> + - - + - + - - + + + - - - + + + + + + + @@ -1643,14 +1648,25 @@ - - + - + + + + + + + + + + + + + + - @@ -1894,14 +1910,19 @@ - + - + + + + + + + @@ -1910,14 +1931,19 @@ - + - + + + + + + + diff --git a/collect-library/src/main/assets/omdb/icon_2013_3.svg b/collect-library/src/main/assets/omdb/icon_2013_3.svg index 0c6d414c..41884305 100644 --- a/collect-library/src/main/assets/omdb/icon_2013_3.svg +++ b/collect-library/src/main/assets/omdb/icon_2013_3.svg @@ -1,1573 +1,3053 @@ - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/icon_2083_0.svg b/collect-library/src/main/assets/omdb/icon_2083_0.svg index e9433758..d9a06b28 100644 --- a/collect-library/src/main/assets/omdb/icon_2083_0.svg +++ b/collect-library/src/main/assets/omdb/icon_2083_0.svg @@ -1 +1,9 @@ - \ No newline at end of file + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/icon_2083_8.svg b/collect-library/src/main/assets/omdb/icon_2083_8.svg index a5e7bda8..350ee63b 100644 --- a/collect-library/src/main/assets/omdb/icon_2083_8.svg +++ b/collect-library/src/main/assets/omdb/icon_2083_8.svg @@ -1 +1,18 @@ - \ No newline at end of file + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/icon_4002_1.svg b/collect-library/src/main/assets/omdb/icon_4002_1.svg index ec283110..b7c66fc1 100644 --- a/collect-library/src/main/assets/omdb/icon_4002_1.svg +++ b/collect-library/src/main/assets/omdb/icon_4002_1.svg @@ -1 +1,41 @@ - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/icon_5005_0.png b/collect-library/src/main/assets/omdb/icon_5005_0.png new file mode 100644 index 0000000000000000000000000000000000000000..d8ebf366da5d4333bbaef284a7277419f74abf21 GIT binary patch literal 206 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC#^NA%Cx&(BWL^R}9iA?ZAsNnZ zZyw}rP~dTUSajip*gJdC=!7o|E(+e7{d0#i(-!^y`C_db@Bc1~s}-BpQ984BOJU0O zjGLYBZKOL2n7urN7Y8&hHsD$;2*f~ik6F&-rQQOekS4E=&?Q18v-~c<+~UDezJIas zdU352{~Lt3%ucx_PU+ngXckq#c~DIHZ=;vZn~4n$ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/java/com/navinfo/collect/library/data/entity/ReferenceEntity.kt b/collect-library/src/main/java/com/navinfo/collect/library/data/entity/ReferenceEntity.kt index 4bf9b066..8b375f3f 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/data/entity/ReferenceEntity.kt +++ b/collect-library/src/main/java/com/navinfo/collect/library/data/entity/ReferenceEntity.kt @@ -24,7 +24,6 @@ import java.util.* open class ReferenceEntity() : RealmObject(), Parcelable { @PrimaryKey var id: String = UUID.randomUUID().toString() // id - @Ignore lateinit var name: String //要素名 lateinit var table: String //要素表名 var propertiesDb: String = "" diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LineHandler.kt b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LineHandler.kt index 139b2816..b20ad6c3 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LineHandler.kt +++ b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LineHandler.kt @@ -40,6 +40,24 @@ class LineHandler(context: AppCompatActivity, mapView: NIMapView) : BaseHandler( layer } + /** + * 高亮线图层,同时只高亮一条线,如要素本身线型 + */ + private val mDataGeometryPathLayer: PathLayer by lazy { + //高亮线绘制线 样式 + val defaultLineStyle = Style.builder() + .stippleColor(context.resources.getColor(R.color.teal_200)) + .strokeWidth(5f) + .fillColor(context.resources.getColor(R.color.draw_line_blue2_color)) + .fillAlpha(0.3f) + .strokeColor(context.resources.getColor(R.color.draw_line_blue2_color)) + .fixed(true).build() + + val layer = PathLayer(mMapView.vtmMap, defaultLineStyle) + addLayer(layer, NIMapView.LAYER_GROUPS.OPERATE_LINE) + layer + } + /** * 路口高亮 @@ -139,6 +157,42 @@ class LineHandler(context: AppCompatActivity, mapView: NIMapView) : BaseHandler( } } + /** + * 高亮一条线 + */ + fun showElementLine(list:List) { + try { + mDataGeometryPathLayer.clearPath() + mDataGeometryPathLayer.setPoints(list) + mDataGeometryPathLayer.isEnabled = true + } catch (e: Exception) { + Toast.makeText(mContext, "高亮路线失败 ${e.message}", Toast.LENGTH_SHORT).show() + } + } + + + + + /** + * 高亮一条线 + */ + fun showElementLine(geometry: String) { + try { + mDataGeometryPathLayer.clearPath() + mDataGeometryPathLayer.setPoints(GeometryTools.getGeoPoints(geometry)) + mDataGeometryPathLayer.isEnabled = true + } catch (e: Exception) { + Toast.makeText(mContext, "高亮路线失败 ${e.message}", Toast.LENGTH_SHORT).show() + } + } + + /** + * 取消高亮线 + */ + fun removeElementLine() { + mDataGeometryPathLayer.clearPath() + mDataGeometryPathLayer.isEnabled = false + } /** * 取消高亮线 @@ -148,6 +202,14 @@ class LineHandler(context: AppCompatActivity, mapView: NIMapView) : BaseHandler( mDefaultPathLayer.isEnabled = false } + /** + * 取消高亮线 + */ + fun removeAllLine() { + removeLine() + removeElementLine() + } + /** * 移除所有任务高亮线 */ diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MarkHandler.kt b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MarkHandler.kt index d7bc72c7..b93215e3 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MarkHandler.kt +++ b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MarkHandler.kt @@ -93,6 +93,26 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : layer } + /** + * 默认marker图层 + */ + private val mDataMarkerLayer: ItemizedLayer by lazy { + //新增marker图标样式 + val mDefaultBitmap = + AndroidBitmap(BitmapFactory.decodeResource(context.resources, R.mipmap.icon_path_maker)) + mDefaultBitmap.scaleTo(150, 150) + val markerSymbol = MarkerSymbol( + mDefaultBitmap, + MarkerSymbol.HotspotPlace.CENTER + ) + val layer = ItemizedLayer( + mapView.vtmMap, + markerSymbol, + ) + addLayer(layer, NIMapView.LAYER_GROUPS.OPERATE_MARKER) + layer + } + private val niLocationBitmap: Bitmap by lazy { AndroidBitmap( BitmapFactory.decodeResource( diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBDataDecoder.java b/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBDataDecoder.java index 39949e1d..0db8f305 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBDataDecoder.java +++ b/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBDataDecoder.java @@ -75,11 +75,10 @@ public class OMDBDataDecoder extends TileDecoder { listResult.stream().iterator().forEachRemaining(new Consumer() { @Override public void accept(RenderEntity renderEntity) { - if (!(mapLevel < renderEntity.getZoomMin() || mapLevel > renderEntity.getZoomMax())) { if (renderEntity.getCode().equals(DataCodeEnum.OMDB_TRAFFIC_SIGN.getCode())) { list.add(renderEntity); - }else if (renderEntity.getCode().equals(DataCodeEnum.OMDB_TRAFFICLIGHT.getCode())) { + } else if (renderEntity.getCode().equals(DataCodeEnum.OMDB_TRAFFICLIGHT.getCode())) { traffList.add(renderEntity); } else { Map properties = new HashMap<>(renderEntity.getProperties().size()); @@ -93,8 +92,8 @@ public class OMDBDataDecoder extends TileDecoder { }); //增加交通标牌聚合显示 List list1 = GeometryTools.groupByDistance(DataCodeEnum.OMDB_TRAFFIC_SIGN.getCode(), list, 5.0); - if(list1!=null&&list1.size()>0){ - Log.e("qj","聚合交通标牌转换开始"+list.size()); + if (list1 != null && list1.size() > 0) { + Log.e("qj", "聚合交通标牌转换开始" + list.size()); list1.stream().iterator().forEachRemaining(new Consumer() { @Override public void accept(RenderEntity renderEntity) { @@ -103,12 +102,12 @@ public class OMDBDataDecoder extends TileDecoder { parseGeometry(renderEntity.getTable(), renderEntity.getWkt(), properties); } }); - Log.e("qj","聚合交通标牌转换结束"+list1.size()); + Log.e("qj", "聚合交通标牌转换结束" + list1.size()); } //增加交通标牌聚合显示 List list2 = GeometryTools.groupByDistance(DataCodeEnum.OMDB_TRAFFICLIGHT.getCode(), traffList, 5.0); - if(list2!=null&&list2.size()>0){ - Log.e("qj","聚合红绿灯转换开始"+traffList.size()); + if (list2 != null && list2.size() > 0) { + Log.e("qj", "聚合红绿灯转换开始" + traffList.size()); list2.stream().iterator().forEachRemaining(new Consumer() { @Override public void accept(RenderEntity renderEntity) { @@ -117,7 +116,7 @@ public class OMDBDataDecoder extends TileDecoder { parseGeometry(renderEntity.getTable(), renderEntity.getWkt(), properties); } }); - Log.e("qj","聚合红绿灯转换结束"+list2.size()); + Log.e("qj", "聚合红绿灯转换结束" + list2.size()); } return true; } diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBTileDataSource.java b/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBTileDataSource.java index 454f450b..b6724bd5 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBTileDataSource.java +++ b/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBTileDataSource.java @@ -127,7 +127,6 @@ public class OMDBTileDataSource implements ITileDataSource { for (String type : Constant.HAD_LAYER_INVISIABLE_ARRAY) { realmQuery.notEqualTo("table", type); } - realmQuery.notEqualTo("table", "OMDB_TRAFFIC_SIGN"); realmQuery.endGroup(); } long time = System.currentTimeMillis(); diff --git a/collect-library/src/main/java/com/navinfo/collect/library/utils/GeometryTools.java b/collect-library/src/main/java/com/navinfo/collect/library/utils/GeometryTools.java index 39305246..ad59f465 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/utils/GeometryTools.java +++ b/collect-library/src/main/java/com/navinfo/collect/library/utils/GeometryTools.java @@ -35,7 +35,7 @@ import java.util.List; * @author qj 几何工具类 */ public class GeometryTools { - + private final static String TAG = "GeometryTools"; static final double PI = 3.14159216; private static volatile GeometryTools mInstance; static double earthRadiusMeters = 6371000.0; @@ -1647,4 +1647,89 @@ public class GeometryTools { return listReslut; } + + /** + * 线几何按距离等分点 + */ + public static synchronized List getLineToDengGeoPints(Geometry lineGeometry, double dengDisance) { + List geoPointList = new ArrayList<>(); + //获取线几何点 + List list = getGeoPoints(lineGeometry); + + if(list!=null&&list.size()>=2) { + + for (int i = 0; i < list.size() - 1; i++) { + + GeoPoint geoPoint1 = list.get(i); + + GeoPoint geoPoint2 = list.get(i + 1); + + double disance = getDistance(geoPoint1.getLatitude(), geoPoint1.getLongitude(), geoPoint2.getLatitude(), geoPoint2.getLongitude()); + + //只有第一个点进行添加,后面数据过滤掉 + if(i==0){ + geoPointList.add(geoPoint1); + } + + geoPointList.add(geoPoint2); + + if (disance > dengDisance) { + //向上取整 + int num = (int) Math.ceil(disance / dengDisance); + + //计算等分数据 + List dengList = getDengGeoPoint(geoPoint1, geoPoint2, num); + + if (dengList != null && dengList.size() > 0) { + + geoPointList.addAll(dengList); + } + } + } + } + return geoPointList; + } + + + /** + * 计算两点之间等距的经纬度 + */ + private static List getDengGeoPoint(GeoPoint geoPoint1, GeoPoint geoPoint2, int number) { + + double aaa, bbb, ccc = 0, ddd = 0; + + List geoPointList = new ArrayList<>(); + + for (int i = 1; i < number + 1; i++) { + if (geoPoint1.getLongitude() > geoPoint2.getLongitude() && geoPoint1.getLatitude() > geoPoint2.getLatitude()) { + aaa = (geoPoint1.getLongitude() - geoPoint2.getLongitude()) / (number + 1); + ccc = geoPoint2.getLongitude() + aaa * (i); + bbb = (geoPoint1.getLatitude() - geoPoint2.getLatitude()) / (number + 1); + ddd = bbb * (i) + geoPoint2.getLatitude(); + Log.e(TAG, "getLatLng:a " + ddd + " " + ccc); + } else if (geoPoint1.getLongitude() < geoPoint2.getLongitude() && geoPoint1.getLatitude() < geoPoint2.getLatitude()) { + aaa = (geoPoint2.getLongitude() - geoPoint1.getLongitude()) / (number + 1); + ccc = geoPoint1.getLongitude() + aaa * (i); + bbb = (geoPoint2.getLatitude() - geoPoint1.getLatitude()) / (number + 1); + ddd = geoPoint1.getLatitude() + bbb * i; + Log.e(TAG, "getLatLng:b " + ddd + " " + ccc); + } else if (geoPoint1.getLongitude() > geoPoint2.getLongitude() && geoPoint1.getLatitude() < geoPoint2.getLatitude()) { + aaa = (geoPoint1.getLongitude() - geoPoint2.getLongitude()) / (number + 1); + ccc = geoPoint2.getLongitude() + aaa * (number + 1 - i); + bbb = (geoPoint2.getLatitude() - geoPoint1.getLatitude()) / (number + 1); + ddd = geoPoint1.getLatitude() + bbb * i; + Log.e(TAG, "getLatLng:c " + ddd + " " + ccc); + } else if (geoPoint1.getLongitude() < geoPoint2.getLongitude() && geoPoint1.getLatitude() > geoPoint2.getLatitude()) { + aaa = (geoPoint2.getLongitude() - geoPoint1.getLongitude()) / (number + 1); + ccc = geoPoint1.getLongitude() + aaa * (i); + bbb = (geoPoint1.getLatitude() - geoPoint2.getLatitude()) / (number + 1); + ddd = geoPoint1.getLatitude() - bbb * i; + Log.e(TAG, "getLatLng:d " + ddd + " " + ccc); + } + + geoPointList.add(new GeoPoint(ddd, ccc)); + } + + return geoPointList; + } }