Cesium实现限高设计

Cesium实现限高设计

在这里插入图片描述

请添加图片描述

主要使用的API

ClassificationPrimitive
GeometryInstance
PolygonGeometry

使用

直接上代码

const {
  Cartesian3,
  GeometryInstance,
  PolygonGeometry,
  PolygonHierarchy,
  ColorGeometryInstanceAttribute,
  Color,
  ClassificationPrimitive,
  ClassificationType,
  Cartographic,
  Matrix4,
  ShowGeometryInstanceAttribute
} = window.Cesium

const handleColor = (color, alpha)=> {
  return Color.fromCssColorString(color).withAlpha(alpha || 1)
}

export default class HeightLimit {
  limitHeightPrimitive = null
  constructor({ viewer, data, style = {} }) {
    this.viewer = viewer
    this.data = data
    this.style = style
    this.addPrimitive()
  }
  addPrimitive() {
    let { height = 0, color = 'pink', alpha } = this.style
    color = handleColor(color, alpha)
    const limitHeightPrimitive = this.viewer.scene.primitives.add(
    	/**
    	https://cesium.com/learn/cesiumjs/ref-doc/ClassificationPrimitive.html?classFilter=ClassificationPrimitive
    	ClassificationPrimitive 用来生成可以穿透
    	*/
      new ClassificationPrimitive({
        geometryInstances: new GeometryInstance({
          geometry: new PolygonGeometry({
            polygonHierarchy: new PolygonHierarchy(
              Cartesian3.fromDegreesArray(this.data)
            ),
            height,
            extrudedHeight: height + 3000
          }),
          attributes: {
            color: ColorGeometryInstanceAttribute.fromColor(color),
            show: new ShowGeometryInstanceAttribute(true)
          }
        }),
        releaseGeometryInstances: false,
        /**
        https://cesium.com/learn/cesiumjs/ref-doc/global.html#ClassificationType
        只有 3D Tiles 会被分类
		 */
        classificationType: ClassificationType.CESIUM_3D_TILE
      })
    )
    limitHeightPrimitive.readyPromise.then(() => {
    })

	// 这里主要是为了添加一个高出地面的 polygon , 用到的经纬度数据和需要校验的建筑物数据一样
	this.setPolygon(height, alpha )
  }
  // 这里主要是为了添加一个高出地面的 polygon , 用到的经纬度数据和需要校验的建筑物数据一样
  setPolygon(height, alpha ) {
	this.viewer.entities.add({
      polygon: {
        hierarchy: new PolygonHierarchy(
          Cartesian3.fromDegreesArray(this.data)
        ),
        material: Color.fromCssColorString('#FFF8DC').withAlpha(alpha || 1),
        height,
        perPositionHeight: false,
      }
    })
  }
}

setPolygon方法不使用的效果图如下
在这里插入图片描述

使用

new HeightLimit({
  viewer: this.viewer,
  data: [
    113.060458, 22.670675, 113.070458, 22.650675, 113.080458, 22.700675,
    113.020458, 22.500675
  ],
  style: {
    color: 'pink',
    alpha: 0.5,
    height: 120
  }
})
// 需要生成 倾斜摄影数据
function set3Dtitle3(){}

倾斜摄影可以参考这个大佬的文章

### Cesium 高度限制分析方法 在 `cesium-test` 项目中,提供了多种地形和建筑的高度限制分析功能[^1]。为了实现高度限制分析,通常会涉及到以下几个方面: #### 1. 获取地形高度数据 Cesium 提供了内置的方法来获取指定位置的地形高度。可以使用 `sampleTerrainMostDetailed` 或者 `sampleTerrain` 方法异步获取地形高度。 ```javascript const terrainProvider = new Cesium.CesiumTerrainProvider({ url: 'https://assets.agi.com/stk-terrain/world' }); async function getHeightAtPosition(position) { const heightSamples = await Cesium.sampleTerrainMostDetailed(terrainProvider, [position]); return heightSamples[0].height; } ``` #### 2. 设置限高条件 通过定义最大允许高度来进行限高判断。当某个物体或飞行路径超过设定的最大高度时触发警告或其他处理逻辑。 ```javascript function checkHeightLimit(entity, maxHeight) { let position = entity.position.getValue(Cesium.JulianDate.now()); getHeightAtPosition(position).then(height => { if (entity.altitude > height + maxHeight) { console.warn('Exceeded maximum allowed altitude'); } }); } ``` #### 3. 可视化展示 对于超出限定范围的部分可以通过改变颜色、增加标记等方式直观显示出来。例如,在三维模型上应用不同的材质属性表示是否越过了界限;也可以创建额外的几何图形作为指示器。 ```javascript // 创建一个红色多边形覆盖超高的区域 let polygonEntity = viewer.entities.add({ name : 'Height Limit Exceed', polygon : { hierarchy : new Cesium.PolygonHierarchy(coordinates), material : Cesium.Color.RED.withAlpha(0.5) } }); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值