增加地图捕捉数据功能

This commit is contained in:
squallzhjch
2023-04-21 14:10:05 +08:00
parent 6da6a4d101
commit ab5cb7a078
24 changed files with 448 additions and 352 deletions

View File

@@ -36,7 +36,7 @@ open class QsRecordBean @JvmOverloads constructor(
/**
* 问题类型
*/
var type: String = "",
var problemType: String = "",
/**
* 问题现象

View File

@@ -10,15 +10,7 @@ import org.oscim.layers.marker.MarkerItem
*10:51
*说明()
*/
class ClusterMarkerItem(uid: Any?, title: String?, description: String?, geoPoint: GeoPoint?) :
class ClusterMarkerItem(uid: Any, title: String?, description: String?, geoPoint: GeoPoint) :
MarkerItem(uid, title, description, geoPoint) {
var clusterList: List<Int> = ArrayList()
constructor(title: String?, description: String?, geoPoint: GeoPoint?) : this(
null,
title,
description,
geoPoint
) {
}
}

View File

@@ -34,10 +34,12 @@ import org.oscim.layers.marker.*
import org.oscim.layers.tile.buildings.BuildingLayer
import org.oscim.layers.tile.vector.VectorTileLayer
import org.oscim.layers.tile.vector.labeling.LabelLayer
import org.oscim.map.Map.UpdateListener
import org.oscim.tiling.source.OkHttpEngine.OkHttpFactory
import org.oscim.tiling.source.mapfile.MapFileTileSource
import java.io.File
import java.util.*
import java.util.stream.Collectors
/**
* Layer 操作
@@ -62,7 +64,8 @@ open class LayerManagerHandler(context: AppCompatActivity, mapView: NIMapView) :
private lateinit var canvas: org.oscim.backend.canvas.Canvas
private lateinit var itemizedLayer: MyItemizedLayer
private lateinit var markerRendererFactory: MarkerRendererFactory
private val markerItemsNames = mutableListOf<MarkerInterface>()
private var resId = R.mipmap.map_icon_point_add
private var itemListener: OnQsRecordItemClickListener? = null
/**
* 文字大小
@@ -79,11 +82,16 @@ open class LayerManagerHandler(context: AppCompatActivity, mapView: NIMapView) :
private fun initMap() {
loadBaseMap()
mMapView.switchTileVectorLayerTheme(NIMapView.MAP_THEME.DEFAULT)
//初始化之间数据图层
initQsRecordDataLayer()
mMapView.vtmMap.updateMap()
mMapView.updateMap()
// initMapLifeSource()
// 设置矢量图层均在12级以上才显示
mMapView.vtmMap.events.bind(UpdateListener { e, mapPosition ->
if (e == org.oscim.map.Map.SCALE_EVENT) {
itemizedLayer.isEnabled = mapPosition.getZoomLevel() >= 12
}
})
}
@@ -144,7 +152,45 @@ open class LayerManagerHandler(context: AppCompatActivity, mapView: NIMapView) :
for (layer in it.layers) {
addLayer(layer, NIMapView.LAYER_GROUPS.BASE)
}
mMapView.updateMap()
}
}
mMapView.switchTileVectorLayerTheme(NIMapView.MAP_THEME.DEFAULT)
mMapView.updateMap()
}
fun setOnQsRecordItemClickListener(listener: OnQsRecordItemClickListener?) {
itemListener = listener
}
/**
* 增加或更新marker
*/
suspend fun addOrUpdateQsRecordMark(data: QsRecordBean) {
for (item in itemizedLayer.itemList) {
if (item is MarkerItem) {
if (item.title == data.id) {
itemizedLayer.itemList.remove(item)
break
}
}
}
createMarkerItem(data)
withContext(Dispatchers.Main) {
mMapView.updateMap(true)
}
}
/**
* 删除marker
*/
suspend fun deleteQsRecordMark(data: QsRecordBean) {
for (item in itemizedLayer.itemList) {
if (item is MarkerItem) {
if (item.title == data.id) {
itemizedLayer.itemList.remove(item)
mMapView.updateMap()
return
}
}
}
}
@@ -153,6 +199,7 @@ open class LayerManagerHandler(context: AppCompatActivity, mapView: NIMapView) :
* 初始话质检数据图层
*/
private fun initQsRecordDataLayer() {
canvas = CanvasAdapter.newCanvas()
paint = CanvasAdapter.newPaint()
paint.setTypeface(Paint.FontFamily.DEFAULT, Paint.FontStyle.NORMAL)
@@ -182,50 +229,67 @@ open class LayerManagerHandler(context: AppCompatActivity, mapView: NIMapView) :
}
}
var resId = R.mipmap.map_icon_point_add
itemizedLayer =
MyItemizedLayer(
mMapView.vtmMap,
mutableListOf(),
markerRendererFactory,
object : MyItemizedLayer.OnItemGestureListener {
override fun onItemSingleTapUp(
list: MutableList<Int>,
nearest: Int
): Boolean {
itemListener?.let {
val idList = mutableListOf<String>()
if (list.size == 0) {
} else {
for (i in list) {
val markerInterface: MarkerInterface =
itemizedLayer.itemList[i]
if (markerInterface is MarkerItem) {
idList.add(markerInterface.title)
}
}
it.onQsRecordList(idList.distinct().toMutableList())
}
}
return true
}
override fun onItemLongPress(
list: MutableList<Int>?,
nearest: Int
): Boolean {
return true
}
})
addLayer(itemizedLayer, NIMapView.LAYER_GROUPS.OPERATE)
mContext.lifecycleScope.launch(Dispatchers.IO) {
var list = mutableListOf<QsRecordBean>()
val realm = Realm.getDefaultInstance()
realm.executeTransaction {
val objects =realm.where<QsRecordBean>().findAll()
val objects = realm.where<QsRecordBean>().findAll()
list = realm.copyFromRealm(objects)
}
realm.close()
itemizedLayer =
MyItemizedLayer(
mMapView.vtmMap,
mutableListOf(),
markerRendererFactory,
object : MyItemizedLayer.OnItemGestureListener {
override fun onItemSingleTapUp(
layer: MyItemizedLayer?,
list: MutableList<Int>?,
nearest: Int
): Boolean {
return true
}
override fun onItemLongPress(
layer: MyItemizedLayer?,
list: MutableList<Int>?,
nearest: Int
): Boolean {
return true
}
})
for (item in list) {
val bitmap: Bitmap = createTextMarkerBitmap(mContext, item.description, resId)
if (item.t_lifecycle != 2) {
val geometry: Geometry? = GeometryTools.createGeometry(item.geometry)
if (geometry != null) {
var geoPoint: GeoPoint? = null
if (geometry.geometryType != null) {
when (geometry.geometryType.uppercase(Locale.getDefault())) {
"POINT" -> geoPoint =
GeoPoint(geometry.coordinate.y, geometry.coordinate.x)
createMarkerItem(item)
}
}
}
private suspend fun createMarkerItem(item: QsRecordBean) {
val bitmap: Bitmap = createTextMarkerBitmap(mContext, item.description, resId)
if (item.t_lifecycle != 2) {
val geometry: Geometry? = GeometryTools.createGeometry(item.geometry)
if (geometry != null) {
var geoPoint: GeoPoint? = null
if (geometry.geometryType != null) {
when (geometry.geometryType.uppercase(Locale.getDefault())) {
"POINT" -> geoPoint =
GeoPoint(geometry.coordinate.y, geometry.coordinate.x)
// "LINESTRING" -> {
// val lineString = geometry as LineString
// if (lineString != null && lineString.coordinates.size > 0) {
@@ -254,14 +318,14 @@ open class LayerManagerHandler(context: AppCompatActivity, mapView: NIMapView) :
// dataVectorLayer.add(drawablePolygon)
// }
// }
}
}
if (geoPoint != null) {
var geoMarkerItem: MarkerItem
}
}
if (geoPoint != null) {
var geoMarkerItem: MarkerItem
// if (item.getType() === 1) {
geoMarkerItem = ClusterMarkerItem(
1, item.id, item.description, geoPoint
)
geoMarkerItem = ClusterMarkerItem(
1, item.id, item.description, geoPoint
)
// } else {
// geoMarkerItem = MarkerItem(
// ePointTemp.getType(),
@@ -270,22 +334,21 @@ open class LayerManagerHandler(context: AppCompatActivity, mapView: NIMapView) :
// geoPoint
// )
// }
markerItemsNames.add(geoMarkerItem)
val markerSymbol =
MarkerSymbol(bitmap, MarkerSymbol.HotspotPlace.CENTER)
geoMarkerItem.marker = markerSymbol
}
}
val markerSymbol =
MarkerSymbol(bitmap, MarkerSymbol.HotspotPlace.CENTER)
geoMarkerItem.marker = markerSymbol
itemizedLayer.itemList.add(geoMarkerItem)
}
}
itemizedLayer.addItems(markerItemsNames)
addLayer(itemizedLayer, NIMapView.LAYER_GROUPS.OPERATE)
withContext(Dispatchers.Main) {
itemizedLayer.map().updateMap(true)
}
}
withContext(Dispatchers.Main) {
itemizedLayer.update()
}
itemizedLayer.populate()
}
/**
* 文字和图片拼装,文字换行
*
@@ -498,6 +561,9 @@ open class LayerManagerHandler(context: AppCompatActivity, mapView: NIMapView) :
}
interface OnQsRecordItemClickListener {
fun onQsRecordList(list: MutableList<String>)
}
/**
* 基础

View File

@@ -50,7 +50,7 @@ public class MyItemizedLayer extends ItemizedLayer {
public boolean run(List list1, int nearest) {
if (mOnItemGestureListener != null) {
return mOnItemGestureListener.onItemSingleTapUp(MyItemizedLayer.this, list1, nearest);
return mOnItemGestureListener.onItemSingleTapUp(list1, nearest);
}
return false;
}
@@ -62,7 +62,7 @@ public class MyItemizedLayer extends ItemizedLayer {
public boolean run(List list1, int nearest) {
if (mOnItemGestureListener != null) {
return mOnItemGestureListener.onItemLongPress(MyItemizedLayer.this, list1, nearest);
return mOnItemGestureListener.onItemLongPress(list1, nearest);
}
return false;
}
@@ -155,8 +155,8 @@ public class MyItemizedLayer extends ItemizedLayer {
}
public interface OnItemGestureListener {
boolean onItemSingleTapUp(MyItemizedLayer layer, List<Integer> list, int nearest);
boolean onItemSingleTapUp(List<Integer> list, int nearest);
boolean onItemLongPress(MyItemizedLayer layer, List<Integer> list, int nearest);
boolean onItemLongPress(List<Integer> list, int nearest);
}
}