cesium两种方式实现贴地

根据地形高度计算高度以实现贴地

  • sampleTerrainMostDetailed,用于在地球表面的特定位置上采样最详细的地形数据,返回的是一个 Promise 对象
  • ==数据量大计算量大耗时长==
javascript 复制代码
export function loadBigPointLayer(viewer, features, id, image) {
  let length = features.length
  if (!image) {
    return
  }
  viewer.scene.globe.depthTestAgainstTerrain = true
  //广告牌
  const billboardCollection = viewer.scene.primitives.add(new Cesium.BillboardCollection({ 
    // 如果所有广告牌都是完全不透明的或全部都是半透明的,将技术设置为BlendOption.OPAQUE或BlendOption.TRANSLUCENT最多可以将性能提高2倍
    blendOption: Cesium.BlendOption.TRANSLUCENT,
    scene: viewer.scene 
  }))
  //标注
  const labelCollection = viewer.scene.primitives.add(new Cesium.LabelCollection({scene: viewer.scene }));
  for (let i = 0; i < length; i++) {
    let feature=features[i]
    let x = feature.geometry.coordinates[0]
    let y = feature.geometry.coordinates[1]
    // 转换坐标格式
    let position = Cesium.Cartographic.fromDegrees(x, y)
    let pixelOffset = new Cartesian2(0, 0)
    let distanceDisplay = 7000//广告牌显示距离
    let distanceDisplayCondition = new DistanceDisplayCondition(0, distanceDisplay)
    if (feature.properties.place_type && feature.properties.imgurl) {
      image =feature.properties.imgurl
    }
    const terrainProvider = viewer.terrainProvider
    //此处可以循环每个点一起算,但由于需求要加入每个点的属性信息,所以就每个点单独算了
    //sampleTerrainMostDetailed的第二个参数是数组
    const promise = Cesium.sampleTerrainMostDetailed(terrainProvider, [position]);
    Promise.resolve(promise).then(function (updatedPositions) {
    for (let item of updatedPositions) {
      billboardCollection.add({
        //存储点击时所需属性
        id:{description:feature},
        show:true,
        //此处需要注意坐标格式的转换,需要将弧度值经纬度转为笛卡尔坐标
        position:Cesium.Cartesian3.fromRadians(item.longitude,item.latitude,item.height),
        //广告牌
        image:image,
        pixelOffset:pixelOffset,
        distanceDisplayCondition:distanceDisplayCondition,
        verticalOrigin : Cesium.VerticalOrigin.BOTTOM,
      })
      labelCollection.add({
        id:'Label'+id,
        show:true,
        position:Cesium.Cartesian3.fromRadians(item.longitude,item.latitude,item.height),
        text: features[i].properties.name || features[i].properties.show_name || '',
        font: "'500 10px Helvetica'",
        pixelOffset: new Cartesian2(0, -25),
        distanceDisplayCondition: distanceDisplayCondition,
      })
    }})
  }
}

设置heightReference属性以实现贴地

  • 数据量大情况下贴地耗性能,会卡死

    javascript 复制代码
    export function loadBigPointLayer(viewer, features, id, image) {
      let length = features.length
      if (!image) {
        return
      }
      viewer.scene.globe.depthTestAgainstTerrain = true
      const billboardCollection = viewer.scene.primitives.add(new Cesium.BillboardCollection({ 
        // 如果所有广告牌都是完全不透明的或全部都是半透明的,将技术设置为BlendOption.OPAQUE或BlendOption.TRANSLUCENT最多可以将性能提高2倍
        blendOption: Cesium.BlendOption.TRANSLUCENT,
        scene: viewer.scene 
      }))
      const labelCollection = viewer.scene.primitives.add(new Cesium.LabelCollection({scene: viewer.scene }));
      for (let i = 0; i < length; i++) {
        let feature=features[i]
        let x = feature.geometry.coordinates[0]
        let y = feature.geometry.coordinates[1]
        let position = Cartesian3.fromDegrees(x, y)
        let pixelOffset = new Cartesian2(0, 0)
        let distanceDisplay = 7000//匹配的显示距离
        let distanceDisplayCondition = new DistanceDisplayCondition(0, distanceDisplay)
        if (feature.properties.place_type && feature.properties.imgurl) {
          image =feature.properties.imgurl
        }
        billboardCollection.add({
          id:{description:feature},
          show:true,
          position:position,
          image:image,
          pixelOffset:pixelOffset,
          distanceDisplayCondition:distanceDisplayCondition,
    	  //贴地属性
          heightReference:Cesium.HeightReference.CLAMP_TO_GROUND,
        })
        labelCollection.add({
          id:'Label'+id,
          show:true,
          position:position,
          text: features[i].properties.name || features[i].properties.show_name || '',
          font: "'500 10px Helvetica'",
          pixelOffset: new Cartesian2(0, -25),
          distanceDisplayCondition: distanceDisplayCondition,
    	  //贴地属性
          heightReference:HeightReference.CLAMP_TO_GROUND,
        })
      }
    }
相关推荐
满怀10152 分钟前
【HTML 全栈进阶】从语义化到现代 Web 开发实战
前端·html
东锋1.314 分钟前
前端动画库 Anime.js 的V4 版本,兼容 Vue、React
前端·javascript·vue.js
满怀101526 分钟前
【Flask全栈开发指南】从零构建企业级Web应用
前端·python·flask·后端开发·全栈开发
小杨升级打怪中1 小时前
前端面经-webpack篇--定义、配置、构建流程、 Loader、Tree Shaking、懒加载与预加载、代码分割、 Plugin 机制
前端·webpack·node.js
Yvonne爱编码1 小时前
CSS- 4.4 固定定位(fixed)& 咖啡售卖官网实例
前端·css·html·状态模式·hbuilder
SuperherRo2 小时前
Web开发-JavaEE应用&SpringBoot栈&SnakeYaml反序列化链&JAR&WAR&构建打包
前端·java-ee·jar·反序列化·war·snakeyaml
大帅不是我2 小时前
Python多进程编程执行任务
java·前端·python
前端怎么个事2 小时前
框架的源码理解——V3中的ref和reactive
前端·javascript·vue.js
Ciito2 小时前
将 Element UI 表格元素导出为 Excel 文件(处理了多级表头和固定列导出的问题)
前端·vue.js·elementui·excel
不爱吃饭爱吃菜3 小时前
uniapp微信小程序一键授权登录
前端·javascript·vue.js·微信小程序·uni-app