diff --git a/app/src/main/assets/omdb_config.json b/app/src/main/assets/omdb_config.json index 8d01d474..b0ceee60 100644 --- a/app/src/main/assets/omdb_config.json +++ b/app/src/main/assets/omdb_config.json @@ -633,7 +633,7 @@ "table": "OMDB_LANE_LINK_LG", "code": 5001, "name": "车道中心线", - "catch": true, + "catch": false, "isDependOnOtherTable": false, "checkLinkId": false, "zoomMin": 18, diff --git a/app/src/main/java/com/navinfo/omqs/bean/ImportConfig.kt b/app/src/main/java/com/navinfo/omqs/bean/ImportConfig.kt index 6e07e485..a93f0de0 100644 --- a/app/src/main/java/com/navinfo/omqs/bean/ImportConfig.kt +++ b/app/src/main/java/com/navinfo/omqs/bean/ImportConfig.kt @@ -3,6 +3,7 @@ package com.navinfo.omqs.bean import android.util.Log import com.google.gson.annotations.Expose import com.navinfo.collect.library.data.entity.RenderEntity +import com.navinfo.collect.library.enums.DataCodeEnum import com.navinfo.omqs.db.ImportPreProcess import io.realm.Realm import kotlin.reflect.KFunction @@ -26,6 +27,10 @@ class ImportConfig { if (transformList.isNullOrEmpty()) { return renderEntity } + if(renderEntity.code==DataCodeEnum.OMDB_LANEINFO.code){ + Log.e("车信","====车信") + } + for (transform in transformList) { // 开始执行转换 val key: String = transform.k diff --git a/app/src/main/java/com/navinfo/omqs/db/ImportPreProcess.kt b/app/src/main/java/com/navinfo/omqs/db/ImportPreProcess.kt index e0038737..586f8f59 100644 --- a/app/src/main/java/com/navinfo/omqs/db/ImportPreProcess.kt +++ b/app/src/main/java/com/navinfo/omqs/db/ImportPreProcess.kt @@ -125,8 +125,7 @@ class ImportPreProcess { ) * Math.sin(radian) // 计算偏移后的点 - val coord = - Coordinate(point.getX() + dy, point.getY() - dx) + val coord = Coordinate(point.getX() + dy, point.getY() - dx) // 记录偏移后的点位或线数据,如果数据为线时,记录的偏移后数据为最后一个点右移后,方向与线的最后两个点平行同向的单位向量 if (Geometry.TYPENAME_POINT == geometry?.geometryType) { @@ -193,12 +192,11 @@ class ImportPreProcess { ) * Math.sin(radian) // 计算偏移后的点 - val coord = - Coordinate(point.getX() - dx, point.getY() - dy) + val coord = Coordinate(point.getX() - dx, point.getY() - dy) // 将这个点记录在数据中 - val geometryTranslate: Geometry = - GeometryTools.createGeometry(doubleArrayOf(coord.x, coord.y)) + val geometryTranslate: Geometry = GeometryTools.createGeometry(doubleArrayOf(coord.x, coord.y)) + renderEntity.geometry = geometryTranslate.toString() } @@ -655,10 +653,20 @@ class ImportPreProcess { Log.d("unpackingLaneInfo", referenceEntity.properties["symbol"].toString()) referenceEntity.propertiesDb = DeflaterUtil.zipString(JSON.toJSONString(referenceEntity.properties)) renderEntity.referenceEntitys?.add(referenceEntity) - //listResult.add(referenceEntity) + Log.e("qj", "车信===插入车信箭头") + //listResult.add(referenceEntity) } //insertData(listResult) } + //将主表线转化为单个点,按点要素实现捕捉 + if (Geometry.TYPENAME_LINESTRING == renderEntity.wkt?.geometryType) { + var coordinates = renderEntity.wkt?.coordinates + if(coordinates!=null){ + val p1: Coordinate = coordinates[0] + renderEntity.geometry = GeometryTools.createGeometry(GeoPoint(p1.y,p1.x)).toString() + } + } + } } @@ -1219,6 +1227,7 @@ class ImportPreProcess { private fun createZLevelReference(renderEntity: RenderEntity): ReferenceEntity { val zLevelReference = ReferenceEntity() // zLevelReference.renderEntityId = renderEntity.id + //zLevelReference.renderEntityId = renderEntity.id zLevelReference.name = "${renderEntity.name}参考点" zLevelReference.code = renderEntity.code zLevelReference.table = renderEntity.table diff --git a/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainActivity.kt b/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainActivity.kt index e3cc8287..365bb182 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainActivity.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainActivity.kt @@ -16,8 +16,6 @@ import androidx.activity.viewModels import androidx.databinding.DataBindingUtil import androidx.fragment.app.Fragment import androidx.lifecycle.lifecycleScope -import androidx.lifecycle.viewModelScope -import androidx.navigation.Navigation import androidx.navigation.findNavController import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView @@ -25,6 +23,7 @@ import com.blankj.utilcode.util.ClipboardUtils import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.tabs.TabLayout import com.navinfo.collect.library.data.entity.RenderEntity +import com.navinfo.collect.library.enums.DataCodeEnum import com.navinfo.collect.library.map.NIMapController import com.navinfo.collect.library.map.handler.MeasureLayerHandler import com.navinfo.collect.library.utils.DeflaterUtil @@ -48,17 +47,13 @@ import com.navinfo.omqs.ui.other.BaseToast import com.navinfo.omqs.ui.widget.RecyclerViewSpacesItemDecoration import com.navinfo.omqs.util.FlowEventBus import com.navinfo.omqs.util.NaviStatus -import com.navinfo.omqs.util.SignUtil import com.navinfo.omqs.util.SpeakMode import dagger.hilt.android.AndroidEntryPoint -import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.delay import kotlinx.coroutines.launch import org.oscim.core.GeoPoint import org.oscim.renderer.GLViewport import org.videolan.vlc.Util -import sun.misc.BASE64Decoder -import sun.misc.BASE64Encoder import java.math.BigDecimal import java.math.RoundingMode import javax.inject.Inject @@ -824,6 +819,25 @@ class MainActivity : BaseActivity() { * zoomOut */ fun zoomOutOnclick(view: View) { + val result = mutableListOf() + for (i in 0 until 10) { + var renderEntity: RenderEntity = RenderEntity() + renderEntity.geometry = "POINT(116.2694${i}13016946 40.0844${i}5791644373 0)" + result.add(renderEntity) + } + //计算后 + var index = 0 + Log.e("qj","====计算开始") + var lastRender:RenderEntity = RenderEntity() + GeometryTools.groupByDistance(DataCodeEnum.OMDB_TRAFFIC_SIGN.code,result, 5.0)?.forEach { + if(lastRender!=null&&lastRender.geometry!=null&& lastRender.geometry != ""){ + if(it.geometry!=lastRender.geometry){ + Log.e("qj","${index++}====计算后"+it.geometry) + } + } + lastRender = it + } + Log.e("qj","====计算结束") mapController.animationHandler.zoomOut() } diff --git a/app/src/main/res/menu/personal_center_menu.xml b/app/src/main/res/menu/personal_center_menu.xml index 0b568fcd..eddd9ad9 100644 --- a/app/src/main/res/menu/personal_center_menu.xml +++ b/app/src/main/res/menu/personal_center_menu.xml @@ -64,7 +64,7 @@ + android:title="版本:23QE4_V1.5.8_20231103_A" /> diff --git a/collect-library/resources/rendertheme.xsd b/collect-library/resources/rendertheme.xsd index fa7348c9..150d511c 100644 --- a/collect-library/resources/rendertheme.xsd +++ b/collect-library/resources/rendertheme.xsd @@ -257,7 +257,7 @@ - + diff --git a/collect-library/src/main/assets/editormarker.xml b/collect-library/src/main/assets/editormarker.xml index f3e26dc5..7e721c3d 100644 --- a/collect-library/src/main/assets/editormarker.xml +++ b/collect-library/src/main/assets/editormarker.xml @@ -1565,7 +1565,7 @@ - @@ -1847,12 +1847,12 @@ - + - + @@ -2022,7 +2022,7 @@ - + diff --git a/collect-library/src/main/java/com/navinfo/collect/library/data/entity/ReferenceEntity.kt b/collect-library/src/main/java/com/navinfo/collect/library/data/entity/ReferenceEntity.kt index 415ad9c1..4bf9b066 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/data/entity/ReferenceEntity.kt +++ b/collect-library/src/main/java/com/navinfo/collect/library/data/entity/ReferenceEntity.kt @@ -1,5 +1,6 @@ package com.navinfo.collect.library.data.entity +import android.os.Parcelable import android.util.Log import com.google.gson.Gson import com.google.gson.reflect.TypeToken @@ -12,26 +13,25 @@ import io.realm.RealmObject import io.realm.RealmSet import io.realm.annotations.Ignore import io.realm.annotations.PrimaryKey +import kotlinx.parcelize.Parcelize import org.locationtech.jts.geom.Geometry import java.util.* /** * 渲染要素对应的实体 * */ -open class ReferenceEntity() : RealmObject() { - // @PrimaryKey -// var id: Int = 0 // id -// var renderEntityId: Int = 0 // 参考的renderEntity的Id +@Parcelize +open class ReferenceEntity() : RealmObject(), Parcelable { + @PrimaryKey + var id: String = UUID.randomUUID().toString() // id @Ignore lateinit var name: String //要素名 lateinit var table: String //要素表名 var propertiesDb: String = "" var code: String = "0" // 要素编码 - @Ignore var zoomMin: Int = 18 //显示最小级别 - @Ignore var zoomMax: Int = 23 //显示最大级别 var taskId: Int = 0 //任务ID var enable: Int = 0 // 默认0不是显示 1为渲染显示 diff --git a/collect-library/src/main/java/com/navinfo/collect/library/data/entity/RenderEntity.kt b/collect-library/src/main/java/com/navinfo/collect/library/data/entity/RenderEntity.kt index 44a5940e..96de1505 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/data/entity/RenderEntity.kt +++ b/collect-library/src/main/java/com/navinfo/collect/library/data/entity/RenderEntity.kt @@ -10,20 +10,23 @@ import com.navinfo.collect.library.utils.GeometryTools import com.navinfo.collect.library.utils.GeometryToolsKt import com.navinfo.collect.library.utils.StrZipUtil import io.realm.RealmDictionary +import io.realm.RealmList import io.realm.RealmObject import io.realm.RealmSet import io.realm.annotations.Ignore import io.realm.annotations.Index +import io.realm.annotations.PrimaryKey import kotlinx.parcelize.Parcelize import org.locationtech.jts.geom.Geometry +import java.util.UUID /** * 渲染要素对应的实体 * */ @Parcelize open class RenderEntity() : RealmObject(), Parcelable { - // @PrimaryKey -// var id: String = UUID.randomUUID().toString() // id + @PrimaryKey + var id: String = UUID.randomUUID().toString() // id lateinit var name: String //要素名 lateinit var table: String //要素表名 var code: String = "0" // 要素编码 @@ -108,7 +111,7 @@ open class RenderEntity() : RealmObject(), Parcelable { @Index var linkPid: String = "" // RenderEntity关联的linkPid集合(可能会关联多个) var linkRelation: LinkRelation? = null - var referenceEntitys: RealmSet? = RealmSet()// + var referenceEntitys: RealmList = RealmList()// constructor(name: String) : this() { this.name = name diff --git a/collect-library/src/main/java/com/navinfo/collect/library/enums/DataCodeEnum.kt b/collect-library/src/main/java/com/navinfo/collect/library/enums/DataCodeEnum.kt index 25f24b9f..4b834f83 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/enums/DataCodeEnum.kt +++ b/collect-library/src/main/java/com/navinfo/collect/library/enums/DataCodeEnum.kt @@ -3,7 +3,7 @@ package com.navinfo.collect.library.enums /* * 要素枚举定义 * */ -enum class DataCodeEnum(var tableName: String, var code: String) { +public enum class DataCodeEnum(var tableName: String, var code: String) { OMDB_NODE_FORM("点形态", "1007-6"), OMDB_NODE_PA("点形态PA", "1007-6"), OMDB_CHECKPOINT("检查点", "1012"), @@ -62,7 +62,8 @@ enum class DataCodeEnum(var tableName: String, var code: String) { OMDB_LINK_FORM2_11("风景路线", "2206-11"), OMDB_LINK_FORM2_12("车辆测试路段", "2206-12"), OMDB_LINK_FORM2_13("驾照考试路段", "2206-13"), - OMDB_OBJECT_OH_STRUCT("上方障碍物", "3001"), + OMDB_LANE_ACCESS("通行车辆类型Lane", "2638"), + OMDB_OBJECT_OH_STRUCT("上方障碍物","3001"), OMDB_OBJECT_TEXT("文字", "3002"), OMDB_OBJECT_SYMBOL("符号", "3003"), OMDB_OBJECT_ARROW("箭头", "3004"), diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBDataDecoder.java b/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBDataDecoder.java index 95b92fc2..d7505186 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBDataDecoder.java +++ b/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBDataDecoder.java @@ -63,22 +63,21 @@ public class OMDBDataDecoder extends TileDecoder { } @RequiresApi(api = Build.VERSION_CODES.N) - public boolean decode(int mapLevel,Tile tile, ITileDataSink sink, List listResult) { + public boolean decode(int mapLevel, Tile tile, ITileDataSink sink, List listResult) { mTileDataSink = sink; mTileScale = 1 << tile.zoomLevel; mTileX = tile.tileX / mTileScale; mTileY = tile.tileY / mTileScale; mTileScale *= Tile.SIZE; - listResult.stream().iterator().forEachRemaining(new Consumer() { @Override public void accept(RenderEntity renderEntity) { - if(!(mapLevelrenderEntity.getZoomMax())){ - Map properties= new HashMap<>(renderEntity.getProperties().size()); + if (!(mapLevel < renderEntity.getZoomMin() || mapLevel > renderEntity.getZoomMax())) { + Map properties = new HashMap<>(renderEntity.getProperties().size()); properties.putAll(renderEntity.getProperties()); parseGeometry(renderEntity.getTable(), renderEntity.getWkt(), properties); - }else{ + } else { // Log.e("qj","render"+renderEntity.name+"=="+renderEntity.getZoomMin()+"==="+renderEntity.getZoomMax()+"==="+renderEntity.getEnable()); } } @@ -106,14 +105,7 @@ public class OMDBDataDecoder extends TileDecoder { processCoordinateArray(multiPoint.getGeometryN(i).getCoordinates(), false); } } else if (geometry instanceof LineString) { - //将车道中心进行转化面渲染 - 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); - } + processLineString((LineString) geometry); } else if (geometry instanceof MultiLineString) { MultiLineString multiLineString = (MultiLineString) geometry; for (int i = 0; i < multiLineString.getNumGeometries(); i++) { @@ -199,8 +191,8 @@ public class OMDBDataDecoder extends TileDecoder { mMapElement.tags.add(new Tag(Tag.KEY_NAME, fallbackName, false)); } - public void clean(){ - if(mTileDataSink!=null){ + public void clean() { + if (mTileDataSink != null) { mTileDataSink.notifyAll(); } } diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBReferenceDecoder.java b/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBReferenceDecoder.java index a0b9e2e7..f6c73934 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBReferenceDecoder.java +++ b/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBReferenceDecoder.java @@ -63,7 +63,7 @@ public class OMDBReferenceDecoder extends TileDecoder { } @RequiresApi(api = Build.VERSION_CODES.N) - public boolean decode(int mapLevel,Tile tile, ITileDataSink sink, List listResult) { + public boolean decode(int mapLevel, Tile tile, ITileDataSink sink, List listResult) { mTileDataSink = sink; mTileScale = 1 << tile.zoomLevel; mTileX = tile.tileX / mTileScale; @@ -73,8 +73,8 @@ public class OMDBReferenceDecoder extends TileDecoder { listResult.stream().iterator().forEachRemaining(new Consumer() { @Override public void accept(ReferenceEntity renderEntity) { - if(!(mapLevelrenderEntity.getZoomMax())){ - Map properties= new HashMap<>(renderEntity.getProperties().size()); + if (!(mapLevel < renderEntity.getZoomMin() || mapLevel > renderEntity.getZoomMax())) { + Map properties = new HashMap<>(renderEntity.getProperties().size()); properties.putAll(renderEntity.getProperties()); parseGeometry(renderEntity.getTable(), renderEntity.getWkt(), properties); } @@ -103,14 +103,7 @@ public class OMDBReferenceDecoder extends TileDecoder { processCoordinateArray(multiPoint.getGeometryN(i).getCoordinates(), false); } } else if (geometry instanceof LineString) { - //将车道中心进行转化面渲染 - 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); - } + processLineString((LineString) geometry); } else if (geometry instanceof MultiLineString) { MultiLineString multiLineString = (MultiLineString) geometry; for (int i = 0; i < multiLineString.getNumGeometries(); i++) { diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBTileDataSource.java b/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBTileDataSource.java index 49112267..0130d367 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBTileDataSource.java +++ b/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBTileDataSource.java @@ -129,7 +129,7 @@ public class OMDBTileDataSource implements ITileDataSource { realmQuery.endGroup(); } long time = System.currentTimeMillis(); - List listResult = realmQuery.findAll(); + List listResult = realm.copyFromRealm(realmQuery.findAll()); long newTime = System.currentTimeMillis() - time; // Log.e("jingo", "当前OMDBTileDataSource " + Thread.currentThread().hashCode() + " 当前realm " + realm.hashCode() + " 查询耗时" + newTime + " 条数" + listResult.size()); @@ -142,8 +142,13 @@ public class OMDBTileDataSource implements ITileDataSource { /*过滤数据,只有最小x(屏幕的最小x或数据的最小x会被渲染,跨Tile的其他数据不再重复渲染)*/ // .filter((RenderEntity renderEntity) -> MercatorProjection.longitudeToTileX(viewport.fromScreenPoint(0,0).getLongitude(), (byte) Constant.DATA_ZOOM) == currentTileX || renderEntity.getTileX().stream().min(Integer::compare).get() == currentTileX) .collect(Collectors.toList()); - mThreadLocalDecoders.get().decode(tile.zoomLevel, tile, mapDataSink, listResult); + + List list = GeometryTools.groupByDistance("3005", listResult, 5.0); + + mThreadLocalDecoders.get().decode(tile.zoomLevel, tile, mapDataSink, list); + mapDataSink.completed(QueryResult.SUCCESS); + } else { mapDataSink.completed(QueryResult.SUCCESS); } diff --git a/collect-library/src/main/java/com/navinfo/collect/library/utils/GeometryTools.java b/collect-library/src/main/java/com/navinfo/collect/library/utils/GeometryTools.java index a512c6ec..1a660a89 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/utils/GeometryTools.java +++ b/collect-library/src/main/java/com/navinfo/collect/library/utils/GeometryTools.java @@ -5,6 +5,8 @@ import android.os.Build; import android.text.TextUtils; import android.util.Log; +import com.navinfo.collect.library.data.entity.RenderEntity; + import org.locationtech.jts.geom.Coordinate; import org.locationtech.jts.geom.Geometry; import org.locationtech.jts.geom.GeometryFactory; @@ -1452,6 +1454,7 @@ public class GeometryTools { /** * 距离转米 + * * @param distance * @param latitude * @return @@ -1463,10 +1466,12 @@ public class GeometryTools { double radianDegree = 2 * Math.asin(Math.sin(radianDistance / 2) / Math.cos(radianLatitude)); return Math.toDegrees(radianDegree); } + /** * 获取指定tile对应的polygon面 + * * @param tile vtm中的瓦片 - * */ + */ public static Polygon getTilePolygon(Tile tile) { // 获取当前tile的起点坐标 double startLongitude = MercatorProjection.tileXToLongitude(tile.tileX, tile.zoomLevel); @@ -1476,6 +1481,7 @@ public class GeometryTools { return GeometryTools.createPolygonFromCoords(new Coordinate[]{new Coordinate(startLongitude, startLatitude), new Coordinate(endLongitude, startLatitude), new Coordinate(endLongitude, endLatitude), new Coordinate(startLongitude, endLatitude), new Coordinate(startLongitude, startLatitude)}); } + /** * 经纬度转墨卡托 */ @@ -1509,13 +1515,13 @@ public class GeometryTools { /** - * @param distLeft 0.00001为一米 + * @param distLeft 0.00001为一米 * @param distRight 单位km - * @param wkt 几何 + * @param wkt 几何 * @return */ - public static String computeLine(Double distLeft,Double distRight,String wkt){ - if(!TextUtils.isEmpty(wkt)){ + public static String computeLine(Double distLeft, Double distRight, String wkt) { + if (!TextUtils.isEmpty(wkt)) { Geometry lineString1 = GeometryTools.createGeometry(wkt); BufferParameters parameters1 = new BufferParameters(); parameters1.setJoinStyle(BufferParameters.DEFAULT_QUADRANT_SEGMENTS); @@ -1525,7 +1531,7 @@ public class GeometryTools { Geometry buffer = BufferOp.bufferOp(lineString1, distLeft, parameters1); Geometry buffer2 = BufferOp.bufferOp(lineString1, -distRight, parameters1); String bufferWkt = buffer.union(buffer2).toString(); - Log.e("qj",bufferWkt); + Log.e("qj", bufferWkt); return bufferWkt; } return ""; @@ -1536,8 +1542,8 @@ public class GeometryTools { * @param wkt 几何 * @return */ - public static String computeLine(Double dist,String wkt){ - if(!TextUtils.isEmpty(wkt)){ + public static String computeLine(Double dist, String wkt) { + if (!TextUtils.isEmpty(wkt)) { Geometry lineString1 = GeometryTools.createGeometry(wkt); BufferParameters parameters1 = new BufferParameters(); parameters1.setJoinStyle(BufferParameters.CAP_FLAT); @@ -1547,8 +1553,8 @@ public class GeometryTools { Geometry buffer = BufferOp.bufferOp(lineString1, dist, parameters1); int coorsLength = lineString1.getCoordinates().length; List list = new ArrayList<>(); - for (int i = coorsLength; i < buffer.getCoordinates().length-1; i++) { - list.add(buffer.getCoordinates()[i]); + for (int i = coorsLength; i < buffer.getCoordinates().length - 1; i++) { + list.add(buffer.getCoordinates()[i]); } Coordinate[] coordinates = new Coordinate[list.size()]; for (int i = 0; i < list.size(); i++) { @@ -1564,8 +1570,71 @@ public class GeometryTools { //定义垂线 FootAndDistance pointPairDistance = new FootAndDistance(point); Coordinate coordinate = new Coordinate(point.getLongitude(), point.getLatitude()); - pointPairDistance.computeDistance(geometry,coordinate); + pointPairDistance.computeDistance(geometry, coordinate); return pointPairDistance; } + + /** + * 按距离分组 + * + * @param list + * @return + */ + public static List groupByDistance(String code,List list, double disance) { + + if (list == null || disance <= 0) { + return null; + } + + List listReslut = new ArrayList<>(); + + java.util.Map calcMap = new HashMap<>(); + + int count = 0; + + //遍历开始 + for (RenderEntity renderEntity : list) { + + if(!TextUtils.isEmpty(code)&&!renderEntity.getCode().equals(code)){ + listReslut.add(renderEntity); + calcMap.put(renderEntity.getId(),renderEntity); + continue; + } + + if (!calcMap.containsKey(renderEntity.getId())) { + + //跟要素遍历对比,如果统一个点直接标记计算并记录在内,已经计算过不在二次计算 + for (RenderEntity renderEntityTemp : list) { + + if (!calcMap.containsKey(renderEntity.getId())) { + if (renderEntity.getId().equals(renderEntityTemp.getId())) { + listReslut.add(renderEntityTemp); + count++; + Log.e("qj", "====计算间距" + count); + calcMap.put(renderEntityTemp.getId(), renderEntityTemp); + } else { + GeoPoint geoPoint = createGeoPoint(renderEntity.getGeometry()); + GeoPoint geoPoint1 = createGeoPoint(renderEntityTemp.getGeometry()); + double dis = getDistance(geoPoint.getLatitude(), geoPoint.getLongitude(), geoPoint1.getLatitude(), geoPoint1.getLongitude()); + Log.e("qj", "====计算间距" + dis); + if (geoPoint != null && geoPoint1 != null && dis <= disance) { + //只取第一个坐标 + renderEntityTemp.setGeometry(renderEntity.getGeometry()); + //renderEntity.setProperties(renderEntity.getProperties()); + calcMap.put(renderEntityTemp.getId(), renderEntityTemp); + listReslut.add(renderEntityTemp); + } + + } + } + } + + } + } + + Log.e("qj", listReslut.size()+"==判断后=="+list.size()+"==="+calcMap.size()); + + return listReslut; + } }