Cesium@1.126.0,创建3D瓦片,修改样式

第一步:添加3D建筑

Cesium.createOsmBuildingsAsync()

这是一个异步方法,所以要写在一个异步函数里

创建一个函数

ts 复制代码
  const create3DBuilding = async (viewer) => {
    try {
      // 添加3D建筑
      const tileset = await Cesium.createOsmBuildingsAsync();
      viewer.scene.primitives.add(tileset);
    } catch (error) {
      console.log(`Error creating tileset: ${error}`);
    }
  };

上述代码运行后的效果

第二步:设定样式

根据某些条件设定样式

首先点击页面中的建筑,右侧会出现信息框。信息框中有一些基本信息

这里,我们根据建筑的类型进行颜色设置

ts 复制代码
const tileset = await Cesium.createOsmBuildingsAsync({
  style: new Cesium.Cesium3DTileStyle({
       color: {
         // 设置条件
         conditions: [
           // 建筑为医院时
           ["${feature['building']} === 'hospital'", "color('#0000FF')"],
           // 建筑为学校时
           ["${feature['building']} === 'school'", "color('#00FF00')"],
           // 建筑为公寓时
           ["${feature['building']} === 'apartments'", "color('#ffa600')"],
           // 除了上述条件以为,其他建筑的颜色
           [true, "color('#999999')"],
         ],
       },
     }),
   });

以某一点为中心,向周围扩散设置样式

根据代码中设定的经纬度
const position = Cesium.Cartesian3.fromDegrees(113.3191, 23.109, 1000);

设置在小于position经纬度0.01的范围设置特定的颜色。

ts 复制代码
const tileset = await Cesium.createOsmBuildingsAsync({
     style: new Cesium.Cesium3DTileStyle({
       defines: {
         distance:
           "distance(vec2(${feature['cesium#longitude']},${feature['cesium#latitude']}),vec2(113.3191,23.109))",
       },
       color: {
         // 设置条件
         conditions: [
           ['${distance} < 0.01', "color('rgba(123,15,110,.8)')"],
           ['${distance} < 0.02', "color('rgba(23,125,110,.5)')"],
           ['${distance} < 0.03', "color('rgba(99,121,110,.8)')"],
           [true, "color('#999999')"],
         ],
       },
     }),
   });

直接设置所有建筑为蓝色

ts 复制代码
 const tileset = await Cesium.createOsmBuildingsAsync({
   style: new Cesium.Cesium3DTileStyle({
      color: "color('blue')",
   }),
 });

完整代码

ts 复制代码
const CesiumCreate: React.FC = () => {
  const cesiumRef = useRef<HTMLDivElement>(null);
  const create3DBuilding = async (viewer) => {
    try {
      // 添加3D建筑
      const tileset = await Cesium.createOsmBuildingsAsync({
        style: new Cesium.Cesium3DTileStyle({
          color: {
            // 设置条件
            conditions: [
              ["${feature['building']} === 'hospital'", "color('#0000FF')"],
              ["${feature['building']} === 'school'", "color('#00FF00')"],
              ["${feature['building']} === 'apartments'", "color('#ffa600')"],
              [true, "color('#999999')"],
            ],
          },
        }),
      });
      viewer.scene.primitives.add(tileset);
    } catch (error) {
      console.log(`Error creating tileset: ${error}`);
    }
  };

  // 初始化调用
  useEffect(() => {
    if (cesiumRef.current) {
      // 创建实例
      const viewer = new Cesium.Viewer(cesiumRef.current, {
        // infoBox: false, // 这里需要打开信息框,后续有用
      });
      // 隐藏logo
      viewer.cesiumWidget.creditContainer.style.display = 'none';

      create3DBuilding(viewer);
      const position = Cesium.Cartesian3.fromDegrees(113.3191, 23.109, 1000);
      viewer.camera.flyTo({
        destination: position,
        duration: 2,
      });
      return () => {
        if (!viewer.isDestroyed()) {
          viewer.destroy();
        }
      };
    }
  }, []);

  return (
    <div id={'cesiumContainer'} ref={cesiumRef} style={{ height: '100vh', width: '100vw' }}></div>
  );
};

export default CesiumCreate;
相关推荐
林涧泣15 分钟前
【Uniapp-Vue3】导入uni-id用户体系
前端·vue.js·uni-app
blzlh33 分钟前
面试高频考点——手写compose
前端·javascript·面试
best_virtuoso41 分钟前
前端 AJAX 一、AJAX概要
前端·javascript·ajax
JiangJiang1 小时前
手摸手带你阅读Vue3源码之Reactive 上
前端·面试
RTLR1 小时前
JavaScript闭包全解析:从基础到高阶实战(深度扩展版)
前端
拉不动的猪1 小时前
移动端开发中的兼容性问题
前端·javascript·面试
何去何从1 小时前
前端四大预请求方案!快来提高你的首屏加载速度吧~
前端·性能优化
liuyang___1 小时前
element ui的select选择框
前端·javascript·vue.js·ui·elementui
时间轴-小文同学1 小时前
腾讯云cos 临时密钥 适用于前端直传等临时授权场景
前端·php·腾讯云
ONEPEICE-ing1 小时前
快速入门——状态管理VueX
前端·javascript·vue.js·vue·vuex