Merge branch 'master' of gitlab.navinfo.com:CollectVehicle/OneMapQS

This commit is contained in:
2023-04-27 15:38:25 +08:00
8 changed files with 213 additions and 122 deletions

View File

@@ -1,7 +1,10 @@
package com.navinfo.omqs.db
import android.os.Build
import android.util.Log
import androidx.annotation.RequiresApi
import com.navinfo.collect.library.data.entity.RenderEntity
import com.navinfo.collect.library.data.entity.RenderEntity.Companion.LinkTable
import com.navinfo.collect.library.map.NIMapController
import com.navinfo.collect.library.utils.GeometryTools
import com.navinfo.collect.library.utils.GeometryToolsKt
@@ -17,10 +20,11 @@ import org.oscim.core.MercatorProjection
import javax.inject.Inject
import kotlin.streams.toList
@RequiresApi(Build.VERSION_CODES.N)
class RealmOperateHelper() {
@Inject
lateinit var niMapController: NIMapController
/**
* 根据当前点位查询匹配的Link数据
* @param point 点位经纬度信息
@@ -28,7 +32,12 @@ class RealmOperateHelper() {
* @param bufferType 点位外扩距离的单位: 米-Meter像素-PIXEL
* @param sort 是否需要排序
* */
suspend fun queryLink(point: Point, buffer: Double = DEFAULT_BUFFER, bufferType: BUFFER_TYPE = DEFAULT_BUFFER_TYPE, sort: Boolean = false): MutableList<RenderEntity> {
suspend fun queryLink(
point: Point,
buffer: Double = DEFAULT_BUFFER,
bufferType: BUFFER_TYPE = DEFAULT_BUFFER_TYPE,
sort: Boolean = true
): MutableList<RenderEntity> {
val result = mutableListOf<RenderEntity>()
withContext(Dispatchers.IO) {
val polygon = getPolygonFromPoint(point, buffer, bufferType)
@@ -45,25 +54,49 @@ class RealmOperateHelper() {
val yStart = tileYSet.stream().min(Comparator.naturalOrder()).orElse(null)
val yEnd = tileYSet.stream().max(Comparator.naturalOrder()).orElse(null)
// 查询realm中对应tile号的数据
val realmList = Realm.getDefaultInstance().where(RenderEntity::class.java)
val realm = Realm.getDefaultInstance()
val realmList = realm.where(RenderEntity::class.java)
.equalTo("table", "OMDB_RD_LINK")
.and()
.rawPredicate("tileX>=$xStart and tileX<=$xEnd and tileY>=$yStart and tileY<=$yEnd")
.findAll()
// 将获取到的数据和查询的polygon做相交只返回相交的数据
val queryResult = realmList?.stream()?.filter {
val dataList = realm.copyFromRealm(realmList)
val queryResult = dataList?.stream()?.filter {
polygon.intersects(it.wkt)
}?.toList()
queryResult?.let {
result.addAll(queryResult)
}
if (sort) {
result.clear()
result.addAll(sortRenderEntity(point, result))
if (sort) {
result.addAll(sortRenderEntity(point, it))
} else {
result.addAll(it)
}
}
}
return result
}
suspend fun queryLink(
linkPid: String,
): RenderEntity? {
var link: RenderEntity? = null
withContext(Dispatchers.IO) {
val realm = Realm.getDefaultInstance()
val realmR = realm.where(RenderEntity::class.java)
.equalTo("table", "OMDB_RD_LINK")
.and()
.rawPredicate("properties['${LinkTable.linkPid}']=$linkPid")
.findFirst()
if (realmR != null) {
link = realm.copyFromRealm(realmR)
}
}
return link
}
/**
* 根据当前点位查询匹配的除Link外的其他要素数据
* @param point 点位经纬度信息
@@ -71,7 +104,12 @@ class RealmOperateHelper() {
* @param bufferType 点位外扩距离的单位: 米-Meter像素-PIXEL
* @param sort 是否需要排序
* */
suspend fun queryElement(point: Point, buffer: Double = DEFAULT_BUFFER, bufferType: BUFFER_TYPE = DEFAULT_BUFFER_TYPE, sort: Boolean = false): MutableList<RenderEntity> {
suspend fun queryElement(
point: Point,
buffer: Double = DEFAULT_BUFFER,
bufferType: BUFFER_TYPE = DEFAULT_BUFFER_TYPE,
sort: Boolean = true
): MutableList<RenderEntity> {
val result = mutableListOf<RenderEntity>()
withContext(Dispatchers.IO) {
val polygon = getPolygonFromPoint(point, buffer, bufferType)
@@ -121,7 +159,7 @@ class RealmOperateHelper() {
val realmList = Realm.getDefaultInstance().where(RenderEntity::class.java)
.notEqualTo("table", "OMDB_RD_LINK")
.and()
.equalTo("properties['LINK_PID']", linkPid)
.equalTo("properties['${LinkTable.linkPid}']", linkPid)
.findAll()
result.addAll(realmList)
}
@@ -134,15 +172,19 @@ class RealmOperateHelper() {
* @param unSortList 未排序的数据
* @return 排序后的数据
* */
fun sortRenderEntity(point: Point, unSortList: MutableList<RenderEntity>): List<RenderEntity> {
fun sortRenderEntity(point: Point, unSortList: List<RenderEntity>): List<RenderEntity> {
val sortList = unSortList.stream().sorted { renderEntity, renderEntity2 ->
val near = point.distance(renderEntity.wkt) - point.distance(renderEntity2.wkt)
if (near<0) -1 else 1
if (near < 0) -1 else 1
}.toList()
return sortList
}
private fun getPolygonFromPoint(point: Point, buffer: Double = DEFAULT_BUFFER, bufferType: BUFFER_TYPE = DEFAULT_BUFFER_TYPE): Polygon {
private fun getPolygonFromPoint(
point: Point,
buffer: Double = DEFAULT_BUFFER,
bufferType: BUFFER_TYPE = DEFAULT_BUFFER_TYPE
): Polygon {
// 首先计算当前点位的buffer组成的geometry
val wkt: Polygon = if (bufferType == BUFFER_TYPE.METER) { // 如果单位是米
val distanceDegrees = GeometryTools.convertDistanceToDegree(buffer, point.y)
@@ -151,14 +193,30 @@ class RealmOperateHelper() {
} else { // 如果单位是像素,需要根据当前屏幕像素计算出经纬度变化
val currentMapScale = niMapController.mMapView.vtmMap.mapPosition.scale
// 转换为屏幕坐标
val pixelPoint = MercatorProjection.getPixelWithScale(GeoPoint(point.y, point.x), currentMapScale)
val pixelPoint =
MercatorProjection.getPixelWithScale(
GeoPoint(point.y, point.x),
currentMapScale
)
// 将屏幕坐标外扩指定距离
// 计算外扩矩形
val envelope = Envelope(
MercatorProjection.pixelXToLongitudeWithScale(pixelPoint.x - buffer, currentMapScale),
MercatorProjection.pixelXToLongitudeWithScale(pixelPoint.x + buffer, currentMapScale),
MercatorProjection.pixelYToLatitudeWithScale(pixelPoint.y - buffer, currentMapScale),
MercatorProjection.pixelYToLatitudeWithScale(pixelPoint.y + buffer, currentMapScale),
MercatorProjection.pixelXToLongitudeWithScale(
pixelPoint.x - buffer,
currentMapScale
),
MercatorProjection.pixelXToLongitudeWithScale(
pixelPoint.x + buffer,
currentMapScale
),
MercatorProjection.pixelYToLatitudeWithScale(
pixelPoint.y - buffer,
currentMapScale
),
MercatorProjection.pixelYToLatitudeWithScale(
pixelPoint.y + buffer,
currentMapScale
),
)
// 将Envelope对象转换为Polygon对象
val geometryFactory = GeometryFactory()
@@ -178,7 +236,8 @@ class RealmOperateHelper() {
enum class BUFFER_TYPE(val index: Int) {
METER(0)/*米*/, PIXEL(1)/*像素*/;
fun getBufferTypeByIndex(index: Int): BUFFER_TYPE{
fun getBufferTypeByIndex(index: Int): BUFFER_TYPE {
for (item in BUFFER_TYPE.values()) {
if (item.index == index) {
return item;

View File

@@ -59,7 +59,7 @@ class EvaluationResultFragment : BaseFragment(), View.OnClickListener {
if (arguments != null) {
val id = requireArguments().getString("QsId")
if (id != null) {
viewModel.loadData(id)
viewModel.initData(id)
} else {
viewModel.initNewData()
}

View File

@@ -1,10 +1,14 @@
package com.navinfo.omqs.ui.fragment.evaluationresult
import android.os.Build
import android.util.Log
import androidx.annotation.RequiresApi
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.navinfo.collect.library.data.entity.QsRecordBean
import com.navinfo.collect.library.data.entity.RenderEntity.Companion.LinkTable
import com.navinfo.collect.library.map.GeoPoint
import com.navinfo.collect.library.map.NIMapController
import com.navinfo.collect.library.utils.GeometryTools
import com.navinfo.omqs.db.RealmOperateHelper
@@ -14,10 +18,10 @@ import io.realm.Realm
import io.realm.kotlin.where
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import org.locationtech.jts.geom.Point
import java.util.*
import javax.inject.Inject
@RequiresApi(Build.VERSION_CODES.N)
@HiltViewModel
class EvaluationResultViewModel @Inject constructor(
private val roomAppDatabase: RoomAppDatabase,
@@ -60,15 +64,7 @@ class EvaluationResultViewModel @Inject constructor(
liveDataQsRecordBean.value!!.geometry = it.toGeometry()
addMarker(it, markerTitle)
viewModelScope.launch {
val linkList = realmOperateHelper.queryLink(
point = GeometryTools.createPoint(
it.longitude,
it.latitude
), sort = true
)
if (linkList.isNotEmpty()) {
liveDataQsRecordBean.value!!.linkId = linkList[0].id
}
captureLink(it.longitude, it.latitude)
}
}
}
@@ -80,6 +76,7 @@ class EvaluationResultViewModel @Inject constructor(
Log.e("jingo", "EvaluationResultViewModel 销毁了 ${hashCode()}")
mapController.markerHandle.removeMarker(markerTitle)
mapController.markerHandle.removeOnMapClickListener()
mapController.lineHandler.removeLine()
}
@@ -96,15 +93,29 @@ class EvaluationResultViewModel @Inject constructor(
liveDataQsRecordBean.value!!.geometry = it.toGeometry()
mapController.markerHandle.addMarker(geoPoint, markerTitle)
viewModelScope.launch {
val linkList = realmOperateHelper.queryLink(
GeometryTools.createPoint(
geoPoint.longitude,
geoPoint.latitude
)
)
if (linkList.isNotEmpty()) {
liveDataQsRecordBean.value!!.linkId = linkList[0].id
}
captureLink(geoPoint.longitude, geoPoint.latitude)
}
}
}
/**
* 捕捉到路
*/
private suspend fun captureLink(longitude: Double, latitude: Double) {
val linkList = realmOperateHelper.queryLink(
point = GeometryTools.createPoint(
longitude,
latitude
),
)
liveDataQsRecordBean.value?.let {
if (linkList.isNotEmpty()) {
it.linkId =
linkList[0].properties[LinkTable.linkPid] ?: ""
mapController.lineHandler.showLine(linkList[0].geometry)
} else {
it.linkId = ""
mapController.lineHandler.removeLine()
}
}
}
@@ -263,14 +274,28 @@ class EvaluationResultViewModel @Inject constructor(
/**
* 根据数据id查询数据
*/
fun loadData(id: String) {
fun initData(id: String) {
viewModelScope.launch(Dispatchers.IO) {
val realm = Realm.getDefaultInstance()
val objects = realm.where<QsRecordBean>().equalTo("id", id).findFirst()
if (objects != null) {
oldBean = realm.copyFromRealm(objects)
liveDataQsRecordBean.postValue(oldBean!!.copy())
oldBean?.let {
liveDataQsRecordBean.postValue(it.copy())
val p = GeometryTools.createGeoPoint(it.geometry)
mapController.markerHandle.addMarker(
GeoPoint(p.longitude, p.latitude),
markerTitle
)
if (it.linkId.isNotEmpty()) {
val link = realmOperateHelper.queryLink(it.linkId)
link?.let { l ->
mapController.lineHandler.showLine(l.geometry)
}
}
}
}
}
}