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

 Conflicts:
	app/src/main/java/com/navinfo/omqs/ui/activity/map/MainViewModel.kt
This commit is contained in:
squallzhjch
2023-11-06 16:33:56 +08:00
28 changed files with 918 additions and 210 deletions

View File

@@ -107,6 +107,7 @@ dependencies {
// implementation 'javax.xml.stream:stax-api:1.0-2' // implementation 'javax.xml.stream:stax-api:1.0-2'
// implementation 'com.bea.xml.stream:com.bea.xml.stream:1.0.0' // implementation 'com.bea.xml.stream:com.bea.xml.stream:1.0.0'
implementation 'commons-io:commons-io:2.11.0' implementation 'commons-io:commons-io:2.11.0'
implementation 'com.alibaba:fastjson:1.2.73'
// 读取spatialite文件 // 读取spatialite文件
implementation 'com.github.sevar83:android-spatialite:2.0.1' implementation 'com.github.sevar83:android-spatialite:2.0.1'

View File

@@ -150,17 +150,23 @@
"code": 2092, "code": 2092,
"name": "车道类型", "name": "车道类型",
"catch": true, "catch": true,
"isDependOnOtherTable": true, "isDependOnOtherTable": false,
"zoomMin": 18, "zoomMin": 18,
"zoomMax": 20, "zoomMax": 20,
"transformer": [ "transformer": [
{ {
"k": "geometry", "k": "geometry",
"v": "~", "v": "~",
"klib": "geometry", "klib": "geometry",
"vlib": "generateLaneTypeAccessS2ERefPoint()" "vlib": "filterLaneTypeAccess()"
} },
] {
"k": "geometry",
"v": "~",
"klib": "geometry",
"vlib": "generateLaneTypeAccessS2ERefPoint()"
}
]
}, },
"2097": { "2097": {
"table": "OMDB_PHY_LANENUM", "table": "OMDB_PHY_LANENUM",
@@ -173,7 +179,7 @@
"name": "桥", "name": "桥",
"catch": true, "catch": true,
"existSubCode": true, "existSubCode": true,
"isDependOnOtherTable": true, "isDependOnOtherTable": false,
"zoomMin": 15, "zoomMin": 15,
"zoomMax": 20, "zoomMax": 20,
"transformer": [ "transformer": [
@@ -350,7 +356,7 @@
"code": 4001, "code": 4001,
"name": "路口", "name": "路口",
"zoomMin": 15, "zoomMin": 15,
"isDependOnOtherTable": true, "isDependOnOtherTable": false,
"zoomMax": 17, "zoomMax": 17,
"catch": true, "catch": true,
"transformer": [ "transformer": [
@@ -492,7 +498,7 @@
"code": 4009, "code": 4009,
"name": "警示信息", "name": "警示信息",
"catch": true, "catch": true,
"isDependOnOtherTable": true, "isDependOnOtherTable": false,
"zoomMin": 15, "zoomMin": 15,
"zoomMax": 20, "zoomMax": 20,
"transformer": [ "transformer": [
@@ -581,7 +587,7 @@
"code": 4601, "code": 4601,
"name": "车信", "name": "车信",
"catch": true, "catch": true,
"isDependOnOtherTable": true, "isDependOnOtherTable": false,
"zoomMin": 15, "zoomMin": 15,
"zoomMax": 17, "zoomMax": 17,
"transformer": [ "transformer": [
@@ -609,8 +615,8 @@
"table": "OMDB_LANE_LINK_LG", "table": "OMDB_LANE_LINK_LG",
"code": 5001, "code": 5001,
"name": "车道中心线", "name": "车道中心线",
"catch": false, "catch": true,
"isDependOnOtherTable": true, "isDependOnOtherTable": false,
"checkLinkId": false, "checkLinkId": false,
"zoomMin": 18, "zoomMin": 18,
"zoomMax": 20, "zoomMax": 20,

View File

@@ -40,12 +40,19 @@ class Constant {
*/ */
lateinit var USER_DATA_PATH: String lateinit var USER_DATA_PATH: String
/**
* 用户数据安装标识
*/
var INSTALL_DATA: Boolean = false
/** /**
* 轨迹渲染个数统计 * 轨迹渲染个数统计
*/ */
var TRACE_COUNT : Int = 0 var TRACE_COUNT : Int = 0
var TRACE_COUNT_TIME : Int = 10 var TRACE_COUNT_TIME : Int = 9
var TRACE_COUNT_MORE_TIME : Int = 24
/** /**
* 当前安装任务 * 当前安装任务

View File

@@ -3,12 +3,13 @@ package com.navinfo.omqs.db
import android.content.Context import android.content.Context
import android.database.Cursor.* import android.database.Cursor.*
import android.util.Log import android.util.Log
import com.alibaba.fastjson.JSON
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.* import com.navinfo.collect.library.data.entity.*
import com.navinfo.collect.library.enums.DataCodeEnum import com.navinfo.collect.library.enums.DataCodeEnum
import com.navinfo.collect.library.utils.StrZipUtil import com.navinfo.collect.library.utils.DeflaterUtil
import com.navinfo.omqs.Constant import com.navinfo.omqs.Constant
import com.navinfo.omqs.Constant.Companion.currentInstallTaskConfig import com.navinfo.omqs.Constant.Companion.currentInstallTaskConfig
import com.navinfo.omqs.Constant.Companion.currentInstallTaskFolder import com.navinfo.omqs.Constant.Companion.currentInstallTaskFolder
@@ -24,18 +25,34 @@ import io.realm.Realm
import io.realm.RealmConfiguration import io.realm.RealmConfiguration
import kotlinx.coroutines.* import kotlinx.coroutines.*
import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.channels.Channel
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.channels.awaitClose
import kotlinx.coroutines.flow.FlowCollector import kotlinx.coroutines.channels.trySendBlocking
import kotlinx.coroutines.flow.channelFlow import kotlinx.coroutines.flow.callbackFlow
import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.conflate
import kotlinx.coroutines.sync.Mutex
import org.spatialite.database.SQLiteDatabase
import java.io.BufferedReader import java.io.BufferedReader
import java.io.File import java.io.File
import java.io.FileReader import java.io.FileReader
import java.util.* import java.util.*
import javax.inject.Inject import javax.inject.Inject
//定义一个接口
sealed interface Event
class OnProgress(val value:Int):Event
class OnError(val t:Throwable):Event
class OnResult<T>(val value:T):Event
object OnComplete:Event
interface MultiPathsCallback<T>{
fun onProgress(value: Int)
fun onResult(value: T)
fun onError(t:Throwable)
fun onComplete()
}
/** /**
* 导入omdb数据的帮助类 * 导入omdb数据的帮助类
* */ * */
@@ -147,8 +164,9 @@ class ImportOMDBHelper @AssistedInject constructor(
* @param configFile 对应的配置文件 * @param configFile 对应的配置文件
* */ * */
suspend fun importOmdbZipFile( suspend fun importOmdbZipFile(
omdbZipFile: File, task: TaskBean, scope: CoroutineScope omdbZipFile: File, task: TaskBean, scope: CoroutineScope,callback: MultiPathsCallback<String>
): Boolean { ) {
val channel = Channel<List<RenderEntity>>(Channel.RENDEZVOUS) val channel = Channel<List<RenderEntity>>(Channel.RENDEZVOUS)
installTaskid = task.id.toString() installTaskid = task.id.toString()
@@ -190,7 +208,11 @@ class ImportOMDBHelper @AssistedInject constructor(
mutableMapOf<MutableMap.MutableEntry<String, TableInfo>, ImportConfig>() mutableMapOf<MutableMap.MutableEntry<String, TableInfo>, ImportConfig>()
//协程池 //协程池
val listJob = mutableListOf<Job>() val listJob = mutableListOf<Job>()
try { try {
CMLog.writeLogtoFile(ImportOMDBHelper::class.java.name, "数据安装", "开始安装数据")
Constant.INSTALL_DATA = true
for (importConfig in importConfigList) { for (importConfig in importConfigList) {
for ((index, currentEntry) in importConfig.tableMap.entries.withIndex()) { for ((index, currentEntry) in importConfig.tableMap.entries.withIndex()) {
if (currentEntry.value.isDependOnOtherTable) { if (currentEntry.value.isDependOnOtherTable) {
@@ -198,14 +220,64 @@ class ImportOMDBHelper @AssistedInject constructor(
continue continue
} }
val job = scope.launch(Dispatchers.IO) { val job = scope.launch(Dispatchers.IO) {
importData( startTaskAsFlow(
channel, channel,
unZipFiles, unZipFiles,
currentEntry, currentEntry,
task, task,
importConfig, importConfig,
hashMap hashMap,
) true).collect{
when(it){
OnComplete->{
processIndex ++
callback.onResult("$processIndex|$tableNum")
Log.e("jingo", "安装==$processIndex===$tableNum")
if(tableNum-processIndex==listDependOnEntry.size){
for ((currentEntry, importConfig) in listDependOnEntry) {
processIndex++
if(processIndex==tableNum){
importData(
channel,
unZipFiles,
currentEntry,
task,
importConfig,
hashMap,
false, callback
)
}else{
callback.onResult("$processIndex|$tableNum")
importData(
channel,
unZipFiles,
currentEntry,
task,
importConfig,
hashMap,
false, null)
}
}
Log.e("jingo", "安装结束")
CMLog.writeLogtoFile(ImportOMDBHelper::class.java.name, "数据安装", "安装结束")
Constant.INSTALL_DATA = false
}
}
is OnProgress->{
callback.onProgress(it.value)
Log.e("qj","progress==${it.value}")
}
is OnResult<*>->{
callback.onResult(it.value.toString())
}
is OnError->{
callback.onError(it.t)
}
}
}
} }
listJob.add(job) listJob.add(job)
} }
@@ -220,31 +292,49 @@ class ImportOMDBHelper @AssistedInject constructor(
} }
realm.close() realm.close()
} }
} }
listJob.joinAll() listJob.joinAll()
channel.close() channel.close()
channelJob.join() channelJob.join()
Log.e("jingo", "channel close 等待结束")
for ((currentEntry, importConfig) in listDependOnEntry) {
importData(
channel,
unZipFiles,
currentEntry,
task,
importConfig,
hashMap,
false
)
}
Log.e("jingo", "安装结束")
} catch (e: Exception) { } catch (e: Exception) {
Log.e("jingo", "安装报错1 ${e.message}") Log.e("jingo", "安装报错1 ${e.message}")
return false
callback.onError(e)
Constant.INSTALL_DATA = false
} }
return true
} }
private fun startTaskAsFlow(
f: Channel<List<RenderEntity>>,
unZipFiles: List<File>,
currentEntry: MutableMap.MutableEntry<String, TableInfo>,
task: TaskBean,
importConfig: ImportConfig,
hashMap: HashMap<Long, HadLinkDvoBean>,
isEmit: Boolean = true) = callbackFlow <Event>{
val cancellable= importData(f,unZipFiles,currentEntry,task,importConfig,hashMap,isEmit,object :MultiPathsCallback<String>{
override fun onProgress(value: Int) {
trySendBlocking(OnProgress(value))
Log.e("jingo","=====$value")
}
override fun onError(t: Throwable) {
trySendBlocking(OnError(t))
}
override fun onComplete() {
trySendBlocking(OnComplete)
}
override fun onResult(value: String) {
trySendBlocking(OnResult(value))
}
})
awaitClose {
}
}.conflate()
private suspend fun importData( private suspend fun importData(
f: Channel<List<RenderEntity>>, f: Channel<List<RenderEntity>>,
@@ -253,18 +343,20 @@ class ImportOMDBHelper @AssistedInject constructor(
task: TaskBean, task: TaskBean,
importConfig: ImportConfig, importConfig: ImportConfig,
hashMap: HashMap<Long, HadLinkDvoBean>, hashMap: HashMap<Long, HadLinkDvoBean>,
isEmit: Boolean = true isEmit: Boolean = true, callback: MultiPathsCallback<String>?
) { ):NonCancellable {
val resHashMap: HashMap<String, RenderEntity> = HashMap() //define empty hashmap val resHashMap: HashMap<String, RenderEntity> = HashMap() //define empty hashmap
var listRenderEntity = mutableListOf<RenderEntity>() var listRenderEntity = mutableListOf<RenderEntity>()
//单个表要素统计 //单个表要素统计
var elementIndex = 0 var elementIndex = 0
val currentConfig = currentEntry.value val currentConfig = currentEntry.value
// CMLog.writeLogtoFile(
// ImportOMDBHelper::class.java.name, CMLog.writeLogtoFile(
// "importOmdbZipFile", ImportOMDBHelper::class.java.name,
// "${currentConfig.table}开始" "importOmdbZipFile",
// ) "${currentConfig.table}开始"
)
try { try {
var realm: Realm? = null var realm: Realm? = null
if (!isEmit) { if (!isEmit) {
@@ -286,12 +378,18 @@ class ImportOMDBHelper @AssistedInject constructor(
continue continue
} }
newTime = System.currentTimeMillis() newTime = System.currentTimeMillis()
Log.e(
"jingo", if (elementIndex % 50 == 0) {
"安装数据 ${currentConfig.table} $elementIndex ${listRenderEntity.size} ${newTime - time}" Log.e(
) "jingo",
"安装数据 ${currentConfig.table} $elementIndex ${listRenderEntity.size} ${newTime - time}"
)
}
time = newTime time = newTime
elementIndex += 1 elementIndex += 1
val map = gson.fromJson<Map<String, Any>>( val map = gson.fromJson<Map<String, Any>>(
line, object : TypeToken<Map<String, Any>>() {}.type line, object : TypeToken<Map<String, Any>>() {}.type
).toMutableMap() ).toMutableMap()
@@ -480,6 +578,8 @@ class ImportOMDBHelper @AssistedInject constructor(
// 对renderEntity做预处理后再保存 // 对renderEntity做预处理后再保存
val resultEntity = importConfig.transformProperties(renderEntity, realm) val resultEntity = importConfig.transformProperties(renderEntity, realm)
//车道中心线不在主表写入
if (resultEntity != null) { if (resultEntity != null) {
//对code编码需要特殊处理 存在多个属性值时渲染优先级SA>PA,存在多个属性值时渲染优先级FRONTAGE>MAIN_SIDE_A CCESS //对code编码需要特殊处理 存在多个属性值时渲染优先级SA>PA,存在多个属性值时渲染优先级FRONTAGE>MAIN_SIDE_A CCESS
@@ -526,6 +626,7 @@ class ImportOMDBHelper @AssistedInject constructor(
when (renderEntity.properties["bridgeType"]) { when (renderEntity.properties["bridgeType"]) {
"1" -> renderEntity.code = "1" -> renderEntity.code =
DataCodeEnum.OMDB_BRIDGE_1.code DataCodeEnum.OMDB_BRIDGE_1.code
"2" -> renderEntity.code = "2" -> renderEntity.code =
DataCodeEnum.OMDB_BRIDGE_2.code DataCodeEnum.OMDB_BRIDGE_2.code
// "3" -> renderEntity.code = DataCodeEnum.OMDB_BRIDGE_3.code // "3" -> renderEntity.code = DataCodeEnum.OMDB_BRIDGE_3.code
@@ -669,6 +770,21 @@ class ImportOMDBHelper @AssistedInject constructor(
renderEntity.properties.remove("linkPid") renderEntity.properties.remove("linkPid")
} }
//去掉暂用控件较大的字段多余属性字段
if (renderEntity.properties.containsKey("shapeList")) {
renderEntity.properties.remove("shapeList")
}
//只保留link表相关的pid
if (currentConfig.code != DataCodeEnum.OMDB_RD_LINK.code.toInt() && currentConfig.code != DataCodeEnum.OMDB_RD_LINK_KIND.code.toInt() && renderEntity.properties.containsKey(
"linkPid"
)
) {
if (renderEntity.properties.containsKey("mesh")) {
renderEntity.properties.remove("mesh")
}
}
// 如果当前解析的是OMDB_RD_LINK数据将其缓存在预处理类中以便后续处理其他要素时使用 // 如果当前解析的是OMDB_RD_LINK数据将其缓存在预处理类中以便后续处理其他要素时使用
if (currentConfig.code == DataCodeEnum.OMDB_RD_LINK.code.toInt()) { if (currentConfig.code == DataCodeEnum.OMDB_RD_LINK.code.toInt()) {
if (renderEntity.linkRelation == null) { if (renderEntity.linkRelation == null) {
@@ -681,15 +797,11 @@ class ImportOMDBHelper @AssistedInject constructor(
renderEntity.properties["enodePid"] renderEntity.properties["enodePid"]
} }
//去掉暂用控件较大的字段多余属性字段 renderEntity.propertiesDb =
if (renderEntity.properties.containsKey("shapeList")) { DeflaterUtil.zipString(JSON.toJSONString(renderEntity.properties))
renderEntity.properties.remove("shapeList")
}
renderEntity.propertiesDb = StrZipUtil.compress(
gson.toJson(renderEntity.properties).toString()
)
listRenderEntity.add(renderEntity) listRenderEntity.add(renderEntity)
} }
if (listRenderEntity.size > 20000) { if (listRenderEntity.size > 20000) {
@@ -700,32 +812,36 @@ class ImportOMDBHelper @AssistedInject constructor(
if (isEmit) { if (isEmit) {
f.send(listRenderEntity) f.send(listRenderEntity)
delay(20) delay(20)
callback?.onProgress(elementIndex)
} else { } else {
realm!!.copyToRealm(listRenderEntity) realm!!.copyToRealm(listRenderEntity)
realm!!.commitTransaction() realm!!.commitTransaction()
realm!!.close() realm!!.close()
realm = Realm.getInstance(currentInstallTaskConfig) realm = Realm.getInstance(currentInstallTaskConfig)
realm.beginTransaction() realm.beginTransaction()
callback?.onProgress(elementIndex)
} }
listRenderEntity = mutableListOf() listRenderEntity = mutableListOf()
// //
} }
line = bufferedReader.readLine() line = bufferedReader.readLine()
} }
// CMLog.writeLogtoFile(
// ImportOMDBHelper::class.java.name, CMLog.writeLogtoFile(
// "importOmdbZipFile", ImportOMDBHelper::class.java.name,
// "结束===总量$elementIndex" "importOmdbZipFile",
// ) "${currentConfig.table}结束===总量$elementIndex"
)
if (isEmit) { if (isEmit) {
f.send(listRenderEntity) f.send(listRenderEntity)
delay(20) delay(20)
callback?.onProgress(elementIndex)
} else { } else {
bufferedReader.close() bufferedReader.close()
realm!!.copyToRealm(listRenderEntity) realm!!.copyToRealm(listRenderEntity)
realm!!.commitTransaction() realm!!.commitTransaction()
callback?.onProgress(elementIndex)
} }
} }
if (!isEmit) { if (!isEmit) {
@@ -735,7 +851,12 @@ class ImportOMDBHelper @AssistedInject constructor(
Log.e("jingo", "安装报错 ${currentConfig.table} ${elementIndex} ${e.message}") Log.e("jingo", "安装报错 ${currentConfig.table} ${elementIndex} ${e.message}")
throw e throw e
} }
Log.e("jingo", "完成 ${currentConfig.table}") Log.e("jingo", "完成 ${currentConfig.table}")
callback?.onComplete()
return NonCancellable
} }

View File

@@ -1,11 +1,13 @@
package com.navinfo.omqs.db package com.navinfo.omqs.db
import android.util.Log import android.util.Log
import com.alibaba.fastjson.JSON
import com.google.gson.Gson import com.google.gson.Gson
import com.navinfo.collect.library.data.entity.LinkRelation import com.navinfo.collect.library.data.entity.LinkRelation
import com.navinfo.collect.library.data.entity.ReferenceEntity 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.enums.DataCodeEnum import com.navinfo.collect.library.enums.DataCodeEnum
import com.navinfo.collect.library.utils.DeflaterUtil
import com.navinfo.collect.library.utils.GeometryTools import com.navinfo.collect.library.utils.GeometryTools
import com.navinfo.collect.library.utils.StrZipUtil import com.navinfo.collect.library.utils.StrZipUtil
import com.navinfo.omqs.Constant import com.navinfo.omqs.Constant
@@ -240,19 +242,32 @@ class ImportPreProcess {
startEndReference.properties["qi_table"] = renderEntity.table startEndReference.properties["qi_table"] = renderEntity.table
startEndReference.properties["type"] = "s_2_e" startEndReference.properties["type"] = "s_2_e"
val listResult = mutableListOf<ReferenceEntity>() val listResult = mutableListOf<ReferenceEntity>()
startEndReference.propertiesDb = StrZipUtil.compress( startEndReference.propertiesDb = DeflaterUtil.zipString(JSON.toJSONString(startEndReference.properties))
gson.toJson(startEndReference.properties).toString() renderEntity.referenceEntitys?.add(startEndReference)
) //listResult.add(startEndReference)
listResult.add(startEndReference) //insertData(listResult)
insertData(listResult) }
/**
* 过滤车道类型数据,只保留加速车道、减速车道和自行车道
* */
fun filterLaneTypeAccess(renderEntity: RenderEntity): Boolean {
if (renderEntity.properties["laneType"]!!.toInt() and (0b1100) > 0 || renderEntity.properties["laneType"]!!.toInt() and (0b1 shl 19) > 0) { // 是加速车道/减速车道/自行车道
// 如果是自行车道需要在properties中增加新的属性用于渲染自行车道的特殊线型
if (renderEntity.properties["laneType"]!!.toInt() and (0b1 shl 19) > 0) {
renderEntity.properties["bike"] = "true"
}
return true
}
return false
} }
/** /**
* 生成车道类型起终点参考数据 * 生成车道类型起终点参考数据
* */ * */
fun generateLaneTypeAccessS2ERefPoint(renderEntity: RenderEntity) { fun generateLaneTypeAccessS2ERefPoint(renderEntity: RenderEntity) {
// 如果车道类型非常规车道(第0bit的数据),则需要生成辅助数据 // 只需要生成加速车道和减速车道的起终点辅助数据
if (renderEntity.properties["laneType"]!!.toInt()>0) { if (renderEntity.properties["laneType"]!!.toInt() and (0b1100) > 0) { // 是加速车道或者减速车道
val geometry = GeometryTools.createGeometry(renderEntity.properties["geometry"]) val geometry = GeometryTools.createGeometry(renderEntity.properties["geometry"])
val pointEnd = geometry!!.coordinates[geometry.numPoints - 1] // 获取这个geometry对应的结束点坐标 val pointEnd = geometry!!.coordinates[geometry.numPoints - 1] // 获取这个geometry对应的结束点坐标
@@ -273,7 +288,7 @@ class ImportPreProcess {
startReference.geometry = startReference.geometry =
GeometryTools.createGeometry(GeoPoint(pointStart.y, pointStart.x)).toString() GeometryTools.createGeometry(GeoPoint(pointStart.y, pointStart.x)).toString()
startReference.properties["qi_table"] = renderEntity.table startReference.properties["qi_table"] = renderEntity.table
startReference.properties["type"] = "s_2_p" startReference.properties["type"] = "s${if (renderEntity.properties["laneType"]!!.toInt() and (0b1000)>0) "_dec" else "_acc"}"
startReference.properties["geometry"] = startReference.geometry startReference.properties["geometry"] = startReference.geometry
listResult.add(startReference) listResult.add(startReference)
@@ -291,11 +306,11 @@ class ImportPreProcess {
endReference.geometry = endReference.geometry =
GeometryTools.createGeometry(GeoPoint(pointEnd.y, pointEnd.x)).toString() GeometryTools.createGeometry(GeoPoint(pointEnd.y, pointEnd.x)).toString()
endReference.properties["qi_table"] = renderEntity.table endReference.properties["qi_table"] = renderEntity.table
endReference.properties["type"] = "e_2_p" endReference.properties["type"] = "e${if (renderEntity.properties["laneType"]!!.toInt() and (0b1000)>0) "_dec" else "_acc"}"
endReference.properties["geometry"] = endReference.geometry endReference.properties["geometry"] = endReference.geometry
renderEntity.referenceEntitys?.add(endReference)
listResult.add(endReference) //listResult.add(endReference)
insertData(listResult) //insertData(listResult)
} }
} }
@@ -344,9 +359,7 @@ class ImportPreProcess {
Log.e("qj", "generateS2EReferencePoint===${startReference.geometry}") Log.e("qj", "generateS2EReferencePoint===${startReference.geometry}")
startReference.properties["geometry"] = startReference.geometry startReference.properties["geometry"] = startReference.geometry
startReference.propertiesDb = StrZipUtil.compress( startReference.propertiesDb = DeflaterUtil.zipString(JSON.toJSONString(startReference.properties))
gson.toJson(startReference.properties).toString()
)
listResult.add(startReference) listResult.add(startReference)
Log.e("qj", "generateS2EReferencePoint===1") Log.e("qj", "generateS2EReferencePoint===1")
@@ -381,12 +394,11 @@ class ImportPreProcess {
Log.e("qj", "generateS2EReferencePoint===e_2_p${renderEntity.name}") Log.e("qj", "generateS2EReferencePoint===e_2_p${renderEntity.name}")
} }
endReference.properties["geometry"] = endReference.geometry endReference.properties["geometry"] = endReference.geometry
endReference.propertiesDb = StrZipUtil.compress( endReference.propertiesDb = DeflaterUtil.zipString(JSON.toJSONString(endReference.properties))
gson.toJson(endReference.properties).toString() renderEntity.referenceEntitys?.add(endReference)
) //listResult.add(endReference)
listResult.add(endReference)
Log.e("qj", "generateS2EReferencePoint===4") Log.e("qj", "generateS2EReferencePoint===4")
insertData(listResult) //insertData(listResult)
} }
/** /**
@@ -482,12 +494,11 @@ class ImportPreProcess {
WKTWriter(3).write(GeometryTools.createLineString(arrayOf(pointStart, coorEnd))) WKTWriter(3).write(GeometryTools.createLineString(arrayOf(pointStart, coorEnd)))
angleReference.properties["qi_table"] = renderEntity.table angleReference.properties["qi_table"] = renderEntity.table
angleReference.properties["type"] = "angle" angleReference.properties["type"] = "angle"
angleReference.propertiesDb = StrZipUtil.compress( angleReference.propertiesDb = DeflaterUtil.zipString(JSON.toJSONString(angleReference.properties))
gson.toJson(angleReference.properties).toString() renderEntity.referenceEntitys?.add(angleReference)
) //listResult.add(angleReference)
listResult.add(angleReference)
} }
insertData(listResult) //insertData(listResult)
} }
fun addAngleFromGeometry(renderEntity: RenderEntity): String { fun addAngleFromGeometry(renderEntity: RenderEntity): String {
@@ -642,12 +653,11 @@ class ImportPreProcess {
referenceEntity.properties["symbol"] = referenceEntity.properties["symbol"] =
"assets:omdb/4601/${type}/1301_${referenceEntity.properties["currentDirect"]}.svg" "assets:omdb/4601/${type}/1301_${referenceEntity.properties["currentDirect"]}.svg"
Log.d("unpackingLaneInfo", referenceEntity.properties["symbol"].toString()) Log.d("unpackingLaneInfo", referenceEntity.properties["symbol"].toString())
referenceEntity.propertiesDb = StrZipUtil.compress( referenceEntity.propertiesDb = DeflaterUtil.zipString(JSON.toJSONString(referenceEntity.properties))
gson.toJson(referenceEntity.properties).toString() renderEntity.referenceEntitys?.add(referenceEntity)
) //listResult.add(referenceEntity)
listResult.add(referenceEntity)
} }
insertData(listResult) //insertData(listResult)
} }
} }
} }
@@ -745,9 +755,8 @@ class ImportPreProcess {
angleReference.table = renderEntity.table angleReference.table = renderEntity.table
angleReference.code = renderEntity.code angleReference.code = renderEntity.code
Log.e("jingo", "几何转换开始") Log.e("jingo", "几何转换开始")
angleReference.geometry = //angleReference.geometry = renderEntity.geometry
GeometryTools.createGeometry(renderEntity.geometry).buffer(0.000010) angleReference.geometry = GeometryTools.computeLine(0.000035,0.000035,renderEntity.geometry)
.toString()//GeometryTools.computeLine(0.000035,0.000035,renderEntity.geometry)
Log.e("jingo", "几何转换结束") Log.e("jingo", "几何转换结束")
angleReference.properties["qi_table"] = renderEntity.table angleReference.properties["qi_table"] = renderEntity.table
angleReference.properties["widthProperties"] = "3" angleReference.properties["widthProperties"] = "3"
@@ -756,12 +765,10 @@ class ImportPreProcess {
angleReference.taskId = renderEntity.taskId angleReference.taskId = renderEntity.taskId
angleReference.enable = renderEntity.enable angleReference.enable = renderEntity.enable
val listResult = mutableListOf<ReferenceEntity>() val listResult = mutableListOf<ReferenceEntity>()
angleReference.propertiesDb = StrZipUtil.compress( angleReference.propertiesDb = DeflaterUtil.zipString(JSON.toJSONString(angleReference.properties))
gson.toJson(angleReference.properties).toString() renderEntity.referenceEntitys?.add(angleReference)
) //listResult.add(angleReference)
listResult.add(angleReference) //insertData(listResult)
insertData(listResult)
} }
@@ -790,12 +797,11 @@ class ImportPreProcess {
GeometryTools.createGeometry(nodeJSONObject["geometry"].toString()).toString() GeometryTools.createGeometry(nodeJSONObject["geometry"].toString()).toString()
intersectionReference.properties["qi_table"] = renderEntity.table intersectionReference.properties["qi_table"] = renderEntity.table
intersectionReference.properties["type"] = "node" intersectionReference.properties["type"] = "node"
intersectionReference.propertiesDb = StrZipUtil.compress( intersectionReference.propertiesDb = DeflaterUtil.zipString(JSON.toJSONString(intersectionReference.properties))
gson.toJson(intersectionReference.properties).toString() renderEntity.referenceEntitys?.add(intersectionReference)
) //listResult.add(intersectionReference)
listResult.add(intersectionReference)
} }
insertData(listResult) //insertData(listResult)
} }
} }
@@ -962,12 +968,11 @@ class ImportPreProcess {
dynamicSrcReference.properties["type"] = "dynamicSrc" dynamicSrcReference.properties["type"] = "dynamicSrc"
val code = renderEntity.properties[codeName] val code = renderEntity.properties[codeName]
dynamicSrcReference.properties["src"] = "${prefix}${code}${suffix}" dynamicSrcReference.properties["src"] = "${prefix}${code}${suffix}"
dynamicSrcReference.propertiesDb = StrZipUtil.compress( dynamicSrcReference.propertiesDb = DeflaterUtil.zipString(JSON.toJSONString(dynamicSrcReference.properties))
gson.toJson(dynamicSrcReference.properties).toString() renderEntity.referenceEntitys?.add(dynamicSrcReference)
) //listResult.add(dynamicSrcReference)
listResult.add(dynamicSrcReference)
} }
insertData(listResult) //insertData(listResult)
} }
private fun insertData(list: List<RealmModel>) { private fun insertData(list: List<RealmModel>) {
@@ -1111,4 +1116,118 @@ class ImportPreProcess {
renderEntity.properties["ref"] = "${renderEntity.properties["maxSpeed"]}|${renderEntity.properties["minSpeed"]}" renderEntity.properties["ref"] = "${renderEntity.properties["maxSpeed"]}|${renderEntity.properties["minSpeed"]}"
} }
} }
/**
* 生成立交的辅助图层数据
* */
fun obtainZLevelReference(renderEntity: RenderEntity) {
if(renderEntity!=null&&renderEntity.properties.containsKey("zlevelList")) {
// 获取ZLevelList数据
val zLevelList = JSONArray(renderEntity.properties["zlevelList"])
for (i in 0 until zLevelList.length()) {
val zLevelObject = zLevelList.getJSONObject(i)
// 获取ZLevelObject的startEnd字段值
val startEnd = zLevelObject.optInt("startEnd", 0)
val zLevel = zLevelObject.optInt("zlevel", 0)
val shpSeqNum = zLevelObject.optInt("shpSeqNum", 0)
val linkGeometry = GeometryTools.createGeometry(zLevelObject.optString("linkGeometry"))
val coordinates = linkGeometry!!.coordinates
val referenceEntityList = mutableListOf<ReferenceEntity>()
// 判断当前数据的startEnd如果是0则向前和向后都绘制线如果是1起点则只绘制前两个点组成的线如果是2终点则只绘制后两个点组成的线
if (startEnd == 0 || startEnd == 1) { // 处理向后的线
val zLevelReference = createZLevelReference(renderEntity)
zLevelReference.properties["type"] = "zlevelLine"
// zLevelReference.properties["name"] = zLevel.toString()
// 根据shpSeqNum获取对应的点位
if (shpSeqNum < coordinates.size-1) {
val currentCoordinate = coordinates[shpSeqNum]
var nextCoordinate = coordinates[shpSeqNum+1]
// 计算两个点的距离,如果小于指定阈值,程序按照方向计算延长线
// if (GeometryTools.getDistance(currentCoordinate.y, currentCoordinate.x, nextCoordinate.y, nextCoordinate.x) < 3.0) {
// 获取当前点到下一个点的线方向
val angle = Angle.angle(currentCoordinate, nextCoordinate)
// 计算偏移距离
val dx: Double = GeometryTools.convertDistanceToDegree(
3.0,
currentCoordinate.y!!
) * Math.cos(angle)
val dy: Double = GeometryTools.convertDistanceToDegree(
3.0,
currentCoordinate.y!!
) * Math.sin(angle)
// 计算偏移后的点
nextCoordinate =
Coordinate(currentCoordinate.getX() + dx, currentCoordinate.getY() + dy)
// }
zLevelReference.geometry = GeometryTools.createLineString(arrayListOf(GeoPoint(currentCoordinate.y, currentCoordinate.x), GeoPoint(nextCoordinate.y, nextCoordinate.x))).toString()
referenceEntityList.add(zLevelReference)
val zLevelNameReference = createZLevelReference(renderEntity)
zLevelNameReference.properties["type"] = "zlevelName"
zLevelNameReference.properties["name"] = zLevel.toString()
zLevelNameReference.geometry = GeometryTools.createGeometry(GeoPoint(nextCoordinate.y, nextCoordinate.x)).toString()
referenceEntityList.add(zLevelNameReference)
}
}
if (startEnd == 0 || startEnd == 2) { // 处理向前的线
val zLevelReference = createZLevelReference(renderEntity)
zLevelReference.properties["type"] = "zlevelLine"
// zLevelReference.properties["name"] = zLevel.toString()
// 根据shpSeqNum获取对应的点位
if (shpSeqNum < coordinates.size&&shpSeqNum>0) {
val currentCoordinate = coordinates[shpSeqNum]
var preCoordinate = coordinates[shpSeqNum-1]
// 计算两个点的距离,如果小于指定阈值,程序按照方向计算延长线
// if (GeometryTools.getDistance(currentCoordinate.y, currentCoordinate.x, preCoordinate.y, preCoordinate.x) < 3.0) {
// 获取当前点到下一个点的线方向
val angle = Angle.angle(currentCoordinate, preCoordinate)
// 计算偏移距离
val dx: Double = GeometryTools.convertDistanceToDegree(
3.0,
currentCoordinate.y!!
) * Math.cos(angle)
val dy: Double = GeometryTools.convertDistanceToDegree(
3.0,
currentCoordinate.y!!
) * Math.sin(angle)
// 计算偏移后的点
preCoordinate =
Coordinate(currentCoordinate.getX() + dx, currentCoordinate.getY() + dy)
// }
zLevelReference.geometry = GeometryTools.createLineString(arrayListOf(GeoPoint(currentCoordinate.y, currentCoordinate.x), GeoPoint(preCoordinate.y, preCoordinate.x))).toString()
referenceEntityList.add(zLevelReference)
val zLevelNameReference = createZLevelReference(renderEntity)
zLevelNameReference.properties["type"] = "zlevelName"
zLevelNameReference.properties["name"] = zLevel.toString()
zLevelNameReference.geometry = GeometryTools.createGeometry(GeoPoint(preCoordinate.y, preCoordinate.x)).toString()
referenceEntityList.add(zLevelNameReference)
}
}
insertData(referenceEntityList)
// 移除zlevelList减小原始数据大小
renderEntity.properties.remove("zlevelList")
}
}
}
private fun createZLevelReference(renderEntity: RenderEntity): ReferenceEntity {
val zLevelReference = ReferenceEntity()
zLevelReference.renderEntityId = renderEntity.id
zLevelReference.name = "${renderEntity.name}参考点"
zLevelReference.code = renderEntity.code
zLevelReference.table = renderEntity.table
zLevelReference.zoomMin = renderEntity.zoomMin
zLevelReference.zoomMax = renderEntity.zoomMax
zLevelReference.taskId = renderEntity.taskId
zLevelReference.enable = renderEntity.enable
zLevelReference.properties["qi_table"] = renderEntity.table
return zLevelReference
}
} }

View File

@@ -1,14 +1,18 @@
package com.navinfo.omqs.http.taskdownload package com.navinfo.omqs.http.taskdownload
import android.os.Handler
import android.os.Message
import android.util.Log import android.util.Log
import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.MutableLiveData import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.Observer import androidx.lifecycle.Observer
import androidx.lifecycle.viewmodel.viewModelFactory
import com.blankj.utilcode.util.MapUtils import com.blankj.utilcode.util.MapUtils
import com.navinfo.collect.library.data.entity.TaskBean import com.navinfo.collect.library.data.entity.TaskBean
import com.navinfo.collect.library.utils.MapParamUtils import com.navinfo.collect.library.utils.MapParamUtils
import com.navinfo.omqs.Constant import com.navinfo.omqs.Constant
import com.navinfo.omqs.db.ImportOMDBHelper import com.navinfo.omqs.db.ImportOMDBHelper
import com.navinfo.omqs.db.MultiPathsCallback
import com.navinfo.omqs.db.RealmOperateHelper import com.navinfo.omqs.db.RealmOperateHelper
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
@@ -155,20 +159,50 @@ class TaskDownloadScope(
fileNew fileNew
) )
if (task != null) { if (task != null) {
if (importOMDBHelper.importOmdbZipFile(importOMDBHelper.omdbFile, task, this)) { importOMDBHelper.importOmdbZipFile(
// if (it == "finish") { importOMDBHelper.omdbFile,
change(FileDownloadStatus.DONE) task,
Log.e("jingo", "数据安装结束") this,
withContext(Dispatchers.Main) { object : MultiPathsCallback<String> {
//任务与当前一致,需要更新渲染图层 override fun onProgress(value: Int) {
if (MapParamUtils.getTaskId() == taskBean.id) { Log.e("jingo", "安装====$value")
downloadManager.mapController.layerManagerHandler.updateOMDBVectorTileLayer()
} }
}
} else { override fun onError(t: Throwable) {
change(FileDownloadStatus.IMPORTING, "anzhuang") }
}
// } override fun onComplete() {
taskBean.status = FileDownloadStatus.DONE
downloadData.postValue(taskBean)
//任务与当前一致,需要更新渲染图层
if (MapParamUtils.getTaskId() == taskBean.id) {
downloadManager.mapController.layerManagerHandler.updateOMDBVectorTileLayer()
}
val realm = realmOperateHelper.getRealmDefaultInstance()
realm.executeTransaction { r ->
val newTask =
realm.where(TaskBean::class.java).equalTo("id", taskBean.id)
.findFirst()
newTask?.let {
it.syncStatus = taskBean.syncStatus
it.status = taskBean.status
it.errMsg = taskBean.errMsg
//赋值时间,用于查询过滤
it.operationTime = taskBean.operationTime
r.copyToRealmOrUpdate(it)
taskBean = realm.copyFromRealm(it)
}
}
realm.close()
}
override fun onResult(value: String) {
taskBean.status = FileDownloadStatus.IMPORTING
taskBean.message = value
downloadData.postValue(taskBean)
}
})
} }
} catch (e: Exception) { } catch (e: Exception) {
Log.e("jingo", "数据安装失败 ${e.toString()}") Log.e("jingo", "数据安装失败 ${e.toString()}")

File diff suppressed because one or more lines are too long

View File

@@ -70,6 +70,18 @@ import kotlin.concurrent.fixedRateTimer
* 创建Activity全局viewmode * 创建Activity全局viewmode
*/ */
enum class LoadDataStatus {
/**
* 加载开始
*/
LOAD_DATA_STATUS_BEGIN,
/**
* 加载结束
*/
LOAD_DATA_STATUS_FISISH,
}
@HiltViewModel @HiltViewModel
class MainViewModel @Inject constructor( class MainViewModel @Inject constructor(
private val mapController: NIMapController, private val mapController: NIMapController,
@@ -97,6 +109,9 @@ class MainViewModel @Inject constructor(
//地图点击捕捉到的轨迹列表 //地图点击捕捉到的轨迹列表
val liveDataNILocationList = MutableLiveData<NiLocation>() val liveDataNILocationList = MutableLiveData<NiLocation>()
//加载数据
val liveDataLoadData = MutableLiveData<LoadDataStatus>()
//左侧看板数据 //左侧看板数据
val liveDataSignList = MutableLiveData<List<SignBean>>() val liveDataSignList = MutableLiveData<List<SignBean>>()
@@ -251,8 +266,6 @@ class MainViewModel @Inject constructor(
private val naviMutex = Mutex() private val naviMutex = Mutex()
private var testRealm: Realm? = null; private var testRealm: Realm? = null;
private var traceCount = 0
init { init {
mapController.mMapView.vtmMap.events.bind(Map.UpdateListener { e, mapPosition -> mapController.mMapView.vtmMap.events.bind(Map.UpdateListener { e, mapPosition ->
when (e) { when (e) {
@@ -279,6 +292,10 @@ class MainViewModel @Inject constructor(
object : OnGeoPointClickListener { object : OnGeoPointClickListener {
override fun onMapClick(tag: String, point: GeoPoint) { override fun onMapClick(tag: String, point: GeoPoint) {
if (tag == TAG) { if (tag == TAG) {
//数据安装时不允许操作数据
if(Constant.INSTALL_DATA){
return
}
if (bMeasuringTool) { if (bMeasuringTool) {
mapController.measureLayerHandler.addPoint(measuringType, point) mapController.measureLayerHandler.addPoint(measuringType, point)
} else { } else {
@@ -329,6 +346,7 @@ class MainViewModel @Inject constructor(
}) })
viewModelScope.launch(Dispatchers.IO) { viewModelScope.launch(Dispatchers.IO) {
liveDataLoadData.postValue(LoadDataStatus.LOAD_DATA_STATUS_BEGIN)
getTaskBean() getTaskBean()
//初始化选中的任务高亮高亮 //初始化选中的任务高亮高亮
if (currentTaskBean != null) { if (currentTaskBean != null) {
@@ -337,6 +355,7 @@ class MainViewModel @Inject constructor(
initQsRecordData() initQsRecordData()
initNoteData() initNoteData()
initNILocationData() initNILocationData()
liveDataLoadData.postValue(LoadDataStatus.LOAD_DATA_STATUS_FISISH)
} }
sharedPreferences.registerOnSharedPreferenceChangeListener(this) sharedPreferences.registerOnSharedPreferenceChangeListener(this)
MapParamUtils.setTaskId(sharedPreferences.getInt(Constant.SELECT_TASK_ID, -1)) MapParamUtils.setTaskId(sharedPreferences.getInt(Constant.SELECT_TASK_ID, -1))
@@ -568,12 +587,18 @@ class MainViewModel @Inject constructor(
for (location in list) { for (location in list) {
Constant.TRACE_COUNT++ Constant.TRACE_COUNT++
if(Constant.TRACE_COUNT%Constant.TRACE_COUNT_MORE_TIME==0){
mapController.markerHandle.addNiLocationMarkerItemRough(location)
Log.e("qj","${Constant.TRACE_COUNT}===轨迹")
}
if(Constant.TRACE_COUNT%Constant.TRACE_COUNT_TIME==0){
mapController.markerHandle.addNiLocationMarkerItemSimple(location)
Log.e("qj","${Constant.TRACE_COUNT}===轨迹")
}
mapController.markerHandle.addNiLocationMarkerItem(location) mapController.markerHandle.addNiLocationMarkerItem(location)
if (Constant.TRACE_COUNT % Constant.TRACE_COUNT_TIME == 0) {
mapController.markerHandle.addNiLocationMarkerItemSimple(location)
Log.e("qj", "$traceCount===轨迹")
}
} }
} }
} }
@@ -636,23 +661,22 @@ class MainViewModel @Inject constructor(
lastNiLocaion!!.longitude lastNiLocaion!!.longitude
) )
} }
//室内整理工具时不能进行轨迹存储,判断轨迹间隔要超过2.5并小于60米 //室内整理工具时不能进行轨迹存储,判断轨迹间隔要超过6并小于60米
if (Constant.INDOOR_IP.isEmpty() && (disance == 0.0 || (disance > 2.5 && disance < 60))) { if (Constant.INDOOR_IP.isEmpty() && (disance == 0.0 || (disance > 6.0 && disance < 60))) {
traceCount++
Log.e("jingo", "轨迹插入开始") Log.e("jingo", "轨迹插入开始")
CMLog.writeLogtoFile(MainViewModel::class.java.name, "insertTrace", "开始") CMLog.writeLogtoFile(MainViewModel::class.java.name,"insertTrace","开始")
traceDataBase.niLocationDao.insert(location) traceDataBase.niLocationDao.insert(location)
mapController.markerHandle.addNiLocationMarkerItem(location) mapController.markerHandle.addNiLocationMarkerItem(location)
if (Constant.TRACE_COUNT % Constant.TRACE_COUNT_TIME == 0) {
if(Constant.TRACE_COUNT%Constant.TRACE_COUNT_TIME==0){
mapController.markerHandle.addNiLocationMarkerItemSimple(location) mapController.markerHandle.addNiLocationMarkerItemSimple(location)
} }
if(Constant.TRACE_COUNT%Constant.TRACE_COUNT_MORE_TIME==0){
mapController.markerHandle.addNiLocationMarkerItemRough(location)
}
mapController.mMapView.vtmMap.updateMap(true) mapController.mMapView.vtmMap.updateMap(true)
lastNiLocaion = location lastNiLocaion = location
CMLog.writeLogtoFile( CMLog.writeLogtoFile(MainViewModel::class.java.name,"insertTrace",gson.toJson(location))
MainViewModel::class.java.name,
"insertTrace",
gson.toJson(location)
)
Log.e("jingo", "轨迹插入结束") Log.e("jingo", "轨迹插入结束")
} }
} }
@@ -830,7 +854,7 @@ class MainViewModel @Inject constructor(
*/ */
private suspend fun captureLink(point: GeoPoint) { private suspend fun captureLink(point: GeoPoint) {
if (captureLinkState) { if (captureLinkState||Constant.INSTALL_DATA) {
return return
} }

View File

@@ -196,7 +196,7 @@ class PersonalCenterFragment(private var indoorDataListener: ((Boolean) -> Unit?
// 定位到指定位置 // 定位到指定位置
niMapController.mMapView.vtmMap.animator() niMapController.mMapView.vtmMap.animator()
// .animateTo(GeoPoint( 40.05108004733645, 116.29187746293708 )) // .animateTo(GeoPoint( 40.05108004733645, 116.29187746293708 ))
.animateTo(GeoPoint(31.205913609396507, 121.56955739056055 )) .animateTo(GeoPoint(39.63769191655024, 115.58991663847937))
} }
R.id.personal_center_menu_open_all_layer -> { R.id.personal_center_menu_open_all_layer -> {

View File

@@ -11,6 +11,7 @@ import com.navinfo.omqs.bean.ScProblemTypeBean
import com.navinfo.omqs.bean.ScRootCauseAnalysisBean import com.navinfo.omqs.bean.ScRootCauseAnalysisBean
import com.navinfo.omqs.bean.ScWarningCodeBean import com.navinfo.omqs.bean.ScWarningCodeBean
import com.navinfo.omqs.db.ImportOMDBHelper import com.navinfo.omqs.db.ImportOMDBHelper
import com.navinfo.omqs.db.MultiPathsCallback
import com.navinfo.omqs.db.RealmOperateHelper import com.navinfo.omqs.db.RealmOperateHelper
import com.navinfo.omqs.db.RoomAppDatabase import com.navinfo.omqs.db.RoomAppDatabase
import com.navinfo.omqs.tools.MetadataUtils import com.navinfo.omqs.tools.MetadataUtils
@@ -152,11 +153,36 @@ class PersonalCenterViewModel @Inject constructor(
viewModelScope.launch(Dispatchers.IO) { viewModelScope.launch(Dispatchers.IO) {
Log.d("OMQSApplication", "开始导入数据") Log.d("OMQSApplication", "开始导入数据")
if (task != null) { if (task != null) {
importOMDBHelper.importOmdbZipFile(importOMDBHelper.omdbFile, task, this) importOMDBHelper.importOmdbZipFile(importOMDBHelper.omdbFile, task, this,object :MultiPathsCallback<String>{
override fun onProgress(value: Int) {
}
override fun onResult(value: String) {
}
override fun onError(t: Throwable) {
}
override fun onComplete() {
}
})
} else { } else {
val newTask = TaskBean() val newTask = TaskBean()
newTask.id = -1 newTask.id = -1
importOMDBHelper.importOmdbZipFile(importOMDBHelper.omdbFile, newTask, this) importOMDBHelper.importOmdbZipFile(importOMDBHelper.omdbFile, newTask, this,object :MultiPathsCallback<String>{
override fun onProgress(value: Int) {
}
override fun onResult(value: String) {
}
override fun onError(t: Throwable) {
}
override fun onComplete() {
}
})
} }
Log.d("OMQSApplication", "导入数据完成") Log.d("OMQSApplication", "导入数据完成")

View File

@@ -325,18 +325,19 @@ class TaskListAdapter(
if (binding.taskProgressText.visibility != View.VISIBLE) binding.taskProgressText.visibility = if (binding.taskProgressText.visibility != View.VISIBLE) binding.taskProgressText.visibility =
View.VISIBLE View.VISIBLE
binding.taskDownloadBtn.setText("安装中") binding.taskDownloadBtn.setText("安装中")
Log.e("jingo", "更新进度条 ${taskBean.message}")
val split = taskBean.message.split("/") val split = taskBean.message.split("/")
if (split.size == 2) { if (split.size == 2) {
try { try {
val index = split[0].toInt() val index = split[0].toInt()
val count = split[1].toInt() val count = split[1].toInt()
binding.taskProgressText.text = Log.e("jingo", "更新进度条 $index====$count")
"${index * 100 / count}%" binding.taskProgressText.text = "${index * 100 / count}%"
} catch (e: Exception) { } catch (e: Exception) {
Log.e("jingo", "更新进度条 $e") Log.e("jingo", "更新进度条 $e")
} }
} else { } else {
binding.taskProgressText.text = "0%" binding.taskProgressText.text = taskBean.message
} }
val errMsg = taskBean.errMsg val errMsg = taskBean.errMsg
if (errMsg != null && errMsg.isNotEmpty()) { if (errMsg != null && errMsg.isNotEmpty()) {

View File

@@ -145,6 +145,17 @@ class TaskListFragment : BaseFragment() {
binding.taskListRecyclerview.smoothScrollToPosition(position) binding.taskListRecyclerview.smoothScrollToPosition(position)
} }
viewModel.liveDataLoadTask.observe(viewLifecycleOwner){
when(it){
TaskLoadStatus.TASK_LOAD_STATUS_BEGIN->{
showLoadingDialog("正在切换任务")
}
TaskLoadStatus.TASK_LOAD_STATUS_FISISH->{
hideLoadingDialog()
}
}
}
viewModel.liveDataCloseTask.observe(viewLifecycleOwner){ viewModel.liveDataCloseTask.observe(viewLifecycleOwner){
when(it){ when(it){
TaskDelStatus.TASK_DEL_STATUS_BEGIN->{ TaskDelStatus.TASK_DEL_STATUS_BEGIN->{

View File

@@ -59,6 +59,18 @@ enum class TaskDelStatus {
TASK_DEL_STATUS_CANCEL, TASK_DEL_STATUS_CANCEL,
} }
enum class TaskLoadStatus {
/**
* 加载开始
*/
TASK_LOAD_STATUS_BEGIN,
/**
* 加载结束
*/
TASK_LOAD_STATUS_FISISH,
}
@HiltViewModel @HiltViewModel
class TaskViewModel @Inject constructor( class TaskViewModel @Inject constructor(
private val networkService: NetworkService, private val networkService: NetworkService,
@@ -90,6 +102,11 @@ class TaskViewModel @Inject constructor(
*/ */
val liveDataCloseTask = MutableLiveData<TaskDelStatus>() val liveDataCloseTask = MutableLiveData<TaskDelStatus>()
/**
* 用来确定是否加载
*/
val liveDataLoadTask = MutableLiveData<TaskLoadStatus>()
/** /**
* 用来更新任务 * 用来更新任务
*/ */
@@ -317,7 +334,11 @@ class TaskViewModel @Inject constructor(
currentSelectTaskBean = taskBean currentSelectTaskBean = taskBean
liveDataTaskLinks.value = taskBean.hadLinkDvoList liveDataTaskLinks.value = taskBean.hadLinkDvoList
liveDataLoadTask.postValue(TaskLoadStatus.TASK_LOAD_STATUS_BEGIN)
showTaskLinks(taskBean) showTaskLinks(taskBean)
//重新加载轨迹 //重新加载轨迹
viewModelScope.launch(Dispatchers.IO) { viewModelScope.launch(Dispatchers.IO) {
Constant.TRACE_COUNT = 0 Constant.TRACE_COUNT = 0
@@ -328,22 +349,30 @@ class TaskViewModel @Inject constructor(
Constant.TRACE_COUNT ++ Constant.TRACE_COUNT ++
mapController.markerHandle.addNiLocationMarkerItem(it) if(Constant.TRACE_COUNT%Constant.TRACE_COUNT_MORE_TIME==0){
mapController.markerHandle.addNiLocationMarkerItemRough(it)
}
if(Constant.TRACE_COUNT%Constant.TRACE_COUNT_TIME==0){ if(Constant.TRACE_COUNT%Constant.TRACE_COUNT_TIME==0){
mapController.markerHandle.addNiLocationMarkerItemSimple(it) mapController.markerHandle.addNiLocationMarkerItemSimple(it)
} }
mapController.markerHandle.addNiLocationMarkerItem(it)
}
liveDataLoadTask.postValue(TaskLoadStatus.TASK_LOAD_STATUS_FISISH)
withContext(Dispatchers.Main){
MapParamUtils.setTaskId(taskBean.id)
Constant.currentSelectTaskFolder = File(Constant.USER_DATA_PATH + "/${taskBean.id}")
Constant.currentSelectTaskConfig =
RealmConfiguration.Builder().directory(Constant.currentSelectTaskFolder)
.name("OMQS.realm").encryptionKey(Constant.PASSWORD).allowQueriesOnUiThread(true)
.schemaVersion(2).build()
MapParamUtils.setTaskConfig(Constant.currentSelectTaskConfig)
mapController.layerManagerHandler.updateOMDBVectorTileLayer()
mapController.mMapView.updateMap(true)
} }
} }
MapParamUtils.setTaskId(taskBean.id)
Constant.currentSelectTaskFolder = File(Constant.USER_DATA_PATH + "/${taskBean.id}")
Constant.currentSelectTaskConfig =
RealmConfiguration.Builder().directory(Constant.currentSelectTaskFolder)
.name("OMQS.realm").encryptionKey(Constant.PASSWORD).allowQueriesOnUiThread(true)
.schemaVersion(2).build()
MapParamUtils.setTaskConfig(Constant.currentSelectTaskConfig)
mapController.layerManagerHandler.updateOMDBVectorTileLayer()
mapController.mMapView.updateMap(true)
} }

View File

@@ -120,6 +120,7 @@ dependencies {
api 'org.locationtech.jts:jts-core:1.19.0' api 'org.locationtech.jts:jts-core:1.19.0'
implementation 'com.squareup.okhttp3:okhttp:5.0.0-alpha.11' implementation 'com.squareup.okhttp3:okhttp:5.0.0-alpha.11'
implementation 'com.squareup.okio:okio:3.3.0' implementation 'com.squareup.okio:okio:3.3.0'
implementation 'com.alibaba:fastjson:1.2.73'
implementation "com.fasterxml.jackson.core:jackson-annotations:2.9.9" implementation "com.fasterxml.jackson.core:jackson-annotations:2.9.9"
implementation "com.fasterxml.jackson.core:jackson-core:2.9.9" implementation "com.fasterxml.jackson.core:jackson-core:2.9.9"

View File

@@ -1558,11 +1558,6 @@
<symbol repeat="false" repeat-start="0" repeat-gap="2000" <symbol repeat="false" repeat-start="0" repeat-gap="2000"
src="@symbol" symbol-height="24" degree="90"></symbol> src="@symbol" symbol-height="24" degree="90"></symbol>
</m> </m>
<!-- 车信CLM -->
<m v="OMDB_CLM_LANEINFO" >
<symbol repeat="false" repeat-start="0" repeat-gap="2000"
src="@symbol" symbol-height="24" degree="90"></symbol>
</m>
<!-- 杆状物 --> <!-- 杆状物 -->
<m v="OMDB_POLE"> <m v="OMDB_POLE">
<symbol src="assets:omdb/icon_pole_3006.svg" symbol-height="56" symbol-width="56"></symbol> <symbol src="assets:omdb/icon_pole_3006.svg" symbol-height="56" symbol-width="56"></symbol>
@@ -2063,17 +2058,38 @@
</m> </m>
</m> </m>
<!-- zLevel -->
<m v="OMDB_ZLEVEL">
<m k="type" v="zlevelLine">
<line stroke="#59feb8" width="0.2" />
</m>
<m k="type" v="zlevelName">
<caption k="name" fill="#000000" stroke="#f1fe59" size="12" priority="0" ></caption>
</m>
<m k="linkPid">
<circle radius="3" stroke="#000000" fill="#ffffff"></circle>
</m>
</m>
<!-- 车道类型 --> <!-- 车道类型 -->
<m v="OMDB_LANE_TYPE_ACCESS"> <m v="OMDB_LANE_TYPE_ACCESS">
<m k="laneLinkPid"> <m k="bike">
<line width="0.1" stroke="#cccccc" stipple-width="0.1" stipple-stroke="#cccccc"></line> <line fix="true" width="3" stroke="#cccccc"></line>
</m> </m>
<m k="type" v="s_2_p"> <m k="type" v="s_acc">
<symbol src="assets:omdb/icon_2092_s.svg" symbol-height="32" <symbol src="assets:omdb/icon_2092_acc_s.svg" symbol-height="32"
symbol-width="32" gland="true"></symbol> symbol-width="32" gland="true"></symbol>
</m> </m>
<m k="type" v="e_2_p"> <m k="type" v="e_acc">
<symbol src="assets:omdb/icon_2092_e.svg" symbol-height="32" <symbol src="assets:omdb/icon_2092_acc_e.svg" symbol-height="32"
symbol-width="32" gland="true"></symbol>
</m>
<m k="type" v="s_dec">
<symbol src="assets:omdb/icon_2092_dec_s.svg" symbol-height="32"
symbol-width="32" gland="true"></symbol>
</m>
<m k="type" v="e_dec">
<symbol src="assets:omdb/icon_2092_dec_e.svg" symbol-height="32"
symbol-width="32" gland="true"></symbol> symbol-width="32" gland="true"></symbol>
</m> </m>
</m> </m>

View File

@@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8"?><svg id="b" xmlns="http://www.w3.org/2000/svg" width="51" height="51" viewBox="0 0 51 51"><g id="c"><circle cx="25.5" cy="25.5" r="24.5" style="fill:#0e992b; stroke-width:0px;"/><path d="m25.5,2c13,0,23.5,10.5,23.5,23.5s-10.5,23.5-23.5,23.5S2,38.5,2,25.5,12.5,2,25.5,2m0-2h0C11.4,0,0,11.4,0,25.5h0c0,14.1,11.4,25.5,25.5,25.5h0c14.1,0,25.5-11.4,25.5-25.5h0C51,11.4,39.6,0,25.5,0h0Z" style="fill:#02441e; stroke-width:0px;"/><path d="m6.4,16.1c.2.1.7.6,1.1.9l1.2-1.4,4,3.6c.7.7.6,1,0,1.8l-.3.4-.9-.4.3-.4c.3-.4.3-.6-.1-1-.3-.3-2.7-2.5-3-2.7l-.7.8c2.1,2,2.8,3,3.6,5l-.9.3c-.6-1.8-1.3-2.8-3.3-4.6l-.6.8-.7-.6.7-.8c-.4-.4-.9-.8-1.1-1l.6-.6Zm4.3-3.6l5.4,4.6-.6.6-.5-.4-.9,1.1.5.4-.6.7-5.4-4.6,2-2.4Zm3.7,4.3l-3.6-3-.9,1.1,3.6,3,.9-1.1Z" style="fill:#fff; stroke-width:0px;"/><path d="m17.1,10.6c-.3-.4-1.1-1.1-1.5-1.4l.5-.6c.4.3,1.1.9,1.5,1.3l-.5.7Zm7.4,2.8v.9c-1.2.4-2.4.7-3.6,1-1.1.3-1.7.2-2.5-.4-.2.5-.5,1-.7,1.4l-.7-.6c.3-.5.6-.9.8-1.4l-.6-2.3-.9.2-.2-.9,1.7-.5.8,3.1c.7.6,1.2.7,2.3.4,1.3-.3,2.5-.7,3.7-1.1Zm-5.8.4c.6-.5,1.2-1.3,1.5-2l-1.5.4-.6-2.3,1.8-.5-.2-.6-2,.5-.2-.8,2-.5-.2-.8.8-.2.2.7,2.1-.5.2.8-2.1.5.2.6,1.8-.5.6,2.3-1.8.5v.5c.1,0,.3-.5.3-.5.5.2,1.5.6,2.2.8l-.2.9c-.6-.3-1.5-.7-2.1-.9l.4,1.6-.8.2-.4-1.6c-.3.7-.8,1.3-1.3,1.8l-.7-.6Zm.6-2.5l1-.3-.2-.8-1,.3.2.8Zm1.6-1.3l.2.8,1.1-.3-.2-.8-1.1.3Z" style="fill:#fff; stroke-width:0px;"/><path d="m33.4,15.9l-2.9-1.1-.5,1.4-.8-.3.5-1.4-3.3-1.2.3-.8,3.3,1.2.4-1.1-2.4-.9.3-.8c.4-.3,1-.8,1.6-1.3l-1.4-.5.3-.8,1.8.7c.4-.4.7-.8.9-1.1l.8.6c-.2.3-.5.6-.7.8l3.6,1.4-.3.8-4-1.5c-.5.5-1.1,1-1.5,1.3l1.4.5.5-1.3.8.4-.5,1.2,2.2.8-.3.8-2.2-.8-.4,1.1,2.9,1.1-.3.8Z" style="fill:#fff; stroke-width:0px;"/><path d="m39.2,23.6l-.8.3c-.8-1-1.5-2-2.3-3.1-.6-1-.8-1.5-.5-2.5-.5,0-1,0-1.5-.2l.3-.9c.5,0,1.1.2,1.7.2l1.9-1.3-.5-.7.8-.5,1,1.4-2.6,1.8c-.4.9-.2,1.4.4,2.3.7,1.1,1.5,2.1,2.3,3.2Zm2.4-5.9l-1.2-1.7.6-.4.8,1.1c0-.3.2-.6.3-.9l.8.2c0,.4-.2.7-.3,1.1h-.5c0,0,.6.8.6.8.5,0,1.2,0,1.5,0v.9c-.2,0-.5,0-.9,0l.8,1.2-.6.4-1.4-2c-.2,0-.4.1-.5.2l1.1,1.6-3.5,2.5-2.5-3.5,3.5-2.5.8,1.2.6-.2Zm-2.4,3.9l.4-.3-1.5-2.1-.4.3,1.5,2.1Zm-.5-2.8l1.5,2.1.4-.3-1.5-2.1-.4.3Zm.6-3.1c.2-.5.6-1.4.8-2l.8.3c-.1.5-.5,1.4-.7,1.9l-.9-.2Zm2.3,4.2l-1.5-2.1-.4.3,1.5,2.1.4-.3Z" style="fill:#fff; stroke-width:0px;"/><path d="m23.4,37.1v.9c-.8.1-5.1.9-6,1.1v-1.7c.7-.1,5-.9,6-1.1v.8Zm-5.5-6.6l-.4-1.7c.3-.1.5-.3.6-.5.4-.5,1.6-2.7,2.3-4.7l1.5.6c-.6,1.5-1.7,3.5-2.4,4.5.3,0,1.1,0,1.7-.1.5-.9.9-1.7,1.2-2.4l1.4.6c-.9,2-2.6,4.9-3.4,6.2.6-.1,2-.4,2.4-.5v1.7c-.3,0-2.4.4-3.3.6-.4,0-.8.2-1.1.2l-.4-1.8c.6-.2.6-.3.9-.7.5-.6,1-1.5,1.5-2.4-.6,0-1.3,0-1.6.1-.3,0-.5,0-.8.1Zm16.1,2.2l-.6,1.8c-2.1-.8-3.7-1.7-5.1-2.8-.6.5-1.3,1-2.2,1.4,1.2.3,3.5,1.2,4.8,1.7l-.6,1.7c-1.1-.5-3.5-1.3-4.9-1.7l.4-1.4c-.7.4-1.4.7-2.2,1.1l-.8-1.6c1.8-.7,3.1-1.4,4.2-2.2-.6-.6-1.2-1.3-1.7-2.1-.4.7-1,1.3-1.5,1.9l-.9-1.2c1.4-1.5,2.8-4,3.4-5.7l1.5.4c-.2.4-.3.8-.5,1.3h5.2v1.7c-.9,1.5-1.7,2.6-2.8,3.8,1.2.8,2.6,1.5,4.4,2.1Zm-9.5,3.6c1.8.5,5.3,1.7,7.1,2.4l-.5,1.7c-1.8-.7-5.2-2-7.1-2.4l.5-1.7Zm1.7-9.2c.6.9,1.2,1.7,2,2.5.9-.8,1.6-1.7,2.2-2.7h-4.1v.3Z" style="fill:#fff; stroke-width:0px;"/></g></svg>

After

Width:  |  Height:  |  Size: 3.0 KiB

View File

@@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8"?><svg id="b" xmlns="http://www.w3.org/2000/svg" width="51" height="51" viewBox="0 0 51 51"><g id="c"><path d="m25.5,50C12,50,1,39,1,25.5S12,1,25.5,1s24.5,11,24.5,24.5-11,24.5-24.5,24.5Z" style="fill:#0e992b; stroke-width:0px;"/><path d="m25.5,2c13,0,23.5,10.5,23.5,23.5s-10.5,23.5-23.5,23.5S2,38.5,2,25.5,12.5,2,25.5,2m0-2h0C11.4,0,0,11.4,0,25.5s11.4,25.5,25.5,25.5h0c14.1,0,25.5-11.4,25.5-25.5S39.6,0,25.5,0h0Z" style="fill:#02441e; stroke-width:0px;"/><path d="m6.4,16.1c.2.1.7.6,1.1.9l1.2-1.4,4,3.6c.7.7.6,1,0,1.8l-.3.4-.9-.4.3-.4c.3-.4.3-.6-.1-1-.3-.3-2.7-2.5-3-2.7l-.7.8c2.1,2,2.8,3,3.6,5l-.9.3c-.6-1.8-1.3-2.8-3.3-4.6l-.6.8-.7-.6.7-.8c-.4-.4-.9-.8-1.1-1l.6-.6Zm4.3-3.6l5.4,4.6-.6.6-.5-.4-.9,1.1.5.4-.6.7-5.4-4.6,2-2.4Zm3.7,4.3l-3.6-3-.9,1.1,3.6,3,.9-1.1Z" style="fill:#fff; stroke-width:0px;"/><path d="m17.1,10.6c-.3-.4-1.1-1.1-1.5-1.4l.5-.6c.4.3,1.1.9,1.5,1.3l-.5.7Zm7.4,2.8v.9c-1.2.4-2.4.7-3.6,1-1.1.3-1.7.2-2.5-.4-.2.5-.5,1-.7,1.4l-.7-.6c.3-.5.6-.9.8-1.4l-.6-2.3-.9.2-.2-.9,1.7-.5.8,3.1c.7.6,1.2.7,2.3.4,1.3-.3,2.5-.7,3.7-1.1Zm-5.8.4c.6-.5,1.2-1.3,1.5-2l-1.5.4-.6-2.3,1.8-.5-.2-.6-2,.5-.2-.8,2-.5-.2-.8.8-.2.2.7,2.1-.5.2.8-2.1.5.2.6,1.8-.5.6,2.3-1.8.5v.5c.1,0,.3-.5.3-.5.5.2,1.5.6,2.2.8l-.2.9c-.6-.3-1.5-.7-2.1-.9l.4,1.6-.8.2-.4-1.6c-.3.7-.8,1.3-1.3,1.8l-.7-.6Zm.6-2.5l1-.3-.2-.8-1,.3.2.8Zm1.6-1.3l.2.8,1.1-.3-.2-.8-1.1.3Z" style="fill:#fff; stroke-width:0px;"/><path d="m33.4,15.9l-2.9-1.1-.5,1.4-.8-.3.5-1.4-3.3-1.2.3-.8,3.3,1.2.4-1.1-2.4-.9.3-.8c.4-.3,1-.8,1.6-1.3l-1.4-.5.3-.8,1.8.7c.4-.4.7-.8.9-1.1l.8.6c-.2.3-.5.6-.7.8l3.6,1.4-.3.8-4-1.5c-.5.5-1.1,1-1.5,1.3l1.4.5.5-1.3.8.4-.5,1.2,2.2.8-.3.8-2.2-.8-.4,1.1,2.9,1.1-.3.8Z" style="fill:#fff; stroke-width:0px;"/><path d="m39.2,23.6l-.8.3c-.8-1-1.5-2-2.3-3.1-.6-1-.8-1.5-.5-2.5-.5,0-1,0-1.5-.2l.3-.9c.5,0,1.1.2,1.7.2l1.9-1.3-.5-.7.8-.5,1,1.4-2.6,1.8c-.4.9-.2,1.4.4,2.3.7,1.1,1.5,2.1,2.3,3.2Zm2.4-5.9l-1.2-1.7.6-.4.8,1.1c0-.3.2-.6.3-.9l.8.2c0,.4-.2.7-.3,1.1h-.5c0,0,.6.8.6.8.5,0,1.2,0,1.5,0v.9c-.2,0-.5,0-.9,0l.8,1.2-.6.4-1.4-2c-.2,0-.4.1-.5.2l1.1,1.6-3.5,2.5-2.5-3.5,3.5-2.5.8,1.2.6-.2Zm-2.4,3.9l.4-.3-1.5-2.1-.4.3,1.5,2.1Zm-.5-2.8l1.5,2.1.4-.3-1.5-2.1-.4.3Zm.6-3.1c.2-.5.6-1.4.8-2l.8.3c-.1.5-.5,1.4-.7,1.9l-.9-.2Zm2.3,4.2l-1.5-2.1-.4.3,1.5,2.1.4-.3Z" style="fill:#fff; stroke-width:0px;"/><path d="m33.7,37.9l-.3,1.7c-2.8.1-5.5.2-8.3.1-2.7,0-4.5-.6-5.4-2.5-.3,1-.6,2-1.1,3.1l-1.5-.6c1.1-2.5,1.6-4,1.6-7.6h1.6c0,1,0,1.9-.1,2.7.3,1,.7,1.6,1.2,2.1v-5.7h-3.5v-1.7h3.2v-2.1h-2.6v-1.6h2.6v-2.1h1.7v2.1h2.4v1.6h-2.4v2.1h2.9v1.7h-2.6v2.3h2.4v1.7h-2.4v2.6c.6.2,1.4.2,2.3.3,2.8,0,5.6,0,8.5-.1Zm-3.2-11.7h-4.7v-1.7h6.4v6.1h-4.7v3.1c0,1,.2,1.2,1,1.2.4,0,.9,0,1.3,0,1,0,1.2-.2,1.3-1.1,0-.3.1-.8.1-1.3l1.6.6c0,.4,0,.7-.2,1.3-.3,1.8-.7,2.2-2.5,2.2-.7,0-1.5,0-2.2,0-1.7,0-2.2-.7-2.2-2.6v-5.2h4.7v-2.8Z" style="fill:#fff; stroke-width:0px;"/></g></svg>

After

Width:  |  Height:  |  Size: 2.8 KiB

View File

@@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8"?><svg id="b" xmlns="http://www.w3.org/2000/svg" width="51" height="51" viewBox="0 0 51 51"><g id="c"><circle cx="25.5" cy="25.5" r="24.5" style="fill:#f24643; stroke-width:0px;"/><path d="m25.5,2c13,0,23.5,10.5,23.5,23.5s-10.5,23.5-23.5,23.5S2,38.5,2,25.5,12.5,2,25.5,2m0-2h0C11.4,0,0,11.4,0,25.5h0c0,14.1,11.4,25.5,25.5,25.5h0c14.1,0,25.5-11.4,25.5-25.5h0C51,11.4,39.6,0,25.5,0h0Z" style="fill:#510710; stroke-width:0px;"/><path d="m7.9,18.9c-.6-.3-1.8-.7-2.4-.9l.3-.8c.6.2,1.7.6,2.3.9l-.2.8Zm6.9-3.3c.2.2.4.4.6.7.6.8.6,1.1.3,1.3-.2.3-.6.4-1.5.2-.1,0-.2,0-.3-.1.1.6.2,1.2.2,1.9h-.8c0-.3,0-.5,0-.8l-1,1.1-2.1-1.8,1.2-1.4,1.8,1.5c0-.3,0-.6-.2-.9-.9-.5-1.9-1.2-3.2-2.1l-1.5,1.7,2.4,2c.7.6,1.6,1.8,1.9,2.7l-.9.2c-.3-.9-.8-1.7-1.5-2.3l-3-2.6,1.9-2.2-1-.7.5-.6.9.7.5-.6c-.3,0-.7,0-1,0v-.7c.4,0,.9,0,1.2,0v.4s.4-.5.4-.5l.6.5-1.1,1.3c.8.6,1.6,1.1,2.2,1.5-.3-.6-.7-1.1-1.2-1.7l.6-.5c.8,1,1.4,1.9,1.7,2.9.3.1.6.3.8.3.3,0,.4,0,.5,0,0,0,0-.2-.3-.6-.1-.2-.3-.4-.5-.6l.6-.3Zm-5.7,3.4c.8,1.1,1.5,2.2,2.1,3.1l-.7.5c-.6-1-1.3-2.1-2.1-3.1l.7-.5Zm1.9-2.8l-1.3,1.5-.6-.5,1.3-1.5.6.5Zm.7,1.4l-.4.5.9.8.4-.5-.9-.8Z" style="fill:#fff; stroke-width:0px;"/><path d="m17.1,10.6c-.3-.4-1.1-1.1-1.5-1.4l.5-.6c.4.3,1.1.9,1.5,1.3l-.5.7Zm7.4,2.8v.9c-1.2.4-2.4.7-3.6,1-1.1.3-1.7.2-2.5-.4-.2.5-.5,1-.7,1.4l-.7-.6c.3-.5.6-.9.8-1.4l-.6-2.3-.9.2-.2-.9,1.7-.5.8,3.1c.7.6,1.2.7,2.3.4,1.3-.3,2.5-.7,3.7-1.1Zm-5.8.4c.6-.5,1.2-1.3,1.5-2l-1.5.4-.6-2.3,1.8-.5-.2-.6-2,.5-.2-.8,2-.5-.2-.8.8-.2.2.7,2.1-.5.2.8-2.1.5.2.6,1.8-.5.6,2.3-1.8.5v.5c.1,0,.3-.5.3-.5.5.2,1.5.6,2.2.8l-.2.9c-.6-.3-1.5-.7-2.1-.9l.4,1.6-.8.2-.4-1.6c-.3.7-.8,1.3-1.3,1.8l-.7-.6Zm.6-2.5l1-.3-.2-.8-1,.3.2.8Zm1.6-1.3l.2.8,1.1-.3-.2-.8-1.1.3Z" style="fill:#fff; stroke-width:0px;"/><path d="m33.4,15.9l-2.9-1.1-.5,1.4-.8-.3.5-1.4-3.3-1.2.3-.8,3.3,1.2.4-1.1-2.4-.9.3-.8c.4-.3,1-.8,1.6-1.3l-1.4-.5.3-.8,1.8.7c.4-.4.7-.8.9-1.1l.8.6c-.2.3-.5.6-.7.8l3.6,1.4-.3.8-4-1.5c-.5.5-1.1,1-1.5,1.3l1.4.5.5-1.3.8.4-.5,1.2,2.2.8-.3.8-2.2-.8-.4,1.1,2.9,1.1-.3.8Z" style="fill:#fff; stroke-width:0px;"/><path d="m39.2,23.6l-.8.3c-.8-1-1.5-2-2.3-3.1-.6-1-.8-1.5-.5-2.5-.5,0-1,0-1.5-.2l.3-.9c.5,0,1.1.2,1.7.2l1.9-1.3-.5-.7.8-.5,1,1.4-2.6,1.8c-.4.9-.2,1.4.4,2.3.7,1.1,1.5,2.1,2.3,3.2Zm2.4-5.9l-1.2-1.7.6-.4.8,1.1c0-.3.2-.6.3-.9l.8.2c0,.4-.2.7-.3,1.1h-.5c0,0,.6.8.6.8.5,0,1.2,0,1.5,0v.9c-.2,0-.5,0-.9,0l.8,1.2-.6.4-1.4-2c-.2,0-.4.1-.5.2l1.1,1.6-3.5,2.5-2.5-3.5,3.5-2.5.8,1.2.6-.2Zm-2.4,3.9l.4-.3-1.5-2.1-.4.3,1.5,2.1Zm-.5-2.8l1.5,2.1.4-.3-1.5-2.1-.4.3Zm.6-3.1c.2-.5.6-1.4.8-2l.8.3c-.1.5-.5,1.4-.7,1.9l-.9-.2Zm2.3,4.2l-1.5-2.1-.4.3,1.5,2.1.4-.3Z" style="fill:#fff; stroke-width:0px;"/><path d="m23.4,37.1v.9c-.8.1-5.1.9-6,1.1v-1.7c.7-.1,5-.9,6-1.1v.8Zm-5.5-6.6l-.4-1.7c.3-.1.5-.3.6-.5.4-.5,1.6-2.7,2.3-4.7l1.5.6c-.6,1.5-1.7,3.5-2.4,4.5.3,0,1.1,0,1.7-.1.5-.9.9-1.7,1.2-2.4l1.4.6c-.9,2-2.6,4.9-3.4,6.2.6-.1,2-.4,2.4-.5v1.7c-.3,0-2.4.4-3.3.6-.4,0-.8.2-1.1.2l-.4-1.8c.6-.2.6-.3.9-.7.5-.6,1-1.5,1.5-2.4-.6,0-1.3,0-1.6.1-.3,0-.5,0-.8.1Zm16.1,2.2l-.6,1.8c-2.1-.8-3.7-1.7-5.1-2.8-.6.5-1.3,1-2.2,1.4,1.2.3,3.5,1.2,4.8,1.7l-.6,1.7c-1.1-.5-3.5-1.3-4.9-1.7l.4-1.4c-.7.4-1.4.7-2.2,1.1l-.8-1.6c1.8-.7,3.1-1.4,4.2-2.2-.6-.6-1.2-1.3-1.7-2.1-.4.7-1,1.3-1.5,1.9l-.9-1.2c1.4-1.5,2.8-4,3.4-5.7l1.5.4c-.2.4-.3.8-.5,1.3h5.2v1.7c-.9,1.5-1.7,2.6-2.8,3.8,1.2.8,2.6,1.5,4.4,2.1Zm-9.5,3.6c1.8.5,5.3,1.7,7.1,2.4l-.5,1.7c-1.8-.7-5.2-2-7.1-2.4l.5-1.7Zm1.7-9.2c.6.9,1.2,1.7,2,2.5.9-.8,1.6-1.7,2.2-2.7h-4.1v.3Z" style="fill:#fff; stroke-width:0px;"/></g></svg>

After

Width:  |  Height:  |  Size: 3.4 KiB

View File

@@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8"?><svg id="b" xmlns="http://www.w3.org/2000/svg" width="51" height="51" viewBox="0 0 51 51"><g id="c"><path d="m25.5,50C12,50,1,39,1,25.5S12,1,25.5,1s24.5,11,24.5,24.5-11,24.5-24.5,24.5Z" style="fill:#f24643; stroke-width:0px;"/><path d="m25.5,2c13,0,23.5,10.5,23.5,23.5s-10.5,23.5-23.5,23.5S2,38.5,2,25.5,12.5,2,25.5,2m0-2h0C11.4,0,0,11.4,0,25.5s11.4,25.5,25.5,25.5h0c14.1,0,25.5-11.4,25.5-25.5S39.6,0,25.5,0h0Z" style="fill:#510710; stroke-width:0px;"/><path d="m7.9,18.9c-.6-.3-1.8-.7-2.4-.9l.3-.8c.6.2,1.7.6,2.3.9l-.2.8Zm6.9-3.3c.2.2.4.4.6.7.6.8.6,1.1.3,1.3-.2.3-.6.4-1.5.2-.1,0-.2,0-.3-.1.1.6.2,1.2.2,1.9h-.8c0-.3,0-.5,0-.8l-1,1.1-2.1-1.8,1.2-1.4,1.8,1.5c0-.3,0-.6-.2-.9-.9-.5-1.9-1.2-3.2-2.1l-1.5,1.7,2.4,2c.7.6,1.6,1.8,1.9,2.7l-.9.2c-.3-.9-.8-1.7-1.5-2.3l-3-2.6,1.9-2.2-1-.7.5-.6.9.7.5-.6c-.3,0-.7,0-1,0v-.7c.4,0,.9,0,1.2,0v.4s.4-.5.4-.5l.6.5-1.1,1.3c.8.6,1.6,1.1,2.2,1.5-.3-.6-.7-1.1-1.2-1.7l.6-.5c.8,1,1.4,1.9,1.7,2.9.3.1.6.3.8.3.3,0,.4,0,.5,0,0,0,0-.2-.3-.6-.1-.2-.3-.4-.5-.6l.6-.3Zm-5.7,3.4c.8,1.1,1.5,2.2,2.1,3.1l-.7.5c-.6-1-1.3-2.1-2.1-3.1l.7-.5Zm1.9-2.8l-1.3,1.5-.6-.5,1.3-1.5.6.5Zm.7,1.4l-.4.5.9.8.4-.5-.9-.8Z" style="fill:#fff; stroke-width:0px;"/><path d="m17.1,10.6c-.3-.4-1.1-1.1-1.5-1.4l.5-.6c.4.3,1.1.9,1.5,1.3l-.5.7Zm7.4,2.8v.9c-1.2.4-2.4.7-3.6,1-1.1.3-1.7.2-2.5-.4-.2.5-.5,1-.7,1.4l-.7-.6c.3-.5.6-.9.8-1.4l-.6-2.3-.9.2-.2-.9,1.7-.5.8,3.1c.7.6,1.2.7,2.3.4,1.3-.3,2.5-.7,3.7-1.1Zm-5.8.4c.6-.5,1.2-1.3,1.5-2l-1.5.4-.6-2.3,1.8-.5-.2-.6-2,.5-.2-.8,2-.5-.2-.8.8-.2.2.7,2.1-.5.2.8-2.1.5.2.6,1.8-.5.6,2.3-1.8.5v.5c.1,0,.3-.5.3-.5.5.2,1.5.6,2.2.8l-.2.9c-.6-.3-1.5-.7-2.1-.9l.4,1.6-.8.2-.4-1.6c-.3.7-.8,1.3-1.3,1.8l-.7-.6Zm.6-2.5l1-.3-.2-.8-1,.3.2.8Zm1.6-1.3l.2.8,1.1-.3-.2-.8-1.1.3Z" style="fill:#fff; stroke-width:0px;"/><path d="m33.4,15.9l-2.9-1.1-.5,1.4-.8-.3.5-1.4-3.3-1.2.3-.8,3.3,1.2.4-1.1-2.4-.9.3-.8c.4-.3,1-.8,1.6-1.3l-1.4-.5.3-.8,1.8.7c.4-.4.7-.8.9-1.1l.8.6c-.2.3-.5.6-.7.8l3.6,1.4-.3.8-4-1.5c-.5.5-1.1,1-1.5,1.3l1.4.5.5-1.3.8.4-.5,1.2,2.2.8-.3.8-2.2-.8-.4,1.1,2.9,1.1-.3.8Z" style="fill:#fff; stroke-width:0px;"/><path d="m39.2,23.6l-.8.3c-.8-1-1.5-2-2.3-3.1-.6-1-.8-1.5-.5-2.5-.5,0-1,0-1.5-.2l.3-.9c.5,0,1.1.2,1.7.2l1.9-1.3-.5-.7.8-.5,1,1.4-2.6,1.8c-.4.9-.2,1.4.4,2.3.7,1.1,1.5,2.1,2.3,3.2Zm2.4-5.9l-1.2-1.7.6-.4.8,1.1c0-.3.2-.6.3-.9l.8.2c0,.4-.2.7-.3,1.1h-.5c0,0,.6.8.6.8.5,0,1.2,0,1.5,0v.8c-.2,0-.5,0-.9,0l.8,1.2-.6.4-1.4-1.9c-.2,0-.4.1-.5.2l1.1,1.6-3.5,2.5-2.5-3.5,3.5-2.5.8,1.2.6-.2Zm-2.4,3.9l.4-.3-1.5-2.1-.4.3,1.5,2.1Zm-.5-2.8l1.5,2.1.4-.3-1.5-2.1-.4.3Zm.6-3.1c.2-.4.6-1.4.8-2l.8.3c-.1.5-.5,1.4-.7,1.9l-.9-.2Zm2.3,4.2l-1.5-2.1-.4.3,1.5,2.1.4-.3Z" style="fill:#fff; stroke-width:0px;"/><path d="m33.7,37.9l-.3,1.7c-2.8.1-5.5.2-8.3.1-2.7,0-4.5-.6-5.4-2.5-.3,1-.6,2-1.1,3.1l-1.5-.6c1.1-2.5,1.6-4,1.6-7.6h1.6c0,1,0,1.9-.1,2.7.3,1,.7,1.6,1.2,2.1v-5.7h-3.5v-1.7h3.2v-2.1h-2.6v-1.6h2.6v-2.1h1.7v2.1h2.4v1.6h-2.4v2.1h2.9v1.7h-2.6v2.3h2.4v1.7h-2.4v2.6c.6.2,1.4.2,2.3.3,2.8,0,5.6,0,8.5-.1Zm-3.2-11.7h-4.7v-1.7h6.4v6.1h-4.7v3.1c0,1,.2,1.2,1,1.2.4,0,.9,0,1.3,0,1,0,1.2-.2,1.3-1.1,0-.3.1-.8.1-1.3l1.6.6c0,.4,0,.7-.2,1.3-.3,1.8-.7,2.2-2.5,2.2-.7,0-1.5,0-2.2,0-1.7,0-2.2-.7-2.2-2.6v-5.2h4.7v-2.8Z" style="fill:#fff; stroke-width:0px;"/></g></svg>

After

Width:  |  Height:  |  Size: 3.1 KiB

View File

@@ -1 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?><svg id="b" xmlns="http://www.w3.org/2000/svg" width="131.3" height="131.3" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 131.3 131.3"><defs><linearGradient id="f" x1="63.4" y1="54.8" x2="68.2" y2="54.8" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#989898"/><stop offset="0" stop-color="#a3a3a3"/><stop offset=".1" stop-color="#c4c5c5"/><stop offset=".2" stop-color="#d8d9d9"/><stop offset=".3" stop-color="#e0e1e1"/><stop offset=".4" stop-color="#dbdcdc"/><stop offset=".5" stop-color="#cccece"/><stop offset=".6" stop-color="#b5b6b7"/><stop offset=".7" stop-color="#949697"/><stop offset=".8" stop-color="#6a6c6f"/><stop offset=".8" stop-color="#3f4246"/><stop offset="1" stop-color="#404247"/><stop offset="1" stop-color="#43434a"/></linearGradient><linearGradient id="g" x1="41.1" y1="26.7" x2="90.2" y2="26.7" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#afbacb"/><stop offset=".1" stop-color="#c1ccda"/><stop offset=".4" stop-color="#d9e6f0"/><stop offset=".5" stop-color="#e3f0f8"/><stop offset=".6" stop-color="#dde9f2"/><stop offset=".8" stop-color="#ccd8e4"/><stop offset="1" stop-color="#b1bbcc"/><stop offset="1" stop-color="#aeb8c9"/></linearGradient></defs><g id="c"><g><rect width="131.3" height="131.3" style="fill:none;"/><g><ellipse id="d" cx="65.7" cy="66.2" rx="14.4" ry="3.7" style="fill:#262d34; isolation:isolate; opacity:.2;"/><ellipse id="e" cx="65.7" cy="66.2" rx="7.5" ry="3" style="fill:#535a60;"/><path d="M65.7,42.6h0c1.4,0,2.6,1.2,2.6,2.6v19.2c0,1.4-1.1,2.5-2.5,2.5h-.3c-1.4,0-2.5-1.1-2.5-2.5v-19.3c0-1.4,1.2-2.6,2.6-2.6Z" style="fill:url(#f);"/><rect x="41.1" y="1" width="49" height="51.4" rx="24.5" ry="24.5" style="fill:url(#g); stroke:#8b9fae; stroke-miterlimit:10; stroke-width:1.1px;"/><rect x="41.7" y="3.3" width="48" height="48.5" rx="24" ry="24" style="fill:#f24643; stroke:#510710; stroke-miterlimit:10;"/><g><path d="M55.5,17.7l-2.3,2.6,1.2,1-.7,.7-1.2-1-2.5,2.9-.7-.6,2.5-2.9-1-.9-1.9,2.1-.7-.6c-.1-.6-.4-1.3-.6-2.1l-1.1,1.3-.7-.6,1.4-1.6c-.2-.5-.5-1-.7-1.3l.9-.5c.2,.3,.4,.7,.5,1.1l2.8-3.2,.7,.6-3.1,3.5c.3,.8,.6,1.5,.7,2l1.1-1.3-1.1-1,.7-.7,1.1,.9,1.7-1.9,.7,.6-1.7,1.9,1,.9,2.3-2.6,.7,.6Z" style="fill:#fff;"/><path d="M57.8,11.7c-.4-.4-1.2-1.2-1.7-1.5l.6-.7c.4,.3,1.2,1,1.6,1.4l-.6,.8Zm8,3.2v.9c-1.4,.4-2.7,.7-4.1,1-1.2,.3-1.8,.2-2.7-.5-.3,.5-.5,1-.8,1.5l-.8-.6c.3-.5,.6-1,.9-1.6l-.6-2.4-1,.2-.2-.9,1.8-.4,.8,3.3c.7,.7,1.3,.7,2.4,.5,1.4-.3,2.8-.7,4.1-1.1Zm-5-4.6l-2.2,.5-.2-.8,1.5-.4c-.2-.2-.5-.4-.8-.6l.5-.7c.4,.2,.6,.4,.9,.7l-.3,.4,1.1-.3c.2-.4,.5-1.1,.6-1.4l.9,.2c0,.2-.3,.6-.4,.9l1.6-.4,.2,.8-2.5,.6c0,.2,0,.4,0,.6l2-.5,1.1,4.4-4.6,1.1-1.1-4.4,1.6-.4v-.6Zm2.3,.8l-2.7,.6v.6c.1,0,2.9-.6,2.9-.6v-.6Zm-2.4,2.4l2.7-.6v-.6c-.1,0-2.9,.6-2.9,.6v.6Zm3.1,.6v-.6c-.1,0-2.8,.6-2.8,.6v.6c.1,0,2.8-.6,2.8-.6Z" style="fill:#fff;"/><path d="M72.7,15.6c.3,.9,1.1,2,2.7,2.9l-.6,.9c-1.6-1.2-2.6-2.2-2.9-3.3-.9,.6-2.3,.6-4.5,.4v-1c2,.4,3.4,.2,4-.3l-2.9-1.1,.3-.8,3.1,1.2,.2-.6,.9,.4-.2,.5,3.1,1.2-.3,.8-2.9-1.2Zm-3.8-3.5c1.3,.1,2.5,0,3.5-.2l-2.6-1,.3-.8,1.8,.7c-.2-.5-.6-1.3-.8-1.7l.8-.4c.3,.4,.7,1.3,.9,1.8l-.6,.4,1.1,.4,.7-1.9,.9,.4-.7,1.8,1,.4-.2-.6c.6-.2,1.4-.5,1.9-.8l.4,.8c-.4,.2-1.2,.5-1.8,.7l1.8,.7-.3,.8-3.1-1.2-.6,1.5-.9-.3,.3-.8c-1,.3-2.1,.3-3.7,.3v-1Zm5.2,.6c.6,.6,2,1.8,2.6,2.4l-.6,.7c-.6-.7-1.9-1.8-2.5-2.5l.5-.6Z" style="fill:#fff;"/><path d="M81.6,26.4l-.7,.5-4.7-6.9,.7-.5,2.1,3.1,.9-.6-1.5-2.3,.7-.5,1.5,2.3,.5-.3,.5,.8-.4,.3,1.5,2.3-.7,.5-1.5-2.3-.9,.6,2.1,3.1Zm-2.5-8.2c.9,.2,1.4,.1,2-.1l-.6-.9,.7-.5,.6,.9h.2c0-.1,.8-.7,.8-.7l-.5-.7,.7-.5,2.5,3.7-.7,.5-.5-.7-1.1,.7,.6,.8-.7,.5-.6-.8-1.4,.9-.5-.7,1.4-.9-.6-.9c-.8,.4-1.5,.5-2.5,.3v-.9Zm3.8,4.1l.4,.6c.3,.3,.4,.4,.8,.2l3-2,.5,.8-3.2,2.1c-.7,.5-1,.4-1.6-.4l-.4-.6,.6-.7Zm-.5-3.9l.6,.9,1.1-.7-.6-.9-.8,.6h-.2Zm1.1,4.2l-.5-.7,2.8-1.9,.5,.7-2.8,1.8Z" style="fill:#fff;"/></g><path d="M63.9,38.9v.9c-.8,.1-5.1,.9-6,1.1v-1.7c.7-.1,5-.9,6-1.1v.8Zm-5.5-6.6l-.4-1.7c.3-.1,.5-.3,.6-.5,.4-.5,1.6-2.7,2.3-4.7l1.5,.6c-.6,1.5-1.7,3.5-2.4,4.5,.3,0,1.1,0,1.7-.1,.5-.9,.9-1.7,1.2-2.4l1.4,.6c-.9,2-2.6,4.9-3.4,6.2,.6-.1,2-.4,2.4-.5v1.7c-.3,0-2.4,.4-3.3,.6-.4,0-.8,.2-1.1,.2l-.4-1.8c.6-.2,.6-.3,.9-.7,.5-.6,1-1.5,1.5-2.4-.6,0-1.3,0-1.6,.1-.3,0-.5,0-.8,.1Zm16.1,2.2l-.6,1.8c-2.1-.8-3.7-1.7-5.1-2.8-.6,.5-1.3,1-2.2,1.4,1.2,.3,3.5,1.2,4.8,1.7l-.6,1.7c-1.1-.5-3.5-1.3-4.9-1.7l.4-1.4c-.7,.4-1.4,.7-2.2,1.1l-.8-1.6c1.8-.7,3.1-1.4,4.2-2.2-.6-.6-1.2-1.3-1.7-2.1-.4,.7-1,1.3-1.5,1.9l-.9-1.2c1.4-1.5,2.8-4,3.4-5.7l1.5,.4c-.2,.4-.3,.8-.5,1.3h5.2v1.7c-.9,1.5-1.7,2.6-2.8,3.8,1.2,.8,2.6,1.5,4.4,2.1Zm-9.5,3.6c1.8,.5,5.3,1.7,7.1,2.4l-.5,1.7c-1.8-.7-5.2-2-7.1-2.4l.5-1.7Zm1.7-9.2c.6,.9,1.2,1.7,2,2.5,.9-.8,1.6-1.7,2.2-2.7h-4.1v.3Z" style="fill:#fff;"/></g></g></g></svg>

Before

Width:  |  Height:  |  Size: 4.6 KiB

View File

@@ -1 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?><svg id="b" xmlns="http://www.w3.org/2000/svg" width="131.3" height="131.3" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 131.3 131.3"><defs><linearGradient id="f" x1="63.4" y1="54.8" x2="68.2" y2="54.8" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#989898"/><stop offset="0" stop-color="#a3a3a3"/><stop offset=".1" stop-color="#c4c5c5"/><stop offset=".2" stop-color="#d8d9d9"/><stop offset=".3" stop-color="#e0e1e1"/><stop offset=".4" stop-color="#dbdcdc"/><stop offset=".5" stop-color="#cccece"/><stop offset=".6" stop-color="#b5b6b7"/><stop offset=".7" stop-color="#949697"/><stop offset=".8" stop-color="#6a6c6f"/><stop offset=".8" stop-color="#3f4246"/><stop offset="1" stop-color="#404247"/><stop offset="1" stop-color="#43434a"/></linearGradient><linearGradient id="g" x1="41.1" y1="26.7" x2="90.2" y2="26.7" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#afbacb"/><stop offset=".1" stop-color="#c1ccda"/><stop offset=".4" stop-color="#d9e6f0"/><stop offset=".5" stop-color="#e3f0f8"/><stop offset=".6" stop-color="#dde9f2"/><stop offset=".8" stop-color="#ccd8e4"/><stop offset="1" stop-color="#b1bbcc"/><stop offset="1" stop-color="#aeb8c9"/></linearGradient></defs><g id="c"><g><rect width="131.3" height="131.3" style="fill:none;"/><g><ellipse id="d" cx="65.7" cy="66.2" rx="14.4" ry="3.7" style="fill:#262d34; isolation:isolate; opacity:.2;"/><ellipse id="e" cx="65.7" cy="66.2" rx="7.5" ry="3" style="fill:#535a60;"/><path d="M65.7,42.6h0c1.4,0,2.6,1.2,2.6,2.6v19.2c0,1.4-1.1,2.5-2.5,2.5h-.3c-1.4,0-2.5-1.1-2.5-2.5v-19.3c0-1.4,1.2-2.6,2.6-2.6Z" style="fill:url(#f);"/><rect x="41.1" y="1" width="49" height="51.4" rx="24.5" ry="24.5" style="fill:url(#g); stroke:#8b9fae; stroke-miterlimit:10; stroke-width:1.1px;"/><g><path d="M65.7,51.3c-12.9,0-23.5-10.5-23.5-23.5v-.6c0-12.9,10.5-23.5,23.5-23.5s23.5,10.5,23.5,23.5v.6c0,12.9-10.5,23.5-23.5,23.5Z" style="fill:#0e992b;"/><path d="M65.7,4.3c12.7,0,23,10.3,23,23v.6c0,12.7-10.3,23-23,23s-23-10.3-23-23v-.6c0-12.7,10.3-23,23-23m0-1h0c-13.2,0-24,10.7-24,24v.6c0,13.2,10.7,24,24,24h0c13.2,0,24-10.7,24-24v-.6c0-13.2-10.7-24-24-24h0Z" style="fill:#02441e;"/></g><g><path d="M55.5,17.7l-2.3,2.6,1.2,1-.7,.7-1.2-1-2.5,2.9-.7-.6,2.5-2.9-1-.9-1.9,2.1-.7-.6c-.1-.6-.4-1.3-.6-2.1l-1.1,1.3-.7-.6,1.4-1.6c-.2-.5-.5-1-.7-1.3l.9-.5c.2,.3,.4,.7,.5,1.1l2.8-3.2,.7,.6-3.1,3.5c.3,.8,.6,1.5,.7,2l1.1-1.3-1.1-1,.7-.7,1.1,.9,1.7-1.9,.7,.6-1.7,1.9,1,.9,2.3-2.6,.7,.6Z" style="fill:#fff;"/><path d="M57.8,11.7c-.4-.4-1.2-1.2-1.7-1.5l.6-.7c.4,.3,1.2,1,1.6,1.4l-.6,.8Zm8,3.2v.9c-1.4,.4-2.7,.7-4.1,1-1.2,.3-1.8,.2-2.7-.5-.3,.5-.5,1-.8,1.5l-.8-.6c.3-.5,.6-1,.9-1.6l-.6-2.4-1,.2-.2-.9,1.8-.4,.8,3.3c.7,.7,1.3,.7,2.4,.5,1.4-.3,2.8-.7,4.1-1.1Zm-5-4.6l-2.2,.5-.2-.8,1.5-.4c-.2-.2-.5-.4-.8-.6l.5-.7c.4,.2,.6,.4,.9,.7l-.3,.4,1.1-.3c.2-.4,.5-1.1,.6-1.4l.9,.2c0,.2-.3,.6-.4,.9l1.6-.4,.2,.8-2.5,.6c0,.2,0,.4,0,.6l2-.5,1.1,4.4-4.6,1.1-1.1-4.4,1.6-.4v-.6Zm2.3,.8l-2.7,.6v.6c.1,0,2.9-.6,2.9-.6v-.6Zm-2.4,2.4l2.7-.6v-.6c-.1,0-2.9,.6-2.9,.6v.6Zm3.1,.6v-.6c-.1,0-2.8,.6-2.8,.6v.6c.1,0,2.8-.6,2.8-.6Z" style="fill:#fff;"/><path d="M72.7,15.6c.3,.9,1.1,2,2.7,2.9l-.6,.9c-1.6-1.2-2.6-2.2-2.9-3.3-.9,.6-2.3,.6-4.5,.4v-1c2,.4,3.4,.2,4-.3l-2.9-1.1,.3-.8,3.1,1.2,.2-.6,.9,.4-.2,.5,3.1,1.2-.3,.8-2.9-1.2Zm-3.8-3.5c1.3,.1,2.5,0,3.5-.2l-2.6-1,.3-.8,1.8,.7c-.2-.5-.6-1.3-.8-1.7l.8-.4c.3,.4,.7,1.3,.9,1.8l-.6,.4,1.1,.4,.7-1.9,.9,.4-.7,1.8,1,.4-.2-.6c.6-.2,1.4-.5,1.9-.8l.4,.8c-.4,.2-1.2,.5-1.8,.7l1.8,.7-.3,.8-3.1-1.2-.6,1.5-.9-.3,.3-.8c-1,.3-2.1,.3-3.7,.3v-1Zm5.2,.6c.6,.6,2,1.8,2.6,2.4l-.6,.7c-.6-.7-1.9-1.8-2.5-2.5l.5-.6Z" style="fill:#fff;"/><path d="M81.6,26.4l-.7,.5-4.7-6.9,.7-.5,2.1,3.1,.9-.6-1.5-2.3,.7-.5,1.5,2.3,.5-.3,.5,.8-.4,.3,1.5,2.3-.7,.5-1.5-2.3-.9,.6,2.1,3.1Zm-2.5-8.2c.9,.2,1.4,.1,2-.1l-.6-.9,.7-.5,.6,.9h.2c0-.1,.8-.7,.8-.7l-.5-.7,.7-.5,2.5,3.7-.7,.5-.5-.7-1.1,.7,.6,.8-.7,.5-.6-.8-1.4,.9-.5-.7,1.4-.9-.6-.9c-.8,.4-1.5,.5-2.5,.3v-.9Zm3.8,4.1l.4,.6c.3,.3,.4,.4,.8,.2l3-2,.5,.8-3.2,2.1c-.7,.5-1,.4-1.6-.4l-.4-.6,.6-.7Zm-.5-3.9l.6,.9,1.1-.7-.6-.9-.8,.6h-.2Zm1.1,4.2l-.5-.7,2.8-1.9,.5,.7-2.8,1.8Z" style="fill:#fff;"/></g><path d="M74.2,39.7l-.3,1.7c-2.8,.1-5.5,.2-8.3,.1-2.7,0-4.5-.6-5.4-2.5-.3,1-.6,2-1.1,3.1l-1.5-.6c1.1-2.5,1.6-4,1.6-7.6h1.6c0,1,0,1.9-.1,2.7,.3,1,.7,1.6,1.2,2.1v-5.7h-3.5v-1.7h3.2v-2.1h-2.6v-1.6h2.6v-2.1h1.7v2.1h2.4v1.6h-2.4v2.1h2.9v1.7h-2.6v2.3h2.4v1.7h-2.4v2.6c.6,.2,1.4,.2,2.3,.3,2.8,0,5.6,0,8.5-.1Zm-3.2-11.7h-4.7v-1.7h6.4v6.1h-4.7v3.1c0,1,.2,1.2,1,1.2,.4,0,.9,0,1.3,0,1,0,1.2-.2,1.3-1.1,0-.3,.1-.8,.1-1.3l1.6,.6c0,.4,0,.7-.2,1.3-.3,1.8-.7,2.2-2.5,2.2-.7,0-1.5,0-2.2,0-1.7,0-2.2-.7-2.2-2.6v-5.2h4.7v-2.8Z" style="fill:#fff;"/></g></g></g></svg>

Before

Width:  |  Height:  |  Size: 4.6 KiB

View File

@@ -3,6 +3,7 @@ package com.navinfo.collect.library.data.entity
import android.util.Log import android.util.Log
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.utils.DeflaterUtil
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.StrZipUtil import com.navinfo.collect.library.utils.StrZipUtil
@@ -79,11 +80,11 @@ open class ReferenceEntity() : RealmObject() {
@Ignore @Ignore
var properties: RealmDictionary<String> = RealmDictionary() var properties: RealmDictionary<String> = RealmDictionary()
get() { get() {
if (propertiesDb.isNotEmpty() && field.isEmpty()) { if (propertiesDb != null && propertiesDb!!.isNotEmpty() && field.isEmpty()) {
try { try {
val gson = Gson() val gson = Gson()
val type = object : TypeToken<RealmDictionary<String>>() {}.type val type = object : TypeToken<RealmDictionary<String>>() {}.type
field = gson.fromJson(StrZipUtil.uncompress(propertiesDb), type) field = gson.fromJson(DeflaterUtil.unzipString(propertiesDb), type)
} catch (e: Exception) { } catch (e: Exception) {
Log.e("jingo","ReferenceEntity 转 properties $e") Log.e("jingo","ReferenceEntity 转 properties $e")
} }

View File

@@ -2,9 +2,10 @@ package com.navinfo.collect.library.data.entity
import android.os.Parcelable import android.os.Parcelable
import android.util.Log import android.util.Log
import com.alibaba.fastjson.JSON
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.system.Constant import com.navinfo.collect.library.utils.DeflaterUtil
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.StrZipUtil import com.navinfo.collect.library.utils.StrZipUtil
@@ -13,13 +14,8 @@ import io.realm.RealmObject
import io.realm.RealmSet import io.realm.RealmSet
import io.realm.annotations.Ignore import io.realm.annotations.Ignore
import io.realm.annotations.Index import io.realm.annotations.Index
import io.realm.annotations.PrimaryKey
import kotlinx.parcelize.Parcelize import kotlinx.parcelize.Parcelize
import org.locationtech.jts.geom.Coordinate
import org.locationtech.jts.geom.Geometry import org.locationtech.jts.geom.Geometry
import org.oscim.core.MercatorProjection
import java.util.*
import java.util.zip.GZIPInputStream
/** /**
* 渲染要素对应的实体 * 渲染要素对应的实体
@@ -82,11 +78,11 @@ open class RenderEntity() : RealmObject(), Parcelable {
@Ignore @Ignore
var properties: RealmDictionary<String> = RealmDictionary() var properties: RealmDictionary<String> = RealmDictionary()
get() { get() {
if (propertiesDb != null && propertiesDb.isNotEmpty() && field.isEmpty()) { if (propertiesDb != null && propertiesDb!!.isNotEmpty()&& field.isEmpty()) {
try { try {
val gson = Gson() val gson = Gson()
val type = object : TypeToken<RealmDictionary<String>>() {}.type val type = object : TypeToken<RealmDictionary<String>>() {}.type
field = gson.fromJson(StrZipUtil.uncompress(propertiesDb), type) field = gson.fromJson(DeflaterUtil.unzipString(propertiesDb), type)
} catch (e: Exception) { } catch (e: Exception) {
Log.e("jingo","RenderEntity 转 properties $e") Log.e("jingo","RenderEntity 转 properties $e")
} }
@@ -112,6 +108,7 @@ open class RenderEntity() : RealmObject(), Parcelable {
@Index @Index
var linkPid: String = "" // RenderEntity关联的linkPid集合(可能会关联多个) var linkPid: String = "" // RenderEntity关联的linkPid集合(可能会关联多个)
var linkRelation: LinkRelation? = null var linkRelation: LinkRelation? = null
var referenceEntitys: RealmSet<ReferenceEntity>? = RealmSet()//
constructor(name: String) : this() { constructor(name: String) : this() {
this.name = name this.name = name

View File

@@ -190,6 +190,37 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) :
layer layer
} }
/**
* 评测精简数据marker 图层
*/
private val niLocationItemizedLayerRough: ItemizedLayer by lazy {
val symbol = MarkerSymbol(niLocationBitmap, MarkerSymbol.HotspotPlace.CENTER)
val layerRough = ItemizedLayer(
mapView.vtmMap,
symbol,
)
layerRough.setOnItemGestureListener(object : OnItemGestureListener<MarkerInterface> {
override fun onItemSingleTapUp(index: Int, item: MarkerInterface?): Boolean {
val tag = mMapView.listenerTagList.last()
val listenerList = mMapView.listenerList[tag]
if (listenerList != null) {
for (listener in listenerList) {
}
}
return true
}
override fun onItemLongPress(index: Int, item: MarkerInterface?): Boolean {
return true
}
})
layerRough.isEnabled = false
addLayer(layerRough, NIMapView.LAYER_GROUPS.OPERATE_MARKER)
layerRough
}
/** /**
* 评测精简数据marker 图层 * 评测精简数据marker 图层
*/ */
@@ -206,14 +237,6 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) :
val listenerList = mMapView.listenerList[tag] val listenerList = mMapView.listenerList[tag]
if (listenerList != null) { if (listenerList != null) {
for (listener in listenerList) { for (listener in listenerList) {
/* if (listener is OnNiLocationItemListener) {
listener.onNiLocation(
tag,
index,
(niLocationItemizedLayerSimple.itemList[index] as MarkerItem).uid as NiLocation
)
break
}*/
} }
} }
return true return true
@@ -333,11 +356,13 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) :
qsRecordItemizedLayer.isEnabled = false qsRecordItemizedLayer.isEnabled = false
} }
if (traceMarkerEnable) { if (traceMarkerEnable) {
niLocationItemizedLayer.isEnabled = mapPosition.getZoomLevel() in 17..20 niLocationItemizedLayer.isEnabled = mapPosition.getZoomLevel() in 18..20
niLocationItemizedLayerSimple.isEnabled = mapPosition.getZoomLevel() in 12..16 niLocationItemizedLayerSimple.isEnabled = mapPosition.getZoomLevel() in 14..17
niLocationItemizedLayerRough.isEnabled = mapPosition.getZoomLevel() in 12..13
} else { } else {
niLocationItemizedLayer.isEnabled = false niLocationItemizedLayer.isEnabled = false
niLocationItemizedLayerSimple.isEnabled = false niLocationItemizedLayerSimple.isEnabled = false
niLocationItemizedLayerRough.isEnabled = false
} }
} }
}) })
@@ -450,9 +475,11 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) :
fun setTraceMarkEnable(enable: Boolean) { fun setTraceMarkEnable(enable: Boolean) {
niLocationItemizedLayer.isEnabled = enable niLocationItemizedLayer.isEnabled = enable
niLocationItemizedLayerSimple.isEnabled = enable niLocationItemizedLayerSimple.isEnabled = enable
niLocationItemizedLayerRough.isEnabled = enable
traceMarkerEnable = enable traceMarkerEnable = enable
niLocationItemizedLayer.populate() niLocationItemizedLayer.populate()
niLocationItemizedLayerSimple.populate() niLocationItemizedLayerSimple.populate()
niLocationItemizedLayerRough.populate()
mMapView.updateMap(true) mMapView.updateMap(true)
} }
@@ -604,6 +631,15 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) :
niLocationItemizedLayerSimple.update() niLocationItemizedLayerSimple.update()
} }
/**
* 添加质检数据marker
*/
fun addNiLocationMarkerItemRough(niLocation: NiLocation) {
var geoMarkerItem = createNILocationBitmap(niLocation)
niLocationItemizedLayerRough.addItem(geoMarkerItem)
niLocationItemizedLayerRough.update()
}
private fun createNILocationBitmap(niLocation: NiLocation): MarkerItem { private fun createNILocationBitmap(niLocation: NiLocation): MarkerItem {
val direction: Double = niLocation.direction val direction: Double = niLocation.direction
@@ -870,6 +906,8 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) :
niLocationItemizedLayer.update() niLocationItemizedLayer.update()
niLocationItemizedLayerSimple.removeAllItems() niLocationItemizedLayerSimple.removeAllItems()
niLocationItemizedLayerSimple.update() niLocationItemizedLayerSimple.update()
niLocationItemizedLayerRough.removeAllItems()
niLocationItemizedLayerRough.update()
} }
/** /**
@@ -896,6 +934,18 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) :
} }
} }
fun getNILocationItemizedLayerRoughSize(): Int {
return niLocationItemizedLayerRough.itemList.size
}
fun getNILocationRough(index: Int): NiLocation? {
return if (index > -1 && index < getNILocationItemizedLayerRoughSize()) {
((niLocationItemizedLayerRough.itemList[index]) as MarkerItem).uid as NiLocation
} else {
null
}
}
fun getNILocation(index: Int): NiLocation? { fun getNILocation(index: Int): NiLocation? {
return if (index > -1 && index < getNILocationItemizedLayerSize()) { return if (index > -1 && index < getNILocationItemizedLayerSize()) {
((niLocationItemizedLayer.itemList[index]) as MarkerItem).uid as NiLocation ((niLocationItemizedLayer.itemList[index]) as MarkerItem).uid as NiLocation

View File

@@ -4,10 +4,13 @@ import static org.oscim.core.MercatorProjection.latitudeToY;
import static org.oscim.core.MercatorProjection.longitudeToX; import static org.oscim.core.MercatorProjection.longitudeToX;
import android.os.Build; import android.os.Build;
import android.util.Log;
import androidx.annotation.RequiresApi; import androidx.annotation.RequiresApi;
import com.navinfo.collect.library.data.entity.RenderEntity; import com.navinfo.collect.library.data.entity.RenderEntity;
import com.navinfo.collect.library.enums.DataCodeEnum;
import com.navinfo.collect.library.utils.GeometryTools;
import org.locationtech.jts.geom.Coordinate; import org.locationtech.jts.geom.Coordinate;
import org.locationtech.jts.geom.Geometry; import org.locationtech.jts.geom.Geometry;
@@ -103,7 +106,14 @@ public class OMDBDataDecoder extends TileDecoder {
processCoordinateArray(multiPoint.getGeometryN(i).getCoordinates(), false); processCoordinateArray(multiPoint.getGeometryN(i).getCoordinates(), false);
} }
} else if (geometry instanceof LineString) { } else if (geometry instanceof LineString) {
processLineString((LineString) geometry); //将车道中心进行转化面渲染
if(layerName!=null&&layerName.equals(DataCodeEnum.OMDB_LANE_LINK_LG.name())){
Log.e("qj","车道中心线转化开始");
processPolygon((Polygon) GeometryTools.createGeometry(GeometryTools.computeLine(0.000035,0.000035,geometry.toString())));
Log.e("qj","车道中心线转化结束");
}else{
processLineString((LineString) geometry);
}
} else if (geometry instanceof MultiLineString) { } else if (geometry instanceof MultiLineString) {
MultiLineString multiLineString = (MultiLineString) geometry; MultiLineString multiLineString = (MultiLineString) geometry;
for (int i = 0; i < multiLineString.getNumGeometries(); i++) { for (int i = 0; i < multiLineString.getNumGeometries(); i++) {

View File

@@ -4,10 +4,13 @@ import static org.oscim.core.MercatorProjection.latitudeToY;
import static org.oscim.core.MercatorProjection.longitudeToX; import static org.oscim.core.MercatorProjection.longitudeToX;
import android.os.Build; import android.os.Build;
import android.util.Log;
import androidx.annotation.RequiresApi; 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.enums.DataCodeEnum;
import com.navinfo.collect.library.utils.GeometryTools;
import org.locationtech.jts.geom.Coordinate; import org.locationtech.jts.geom.Coordinate;
import org.locationtech.jts.geom.Geometry; import org.locationtech.jts.geom.Geometry;
@@ -100,7 +103,14 @@ public class OMDBReferenceDecoder extends TileDecoder {
processCoordinateArray(multiPoint.getGeometryN(i).getCoordinates(), false); processCoordinateArray(multiPoint.getGeometryN(i).getCoordinates(), false);
} }
} else if (geometry instanceof LineString) { } else if (geometry instanceof LineString) {
processLineString((LineString) geometry); //将车道中心进行转化面渲染
if(layerName!=null&&layerName.equals(DataCodeEnum.OMDB_LANE_LINK_LG.name())){
Log.e("qj","车道中心线转化开始");
processPolygon((Polygon)GeometryTools.createGeometry(GeometryTools.computeLine(0.000035,0.000035,geometry.toString())));
Log.e("qj","车道中心线转化结束");
}else{
processLineString((LineString) geometry);
}
} else if (geometry instanceof MultiLineString) { } else if (geometry instanceof MultiLineString) {
MultiLineString multiLineString = (MultiLineString) geometry; MultiLineString multiLineString = (MultiLineString) geometry;
for (int i = 0; i < multiLineString.getNumGeometries(); i++) { for (int i = 0; i < multiLineString.getNumGeometries(); i++) {

View File

@@ -0,0 +1,218 @@
package com.navinfo.collect.library.utils;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.zip.Deflater;
import java.util.zip.Inflater;
import org.apache.commons.net.util.Base64;
import java.io.UnsupportedEncodingException;
import java.nio.charset.StandardCharsets;
import java.util.zip.DataFormatException;
import java.util.zip.Deflater;
import java.util.zip.Inflater;
/**
* DeflaterUtils 压缩字符串
*/
public class DeflaterUtil{
private DeflaterUtil() {
}
private static final int BUFFER_SIZE = 8192;
/**
* 压缩
*/
public static String zipString(String unzipString) {
/*
* https://www.yiibai.com/javazip/javazip_deflater.html#article-start
* 0 ~ 9 压缩等级 低到高
* public static final int BEST_COMPRESSION = 9; 最佳压缩的压缩级别。
* public static final int BEST_SPEED = 1; 压缩级别最快的压缩。
* public static final int DEFAULT_COMPRESSION = -1; 默认压缩级别。
* public static final int DEFAULT_STRATEGY = 0; 默认压缩策略。
* public static final int DEFLATED = 8; 压缩算法的压缩方法(目前唯一支持的压缩方法)。
* public static final int FILTERED = 1; 压缩策略最适用于大部分数值较小且数据分布随机分布的数据。
* public static final int FULL_FLUSH = 3; 压缩刷新模式,用于清除所有待处理的输出并重置拆卸器。
* public static final int HUFFMAN_ONLY = 2; 仅用于霍夫曼编码的压缩策略。
* public static final int NO_COMPRESSION = 0; 不压缩的压缩级别。
* public static final int NO_FLUSH = 0; 用于实现最佳压缩结果的压缩刷新模式。
* public static final int SYNC_FLUSH = 2; 用于清除所有未决输出的压缩刷新模式; 可能会降低某些压缩算法的压缩率。
*/
//使用指定的压缩级别创建一个新的压缩器。
Deflater deflater = new Deflater(Deflater.BEST_COMPRESSION);
//设置压缩输入数据。
deflater.setInput(unzipString.getBytes(StandardCharsets.UTF_8));
//当被调用时,表示压缩应该以输入缓冲区的当前内容结束。
deflater.finish();
final byte[] bytes = new byte[512];
ByteArrayOutputStream outputStream = new ByteArrayOutputStream(512);
try {
while (!deflater.finished()) {
//压缩输入数据并用压缩数据填充指定的缓冲区。
int length = deflater.deflate(bytes);
outputStream.write(bytes, 0, length);
}
deflater.end();
return Base64.encodeBase64String(outputStream.toByteArray());
}catch (Exception e){
return null;
}finally {
try {
outputStream.close();
}catch (Exception e){
}
}
}
/**
* 解压缩
*/
public static String unzipString(String zipString) {
byte[] decode = Base64.decodeBase64(zipString);
//创建一个新的解压缩器 https://www.yiibai.com/javazip/javazip_inflater.html
Inflater inflater = new Inflater();
//设置解压缩的输入数据。
inflater.setInput(decode);
final byte[] bytes = new byte[512];
ByteArrayOutputStream outputStream = new ByteArrayOutputStream(512);
try {
//finished() 如果已到达压缩数据流的末尾则返回true。
while (!inflater.finished()) {
//将字节解压缩到指定的缓冲区中。
int length = inflater.inflate(bytes);
outputStream.write(bytes, 0, length);
}
} catch (DataFormatException e) {
e.printStackTrace();
return null;
} finally {
//关闭解压缩器并丢弃任何未处理的输入。
inflater.end();
}
try {
return outputStream.toString("UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
return null;
}finally {
try {
outputStream.close();
}catch (Exception e){
}
}
}
public static byte[] compress(byte[] bytes) {
if (bytes == null) {
throw new NullPointerException("bytes is null");
}
int lenght = 0;
Deflater deflater = new Deflater();
deflater.setInput(bytes);
deflater.finish();
byte[] outputBytes = new byte[BUFFER_SIZE];
try (ByteArrayOutputStream bos = new ByteArrayOutputStream()) {
while (!deflater.finished()) {
lenght = deflater.deflate(outputBytes);
bos.write(outputBytes, 0, lenght);
}
deflater.end();
return bos.toByteArray();
} catch (IOException e) {
throw new RuntimeException("Deflater compress error", e);
}
}
public static byte[] decompress(byte[] bytes) {
if (bytes == null) {
throw new NullPointerException("bytes is null");
}
int length = 0;
Inflater inflater = new Inflater();
inflater.setInput(bytes);
byte[] outputBytes = new byte[BUFFER_SIZE];
try (ByteArrayOutputStream bos = new ByteArrayOutputStream();) {
while (!inflater.finished()) {
length = inflater.inflate(outputBytes);
if (length == 0) {
break;
}
bos.write(outputBytes, 0, length);
}
inflater.end();
return bos.toByteArray();
} catch (Exception e) {
throw new RuntimeException("Deflater decompress error", e);
}
}
}

2
vtm

Submodule vtm updated: c046e788f5...ee88167c7d