修改为只有小于50km的实体才会跳动

This commit is contained in:
huangchenhao 2025-11-28 09:25:29 +08:00
parent 4e328cf658
commit d05077e9ed
2 changed files with 74 additions and 7 deletions

View File

@ -796,7 +796,7 @@ export function useMapMarkers() {
* @param {number} [options.heightOffset=10] - 相对地面的高度偏移 * @param {number} [options.heightOffset=10] - 相对地面的高度偏移
* @returns {Promise<void>} * @returns {Promise<void>}
*/ */
const addReserveCenterMarkers = async (viewer, reserveData, options = {}) => { const addReserveCenterMarkers = async (viewer, reserveData, options = {}, disasterCenter = {}) => {
if (!viewer) { if (!viewer) {
console.warn('[useMapMarkers] addReserveCenterMarkers: viewer 为空') console.warn('[useMapMarkers] addReserveCenterMarkers: viewer 为空')
return return
@ -812,6 +812,7 @@ export function useMapMarkers() {
} }
console.log('[useMapMarkers] 开始添加储备中心和预置点标记...', reserveData.length) console.log('[useMapMarkers] 开始添加储备中心和预置点标记...', reserveData.length)
console.log('reserverData@@@@@', reserveData)
const entities = [] const entities = []
@ -852,8 +853,29 @@ export function useMapMarkers() {
// return; // return;
} }
console.log(`[useMapMarkers] 添加标记: ${item.gl1Yjllmc}, 级别: ${levelString} (${levelName})`) console.log(`[useMapMarkers] 添加标记: ${item.gl1Yjllmc}, 级别: ${levelString} (${levelName})`)
// 3. 计算距离(如果接口未提供)
let distance = null
if (
item.gl1Lng !== null &&
item.gl1Lat !== null &&
typeof disasterCenter?.longitude === 'number' &&
typeof disasterCenter?.latitude === 'number'
) {
distance = Number(
calculateDistance(
{ longitude: item.gl1Lng, latitude: item.gl1Lat },
{ longitude: disasterCenter.longitude, latitude: disasterCenter.latitude }
).toFixed(2)
)
}
const entity = viewer.entities.add({ const entity = viewer.entities.add({
position: result.position, position: result.position,
billboard: { billboard: {
@ -871,7 +893,8 @@ export function useMapMarkers() {
name: item.gl1Yjllmc || `${levelName}应急点`, name: item.gl1Yjllmc || `${levelName}应急点`,
district: item.gl1Qxmc || '-', district: item.gl1Qxmc || '-',
personnelCount: item.gl1Rysl || '0', personnelCount: item.gl1Rysl || '0',
area: item.gl1Zdmj || '-' area: item.gl1Zdmj || '-',
distance: distance || 0,
} }
}) })
entities.push(entity) entities.push(entity)
@ -886,6 +909,46 @@ export function useMapMarkers() {
} }
} }
/**
* 角度转弧度
* @param {number} degrees - 角度值
* @returns {number} 弧度值
*/
const toRadians = (degrees) => (degrees * Math.PI) / 180
/**
* 计算两个经纬度点之间的距离(公里)
* 使用 Haversine 公式
* @param {Object} pointA - { longitude, latitude }
* @param {Object} pointB - { longitude, latitude }
* @returns {number} 距离(km)
*/
const EARTH_RADIUS_KM = 6371
const calculateDistance = (pointA, pointB) => {
if (
typeof pointA?.longitude !== 'number' ||
typeof pointA?.latitude !== 'number' ||
typeof pointB?.longitude !== 'number' ||
typeof pointB?.latitude !== 'number'
) {
console.warn('[useDisasterData] calculateDistance: 坐标参数无效')
return 0
}
const lat1 = toRadians(pointA.latitude)
const lat2 = toRadians(pointB.latitude)
const deltaLat = toRadians(pointB.latitude - pointA.latitude)
const deltaLon = toRadians(pointB.longitude - pointA.longitude)
const a =
Math.sin(deltaLat / 2) ** 2 +
Math.cos(lat1) * Math.cos(lat2) * Math.sin(deltaLon / 2) ** 2
const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a))
return EARTH_RADIUS_KM * c
}
/** /**
* 根据API数据添加应急资源标记养护站 * 根据API数据添加应急资源标记养护站
* @param {Cesium.Viewer} viewer * @param {Cesium.Viewer} viewer
@ -987,12 +1050,11 @@ export function useMapMarkers() {
return return
} }
// 收集所有需要动画的实体(包含所有类型)
const allEntities = [ const allEntities = [
...markerEntities.value, ...markerEntities.value,
...emergencyResourceEntities.value, ...emergencyResourceEntities.value,
...reserveCenterEntities.value ...reserveCenterEntities.value
].filter(e => e.billboard) // 只需要有billboard的实体 ].filter(e => e.billboard && e.properties?.distance?.getValue() <= 50)
console.log('allEntities', allEntities) console.log('allEntities', allEntities)

View File

@ -1267,9 +1267,14 @@ const loadReserveCentersAndPresets = async (
if (mapStore.viewer) { if (mapStore.viewer) {
console.log("[index.vue] 添加储备中心和预置点地图标记..."); console.log("[index.vue] 添加储备中心和预置点地图标记...");
clearReserveCenterMarkers(mapStore.viewer); clearReserveCenterMarkers(mapStore.viewer);
await addReserveCenterMarkers(mapStore.viewer, response.data, { await addReserveCenterMarkers(
heightOffset: 10, mapStore.viewer,
}); response.data,
{
heightOffset: 10,
},
{ longitude, latitude }
);
} else { } else {
console.warn("[index.vue] 地图viewer未就绪跳过标记更新"); console.warn("[index.vue] 地图viewer未就绪跳过标记更新");
} }