/**
* 创建或更新一个适应地形的 Polyline 实体
* @param {Cesium.Viewer} viewer - Cesium Viewer 实例
* @param {string} entityId - 实体ID
* @param {Array} positions - 经纬度坐标数组,格式为 [[经度, 纬度], ...]
* @param {number} [defaultHeight=100] - 无地形数据时使用的默认高度(米)
* @returns {Promise<Cesium.Entity>} - 返回创建的 Polyline 实体 Promise
*/
function createOrUpdateTerrainAwarePolyline(viewer, entityId, positions, defaultHeight = 100) {
const polylineEntityPromise = positions.reduce((promise, [longitude, latitude]) => {
return promise.then((currentEntity) => {
// 将经纬度转换为笛卡尔坐标
const cartesian = Cesium.Cartesian3.fromDegrees(longitude, latitude);
// 查询地形高度
return viewer.scene.globe.getHeight(cartesian).then((height) => {
// 如果没有地形数据,使用默认高度
const finalHeight = height !== undefined ? height : defaultHeight;
// 更新点坐标
const updatedPosition = Cesium.Cartesian3.clone(cartesian, finalHeight);
// 如果是第一个点,创建新的 Polyline 实体
if (!currentEntity) {
return createPolylineEntity(viewer, entityId, [updatedPosition]);
}
// 否则更新现有实体的 Polyline 位置
const polyline = currentEntity.polyline.positions;
polyline.value.push(updatedPosition);
return currentEntity;
});
});
}, Promise.resolve(null));
return polylineEntityPromise;
/**
* 创建一个新的 Polyline 实体
* @param {Cesium.Viewer} viewer - Cesium Viewer 实例
* @param {string} entityId - 实体ID
* @param {Array} positions - 初始的笛卡尔坐标数组
* @returns {Cesium.Entity} - 创建的 Polyline 实体
*/
function createPolylineEntity(viewer, entityId, positions) {
const entity = viewer.entities.add({
id: entityId,
polyline: {
positions: new Cesium.CallbackProperty(() => positions, false),
material: new Cesium.PolylineArrowMaterialProperty(Cesium.Color.AQUAMARINE),
followSurface: false,
width: 10,
},
});
return entity;
}
}
09-17
05-30