增加轨迹存储渲染业务

This commit is contained in:
qiji4215 2023-04-21 17:20:34 +08:00
parent e4e8866ad6
commit 8e4f8459d5
13 changed files with 65 additions and 42 deletions

View File

@ -2,8 +2,6 @@ package com.navinfo.omqs
import android.app.Application import android.app.Application
import android.util.Log import android.util.Log
import com.navinfo.collect.library.data.dao.impl.MapLifeDataBase
import com.navinfo.omqs.db.TraceDataBase
import com.navinfo.omqs.tools.FileManager import com.navinfo.omqs.tools.FileManager
import com.navinfo.omqs.ui.manager.TakePhotoManager import com.navinfo.omqs.ui.manager.TakePhotoManager
import com.navinfo.omqs.util.NetUtils import com.navinfo.omqs.util.NetUtils
@ -11,9 +9,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

@ -1,20 +1,16 @@
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 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

View File

@ -5,13 +5,13 @@ import android.content.DialogInterface
import android.util.Log import android.util.Log
import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModel
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.utils.GeometryTools 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

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

@ -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

@ -10,7 +10,6 @@ import androidx.lifecycle.lifecycleScope
import com.navinfo.collect.library.R import com.navinfo.collect.library.R
import com.navinfo.collect.library.data.entity.QsRecordBean import com.navinfo.collect.library.data.entity.QsRecordBean
import com.navinfo.collect.library.map.NIMapView import com.navinfo.collect.library.map.NIMapView
import com.navinfo.collect.library.map.NIMapView.LAYER_GROUPS
import com.navinfo.collect.library.map.cluster.ClusterMarkerItem import com.navinfo.collect.library.map.cluster.ClusterMarkerItem
import com.navinfo.collect.library.map.cluster.ClusterMarkerRenderer import com.navinfo.collect.library.map.cluster.ClusterMarkerRenderer
import com.navinfo.collect.library.map.layers.MyItemizedLayer import com.navinfo.collect.library.map.layers.MyItemizedLayer
@ -96,10 +95,6 @@ open class LayerManagerHandler(context: AppCompatActivity, mapView: NIMapView,tr
private fun initMap() { private fun initMap() {
loadBaseMap() loadBaseMap()
mMapView.switchTileVectorLayerTheme(NIMapView.MAP_THEME.DEFAULT)
//初始化之间数据图层
initQsRecordDataLayer()
mMapView.vtmMap.updateMap()
mapLifeNiLocationTileSource = MapLifeNiLocationTileSource(mContext, mTracePath) mapLifeNiLocationTileSource = MapLifeNiLocationTileSource(mContext, mTracePath)
@ -107,7 +102,24 @@ open class LayerManagerHandler(context: AppCompatActivity, mapView: NIMapView,tr
labelNiLocationLayer = LabelLayer(mMapView.vtmMap, vectorNiLocationTileLayer, LabelTileLoaderHook(), 15) labelNiLocationLayer = LabelLayer(mMapView.vtmMap, vectorNiLocationTileLayer, LabelTileLoaderHook(), 15)
// initMapLifeSource() 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)
//初始化之间数据图层
initQsRecordDataLayer()
mMapView.vtmMap.updateMap()
} }
@ -522,14 +534,14 @@ open class LayerManagerHandler(context: AppCompatActivity, mapView: NIMapView,tr
//显示轨迹图层 //显示轨迹图层
fun showNiLocationLayer() { fun showNiLocationLayer() {
if(labelNiLocationLayer!=null){ vectorNiLocationTileLayer.isEnabled = true
addLayer(labelNiLocationLayer, NIMapView.LAYER_GROUPS.VECTOR) labelNiLocationLayer.isEnabled = true
}
} }
//隐藏轨迹图层 //隐藏轨迹图层
fun hideNiLocationLayer() { fun hideNiLocationLayer() {
removeLayer(labelNiLocationLayer) vectorNiLocationTileLayer.isEnabled = false
labelNiLocationLayer.isEnabled = false
} }
} }

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;