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

 Conflicts:
	collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBReferenceDataSource.java
	collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBTileDataSource.java
	vtm
This commit is contained in:
squallzhjch 2023-08-11 14:30:42 +08:00
commit 212193dc26
28 changed files with 600 additions and 296 deletions

View File

@ -80,6 +80,7 @@ android {
dependencies { dependencies {
api project(':collect-library') api project(':collect-library')
implementation project(path: ':vtm-android')
testImplementation 'junit:junit:4.13.2' testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.5' androidTestImplementation 'androidx.test.ext:junit:1.1.5'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1' androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'

View File

@ -4,45 +4,45 @@
"table": "OMDB_CHECKPOINT", "table": "OMDB_CHECKPOINT",
"code": 1012, "code": 1012,
"name": "检查点", "name": "检查点",
"zoomMin": 16, "zoomMin": 15,
"zoomMax": 19 "zoomMax": 19
}, },
"2001": { "2001": {
"table": "OMDB_RD_LINK", "table": "OMDB_RD_LINK",
"code": 2001, "code": 2001,
"name": "道路线", "name": "道路线",
"zoomMin": 16, "zoomMin": 15,
"zoomMax": 17 "zoomMax": 17
}, },
"2002": { "2002": {
"table": "OMDB_RD_LINK_FUNCTION_CLASS", "table": "OMDB_RD_LINK_FUNCTION_CLASS",
"code": 2002, "code": 2002,
"name": "道路功能等级", "name": "道路功能等级",
"zoomMin": 16, "zoomMin": 15,
"zoomMax": 19 "zoomMax": 17
}, },
"2008": { "2008": {
"table": "OMDB_RD_LINK_KIND", "table": "OMDB_RD_LINK_KIND",
"code": 2008, "code": 2008,
"name": "道路种别", "name": "道路种别",
"zoomMin": 16, "zoomMin": 15,
"zoomMax": 19, "zoomMax": 20,
"checkLinkId": false "checkLinkId": false
}, },
"2010": { "2010": {
"table": "OMDB_LINK_DIRECT", "table": "OMDB_LINK_DIRECT",
"code": 2010, "code": 2010,
"name": "道路方向", "name": "道路方向",
"zoomMin": 16, "zoomMin": 15,
"zoomMax": 19, "zoomMax": 17,
"checkLinkId": false "checkLinkId": false
}, },
"2011": { "2011": {
"table": "OMDB_LINK_NAME", "table": "OMDB_LINK_NAME",
"code": 2011, "code": 2011,
"name": "道路名", "name": "道路名",
"zoomMin": 16, "zoomMin": 15,
"zoomMax": 19, "zoomMax": 17,
"checkLinkId": false, "checkLinkId": false,
"transformer": [ "transformer": [
{ {
@ -58,7 +58,7 @@
"code": 2013, "code": 2013,
"name": "车道边界类型", "name": "车道边界类型",
"zoomMin": 18, "zoomMin": 18,
"zoomMax": 21, "zoomMax": 20,
"checkLinkId": false, "checkLinkId": false,
"transformer": [ "transformer": [
{ {
@ -73,22 +73,22 @@
"table": "OMDB_LINK_SPEEDLIMIT", "table": "OMDB_LINK_SPEEDLIMIT",
"code": 2019, "code": 2019,
"name": "常规线限速", "name": "常规线限速",
"zoomMin": 16, "zoomMin": 15,
"zoomMax": 19 "zoomMax": 17
}, },
"2020": { "2020": {
"table": "OMDB_LINK_SPEEDLIMIT_COND", "table": "OMDB_LINK_SPEEDLIMIT_COND",
"code": 2020, "code": 2020,
"name": "条件线限速", "name": "条件线限速",
"zoomMin": 16, "zoomMin": 15,
"zoomMax": 19 "zoomMax": 17
}, },
"2021": { "2021": {
"table": "OMDB_LINK_SPEEDLIMIT_VAR", "table": "OMDB_LINK_SPEEDLIMIT_VAR",
"code": 2021, "code": 2021,
"name": "可变线限速", "name": "可变线限速",
"zoomMin": 16, "zoomMin": 15,
"zoomMax": 19 "zoomMax": 17
}, },
"2022": { "2022": {
"table": "OMDB_CON_ACCESS", "table": "OMDB_CON_ACCESS",
@ -115,15 +115,15 @@
"code": 2083, "code": 2083,
"name": "道路边界类型", "name": "道路边界类型",
"zoomMin": 18, "zoomMin": 18,
"zoomMax": 21, "zoomMax": 20,
"checkLinkId": false "checkLinkId": false
}, },
"2201":{ "2201":{
"table": "OMDB_BRIDGE", "table": "OMDB_BRIDGE",
"code": 2201, "code": 2201,
"name": "桥", "name": "桥",
"zoomMin": 16, "zoomMin": 15,
"zoomMax": 21, "zoomMax": 20,
"transformer": [ "transformer": [
{ {
"k": "geometry", "k": "geometry",
@ -137,8 +137,8 @@
"table": "OMDB_TUNNEL", "table": "OMDB_TUNNEL",
"code": 2202, "code": 2202,
"name": "隧道", "name": "隧道",
"zoomMin": 16, "zoomMin": 15,
"zoomMax": 21, "zoomMax": 20,
"transformer": [ "transformer": [
{ {
"k": "geometry", "k": "geometry",
@ -152,8 +152,8 @@
"table": "OMDB_INTERSECTION", "table": "OMDB_INTERSECTION",
"code": 4001, "code": 4001,
"name": "路口", "name": "路口",
"zoomMin": 16, "zoomMin": 15,
"zoomMax": 19, "zoomMax": 17,
"transformer": [ "transformer": [
{ {
"k": "geometry", "k": "geometry",
@ -167,8 +167,8 @@
"table": "OMDB_SPEEDLIMIT", "table": "OMDB_SPEEDLIMIT",
"code": 4002, "code": 4002,
"name": "常规点限速", "name": "常规点限速",
"zoomMin": 16, "zoomMin": 15,
"zoomMax": 19, "zoomMax": 20,
"transformer": [ "transformer": [
{ {
"k": "maxSpeed", "k": "maxSpeed",
@ -188,8 +188,8 @@
"table": "OMDB_SPEEDLIMIT_COND", "table": "OMDB_SPEEDLIMIT_COND",
"code": 4003, "code": 4003,
"name": "条件点限速", "name": "条件点限速",
"zoomMin": 16, "zoomMin": 15,
"zoomMax": 19, "zoomMax": 20,
"transformer": [ "transformer": [
{ {
"k": "maxSpeed", "k": "maxSpeed",
@ -203,8 +203,8 @@
"table": "OMDB_SPEEDLIMIT_VAR", "table": "OMDB_SPEEDLIMIT_VAR",
"code": 4004, "code": 4004,
"name": "可变点限速", "name": "可变点限速",
"zoomMin": 16, "zoomMin": 15,
"zoomMax": 19, "zoomMax": 20,
"transformer": [ "transformer": [
{ {
"k": "location", "k": "location",
@ -230,8 +230,8 @@
"table": "OMDB_RESTRICTION", "table": "OMDB_RESTRICTION",
"code": 4006, "code": 4006,
"name": "普通交限", "name": "普通交限",
"zoomMin": 16, "zoomMin": 15,
"zoomMax": 21, "zoomMax": 20,
"transformer": [ "transformer": [
{ {
"k": "geometry", "k": "geometry",
@ -269,8 +269,8 @@
"table": "OMDB_ELECTRONICEYE", "table": "OMDB_ELECTRONICEYE",
"code": 4010, "code": 4010,
"name": "电子眼", "name": "电子眼",
"zoomMin": 16, "zoomMin": 15,
"zoomMax": 21, "zoomMax": 20,
"transformer": [ "transformer": [
{ {
"k": "geometry", "k": "geometry",
@ -302,8 +302,8 @@
"table": "OMDB_TRAFFICLIGHT", "table": "OMDB_TRAFFICLIGHT",
"code": 4022, "code": 4022,
"name": "交通灯", "name": "交通灯",
"zoomMin": 16, "zoomMin": 15,
"zoomMax": 21, "zoomMax": 20,
"transformer": [ "transformer": [
] ]
}, },
@ -311,8 +311,8 @@
"table": "OMDB_LANEINFO", "table": "OMDB_LANEINFO",
"code": 4601, "code": 4601,
"name": "车信", "name": "车信",
"zoomMin": 16, "zoomMin": 15,
"zoomMax": 19, "zoomMax": 17,
"transformer": [ "transformer": [
{ {
"k": "geometry", "k": "geometry",
@ -339,7 +339,7 @@
"code": 5001, "code": 5001,
"name": "车道中心线", "name": "车道中心线",
"zoomMin": 18, "zoomMin": 18,
"zoomMax": 21, "zoomMax": 20,
"transformer": [ "transformer": [
{ {
"k": "geometry", "k": "geometry",

View File

@ -65,9 +65,9 @@ class Constant {
const val DEBUG = true const val DEBUG = true
/** /**
* 地图最多缩放级别23 * 地图最多缩放级别20
*/ */
const val MAX_ZOOM = 22 const val MAX_ZOOM = 20
/** /**
* 是否自动定位 * 是否自动定位

View File

@ -9,16 +9,15 @@ import com.blankj.utilcode.util.FileIOUtils
import com.blankj.utilcode.util.ZipUtils import com.blankj.utilcode.util.ZipUtils
import com.google.gson.Gson import com.google.gson.Gson
import com.google.gson.reflect.TypeToken import com.google.gson.reflect.TypeToken
import com.navinfo.collect.library.data.entity.ReferenceEntity
import com.navinfo.collect.library.data.entity.RenderEntity import com.navinfo.collect.library.data.entity.RenderEntity
import com.navinfo.collect.library.data.entity.TaskBean import com.navinfo.collect.library.data.entity.TaskBean
import com.navinfo.omqs.Constant import com.navinfo.omqs.Constant
import com.navinfo.omqs.bean.ImportConfig import com.navinfo.omqs.bean.ImportConfig
import com.navinfo.omqs.db.deep.LinkList
import com.navinfo.omqs.hilt.OMDBDataBaseHiltFactory import com.navinfo.omqs.hilt.OMDBDataBaseHiltFactory
import dagger.assisted.Assisted import dagger.assisted.Assisted
import dagger.assisted.AssistedInject import dagger.assisted.AssistedInject
import io.realm.Realm import io.realm.Realm
import io.realm.RealmQuery
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.flow
@ -102,13 +101,10 @@ class ImportOMDBHelper @AssistedInject constructor(
FIELD_TYPE_NULL -> rowMap[columnName] = "" FIELD_TYPE_NULL -> rowMap[columnName] = ""
FIELD_TYPE_INTEGER -> rowMap[columnName] = FIELD_TYPE_INTEGER -> rowMap[columnName] =
getInt(columnIndex) getInt(columnIndex)
FIELD_TYPE_FLOAT -> rowMap[columnName] = FIELD_TYPE_FLOAT -> rowMap[columnName] =
getFloat(columnIndex) getFloat(columnIndex)
FIELD_TYPE_BLOB -> rowMap[columnName] = FIELD_TYPE_BLOB -> rowMap[columnName] =
String(getBlob(columnIndex), Charsets.UTF_8) String(getBlob(columnIndex), Charsets.UTF_8)
else -> rowMap[columnName] = getString(columnIndex) else -> rowMap[columnName] = getString(columnIndex)
} }
} }
@ -127,132 +123,172 @@ class ImportOMDBHelper @AssistedInject constructor(
* @param omdbZipFile omdb数据抽取生成的Zip文件 * @param omdbZipFile omdb数据抽取生成的Zip文件
* @param configFile 对应的配置文件 * @param configFile 对应的配置文件
* */ * */
suspend fun importOmdbZipFile(omdbZipFile: File, task: TaskBean): Flow<String> = suspend fun importOmdbZipFile(omdbZipFile: File, task: TaskBean): Flow<String> = withContext(Dispatchers.IO) {
withContext(Dispatchers.IO) { val unZipFolder = File(omdbZipFile.parentFile, "result")
val unZipFolder = File(omdbZipFile.parentFile, "result") flow {
flow { if (unZipFolder.exists()) {
if (unZipFolder.exists()) { unZipFolder.deleteRecursively()
unZipFolder.deleteRecursively() }
} unZipFolder.mkdirs()
unZipFolder.mkdirs() // 开始解压zip文件
// 开始解压zip文件 val unZipFiles = ZipUtils.unzipFile(omdbZipFile, unZipFolder)
val unZipFiles = ZipUtils.unzipFile(omdbZipFile, unZipFolder) // 将listResult数据插入到Realm数据库中
// 将listResult数据插入到Realm数据库中 val realm = Realm.getDefaultInstance()
val realm = Realm.getDefaultInstance() realm.beginTransaction()
realm.beginTransaction() try {
try { // 遍历解压后的文件,读取该数据返回
// 遍历解压后的文件,读取该数据返回 for ((index, currentEntry) in importConfig.tableMap.entries.withIndex()) {
for ((index, currentEntry) in importConfig.tableMap.entries.withIndex()) { val currentConfig = currentEntry.value
val currentConfig = currentEntry.value val txtFile = unZipFiles.find {
val txtFile = unZipFiles.find { it.name == currentConfig.table
it.name == currentConfig.table }
}
val listResult = mutableListOf<RenderEntity>() val listResult = mutableListOf<RenderEntity>()
currentConfig?.let { currentConfig?.let {
val list = FileIOUtils.readFile2List(txtFile, "UTF-8") val list = FileIOUtils.readFile2List(txtFile, "UTF-8")
Log.d("ImportOMDBHelper", "开始解析:${txtFile?.name}") Log.d("ImportOMDBHelper", "开始解析:${txtFile?.name}")
if (list != null) { if (list != null) {
// 将list数据转换为map // 将list数据转换为map
for ((index, line) in list.withIndex()) { for ((index, line) in list.withIndex()) {
if (line == null || line.trim() == "") { if (line == null || line.trim() == "") {
continue continue
}
Log.d("ImportOMDBHelper", "解析第:${index+1}")
val map = gson.fromJson<Map<String, Any>>(line, object:TypeToken<Map<String, Any>>(){}.getType())
.toMutableMap()
map["qi_table"] = currentConfig.table
map["qi_name"] = currentConfig.name
map["qi_code"] =
if (currentConfig.code == 0) currentConfig.code else currentEntry.key
map["qi_code"] = if (currentConfig.code == 0) currentConfig.code else currentEntry.key
map["qi_zoomMin"] = currentConfig.zoomMin
map["qi_zoomMax"] = currentConfig.zoomMax
// 先查询这个mesh下有没有数据如果有则跳过即可
// val meshEntity = Realm.getDefaultInstance().where(RenderEntity::class.java).equalTo("properties['mesh']", map["mesh"].toString()).findFirst()
val renderEntity = RenderEntity()
renderEntity.code = map["qi_code"].toString().toInt()
renderEntity.name = map["qi_name"].toString()
renderEntity.table = map["qi_table"].toString()
renderEntity.taskId = task.id
renderEntity.zoomMin = map["qi_zoomMin"].toString().toInt()
renderEntity.zoomMax = map["qi_zoomMax"].toString().toInt()
// 其他数据插入到Properties中
renderEntity.geometry = map["geometry"].toString()
for ((key, value) in map) {
when (value) {
is String -> renderEntity.properties.put(key, value)
is Int -> renderEntity.properties.put(
key,
value.toInt().toString()
)
is Double -> renderEntity.properties.put(
key,
value.toDouble().toString()
)
else -> renderEntity.properties.put(key, value.toString())
} }
Log.d("ImportOMDBHelper", "解析第:${index + 1}") }
val map = gson.fromJson<Map<String, Any>>( //遍历判断只显示与任务Link相关的任务数据
line, if(currentConfig.checkLinkId){
object : TypeToken<Map<String, Any>>() {}.getType()
)
.toMutableMap()
map["qi_table"] = currentConfig.table
map["qi_name"] = currentConfig.name
map["qi_code"] =
if (currentConfig.code == 0) currentConfig.code else currentEntry.key
map["qi_code"] =
if (currentConfig.code == 0) currentConfig.code else currentEntry.key
map["qi_zoomMin"] = currentConfig.zoomMin
map["qi_zoomMax"] = currentConfig.zoomMax
// 先查询这个mesh下有没有数据如果有则跳过即可 if(renderEntity.properties.containsKey("linkPid")){
// val meshEntity = Realm.getDefaultInstance().where(RenderEntity::class.java).equalTo("properties['mesh']", map["mesh"].toString()).findFirst()
val renderEntity = RenderEntity()
renderEntity.code = map["qi_code"].toString().toInt()
renderEntity.name = map["qi_name"].toString()
renderEntity.table = map["qi_table"].toString()
renderEntity.taskId = task.id
renderEntity.zoomMin = map["qi_zoomMin"].toString().toInt()
renderEntity.zoomMax = map["qi_zoomMax"].toString().toInt()
// 其他数据插入到Properties中
renderEntity.geometry = map["geometry"].toString()
for ((key, value) in map) {
when (value) {
is String -> renderEntity.properties[key] = value
is Int -> renderEntity.properties[key] = value.toInt().toString()
is Double -> renderEntity.properties[key] = value.toDouble().toString()
else -> renderEntity.properties[key] = value.toString()
}
}
//如果要素不包括linkPid需要从其他字段获得
if(!renderEntity.properties.containsKey("linkPid")){
//交限从进入线获取
if(renderEntity.properties.containsKey("linkIn")){
renderEntity.properties["linkPid"]= renderEntity.properties["linkIn"]
}
}
//遍历判断只显示与任务Link相关的任务数据
if (currentConfig.checkLinkId && renderEntity.properties.containsKey("linkPid")) {
var currentLinkPid = renderEntity.properties["linkPid"] var currentLinkPid = renderEntity.properties["linkPid"]
task.hadLinkDvoList.forEach { if(!currentLinkPid.isNullOrEmpty()&&currentLinkPid!="null"){
if (it.linkPid == currentLinkPid) {
renderEntity.enable = 1 task.hadLinkDvoList.forEach{
Log.e("qj", "${renderEntity.name}==包括任务link") if(it.linkPid==renderEntity.properties["linkPid"]){
return@forEach renderEntity.enable = 1
Log.e("qj","${renderEntity.name}==包括任务link")
return@forEach
}
} }
} }
} else {
}else if(renderEntity.table == "OMDB_RESTRICTION" && renderEntity.properties.containsKey("linkIn")){
if (renderEntity.properties["linkIn"] != null) {
var currentLinkPid = renderEntity.properties["linkIn"]
if(!currentLinkPid.isNullOrEmpty()&&currentLinkPid!="null"){
task.hadLinkDvoList.forEach{
if(it.linkPid==currentLinkPid){
renderEntity.enable = 1
Log.e("qj","${renderEntity.name}==包括任务link")
return@forEach
}
}
}
}
}else if(renderEntity.table == "OMDB_INTERSECTION" && renderEntity.properties.containsKey("linkList")){
if (renderEntity.properties["linkList"] != null) {
Log.e("qj", "linkList==开始${renderEntity.name}==${renderEntity.properties["linkList"]}}")
val linkList = renderEntity.properties["linkList"]
if (!linkList.isNullOrEmpty()&&linkList!="null") {
Log.e("qj", "linkList==${renderEntity.name}==${renderEntity.properties["linkList"]}}")
val list: List<LinkList> = gson.fromJson(linkList, object : TypeToken<List<LinkList>>() {}.type)
if (list != null) {
m@for (link in list){
for(hadLink in task.hadLinkDvoList){
if (hadLink.linkPid == link.linkPid) {
renderEntity.enable = 1
Log.e("qj", "${renderEntity.name}==包括任务link==${renderEntity.geometry}")
break@m
}
}
}
}
}else{
renderEntity.enable = 2
Log.e("qj", "简单路口")
}
}
}else{
renderEntity.enable = 2 renderEntity.enable = 2
Log.e("qj", "${renderEntity.name}==不包括任务linkPid") Log.e("qj","${renderEntity.name}==不包括任务linkPid")
} }
}else{
listResult.add(renderEntity) renderEntity.enable = 2
Log.e("qj","${renderEntity.name}==不包括任务linkPid")
// 对renderEntity做预处理后再保存 }
val resultEntity = importConfig.transformProperties(renderEntity) listResult.add(renderEntity)
// 对renderEntity做预处理后再保存
if (resultEntity != null) { val resultEntity = importConfig.transformProperties(renderEntity)
realm.insert(renderEntity) if (resultEntity != null) {
} realm.insert(renderEntity)
} }
} }
} }
// 1个文件发送一次flow流
emit("${index + 1}/${importConfig.tableMap.size}")
// 如果当前解析的是OMDB_RD_LINK数据将其缓存在预处理类中以便后续处理其他要素时使用
if (currentConfig.table == "OMDB_RD_LINK") {
importConfig.preProcess.cacheRdLink =
listResult.associateBy { it.properties["linkPid"] }
}
} }
realm.commitTransaction() // 1个文件发送一次flow流
realm.close() emit("${index + 1}/${importConfig.tableMap.size}")
} catch (e: Exception) { // 如果当前解析的是OMDB_RD_LINK数据将其缓存在预处理类中以便后续处理其他要素时使用
realm.cancelTransaction() if (currentConfig.table == "OMDB_RD_LINK") {
throw e importConfig.preProcess.cacheRdLink =
listResult.associateBy { it.properties["linkPid"] }
}
} }
emit("finish") realm.commitTransaction()
realm.close()
} catch (e: Exception) {
realm.cancelTransaction()
throw e
} }
emit("finish")
} }
}
// 获取指定数据表的列名 // 获取指定数据表的列名
fun getColumns(db: SQLiteDatabase, tableName: String): List<String> { fun getColumns(db: SQLiteDatabase, tableName: String): List<String> {

View File

@ -433,6 +433,8 @@ class ImportPreProcess {
referenceEntity.renderEntityId = renderEntity.id referenceEntity.renderEntityId = renderEntity.id
referenceEntity.name = "${renderEntity.name}参考方向" referenceEntity.name = "${renderEntity.name}参考方向"
referenceEntity.table = renderEntity.table referenceEntity.table = renderEntity.table
referenceEntity.enable = renderEntity.enable
referenceEntity.taskId = renderEntity.taskId
// 与原数据使用相同的geometry // 与原数据使用相同的geometry
referenceEntity.geometry = renderEntity.geometry.toString() referenceEntity.geometry = renderEntity.geometry.toString()
referenceEntity.properties["qi_table"] = renderEntity.table referenceEntity.properties["qi_table"] = renderEntity.table

View File

@ -4,11 +4,14 @@ import android.os.Build
import android.util.Log import android.util.Log
import androidx.annotation.RequiresApi import androidx.annotation.RequiresApi
import com.navinfo.collect.library.data.entity.HadLinkDvoBean import com.navinfo.collect.library.data.entity.HadLinkDvoBean
import com.navinfo.collect.library.data.entity.QsRecordBean
import com.navinfo.collect.library.data.entity.RenderEntity import com.navinfo.collect.library.data.entity.RenderEntity
import com.navinfo.collect.library.data.entity.RenderEntity.Companion.LinkTable import com.navinfo.collect.library.data.entity.RenderEntity.Companion.LinkTable
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.collect.library.utils.RealmDBParamUtils
import com.navinfo.omqs.bean.QRCodeBean
import io.realm.Realm import io.realm.Realm
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
@ -60,7 +63,7 @@ class RealmOperateHelper() {
val realmList = realm.where(RenderEntity::class.java) val realmList = realm.where(RenderEntity::class.java)
.equalTo("table", "OMDB_RD_LINK") .equalTo("table", "OMDB_RD_LINK")
.and() .and()
.rawPredicate("tileX>=$xStart and tileX<=$xEnd and tileY>=$yStart and tileY<=$yEnd") .rawPredicate("tileX>=$xStart and tileX<=$xEnd and tileY>=$yStart and tileY<=$yEnd").and().equalTo("taskId",RealmDBParamUtils.getTaskId())
.findAll() .findAll()
// 将获取到的数据和查询的polygon做相交只返回相交的数据 // 将获取到的数据和查询的polygon做相交只返回相交的数据
val dataList = realm.copyFromRealm(realmList) val dataList = realm.copyFromRealm(realmList)
@ -85,9 +88,70 @@ class RealmOperateHelper() {
return result return result
} }
/**
* 根据当前点位查询匹配的Link数据
* @param point 点位经纬度信息
* @param buffer 点位的外扩距离
* @param bufferType 点位外扩距离的单位 -Meter像素-PIXEL
* @param sort 是否需要排序
* */
@RequiresApi(Build.VERSION_CODES.N)
suspend fun queryLine(
point: GeoPoint,
buffer: Double = DEFAULT_BUFFER,
bufferType: BUFFER_TYPE = DEFAULT_BUFFER_TYPE,
table: String,
sort: Boolean = true
): MutableList<RenderEntity> {
val result = mutableListOf<RenderEntity>()
val polygon = getPolygonFromPoint(
GeometryTools.createPoint(point.longitude, point.latitude),
buffer,
bufferType
)
// 根据polygon查询相交的tile号
val tileXSet = mutableSetOf<Int>()
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 realm = Realm.getDefaultInstance()
val realmList = realm.where(RenderEntity::class.java)
.equalTo("table", table)
.and()
.rawPredicate("tileX>=$xStart and tileX<=$xEnd and tileY>=$yStart and tileY<=$yEnd").and().equalTo("taskId",RealmDBParamUtils.getTaskId())
.findAll()
// 将获取到的数据和查询的polygon做相交只返回相交的数据
val dataList = realm.copyFromRealm(realmList)
val queryResult = dataList?.stream()?.filter {
polygon.intersects(it.wkt)
}?.toList()
queryResult?.let {
if (sort) {
result.addAll(
sortRenderEntity(
GeometryTools.createPoint(
point.longitude,
point.latitude
), it
)
)
} else {
result.addAll(it)
}
}
return result
}
suspend fun captureTaskLink( suspend fun captureTaskLink(
taskId: Int,
point: GeoPoint, point: GeoPoint,
buffer: Double = DEFAULT_BUFFER, buffer: Double = DEFAULT_BUFFER,
bufferType: BUFFER_TYPE = DEFAULT_BUFFER_TYPE, bufferType: BUFFER_TYPE = DEFAULT_BUFFER_TYPE,
@ -101,7 +165,7 @@ class RealmOperateHelper() {
val realm = Realm.getDefaultInstance() val realm = Realm.getDefaultInstance()
val realmList = realm.where(HadLinkDvoBean::class.java) val realmList = realm.where(HadLinkDvoBean::class.java)
.equalTo("taskId", taskId) .equalTo("taskId",RealmDBParamUtils.getTaskId())
.findAll() .findAll()
var linkBean: HadLinkDvoBean? = null var linkBean: HadLinkDvoBean? = null
var nearLast: Double = 99999.99 var nearLast: Double = 99999.99
@ -125,7 +189,7 @@ class RealmOperateHelper() {
val realmR = realm.where(RenderEntity::class.java) val realmR = realm.where(RenderEntity::class.java)
.equalTo("table", "OMDB_RD_LINK") .equalTo("table", "OMDB_RD_LINK")
.and() .and()
.equalTo("properties['${LinkTable.linkPid}']", linkPid) .equalTo("properties['${LinkTable.linkPid}']", linkPid).and().equalTo("taskId",RealmDBParamUtils.getTaskId())
.findFirst() .findFirst()
if (realmR != null) { if (realmR != null) {
link = realm.copyFromRealm(realmR) link = realm.copyFromRealm(realmR)
@ -133,13 +197,31 @@ class RealmOperateHelper() {
return link return link
} }
/**
* 根据markid查询获取对应数据
* @param markId
* */
suspend fun queryQcRecordBean(markId: String): QsRecordBean? {
var qsRecordBean: QsRecordBean? = null
val realm = Realm.getDefaultInstance()
val realmR = realm.where(QsRecordBean::class.java)
.equalTo("table", "QsRecordBean")
.and()
.equalTo("id", markId).and().equalTo("taskId",RealmDBParamUtils.getTaskId())
.findFirst()
if (realmR != null) {
qsRecordBean = realm.copyFromRealm(realmR)
}
return qsRecordBean
}
suspend fun queryLinkToMutableRenderEntityList(linkPid: String): MutableList<RenderEntity>? { suspend fun queryLinkToMutableRenderEntityList(linkPid: String): MutableList<RenderEntity>? {
val resultList = mutableListOf<RenderEntity>() val resultList = mutableListOf<RenderEntity>()
val realm = Realm.getDefaultInstance() val realm = Realm.getDefaultInstance()
val realmR = realm.where(RenderEntity::class.java) val realmR = realm.where(RenderEntity::class.java)
.equalTo("properties['${LinkTable.linkPid}']", linkPid) .equalTo("properties['${LinkTable.linkPid}']", linkPid).and().equalTo("taskId",RealmDBParamUtils.getTaskId())
.findAll() .findAll()
val dataList = realm.copyFromRealm(realmR) val dataList = realm.copyFromRealm(realmR)
@ -184,7 +266,7 @@ class RealmOperateHelper() {
val realmList = realm.where(RenderEntity::class.java) val realmList = realm.where(RenderEntity::class.java)
.notEqualTo("table", "OMDB_RD_LINK") .notEqualTo("table", "OMDB_RD_LINK")
.and() .and()
.rawPredicate("tileX>=$xStart and tileX<=$xEnd and tileY>=$yStart and tileY<=$yEnd") .rawPredicate("tileX>=$xStart and tileX<=$xEnd and tileY>=$yStart and tileY<=$yEnd").and().equalTo("taskId",RealmDBParamUtils.getTaskId())
.findAll() .findAll()
// 将获取到的数据和查询的polygon做相交只返回相交的数据 // 将获取到的数据和查询的polygon做相交只返回相交的数据
val queryResult = realmList?.stream()?.filter { val queryResult = realmList?.stream()?.filter {
@ -214,7 +296,7 @@ class RealmOperateHelper() {
val realmList = realm.where(RenderEntity::class.java) val realmList = realm.where(RenderEntity::class.java)
.notEqualTo("table", "OMDB_RD_LINK") .notEqualTo("table", "OMDB_RD_LINK")
.and() .and()
.equalTo("properties['${LinkTable.linkPid}']", linkPid) .equalTo("properties['${LinkTable.linkPid}']", linkPid).and().equalTo("taskId",RealmDBParamUtils.getTaskId())
.findAll() .findAll()
result.addAll(realm.copyFromRealm(realmList)) result.addAll(realm.copyFromRealm(realmList))
return result return result

View File

@ -0,0 +1,6 @@
package com.navinfo.omqs.db.deep
data class LinkList(
var featureType: Int = -1,
var linkPid: String = ""
)

View File

@ -1,7 +1,6 @@
package com.navinfo.omqs.http.taskdownload package com.navinfo.omqs.http.taskdownload
import android.util.Log import android.util.Log
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.MutableLiveData import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.Observer import androidx.lifecycle.Observer
@ -10,10 +9,10 @@ import com.navinfo.omqs.Constant
import com.navinfo.omqs.db.ImportOMDBHelper import com.navinfo.omqs.db.ImportOMDBHelper
import com.navinfo.omqs.tools.FileManager import com.navinfo.omqs.tools.FileManager
import com.navinfo.omqs.tools.FileManager.Companion.FileDownloadStatus import com.navinfo.omqs.tools.FileManager.Companion.FileDownloadStatus
import com.navinfo.omqs.ui.other.BaseViewHolder
import com.navinfo.omqs.util.DateTimeUtil import com.navinfo.omqs.util.DateTimeUtil
import io.realm.Realm import io.realm.Realm
import kotlinx.coroutines.* import kotlinx.coroutines.*
import org.oscim.android.theme.AssetsRenderTheme
import java.io.File import java.io.File
import java.io.IOException import java.io.IOException
import java.io.InputStream import java.io.InputStream
@ -144,7 +143,7 @@ class TaskDownloadScope(
if (it == "finish") { if (it == "finish") {
change(FileDownloadStatus.DONE) change(FileDownloadStatus.DONE)
withContext(Dispatchers.Main) { withContext(Dispatchers.Main) {
downloadManager.mapController.mMapView.updateMap(true) downloadManager.mapController.layerManagerHandler.updateOMDBVectorTileLayer()
} }
} else { } else {
change(FileDownloadStatus.IMPORTING, it) change(FileDownloadStatus.IMPORTING, it)

View File

@ -20,6 +20,7 @@ import androidx.navigation.findNavController
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.google.android.material.tabs.TabLayout
import com.navinfo.collect.library.map.NIMapController import com.navinfo.collect.library.map.NIMapController
import com.navinfo.collect.library.map.handler.MeasureLayerHandler import com.navinfo.collect.library.map.handler.MeasureLayerHandler
import com.navinfo.omqs.Constant import com.navinfo.omqs.Constant
@ -42,6 +43,7 @@ import com.navinfo.omqs.util.FlowEventBus
import com.navinfo.omqs.util.SpeakMode import com.navinfo.omqs.util.SpeakMode
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import org.oscim.android.theme.AssetsRenderTheme
import org.oscim.core.GeoPoint import org.oscim.core.GeoPoint
import org.oscim.renderer.GLViewport import org.oscim.renderer.GLViewport
import org.videolan.vlc.Util import org.videolan.vlc.Util
@ -398,78 +400,6 @@ class MainActivity : BaseActivity() {
supportFragmentManager.beginTransaction() supportFragmentManager.beginTransaction()
.add(R.id.console_fragment_layout, ConsoleFragment()).commit() .add(R.id.console_fragment_layout, ConsoleFragment()).commit()
} }
initMeasuringTool()
}
/**
*初始化测量工具栏的点击事件
*/
private fun initMeasuringTool() {
val root = binding.mainActivityMeasuringTool.root
root.findViewById<View>(R.id.measuring_tool_select_point)
.setOnClickListener(measuringToolClickListener)
root.findViewById<View>(R.id.measuring_tool_close)
.setOnClickListener(measuringToolClickListener)
root.findViewById<View>(R.id.measuring_tool_backspace)
.setOnClickListener(measuringToolClickListener)
root.findViewById<View>(R.id.measuring_tool_reset)
.setOnClickListener(measuringToolClickListener)
root.findViewById<View>(R.id.measuring_tool_distance)
.setOnClickListener(measuringToolClickListener)
root.findViewById<View>(R.id.measuring_tool_area)
.setOnClickListener(measuringToolClickListener)
root.findViewById<View>(R.id.measuring_tool_angle)
.setOnClickListener(measuringToolClickListener)
}
/**
* 测量工具点击事件
*/
private val measuringToolClickListener = View.OnClickListener {
when (it.id) {
//选点
R.id.measuring_tool_select_point -> {
viewModel.addPointForMeasuringTool()
}
//关闭
R.id.measuring_tool_close -> {
measuringToolOff()
}
//上一步
R.id.measuring_tool_backspace -> {
viewModel.backPointForMeasuringTool()
}
//重绘
R.id.measuring_tool_reset -> {
viewModel.resetMeasuringTool()
}
//测距
R.id.measuring_tool_distance -> {
it.isSelected = true
viewModel.setMeasuringToolType(MeasureLayerHandler.MEASURE_TYPE.DISTANCE)
val root = binding.mainActivityMeasuringTool.root
root.findViewById<View>(R.id.measuring_tool_area).isSelected = false
root.findViewById<View>(R.id.measuring_tool_angle).isSelected = false
}
//测面积
R.id.measuring_tool_area -> {
it.isSelected = true
viewModel.setMeasuringToolType(MeasureLayerHandler.MEASURE_TYPE.AREA)
val root = binding.mainActivityMeasuringTool.root
root.findViewById<View>(R.id.measuring_tool_distance).isSelected = false
root.findViewById<View>(R.id.measuring_tool_angle).isSelected = false
}
//测角度
R.id.measuring_tool_angle -> {
it.isSelected = true
viewModel.setMeasuringToolType(MeasureLayerHandler.MEASURE_TYPE.ANGLE)
val root = binding.mainActivityMeasuringTool.root
root.findViewById<View>(R.id.measuring_tool_distance).isSelected = false
root.findViewById<View>(R.id.measuring_tool_area).isSelected = false
}
}
} }
/** /**
@ -513,29 +443,48 @@ class MainActivity : BaseActivity() {
binding.mainActivityMeasuringTool.root.visibility = View.GONE binding.mainActivityMeasuringTool.root.visibility = View.GONE
} }
/** //根据输入的经纬度跳转坐标
* 根据输入的经纬度跳转坐标
*/
fun jumpPosition() { fun jumpPosition() {
val view = this.layoutInflater.inflate(R.layout.dialog_view_edittext, null) val view = this.layoutInflater.inflate(R.layout.dialog_view_edittext, null)
val inputDialog = MaterialAlertDialogBuilder( val inputDialog = MaterialAlertDialogBuilder(
this this
).setTitle("坐标定位").setView(view) ).setTitle("坐标定位").setView(view)
val editText = view.findViewById<EditText>(R.id.dialog_edittext) val editText = view.findViewById<EditText>(R.id.dialog_edittext)
editText.hint = "请输入经纬度例如116.1234567,39.1234567" val tabItemLayout = view.findViewById<TabLayout>(R.id.search_tab_layout)
editText.hint = "请输入LinkPid例如12345678"
var index:Int = 0
tabItemLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener {
override fun onTabReselected(p0: TabLayout.Tab) {
}
override fun onTabUnselected(p0: TabLayout.Tab) {
}
override fun onTabSelected(p0: TabLayout.Tab) {
index = p0.position
editText.text = null
//清理已绘制线
mapController.lineHandler.removeLine()
mapController.markerHandle.removeMarker("location")
when (p0.position) {
0 -> editText.hint = "请输入LinkPid例如12345678"
1 -> editText.hint = "请输入MarkId例如123456789"
2 -> editText.hint = "请输入经纬度例如116.1234567,39.1234567"
}
}
})
inputDialog.setNegativeButton("取消") { dialog, _ -> inputDialog.setNegativeButton("取消") { dialog, _ ->
dialog.dismiss() dialog.dismiss()
} }
inputDialog.setPositiveButton("确定") { dialog, _ -> inputDialog.setPositiveButton("确定") { dialog, _ ->
if (editText.text.isNotEmpty()) { if (editText.text.isNotEmpty()) {
try { try {
val parts = editText.text.toString().split("[,\\s]".toRegex()) when (index) {
if (parts.size == 2) { 0 -> viewModel.search(SearchEnum.LINK,editText.text.toString(),dialog)
val x = parts[0].toDouble() 1 -> viewModel.search(SearchEnum.MARK,editText.text.toString(),dialog)
val y = parts[1].toDouble() 2 -> viewModel.search(SearchEnum.LOCATION,editText.text.toString(),dialog)
mapController.animationHandler.animationByLatLon(y, x)
} else {
Toast.makeText(this, "输入格式不正确", Toast.LENGTH_SHORT).show()
} }
} catch (e: Exception) { } catch (e: Exception) {
Toast.makeText(this, "输入格式不正确", Toast.LENGTH_SHORT).show() Toast.makeText(this, "输入格式不正确", Toast.LENGTH_SHORT).show()
@ -628,7 +577,7 @@ class MainActivity : BaseActivity() {
* 点击2\3D * 点击2\3D
*/ */
fun onClick2DOr3D() { fun onClick2DOr3D() {
viewModel.click2Dor3D()
} }
/** /**
@ -743,8 +692,8 @@ class MainActivity : BaseActivity() {
* 点击结束轨迹操作 * 点击结束轨迹操作
*/ */
fun mediaFlagOnclick() { fun mediaFlagOnclick() {
/* viewModel.setMediaFlag(!viewModel.isMediaFlag()) /* viewModel.setMediaFlag(!viewModel.isMediaFlag())
binding.mainActivitySnapshotMediaFlag.isSelected = viewModel.isMediaFlag()*/ binding.mainActivitySnapshotMediaFlag.isSelected = viewModel.isMediaFlag()*/
} }
/** /**

View File

@ -30,6 +30,7 @@ import com.navinfo.collect.library.map.OnGeoPointClickListener
import com.navinfo.collect.library.map.handler.* import com.navinfo.collect.library.map.handler.*
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.collect.library.utils.RealmDBParamUtils
import com.navinfo.omqs.Constant import com.navinfo.omqs.Constant
import com.navinfo.omqs.R import com.navinfo.omqs.R
import com.navinfo.omqs.bean.ImportConfig import com.navinfo.omqs.bean.ImportConfig
@ -289,8 +290,7 @@ class MainViewModel @Inject constructor(
initNILocationData() initNILocationData()
} }
sharedPreferences.registerOnSharedPreferenceChangeListener(this) sharedPreferences.registerOnSharedPreferenceChangeListener(this)
com.navinfo.collect.library.system.Constant.TASK_ID = RealmDBParamUtils.setTaskId(sharedPreferences.getInt(Constant.SELECT_TASK_ID, -1))
sharedPreferences.getInt(Constant.SELECT_TASK_ID, -1)
socketServer = SocketServer(mapController, traceDataBase, sharedPreferences) socketServer = SocketServer(mapController, traceDataBase, sharedPreferences)
} }
@ -484,11 +484,14 @@ class MainViewModel @Inject constructor(
captureLinkState = true captureLinkState = true
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
val linkList = realmOperateHelper.queryLink( /* val linkList = realmOperateHelper.queryLink(
point = point, point = point,
) )*/
val linkList = realmOperateHelper.queryLine(point = point, buffer = 2.5, table = "OMDB_LANE_MARK_BOUNDARYTYPE")
var hisRoadName = false var hisRoadName = false
if (linkList.isNotEmpty()) { if (linkList.isNotEmpty()) {
//看板数据 //看板数据
val signList = mutableListOf<SignBean>() val signList = mutableListOf<SignBean>()
@ -1102,5 +1105,74 @@ class MainViewModel @Inject constructor(
mapController.measureLayerHandler.clear() mapController.measureLayerHandler.clear()
} }
} }
fun click2Dor3D(){
viewModelScope.launch(Dispatchers.IO) {
Log.e(
"qj",
"${
Realm.getDefaultInstance().where(RenderEntity::class.java).findAll().size
}==安装数量"
)
}
}
/**
* 搜索接口
* @param searchEnum 枚举类
* @param msg 搜索内容
*/
fun search(searchEnum: SearchEnum,msg:String,dialog:DialogInterface){
if(searchEnum!=null&&msg.isNotEmpty()&&dialog!=null){
when (searchEnum) {
SearchEnum.LINK -> {
viewModelScope.launch(Dispatchers.IO) {
val link = realmOperateHelper.queryLink(linkPid = msg)
if(link!=null){
link?.let { l ->
mapController.lineHandler.showLine(l.geometry)
dialog.dismiss()
}
}else{
withContext(Dispatchers.Main){
Toast.makeText(mapController.mMapView.context, "未查询到数据", Toast.LENGTH_SHORT).show()
}
}
}
}
SearchEnum.MARK -> {
viewModelScope.launch(Dispatchers.IO) {
val qsRecordBean = realmOperateHelper.queryQcRecordBean(markId = msg)
if(qsRecordBean!=null){
qsRecordBean?.let { l ->
val naviController = (mapController.mMapView.context as Activity).findNavController(R.id.main_activity_right_fragment)
val bundle = Bundle()
bundle.putString("QsId", l.id)
naviController.navigate(R.id.EvaluationResultFragment, bundle)
ToastUtils.showLong(l.classType)
dialog.dismiss()
}
}else{
withContext(Dispatchers.Main){
Toast.makeText(mapController.mMapView.context, "未查询到数据", Toast.LENGTH_SHORT).show()
}
}
}
}
SearchEnum.LOCATION -> {
val parts = msg.split("[,\\s]".toRegex())
if (parts.size == 2) {
val x = parts[0].toDouble()
val y = parts[1].toDouble()
mapController.animationHandler.animationByLatLon(y, x)
mapController.markerHandle.addMarker(GeoPoint(y,x),"location")
dialog.dismiss()
} else {
Toast.makeText(mapController.mMapView.context, "输入格式不正确", Toast.LENGTH_SHORT).show()
}
}
}
}
}
} }

View File

@ -0,0 +1,5 @@
package com.navinfo.omqs.ui.activity.map
enum class SearchEnum {
LINK,LOCATION,MARK
}

View File

@ -220,7 +220,7 @@ class EvaluationResultViewModel @Inject constructor(
liveDataQsRecordBean.value?.let { liveDataQsRecordBean.value?.let {
val taskLink = val taskLink =
realmOperateHelper.captureTaskLink(liveDataTaskBean.value!!.id, point) realmOperateHelper.captureTaskLink(point)
if (taskLink != null) { if (taskLink != null) {
it.linkId = taskLink.linkPid it.linkId = taskLink.linkPid
mapController.lineHandler.showLine(taskLink.geometry) mapController.lineHandler.showLine(taskLink.geometry)

View File

@ -1,6 +1,7 @@
package com.navinfo.omqs.ui.fragment.qsrecordlist package com.navinfo.omqs.ui.fragment.qsrecordlist
import android.content.Context import android.content.Context
import android.content.SharedPreferences
import android.os.Bundle import android.os.Bundle
import android.util.Log import android.util.Log
import androidx.lifecycle.MutableLiveData import androidx.lifecycle.MutableLiveData
@ -9,6 +10,7 @@ import androidx.lifecycle.viewModelScope
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.entity.QsRecordBean import com.navinfo.collect.library.data.entity.QsRecordBean
import com.navinfo.omqs.Constant
import com.navinfo.omqs.R import com.navinfo.omqs.R
import com.navinfo.omqs.ui.activity.map.MainActivity import com.navinfo.omqs.ui.activity.map.MainActivity
import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.lifecycle.HiltViewModel
@ -19,14 +21,16 @@ import javax.inject.Inject
@HiltViewModel @HiltViewModel
class QsRecordListViewModel @Inject constructor( class QsRecordListViewModel @Inject constructor(
private val sharedPreferences: SharedPreferences
) : ViewModel() { ) : ViewModel() {
val liveDataQSList = MutableLiveData<List<QsRecordBean>>() val liveDataQSList = MutableLiveData<List<QsRecordBean>>()
fun getList(context: Context) { fun getList(context: Context) {
viewModelScope.launch(Dispatchers.IO) { viewModelScope.launch(Dispatchers.IO) {
val taskId = sharedPreferences.getInt(Constant.SELECT_TASK_ID, -1)
val realm = Realm.getDefaultInstance() val realm = Realm.getDefaultInstance()
val objects = realm.where(QsRecordBean::class.java).findAll() val objects = realm.where(QsRecordBean::class.java).equalTo("taskId",taskId).findAll()
liveDataQSList.postValue(realm.copyFromRealm(objects)) liveDataQSList.postValue(realm.copyFromRealm(objects))
} }
} }

View File

@ -16,6 +16,7 @@ import com.navinfo.collect.library.data.entity.TaskBean
import com.navinfo.collect.library.map.NIMapController import com.navinfo.collect.library.map.NIMapController
import com.navinfo.collect.library.map.OnGeoPointClickListener import com.navinfo.collect.library.map.OnGeoPointClickListener
import com.navinfo.collect.library.utils.GeometryTools import com.navinfo.collect.library.utils.GeometryTools
import com.navinfo.collect.library.utils.RealmDBParamUtils
import com.navinfo.omqs.Constant import com.navinfo.omqs.Constant
import com.navinfo.omqs.db.RealmOperateHelper import com.navinfo.omqs.db.RealmOperateHelper
import com.navinfo.omqs.http.NetworkService import com.navinfo.omqs.http.NetworkService
@ -141,8 +142,8 @@ class TaskViewModel @Inject constructor(
liveDataTaskLinks.value = taskBean.hadLinkDvoList liveDataTaskLinks.value = taskBean.hadLinkDvoList
showTaskLinks(taskBean) showTaskLinks(taskBean)
com.navinfo.collect.library.system.Constant.TASK_ID = taskBean.id RealmDBParamUtils.setTaskId(taskBean.id)
mapController.layerManagerHandler.omdbLayersClear() mapController.layerManagerHandler.updateOMDBVectorTileLayer()
mapController.mMapView.updateMap(true) mapController.mMapView.updateMap(true)
} }
@ -435,6 +436,7 @@ class TaskViewModel @Inject constructor(
} }
liveDataTaskLinks.postValue(currentSelectTaskBean!!.hadLinkDvoList) liveDataTaskLinks.postValue(currentSelectTaskBean!!.hadLinkDvoList)
mapController.lineHandler.addTaskLink(hadLinkDvoBean) mapController.lineHandler.addTaskLink(hadLinkDvoBean)
mapController.layerManagerHandler.updateOMDBVectorTileLayer()
mapController.mMapView.vtmMap.updateMap(true) mapController.mMapView.vtmMap.updateMap(true)
} }
} }
@ -488,6 +490,7 @@ class TaskViewModel @Inject constructor(
} }
} }
} }
mapController.layerManagerHandler.updateOMDBVectorTileLayer()
mapController.mMapView.vtmMap.updateMap(true) mapController.mMapView.vtmMap.updateMap(true)
} }

View File

@ -1,10 +1,54 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:padding="12dp"> android:padding="12dp">
<com.google.android.material.tabs.TabLayout
android:id="@+id/search_tab_layout"
android:layout_width="match_parent"
android:layout_height="@dimen/fragment_tabLayout_height"
android:layout_marginLeft="8dp"
android:layout_marginTop="11dp"
android:layout_marginRight="8dp"
android:background="@color/transparent"
app:layout_constraintLeft_toLeftOf="parent"
app:tabBackground="@drawable/selector_bg_gradient_checkbox"
app:tabGravity="center"
app:tabIndicator="@null"
app:tabIndicatorHeight="0dp"
app:tabMaxWidth="110dp"
app:tabMinWidth="110dp"
app:tabMode="scrollable"
app:tabPaddingEnd="6dp"
app:tabPaddingStart="6dp"
app:tabSelectedTextColor="@color/white"
app:tabTextAppearance="@style/TabLayoutTextStyle"
app:tabTextColor="@color/black"
tools:ignore="MissingConstraints">
<com.google.android.material.tabs.TabItem
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="link" />
<com.google.android.material.tabs.TabItem
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Mark" />
<com.google.android.material.tabs.TabItem
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="经纬度" />
</com.google.android.material.tabs.TabLayout>
<EditText <EditText
app:layout_constraintTop_toBottomOf="@id/search_tab_layout"
android:id="@+id/dialog_edittext" android:id="@+id/dialog_edittext"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"

View File

@ -38,7 +38,7 @@
<item <item
android:id="@+id/personal_center_menu_version" android:id="@+id/personal_center_menu_version"
android:icon="@drawable/ic_baseline_layers_24" android:icon="@drawable/ic_baseline_layers_24"
android:title="版本ONE_23QE4_V1.1.0_20230804_A" /> android:title="版本ONE_23QE4_V1.2.0_20230811_A" />
</group> </group>
<group android:checkableBehavior="single"> <group android:checkableBehavior="single">
<item android:title="小标题"> <item android:title="小标题">

View File

@ -55,6 +55,10 @@ android {
} }
} }
realm {
syncEnabled = true
}
//configurations.all { //configurations.all {
// resolutionStrategy { // resolutionStrategy {
// force 'com.intellij:annotations:13.0' // force 'com.intellij:annotations:13.0'

View File

@ -1956,15 +1956,15 @@
</m> </m>
<!-- 路口 --> <!-- 路口 -->
<m v="OMDB_INTERSECTION"> <m v="OMDB_INTERSECTION">
<!-- <m k="type" v="node">--> <m k="type" v="node">
<!-- <symbol src="assets:symbols/dot_blue_dark.svg"></symbol>--> <symbol src="assets:symbols/dot_blue_dark.svg"></symbol>
<!-- </m>-->
<!-- <m k="intersectionPid">-->
<!-- <symbol src="assets:symbols/dot_magenta.svg"></symbol>-->
<!-- </m>-->
<m k="geometry">
<symbol src="@typesrc"></symbol>
</m> </m>
<m k="intersectionPid">
<symbol src="assets:symbols/dot_magenta.svg"></symbol>
</m>
<!-- <m k="geometry">
<symbol src="@typesrc"></symbol>
</m>-->
</m> </m>
<!--车道中心线--> <!--车道中心线-->
@ -2036,13 +2036,20 @@
</m> </m>
<m k="boundaryType" v="1"> <m k="boundaryType" v="1">
<!--无标线无可区分边界--> <!--无标线无可区分边界-->
<line dasharray="12,6" repeat-start="0" stroke="#ffffff" width="0.2"/> <line dasharray="5,5" repeat-start="0" stroke="#ffffff" width="0.2"/>
</m> </m>
</m> </m>
<!-- 车道边界类型 --> <!-- 车道边界类型 -->
<m v="OMDB_LANE_MARK_BOUNDARYTYPE"> <m v="OMDB_LANE_MARK_BOUNDARYTYPE">
<outline-layer id="boundary" stroke="#ffffff" width="0.1" /> <outline-layer id="boundary" stroke="#ffffff" width="0.1" />
<!--只区分虚线与实线-->
<m k="boundaryType" v="1">
<line dasharray="5,5" repeat-start="5" stroke="#90A0BD" width="0.05"/>
</m>
<m k="boundaryType" v="2"> <m k="boundaryType" v="2">
<!--标线--> <!--标线-->
<m k="markType" v="0|1|4|5|6|7|8"> <m k="markType" v="0|1|4|5|6|7|8">
@ -2072,22 +2079,22 @@
<!--其他|实线--> <!--其他|实线-->
<m k="markColor" v="1"> <m k="markColor" v="1">
<line dasharray="12,6" repeat-start="0" stroke="#ffffff" width="0.1"/> <line dasharray="5,5" repeat-start="0" stroke="#ffffff" width="0.1"/>
</m> </m>
<m k="markColor" v="2"> <m k="markColor" v="2">
<line dasharray="12,6" repeat-start="0" stroke="#eccc68" width="0.1"/> <line dasharray="5,5" repeat-start="0" stroke="#eccc68" width="0.1"/>
</m> </m>
<m k="markColor" v="6"> <m k="markColor" v="6">
<line dasharray="12,6" repeat-start="0" stroke="#0000ff" width="0.1"/> <line dasharray="5,5" repeat-start="0" stroke="#0000ff" width="0.1"/>
</m> </m>
<m k="markColor" v="7"> <m k="markColor" v="7">
<line dasharray="12,6" repeat-start="0" stroke="#00ff00" width="0.1"/> <line dasharray="5,5" repeat-start="0" stroke="#00ff00" width="0.1"/>
</m> </m>
<m k="markColor" v="0|9"> <m k="markColor" v="0|9">
<line dasharray="12,6" repeat-start="0" stroke="#8e44ad" width="0.1"/> <line dasharray="5,5" repeat-start="0" stroke="#8e44ad" width="0.1"/>
</m> </m>
</m> </m>
@ -2097,10 +2104,6 @@
<m k="boundaryType" v="0|3|4|5|6|7|8|9"> <m k="boundaryType" v="0|3|4|5|6|7|8|9">
<line stroke="#ffffff" use="boundaryType" /> <line stroke="#ffffff" use="boundaryType" />
</m> </m>
<!--只区分虚线与实线-->
<m k="boundaryType" v="1">
<line dasharray="12,6" repeat-start="0" stroke="#ffffff" width="0.1"/>
</m>
</m> </m>
<!--常规点限速--> <!--常规点限速-->

View File

@ -1813,5 +1813,4 @@
</m> </m>
</m> </m>
</rendertheme> </rendertheme>

View File

@ -1,7 +1,10 @@
package com.navinfo.collect.library.map.handler package com.navinfo.collect.library.map.handler
import android.util.Log
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import com.navinfo.collect.library.data.entity.RenderEntity
import com.navinfo.collect.library.map.NIMapView import com.navinfo.collect.library.map.NIMapView
import io.realm.Realm
import org.oscim.core.BoundingBox import org.oscim.core.BoundingBox
import org.oscim.core.GeoPoint import org.oscim.core.GeoPoint
import org.oscim.core.MapPosition import org.oscim.core.MapPosition

View File

@ -1,14 +1,18 @@
package com.navinfo.collect.library.map.handler package com.navinfo.collect.library.map.handler
import android.util.Log
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import com.navinfo.collect.library.data.entity.RenderEntity
import com.navinfo.collect.library.map.NIMapView import com.navinfo.collect.library.map.NIMapView
import com.navinfo.collect.library.map.source.MapLifeNiLocationTileSource import com.navinfo.collect.library.map.source.MapLifeNiLocationTileSource
import com.navinfo.collect.library.map.source.NavinfoMultiMapFileTileSource import com.navinfo.collect.library.map.source.NavinfoMultiMapFileTileSource
import com.navinfo.collect.library.map.source.OMDBReferenceTileSource import com.navinfo.collect.library.map.source.OMDBReferenceTileSource
import com.navinfo.collect.library.map.source.OMDBTileSource import com.navinfo.collect.library.map.source.OMDBTileSource
import com.navinfo.collect.library.system.Constant import com.navinfo.collect.library.system.Constant
import io.realm.Realm
import okhttp3.Cache import okhttp3.Cache
import okhttp3.OkHttpClient import okhttp3.OkHttpClient
import org.oscim.android.theme.AssetsRenderTheme
import org.oscim.layers.GroupLayer import org.oscim.layers.GroupLayer
import org.oscim.layers.tile.buildings.BuildingLayer import org.oscim.layers.tile.buildings.BuildingLayer
import org.oscim.layers.tile.vector.VectorTileLayer import org.oscim.layers.tile.vector.VectorTileLayer
@ -131,6 +135,39 @@ class LayerManagerHandler(context: AppCompatActivity, mapView: NIMapView, traceP
if (omdbLabelLayer != null) { if (omdbLabelLayer != null) {
addLayer(omdbLabelLayer, NIMapView.LAYER_GROUPS.LABEL) addLayer(omdbLabelLayer, NIMapView.LAYER_GROUPS.LABEL)
} }
}
private fun resetOMDBVectorTileLayer() {
if (omdbReferenceTileLayer != null) {
removeLayer(omdbReferenceTileLayer)
}
if (omdbReferenceLabelLayer != null) {
removeLayer(omdbReferenceLabelLayer)
}
if (omdbVectorTileLayer != null) {
removeLayer(omdbVectorTileLayer)
}
if (omdbLabelLayer != null) {
removeLayer(omdbLabelLayer)
}
mMapView.vtmMap.updateMap(true)
Log.e("qj", "重新加载")
}
public fun updateOMDBVectorTileLayer(){
omdbTileSource.update()
omdbReferenceTileSource.update()
mMapView.vtmMap.setTheme(AssetsRenderTheme(mMapView.context.assets, "", "editormarker.xml"), true)
mMapView.vtmMap.updateMap(true)
} }
@ -215,13 +252,6 @@ class LayerManagerHandler(context: AppCompatActivity, mapView: NIMapView, traceP
vectorNiLocationTileLayer.isEnabled = false vectorNiLocationTileLayer.isEnabled = false
labelNiLocationLayer.isEnabled = false labelNiLocationLayer.isEnabled = false
} }
fun omdbLayersClear(){
// omdbVectorTileLayer.
// omdbReferenceTileLayer.
omdbLabelLayer.clearLabels()
omdbReferenceLabelLayer.clearLabels()
}
} }

View File

@ -7,6 +7,7 @@ import androidx.annotation.RequiresApi;
import com.navinfo.collect.library.data.entity.ReferenceEntity; import com.navinfo.collect.library.data.entity.ReferenceEntity;
import com.navinfo.collect.library.system.Constant; import com.navinfo.collect.library.system.Constant;
import com.navinfo.collect.library.utils.RealmDBParamUtils;
import org.oscim.layers.tile.MapTile; import org.oscim.layers.tile.MapTile;
import org.oscim.tiling.ITileDataSink; import org.oscim.tiling.ITileDataSink;
@ -19,6 +20,8 @@ import io.realm.Realm;
import io.realm.RealmQuery; import io.realm.RealmQuery;
public class OMDBReferenceDataSource implements ITileDataSource { public class OMDBReferenceDataSource implements ITileDataSource {
private boolean isUpdate;
private final ThreadLocal<OMDBReferenceDecoder> mThreadLocalDecoders = new ThreadLocal<OMDBReferenceDecoder>() { private final ThreadLocal<OMDBReferenceDecoder> mThreadLocalDecoders = new ThreadLocal<OMDBReferenceDecoder>() {
@Override @Override
protected OMDBReferenceDecoder initialValue() { protected OMDBReferenceDecoder initialValue() {
@ -36,8 +39,12 @@ public class OMDBReferenceDataSource implements ITileDataSource {
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);
if(isUpdate){
Realm.getDefaultInstance().refresh();
isUpdate = false;
}
RealmQuery<ReferenceEntity> realmQuery = Realm.getDefaultInstance().where(ReferenceEntity.class) RealmQuery<ReferenceEntity> realmQuery = Realm.getDefaultInstance().where(ReferenceEntity.class)
.rawPredicate("taskId=" + Constant.TASK_ID + " and tileX>=" + xStart + " and tileX<=" + xEnd + " and tileY>=" + yStart + " and tileY<=" + yEnd + " and enable>=1"); .rawPredicate("taskId="+RealmDBParamUtils.getTaskId() +" and tileX>=" + xStart + " and tileX<=" + xEnd + " and tileY>=" + yStart + " and tileY<=" + yEnd + " and enable>=1" );
// 筛选不显示的数据 // 筛选不显示的数据
if (Constant.HAD_LAYER_INVISIABLE_ARRAY != null && Constant.HAD_LAYER_INVISIABLE_ARRAY.length > 0) { if (Constant.HAD_LAYER_INVISIABLE_ARRAY != null && Constant.HAD_LAYER_INVISIABLE_ARRAY.length > 0) {
realmQuery.beginGroup(); realmQuery.beginGroup();
@ -68,4 +75,9 @@ public class OMDBReferenceDataSource implements ITileDataSource {
Realm.getDefaultInstance().cancelTransaction(); Realm.getDefaultInstance().cancelTransaction();
} }
} }
public void update(){
isUpdate = true;
Log.e("qj",Thread.currentThread().getName());
}
} }

View File

@ -1,17 +1,23 @@
package com.navinfo.collect.library.map.source; package com.navinfo.collect.library.map.source;
import android.util.Log;
import com.navinfo.collect.library.data.entity.RenderEntity;
import com.navinfo.collect.library.system.Constant; import com.navinfo.collect.library.system.Constant;
import org.oscim.tiling.ITileDataSource; import org.oscim.tiling.ITileDataSource;
import org.oscim.tiling.OverzoomTileDataSource; import org.oscim.tiling.OverzoomTileDataSource;
import org.oscim.tiling.TileSource; import org.oscim.tiling.TileSource;
public class OMDBReferenceTileSource extends TileSource { import io.realm.Realm;
public class OMDBReferenceTileSource extends RealmDBTileSource {
private OMDBReferenceDataSource omdbReferenceTileSource = new OMDBReferenceDataSource();
@Override @Override
public ITileDataSource getDataSource() { public ITileDataSource getDataSource() {
//return new OverzoomTileDataSource(new OMDBReferenceDataSource(), Constant.OVER_ZOOM); //return new OverzoomTileDataSource(new OMDBReferenceDataSource(), Constant.OVER_ZOOM);
return new OMDBReferenceDataSource(); return omdbReferenceTileSource;
} }
@Override @Override
@ -23,4 +29,10 @@ public class OMDBReferenceTileSource extends TileSource {
public void close() { public void close() {
} }
@Override
public void update() {
super.update();
omdbReferenceTileSource.update();
}
} }

View File

@ -9,6 +9,7 @@ import com.navinfo.collect.library.data.RealmUtils;
import com.navinfo.collect.library.data.entity.GeometryFeatureEntity; import com.navinfo.collect.library.data.entity.GeometryFeatureEntity;
import com.navinfo.collect.library.data.entity.RenderEntity; import com.navinfo.collect.library.data.entity.RenderEntity;
import com.navinfo.collect.library.system.Constant; import com.navinfo.collect.library.system.Constant;
import com.navinfo.collect.library.utils.RealmDBParamUtils;
import org.oscim.layers.tile.MapTile; import org.oscim.layers.tile.MapTile;
import org.oscim.tiling.ITileDataSink; import org.oscim.tiling.ITileDataSink;
@ -21,6 +22,7 @@ import io.realm.Realm;
import io.realm.RealmQuery; import io.realm.RealmQuery;
public class OMDBTileDataSource implements ITileDataSource { public class OMDBTileDataSource implements ITileDataSource {
private boolean isUpdate;
private final ThreadLocal<OMDBDataDecoder> mThreadLocalDecoders = new ThreadLocal<OMDBDataDecoder>() { private final ThreadLocal<OMDBDataDecoder> mThreadLocalDecoders = new ThreadLocal<OMDBDataDecoder>() {
@Override @Override
protected OMDBDataDecoder initialValue() { protected OMDBDataDecoder initialValue() {
@ -38,7 +40,11 @@ public class OMDBTileDataSource implements ITileDataSource {
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);
RealmQuery<RenderEntity> realmQuery = Realm.getDefaultInstance().where(RenderEntity.class).rawPredicate("tileX>=" + xStart + " and tileX<=" + xEnd + " and tileY>=" + yStart + " and tileY<=" + yEnd + " and enable>=1"); if(isUpdate){
Realm.getDefaultInstance().refresh();
isUpdate = false;
}
RealmQuery<RenderEntity> realmQuery = Realm.getDefaultInstance().where(RenderEntity.class).rawPredicate("taskId ="+RealmDBParamUtils.getTaskId() +" and tileX>=" + xStart + " and tileX<=" + xEnd + " and tileY>=" + yStart + " and tileY<=" + yEnd + " and enable>=1");
// 筛选不显示的数据 // 筛选不显示的数据
if (Constant.HAD_LAYER_INVISIABLE_ARRAY != null && Constant.HAD_LAYER_INVISIABLE_ARRAY.length > 0) { if (Constant.HAD_LAYER_INVISIABLE_ARRAY != null && Constant.HAD_LAYER_INVISIABLE_ARRAY.length > 0) {
realmQuery.beginGroup(); realmQuery.beginGroup();
@ -68,4 +74,9 @@ public class OMDBTileDataSource implements ITileDataSource {
Realm.getDefaultInstance().cancelTransaction(); Realm.getDefaultInstance().cancelTransaction();
} }
} }
public void update(){
isUpdate = true;
Log.e("qj",Thread.currentThread().getName());
}
} }

View File

@ -1,21 +1,27 @@
package com.navinfo.collect.library.map.source; package com.navinfo.collect.library.map.source;
import android.util.Log;
import com.navinfo.collect.library.data.entity.RenderEntity;
import com.navinfo.collect.library.system.Constant; import com.navinfo.collect.library.system.Constant;
import org.oscim.tiling.ITileDataSource; import org.oscim.tiling.ITileDataSource;
import org.oscim.tiling.OverzoomTileDataSource; import org.oscim.tiling.OverzoomTileDataSource;
import org.oscim.tiling.TileSource; import org.oscim.tiling.TileSource;
public class OMDBTileSource extends TileSource { import io.realm.Realm;
public class OMDBTileSource extends RealmDBTileSource {
private OMDBTileDataSource omdbTileSource = new OMDBTileDataSource();
@Override @Override
public ITileDataSource getDataSource() { public ITileDataSource getDataSource() {
// return new OverzoomTileDataSource(new OMDBTileDataSource(), Constant.OVER_ZOOM); // return new OverzoomTileDataSource(new OMDBTileDataSource(), Constant.OVER_ZOOM);
return new OMDBTileDataSource(); return omdbTileSource;
} }
@Override @Override
public OpenResult open() { public OpenResult open() {
Log.d("qj", Realm.getDefaultInstance().where(RenderEntity.class).findAll().size()+"open安装数量");
return OpenResult.SUCCESS; return OpenResult.SUCCESS;
} }
@ -23,4 +29,10 @@ public class OMDBTileSource extends TileSource {
public void close() { public void close() {
} }
@Override
public void update() {
super.update();
omdbTileSource.update();
}
} }

View File

@ -25,4 +25,7 @@ public class RealmDBTileSource extends TileSource {
public void close() { public void close() {
} }
public void update(){
}
} }

View File

@ -30,11 +30,10 @@ public class Constant {
} }
public static String[] HAD_LAYER_INVISIABLE_ARRAY; public static String[] HAD_LAYER_INVISIABLE_ARRAY;
public static final int OVER_ZOOM = 22; public static final int OVER_ZOOM = 20;
public static final int MAX_ZOOM = 22; public static final int MAX_ZOOM = 20;
public static final int OMDB_MIN_ZOOM = 16; public static final int OMDB_MIN_ZOOM = 15;
public static int TASK_ID = -1;
/** /**
* 服务器地址 * 服务器地址
*/ */

View File

@ -0,0 +1,13 @@
package com.navinfo.collect.library.utils;
public class RealmDBParamUtils {
private static int mtaskId = -1;
public static int getTaskId() {
return mtaskId;
}
public static void setTaskId(int taskId) {
mtaskId = taskId;
}
}