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

 Conflicts:
	app/src/main/java/com/navinfo/omqs/OMQSApplication.kt
	app/src/main/java/com/navinfo/omqs/ui/activity/map/MainActivity.kt
	collect-library/src/main/java/com/navinfo/collect/library/map/handler/LayerManagerHandler.kt
This commit is contained in:
squallzhjch 2023-04-23 16:41:04 +08:00
commit 9fd2d0fe8a
20 changed files with 212 additions and 64 deletions

View File

@ -12,9 +12,7 @@ import dagger.hilt.android.HiltAndroidApp
import org.videolan.vlc.Util import org.videolan.vlc.Util
import io.realm.Realm import io.realm.Realm
import io.realm.RealmConfiguration import io.realm.RealmConfiguration
import kotlinx.coroutines.launch
import java.io.File import java.io.File
import java.math.BigInteger
import java.security.MessageDigest import java.security.MessageDigest
@HiltAndroidApp @HiltAndroidApp

View File

@ -15,6 +15,7 @@ import org.locationtech.spatial4j.distance.DistanceUtils
import org.oscim.core.GeoPoint import org.oscim.core.GeoPoint
import org.oscim.core.MercatorProjection import org.oscim.core.MercatorProjection
import javax.inject.Inject import javax.inject.Inject
import kotlin.streams.toList
class RealmOperateHelper() { class RealmOperateHelper() {
@ -25,29 +26,126 @@ class RealmOperateHelper() {
* @param point 点位经纬度信息 * @param point 点位经纬度信息
* @param buffer 点位的外扩距离 * @param buffer 点位的外扩距离
* @param bufferType 点位外扩距离的单位 -Meter像素-PIXEL * @param bufferType 点位外扩距离的单位 -Meter像素-PIXEL
* @param order 是否需要排序 * @param sort 是否需要排序
* */ * */
suspend fun queryLink(point: Point, buffer: Double = DEFAULT_BUFFER, bufferType: BUFFER_TYPE = DEFAULT_BUFFER_TYPE, order: Boolean = false): MutableList<RenderEntity> { suspend fun queryLink(point: Point, buffer: Double = DEFAULT_BUFFER, bufferType: BUFFER_TYPE = DEFAULT_BUFFER_TYPE, sort: Boolean = false): MutableList<RenderEntity> {
val result = mutableListOf<RenderEntity>()
withContext(Dispatchers.IO) { withContext(Dispatchers.IO) {
val polygon = getPolygonFromPoint(point, buffer, bufferType) val polygon = getPolygonFromPoint(point, buffer, bufferType)
// 根据polygon查询相交的tile号 // 根据polygon查询相交的tile号
val tileXSet = mutableSetOf<Int>() val tileXSet = mutableSetOf<Int>()
tileXSet.toString()
GeometryToolsKt.getTileXByGeometry(polygon.toString(), tileXSet) GeometryToolsKt.getTileXByGeometry(polygon.toString(), tileXSet)
val tileYSet = mutableSetOf<Int>() val tileYSet = mutableSetOf<Int>()
GeometryToolsKt.getTileYByGeometry(polygon.toString(), tileYSet) GeometryToolsKt.getTileYByGeometry(polygon.toString(), tileYSet)
// 对tileXSet和tileYSet查询最大最小值
val xStart = tileXSet.stream().min(Comparator.naturalOrder()).orElse(null)
val xEnd = tileXSet.stream().max(Comparator.naturalOrder()).orElse(null)
val yStart = tileYSet.stream().min(Comparator.naturalOrder()).orElse(null)
val yEnd = tileYSet.stream().max(Comparator.naturalOrder()).orElse(null)
// 查询realm中对应tile号的数据 // 查询realm中对应tile号的数据
Realm.getDefaultInstance().where(RenderEntity::class.java).equalTo("table", "HAD_LINK") val realmList = Realm.getDefaultInstance().where(RenderEntity::class.java)
.equalTo("table", "HAD_LINK")
.and()
.rawPredicate("tileX>=$xStart and tileX<=$xEnd and tileY>=$yStart and tileY<=$yEnd")
.findAll()
// 将获取到的数据和查询的polygon做相交只返回相交的数据
val queryResult = realmList?.stream()?.filter {
polygon.intersects(it.wkt)
}?.toList()
queryResult?.let {
result.addAll(queryResult)
} }
return mutableListOf() if (sort) {
result.clear()
result.addAll(sortRenderEntity(point, result))
}
}
return result
}
/**
* 根据当前点位查询匹配的除Link外的其他要素数据
* @param point 点位经纬度信息
* @param buffer 点位的外扩距离
* @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> {
val result = mutableListOf<RenderEntity>()
withContext(Dispatchers.IO) {
val polygon = getPolygonFromPoint(point, buffer, bufferType)
// 根据polygon查询相交的tile号
val tileXSet = mutableSetOf<Int>()
tileXSet.toString()
GeometryToolsKt.getTileXByGeometry(polygon.toString(), tileXSet)
val tileYSet = mutableSetOf<Int>()
GeometryToolsKt.getTileYByGeometry(polygon.toString(), tileYSet)
// 对tileXSet和tileYSet查询最大最小值
val xStart = tileXSet.stream().min(Comparator.naturalOrder()).orElse(null)
val xEnd = tileXSet.stream().max(Comparator.naturalOrder()).orElse(null)
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)
.notEqualTo("table", "HAD_LINK")
.and()
.rawPredicate("tileX>=$xStart and tileX<=$xEnd and tileY>=$yStart and tileY<=$yEnd")
.findAll()
// 将获取到的数据和查询的polygon做相交只返回相交的数据
val queryResult = realmList?.stream()?.filter {
polygon.intersects(it.wkt)
}?.toList()
queryResult?.let {
result.addAll(queryResult)
}
if (sort) {
result.clear()
result.addAll(sortRenderEntity(point, result))
}
}
return result
}
/**
* 根据linkPid查询关联的要素除去Link数据
* @param point 点位经纬度信息
* @param buffer 点位的外扩距离
* @param bufferType 点位外扩距离的单位 -Meter像素-PIXEL
* @param sort 是否需要排序
* */
suspend fun queryLinkByLinkPid(linkPid: String): MutableList<RenderEntity> {
val result = mutableListOf<RenderEntity>()
withContext(Dispatchers.IO) {
val realmList = Realm.getDefaultInstance().where(RenderEntity::class.java)
.notEqualTo("table", "HAD_LINK")
.and()
.equalTo("properties['LINK_PID']", linkPid)
.findAll()
result.addAll(realmList)
}
return result
}
/**
* 根据给定的点位对数据排序
* @param point 点位经纬度信息
* @param unSortList 未排序的数据
* @return 排序后的数据
* */
fun sortRenderEntity(point: Point, unSortList: MutableList<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
}.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 // 首先计算当前点位的buffer组成的geometry
val wkt: Polygon = if (bufferType == BUFFER_TYPE.METER) { // 如果单位是米 val wkt: Polygon = if (bufferType == BUFFER_TYPE.METER) { // 如果单位是米
// 计算米和地球角度之间的关系在Spatial4J中经度和纬度的单位是度而不是米。因此将距离从米转换为度需要使用一个转换因子这个转换因子是由地球的周长和360度之间的比例计算得出的。 val distanceDegrees = GeometryTools.convertDistanceToDegree(buffer, point.y)
// 在这个例子中使用的转换因子是111000.0这是因为地球的周长约为40075公里而每个经度的距离大约是地球周长的1/360因此每个经度的距离约为111.32公里
val distanceDegrees = DistanceUtils.dist2Degrees(buffer, DistanceUtils.EARTH_MEAN_RADIUS_KM) * 111000.0
// 计算外扩矩形 // 计算外扩矩形
BufferOp.bufferOp(point, distanceDegrees) as Polygon BufferOp.bufferOp(point, distanceDegrees) as Polygon
} else { // 如果单位是像素,需要根据当前屏幕像素计算出经纬度变化 } else { // 如果单位是像素,需要根据当前屏幕像素计算出经纬度变化

View File

@ -1,21 +1,18 @@
package com.navinfo.omqs.ui.activity.map package com.navinfo.omqs.ui.activity.map
import android.os.Bundle import android.os.Bundle
import android.util.Log
import androidx.activity.viewModels import androidx.activity.viewModels
import androidx.core.view.WindowCompat import androidx.core.view.WindowCompat
import androidx.databinding.DataBindingUtil import androidx.databinding.DataBindingUtil
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
import com.blankj.utilcode.util.ToastUtils import com.blankj.utilcode.util.ToastUtils
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.viewModelScope
import androidx.navigation.findNavController import androidx.navigation.findNavController
import com.navinfo.collect.library.map.NIMapController import com.navinfo.collect.library.map.NIMapController
import com.navinfo.collect.library.map.handler.NiLocationListener import com.navinfo.collect.library.map.handler.NiLocationListener
import com.navinfo.omqs.Constant import com.navinfo.omqs.Constant
import com.navinfo.omqs.R import com.navinfo.omqs.R
import com.navinfo.omqs.databinding.ActivityMainBinding import com.navinfo.omqs.databinding.ActivityMainBinding
import com.navinfo.omqs.db.TraceDataBase
import com.navinfo.omqs.http.offlinemapdownload.OfflineMapDownloadManager import com.navinfo.omqs.http.offlinemapdownload.OfflineMapDownloadManager
import com.navinfo.omqs.system.SystemConstant import com.navinfo.omqs.system.SystemConstant
import com.navinfo.omqs.ui.activity.BaseActivity import com.navinfo.omqs.ui.activity.BaseActivity
@ -50,7 +47,8 @@ class MainActivity : BaseActivity() {
this, this,
binding.mainActivityMap, binding.mainActivityMap,
null, null,
Constant.MAP_PATH Constant.MAP_PATH,
Constant.DATA_PATH+ SystemConstant.USER_ID+"/trace.sqlite"
) )
//关联生命周期 //关联生命周期
binding.lifecycleOwner = this binding.lifecycleOwner = this
@ -78,6 +76,7 @@ class MainActivity : BaseActivity() {
}) })
//显示轨迹图层 //显示轨迹图层
// mapController.layerManagerHandler.showNiLocationLayer(Constant.DATA_PATH+ SystemConstant.USER_ID+"/trace.sqlite") // mapController.layerManagerHandler.showNiLocationLayer(Constant.DATA_PATH+ SystemConstant.USER_ID+"/trace.sqlite")
mapController.layerManagerHandler.showNiLocationLayer()
} }
override fun onPause() { override fun onPause() {
@ -108,6 +107,8 @@ class MainActivity : BaseActivity() {
*/ */
fun openCamera() { fun openCamera() {
binding.viewModel!!.onClickCameraButton(this) binding.viewModel!!.onClickCameraButton(this)
//显示轨迹图层
//binding!!.viewModel!!.onClickCameraButton(this)
} }
/** /**

View File

@ -8,6 +8,7 @@ import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModel
import androidx.navigation.findNavController import androidx.navigation.findNavController
import com.blankj.utilcode.util.ToastUtils import com.blankj.utilcode.util.ToastUtils
import com.navinfo.collect.library.data.dao.impl.TraceDataBase
import com.navinfo.collect.library.data.entity.NiLocation import com.navinfo.collect.library.data.entity.NiLocation
import com.navinfo.collect.library.map.NIMapController import com.navinfo.collect.library.map.NIMapController
import com.navinfo.collect.library.map.handler.OnQsRecordItemClickListener import com.navinfo.collect.library.map.handler.OnQsRecordItemClickListener
@ -15,12 +16,12 @@ import com.navinfo.collect.library.utils.GeometryTools
import com.navinfo.collect.library.utils.GeometryToolsKt import com.navinfo.collect.library.utils.GeometryToolsKt
import com.navinfo.omqs.Constant import com.navinfo.omqs.Constant
import com.navinfo.omqs.R import com.navinfo.omqs.R
import com.navinfo.omqs.db.TraceDataBase
import com.navinfo.omqs.system.SystemConstant import com.navinfo.omqs.system.SystemConstant
import com.navinfo.omqs.ui.dialog.CommonDialog import com.navinfo.omqs.ui.dialog.CommonDialog
import com.navinfo.omqs.ui.manager.TakePhotoManager import com.navinfo.omqs.ui.manager.TakePhotoManager
import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.lifecycle.HiltViewModel
import io.realm.RealmSet import io.realm.RealmSet
import org.oscim.core.GeoPoint
import org.videolan.libvlc.LibVlcUtil import org.videolan.libvlc.LibVlcUtil
import javax.inject.Inject import javax.inject.Inject
@ -105,10 +106,7 @@ class MainViewModel @Inject constructor(
if (niLocationList != null && niLocationList.size > 0) { if (niLocationList != null && niLocationList.size > 0) {
var niLocation = niLocationList[0] var niLocation = niLocationList[0]
var doubleArray = doubleArrayOf() val geometry = GeometryTools.createGeometry(GeoPoint(niLocation.latitude,niLocation.longitude))
doubleArray[0] = niLocation.longitude
doubleArray[1] = niLocation.latitude
val geometry = GeometryTools.createGeometry(doubleArray)
val tileX = RealmSet<Int>() val tileX = RealmSet<Int>()
GeometryToolsKt.getTileXByGeometry(geometry.toString(), tileX) GeometryToolsKt.getTileXByGeometry(geometry.toString(), tileX)
val tileY = RealmSet<Int>() val tileY = RealmSet<Int>()

View File

@ -225,7 +225,9 @@ class PersonalCenterViewModel @Inject constructor(
fun readRealmData() { fun readRealmData() {
viewModelScope.launch(Dispatchers.IO) { viewModelScope.launch(Dispatchers.IO) {
realmOperateHelper.queryLink(GeometryTools.createPoint(115.685817,28.62759)) // val result = realmOperateHelper.queryLink(GeometryTools.createPoint(115.685817,28.62759))
val result = realmOperateHelper.queryLinkByLinkPid("84206617008217069")
Log.d("xiaoyan", result.toString())
} }
} }
} }

View File

@ -1530,4 +1530,23 @@
<symbol src="assets:symbols/traffic_signal.svg" /> <symbol src="assets:symbols/traffic_signal.svg" />
</m> </m>
</m> </m>
<m k="nav_style">
<m v="symbol_object_line">
<m k="rule" zoom-min="15" zoom-max="22">
<!-- 蓝色黑色间隔线 -->
<m v="blue_link">
<line stroke="#00000000" stipple-stroke="#00000000" dasharray="20,20" fix="true" width="0.1" />
</m>
<!-- 黄色线 -->
<m v="yellow_link">
<line stroke="#f4ea2a" width="0.1" stipple-width="0.1"/>
</m>
</m>
<line stroke="#33aaaa" width="0.3" stipple-width="0.5"/>
</m>
<m v="symbol_track_point" zoom-min="10" zoom-max="25">
<symbol src="assets:symbols/dot_blue.svg" />
</m>
</m>
</rendertheme> </rendertheme>

View File

@ -10,7 +10,6 @@ import androidx.sqlite.db.SupportSQLiteDatabase;
import com.navinfo.collect.library.data.entity.CheckManager; import com.navinfo.collect.library.data.entity.CheckManager;
import com.navinfo.collect.library.data.entity.Element; import com.navinfo.collect.library.data.entity.Element;
import com.navinfo.collect.library.data.entity.LayerManager; import com.navinfo.collect.library.data.entity.LayerManager;
import com.navinfo.collect.library.data.entity.NiLocation;
import com.navinfo.collect.library.data.entity.Project; import com.navinfo.collect.library.data.entity.Project;
import com.navinfo.collect.library.data.entity.TileElement; import com.navinfo.collect.library.data.entity.TileElement;
import com.tencent.wcdb.database.SQLiteCipherSpec; import com.tencent.wcdb.database.SQLiteCipherSpec;
@ -25,7 +24,7 @@ import com.tencent.wcdb.room.db.WCDBDatabase;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@Database(entities = {Element.class, TileElement.class, LayerManager.class, Project.class, NiLocation.class, CheckManager.class},version = 1, exportSchema = false) @Database(entities = {Element.class, TileElement.class, LayerManager.class, Project.class, CheckManager.class},version = 1, exportSchema = false)
public abstract class MapLifeDataBase extends RoomDatabase { public abstract class MapLifeDataBase extends RoomDatabase {
// marking the instance as volatile to ensure atomic access to the variable // marking the instance as volatile to ensure atomic access to the variable
/** /**
@ -38,11 +37,6 @@ public abstract class MapLifeDataBase extends RoomDatabase {
*/ */
public abstract IElementDao getElementDao(); public abstract IElementDao getElementDao();
/**
* 地图坐标库类
*/
public abstract INiLocationDao getNiLocationDao();
/** /**
* 图层要素数据库类 * 图层要素数据库类
*/ */

View File

@ -1,14 +1,15 @@
package com.navinfo.omqs.db; package com.navinfo.collect.library.data.dao.impl;
import android.content.Context; import android.content.Context;
import android.os.AsyncTask; import android.os.AsyncTask;
import android.util.Log; import android.util.Log;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.room.Database; import androidx.room.Database;
import androidx.room.Room; import androidx.room.Room;
import androidx.room.RoomDatabase; import androidx.room.RoomDatabase;
import androidx.sqlite.db.SupportSQLiteDatabase; import androidx.sqlite.db.SupportSQLiteDatabase;
import com.navinfo.collect.library.data.dao.impl.INiLocationDao;
import com.navinfo.collect.library.data.entity.NiLocation; import com.navinfo.collect.library.data.entity.NiLocation;
import com.tencent.wcdb.database.SQLiteCipherSpec; import com.tencent.wcdb.database.SQLiteCipherSpec;
import com.tencent.wcdb.database.SQLiteDatabase; import com.tencent.wcdb.database.SQLiteDatabase;

View File

@ -6,6 +6,7 @@ import com.navinfo.collect.library.utils.GeometryToolsKt
import io.realm.RealmDictionary import io.realm.RealmDictionary
import io.realm.RealmObject import io.realm.RealmObject
import io.realm.RealmSet import io.realm.RealmSet
import io.realm.annotations.Ignore
import io.realm.annotations.PrimaryKey import io.realm.annotations.PrimaryKey
import org.locationtech.jts.geom.Coordinate import org.locationtech.jts.geom.Coordinate
import org.locationtech.jts.geom.Geometry import org.locationtech.jts.geom.Geometry
@ -28,7 +29,15 @@ open class RenderEntity(): RealmObject() {
// 根据geometry自动计算当前要素的x-tile和y-tile // 根据geometry自动计算当前要素的x-tile和y-tile
GeometryToolsKt.getTileXByGeometry(value, tileX) GeometryToolsKt.getTileXByGeometry(value, tileX)
GeometryToolsKt.getTileYByGeometry(value, tileY) GeometryToolsKt.getTileYByGeometry(value, tileY)
// 根据传入的geometry文本自动转换为Geometry对象
try {
wkt = GeometryTools.createGeometry(value)
} catch (e: Exception) {
} }
}
@Ignore
var wkt: Geometry? = null
var properties: RealmDictionary<String?> = RealmDictionary() var properties: RealmDictionary<String?> = RealmDictionary()
val tileX: RealmSet<Int> = RealmSet() // x方向的tile编码 val tileX: RealmSet<Int> = RealmSet() // x方向的tile编码
val tileY: RealmSet<Int> = RealmSet() // y方向的tile编码 val tileY: RealmSet<Int> = RealmSet() // y方向的tile编码

View File

@ -1,9 +1,9 @@
package com.navinfo.collect.library.data.handler package com.navinfo.collect.library.data.handler
import android.content.Context import android.content.Context
import com.navinfo.collect.library.data.dao.impl.MapLifeDataBase import androidx.room.RoomDatabase
open class BaseDataHandler(context: Context, dataBase: MapLifeDataBase) { open class BaseDataHandler(context: Context, dataBase: RoomDatabase) {
protected val mContext: Context = context; protected val mContext: Context = context;
protected val mDataBase: MapLifeDataBase = dataBase; protected val mDataBase: RoomDatabase = dataBase;
} }

View File

@ -8,6 +8,7 @@ import android.os.Handler
import android.os.Looper import android.os.Looper
import android.util.Log import android.util.Log
import com.navinfo.collect.library.data.dao.impl.MapLifeDataBase import com.navinfo.collect.library.data.dao.impl.MapLifeDataBase
import com.navinfo.collect.library.data.dao.impl.TraceDataBase
import com.navinfo.collect.library.data.entity.* import com.navinfo.collect.library.data.entity.*
import com.navinfo.collect.library.data.entity.DataLayerItemType.* import com.navinfo.collect.library.data.entity.DataLayerItemType.*
import com.navinfo.collect.library.utils.GeometryTools import com.navinfo.collect.library.utils.GeometryTools
@ -25,7 +26,7 @@ import kotlin.concurrent.thread
open class open class
DataNiLocationHandler(context: Context, dataBase: MapLifeDataBase) : DataNiLocationHandler(context: Context, dataBase: TraceDataBase) :
BaseDataHandler(context, dataBase) { BaseDataHandler(context, dataBase) {
/** /**
@ -58,11 +59,11 @@ DataNiLocationHandler(context: Context, dataBase: MapLifeDataBase) :
} }
} }
val niLocationLoad = mDataBase.niLocationDao.find(niLocation.id); val niLocationLoad = (mDataBase as TraceDataBase).niLocationDao.find(niLocation.id);
if(niLocationLoad!=null){ if(niLocationLoad!=null){
mDataBase.niLocationDao.update(niLocation) (mDataBase as TraceDataBase).niLocationDao.update(niLocation)
}else{ }else{
mDataBase.niLocationDao.insert(niLocation) (mDataBase as TraceDataBase).niLocationDao.insert(niLocation)
} }
Handler(Looper.getMainLooper()).post { Handler(Looper.getMainLooper()).post {
callback.invoke(true, "") callback.invoke(true, "")
@ -89,7 +90,7 @@ DataNiLocationHandler(context: Context, dataBase: MapLifeDataBase) :
"uuid=?", "uuid=?",
arrayOf("'${niLocation.id}'") arrayOf("'${niLocation.id}'")
) )
mDataBase.niLocationDao.delete(niLocation); (mDataBase as TraceDataBase).niLocationDao.delete(niLocation);
} catch (e: Throwable) { } catch (e: Throwable) {
Handler(Looper.getMainLooper()).post { Handler(Looper.getMainLooper()).post {
callback.invoke(false, "${e.message}") callback.invoke(false, "${e.message}")

View File

@ -4,6 +4,7 @@ import android.content.Context
import android.os.Handler import android.os.Handler
import android.os.Looper import android.os.Looper
import com.navinfo.collect.library.data.dao.impl.MapLifeDataBase import com.navinfo.collect.library.data.dao.impl.MapLifeDataBase
import com.navinfo.collect.library.data.dao.impl.TraceDataBase
import com.navinfo.collect.library.data.entity.Project import com.navinfo.collect.library.data.entity.Project
import kotlin.concurrent.thread import kotlin.concurrent.thread
@ -22,7 +23,7 @@ open class DataProjectHandler(context: Context, dataBase: MapLifeDataBase) :
) { ) {
thread(start = true) { thread(start = true) {
try { try {
mDataBase.projectManagerDao.insert(project) (mDataBase as MapLifeDataBase).projectManagerDao.insert(project)
Handler(Looper.getMainLooper()).post { Handler(Looper.getMainLooper()).post {
callback.invoke(true, "") callback.invoke(true, "")
} }
@ -41,7 +42,7 @@ open class DataProjectHandler(context: Context, dataBase: MapLifeDataBase) :
*/ */
fun getProjectList(callback: (list: List<Project>) -> Unit) { fun getProjectList(callback: (list: List<Project>) -> Unit) {
thread(start = true) { thread(start = true) {
val list = mDataBase.projectManagerDao.findList(); val list = (mDataBase as MapLifeDataBase).projectManagerDao.findList();
Handler(Looper.getMainLooper()).post { Handler(Looper.getMainLooper()).post {
callback.invoke(list) callback.invoke(list)
} }

View File

@ -25,9 +25,9 @@ class NIMapController {
lateinit var viewportHandler: ViewportHandler lateinit var viewportHandler: ViewportHandler
lateinit var measureLayerHandler: MeasureLayerHandler lateinit var measureLayerHandler: MeasureLayerHandler
fun init(context: AppCompatActivity, mapView: NIMapView, options: NIMapOptions? = null, mapPath: String) { fun init(context: AppCompatActivity, mapView: NIMapView, options: NIMapOptions? = null, mapPath: String, tracePath: String) {
Constant.MAP_PATH = mapPath Constant.MAP_PATH = mapPath
layerManagerHandler = LayerManagerHandler(context, mapView) layerManagerHandler = LayerManagerHandler(context, mapView, tracePath)
locationLayerHandler = LocationLayerHandler(context, mapView) locationLayerHandler = LocationLayerHandler(context, mapView)
animationHandler = AnimationHandler(context, mapView) animationHandler = AnimationHandler(context, mapView)
markerHandle = MarkHandler(context, mapView) markerHandle = MarkHandler(context, mapView)

View File

@ -49,11 +49,10 @@ import java.util.*
/** /**
* Layer 操作 * Layer 操作
*/ */
open class LayerManagerHandler(context: AppCompatActivity, mapView: NIMapView) : open class LayerManagerHandler(context: AppCompatActivity, mapView: NIMapView,tracePath: String) : BaseHandler(context, mapView) {
BaseHandler(context, mapView) {
private var baseGroupLayer // 用于盛放所有基础底图的图层组,便于统一管理 private var baseGroupLayer // 用于盛放所有基础底图的图层组,便于统一管理
: GroupLayer? = null : GroupLayer? = null
protected val mTracePath:String = tracePath
/** /**
* 默认文字颜色 * 默认文字颜色
*/ */
@ -104,6 +103,26 @@ open class LayerManagerHandler(context: AppCompatActivity, mapView: NIMapView) :
loadBaseMap() loadBaseMap()
//初始化之间数据图层 //初始化之间数据图层
initQsRecordDataLayer() initQsRecordDataLayer()
mapLifeNiLocationTileSource = MapLifeNiLocationTileSource(mContext, mTracePath)
vectorNiLocationTileLayer = VectorTileLayer(mMapView.vtmMap, mapLifeNiLocationTileSource)
labelNiLocationLayer = LabelLayer(mMapView.vtmMap, vectorNiLocationTileLayer, LabelTileLoaderHook(), 15)
if(vectorNiLocationTileLayer!=null){
addLayer(vectorNiLocationTileLayer,NIMapView.LAYER_GROUPS.BASE)
}
if(labelNiLocationLayer!=null){
addLayer(labelNiLocationLayer, NIMapView.LAYER_GROUPS.BASE)
}
vectorNiLocationTileLayer.isEnabled = false
labelNiLocationLayer.isEnabled = false
mMapView.switchTileVectorLayerTheme(NIMapView.MAP_THEME.DEFAULT)
mMapView.updateMap() mMapView.updateMap()
// initMapLifeSource() // initMapLifeSource()
// 设置矢量图层均在12级以上才显示 // 设置矢量图层均在12级以上才显示
@ -579,24 +598,15 @@ open class LayerManagerHandler(context: AppCompatActivity, mapView: NIMapView) :
} }
//显示轨迹图层 //显示轨迹图层
fun showNiLocationLayer(dbName: String?) { fun showNiLocationLayer() {
if (mapLifeNiLocationTileSource == null) { vectorNiLocationTileLayer.isEnabled = true
mapLifeNiLocationTileSource = MapLifeNiLocationTileSource(mContext, dbName) labelNiLocationLayer.isEnabled = true
}
if (vectorNiLocationTileLayer == null) {
vectorNiLocationTileLayer =
VectorTileLayer(mMapView.vtmMap, mapLifeNiLocationTileSource)
}
if (labelNiLocationLayer == null) {
labelNiLocationLayer =
LabelLayer(mMapView.vtmMap, vectorNiLocationTileLayer, LabelTileLoaderHook(), 15)
}
addLayer(labelNiLocationLayer, NIMapView.LAYER_GROUPS.VECTOR)
} }
//隐藏轨迹图层 //隐藏轨迹图层
fun hideNiLocationLayer() { fun hideNiLocationLayer() {
removeLayer(labelNiLocationLayer) vectorNiLocationTileLayer.isEnabled = false
labelNiLocationLayer.isEnabled = false
} }
} }

View File

@ -57,9 +57,7 @@ class LocationLayerHandler(context: AppCompatActivity, mapView: NIMapView) : Bas
//获取定位类型、定位错误返回码具体信息可参照类参考中BDLocation类中的说明 //获取定位类型、定位错误返回码具体信息可参照类参考中BDLocation类中的说明
val errorCode = it.locType val errorCode = it.locType
mCurrentLocation = it mCurrentLocation = it
mLocationLayer.setPosition( mLocationLayer.setPosition(it.latitude, it.longitude, it.radius)
it.latitude, it.longitude, it.radius
)
Log.e("qj","location==${it.longitude}==errorCode===$errorCode===${it.locTypeDescription}") Log.e("qj","location==${it.longitude}==errorCode===$errorCode===${it.locTypeDescription}")
if(niLocationListener!=null){ if(niLocationListener!=null){
getCurrentNiLocation()?.let { it1 -> niLocationListener.call(it1) } getCurrentNiLocation()?.let { it1 -> niLocationListener.call(it1) }

View File

@ -90,7 +90,7 @@ public class MapLifeNiLocationDecoder extends TileDecoder {
} }
if(count==0){ if(count==0){
properties.put("nav_style","symbol_object_line"); properties.put("nav_style","symbol_object_line");
parseGeometry(layerName, GeometryTools.createGeometry("LINESTRING (116.245567 40.073475, 116.245855 40.072811, 116.24706 40.073034)"), properties); parseGeometry(layerName, GeometryTools.createGeometry("LINESTRING (116.245859 40.073475, 116.245855 40.073477)"), properties);
} }
// if(count%55==0){ // if(count%55==0){
// Log.e("qj","decode==geometry==symbol_track_point"+geometry.toString()+String.valueOf(anyNum)); // Log.e("qj","decode==geometry==symbol_track_point"+geometry.toString()+String.valueOf(anyNum));

View File

@ -6,6 +6,7 @@ import android.util.Log;
import androidx.annotation.RequiresApi; import androidx.annotation.RequiresApi;
import com.navinfo.collect.library.data.dao.impl.MapLifeDataBase; import com.navinfo.collect.library.data.dao.impl.MapLifeDataBase;
import com.navinfo.collect.library.data.dao.impl.TraceDataBase;
import com.navinfo.collect.library.data.entity.Element; import com.navinfo.collect.library.data.entity.Element;
import com.navinfo.collect.library.data.entity.NiLocation; import com.navinfo.collect.library.data.entity.NiLocation;
import org.oscim.core.MapElement; import org.oscim.core.MapElement;
@ -43,16 +44,16 @@ public class MapLifeNiLocationTileDataSource implements ITileDataSource {
// 获取tile对应的坐标范围 // 获取tile对应的坐标范围
if (tile.zoomLevel >= 10 && tile.zoomLevel <= 20) { if (tile.zoomLevel >= 10 && tile.zoomLevel <= 20) {
int m = 20 - tile.zoomLevel; int m = 21 - tile.zoomLevel;
int xStart = (int) tile.tileX << m; int xStart = (int) tile.tileX << m;
int xEnd = (int) ((tile.tileX + 1) << m); int xEnd = (int) ((tile.tileX + 1) << m);
int yStart = (int) tile.tileY << m; int yStart = (int) tile.tileY << m;
int yEnd = (int) ((tile.tileY + 1) << m); int yEnd = (int) ((tile.tileY + 1) << m);
List<NiLocation> list = null; List<NiLocation> list = null;
if(mEndTime!=0){ if(mEndTime!=0){
list = MapLifeDataBase.getDatabase(mCon, dbName).getNiLocationDao().timeTofindList(xStart, xEnd, yStart, yEnd,mStartTime,mEndTime); list = TraceDataBase.getDatabase(mCon, dbName).getNiLocationDao().timeTofindList(xStart, xEnd, yStart, yEnd,mStartTime,mEndTime);
}else{ }else{
list = MapLifeDataBase.getDatabase(mCon, dbName).getNiLocationDao().findList(xStart, xEnd, yStart, yEnd); list = TraceDataBase.getDatabase(mCon, dbName).getNiLocationDao().findList(xStart, xEnd, yStart, yEnd);
} }
Log.e("qj","query"+(list==null?0:list.size())+"==="+xStart+"==="+xEnd+"==="+yStart+"==="+yEnd); Log.e("qj","query"+(list==null?0:list.size())+"==="+xStart+"==="+xEnd+"==="+yStart+"==="+yEnd);

View File

@ -5,6 +5,8 @@ import android.content.Context;
import org.oscim.tiling.ITileDataSource; import org.oscim.tiling.ITileDataSource;
import org.oscim.tiling.TileSource; import org.oscim.tiling.TileSource;
import java.util.Date;
public class MapLifeNiLocationTileSource extends TileSource { public class MapLifeNiLocationTileSource extends TileSource {
private Context mCon; private Context mCon;
private String dbName; private String dbName;

View File

@ -1566,4 +1566,19 @@ public class GeometryTools {
return earthRadiusMeters * acos; // 最终结果 return earthRadiusMeters * acos; // 最终结果
} }
/**
* 将平面坐标系中的距离以米为单位转换为地理坐标系中的角度以度为单位
*
* @param distance 平面坐标系中的距离单位
* @param latitude 点的纬度单位
* @return 对应的地理坐标系中的距离单位
*/
private static final double EARTH_RADIUS = 6371000.0;
public static double convertDistanceToDegree(double distance, double latitude) {
double radianDistance = distance / EARTH_RADIUS;
double radianLatitude = Math.toRadians(latitude);
double radianDegree = 2 * Math.asin(Math.sin(radianDistance / 2) / Math.cos(radianLatitude));
return Math.toDegrees(radianDegree);
}
} }

Binary file not shown.