在高德地图上加载3DTilesLayer图层模型/天地瓦片

1. 引入必要的库
  • Three.js:一个用于创建和显示3D图形的JavaScript库。
  • @vuemap/three-layer:一个Vue插件,它允许你在高德地图中添加Three.js图层。
  • @vuemap/layer-3dtiles:一个用于处理3D Tiles格式数据的Vue插件,可以用来加载和渲染3D模型。
bash 复制代码
npm install three @vuemap/three-layer @vuemap/layer-3dtiles
# 或者
yarn add three @vuemap/three-layer @vuemap/layer-3dtiles

javascript 复制代码
import { AmbientLight } from 'three';
import { ThreeLayer } from '@vuemap/three-layer';
import { Layer3DTiles } from '@vuemap/layer-3dtiles';
2. 使用 AmbientLight 添加环境光

AmbientLight 是Three.js中的一个类,用于为场景提供均匀的光照效果。它不会产生阴影,并且其颜色和强度会均匀地照亮所有对象。这对于增强3D模型的可见性和真实感非常有用。

  • 参数:

    • color (Hexadecimal): 光的颜色,默认是白色(0xffffff)。
    • intensity (Number): 光的强度,默认是1.0。
  • 示例:

javascript 复制代码
const light = new AmbientLight(0xffffff, 2); // 白色光,强度为2
layer.add(light); // 将环境光添加到ThreeLayer实例中
3. 使用 ThreeLayer 创建3D图层

ThreeLayer 是由 @vuemap/three-layer 提供的一个类,它允许你将Three.js场景作为一个图层添加到高德地图中。这个类封装了Three.js的核心功能,并与高德地图API进行了集成,使得我们可以轻松地在地图上展示3D内容。

  • 构造函数参数:

    • map (AMap.Map): 高德地图实例。
  • 方法:

    • on(event, callback): 监听事件,例如complete,当图层加载完成时触发。
    • add(object): 向图层中添加Three.js的对象,如灯光、几何体等。
    • setzIndex(index): 设置图层的z-index,以控制图层的堆叠顺序。
  • 示例:

javascript 复制代码
const layer = new ThreeLayer(map);
layer.on('complete', () => {
  // 图层加载完成后执行的操作
});
layer.setzIndex(10); // 设置较低的zIndex,确保模型不覆盖其他内容
4. 使用 Layer3DTiles 加载3D模型

Layer3DTiles 是由 @vuemap/layer-3dtiles 提供的一个类,专门用于加载和渲染符合3D Tiles规范的数据。3D Tiles是一种开放标准,旨在高效地传输和渲染大规模三维地理空间数据集。它支持多种几何类型,包括点云、BIM/CAD模型、倾斜摄影等。

  • 构造函数参数:

    • layer (ThreeLayer): 作为父容器的ThreeLayer实例。
    • options (Object): 包含配置选项的对象,如urlposition等。
  • 配置选项:

    • url (String): 指向3D Tiles数据源的URL。
    • position (Array): 模型的位置,通常是经度, 纬度, 海拔的形式。
    • rotation (Object): 模型的旋转属性,包含x, y, z轴的旋转角度。
    • scale (Object): 模型的比例因子,用于缩放模型。
    • translate (Object): 模型的平移属性,用于调整模型的位置。
  • 方法:

    • setRotation(rotation): 设置模型的旋转属性。
    • setScale(scale): 设置模型的比例因子。
    • setTranslate(translate): 设置模型的平移属性。
  • 示例:

javascript 复制代码
const tiles = new Layer3DTiles(layer, {
  url: value.url,
  position: value.position,
});
tiles.setRotation({ ...value.modelRotation });
tiles.setScale({ ...value.modelScale });
tiles.setTranslate({ ...value.translate });
5. 整合一切
javascript 复制代码
const get3dmap = async (map) => {
  let data = await mapApi().get3dmap({ }); //请求模型数据

  if (data.status * 1 == 200) {
    handleSelectValue.value = data.data.modelInfo.map((item) => ({  //用作下拉框切换模型
      label: item.modelName,
      value: JSON.stringify(item.draw_model_config[0].position),
    }));

    let models = data.data.modelInfo;
    let layers = [];

    for (let model of models) {
      let modelConfig = model.draw_model_config.filter(config => config.type === '3D');

      if (modelConfig.length > 0) {
        let value = modelConfig[0];
        const layer = new ThreeLayer(map);

        layer.on('complete', () => {
          const light = new AmbientLight('#fff', 2);
          layer.add(light);

          const tiles = new Layer3DTiles(layer, {
            url: value.url,
            position: value.position,
          });
          tiles.setRotation({ ...value.modelRotation });
          tiles.setScale({ ...value.modelScale });
          tiles.setTranslate({ ...value.translate });
        });

        layer.setzIndex(10);
        layers.push(layer);
      }
    }

    return layers;
  }
};
6. 初始化地图并添加3D图层

最后,我们需要初始化高德地图,并在地图加载完成后调用 get3dmap 函数来获取3D模型并将其添加到地图中。同时,还可以添加其他类型的图层,比如瓦片图层,来丰富地图的内容。

javascript 复制代码
function onMapInit(map) {
  mapInstance = map;

  get3dmap(map).then(layers => {
    layers.forEach(layer => {
      map.add(layer);
    });
  });

  const key = window.KEY || ''; //天地瓦片key
  const wmts = new AMap.TileLayer({
    tileUrl: `http://t0.tianditu.gov.cn/DataServer?T=img_w&tk=${key}&x=[x]&y=[y]&l=[z]`,
    zIndex: 1,
  });
  map.add(wmts);
}
相关推荐
weixin_382395237 小时前
为小工厂量身打造:本地部署的物料管理系统带缺料计算
前端·制造
__zRainy__8 小时前
解决pnpm v10+不自动构建
前端·pnpm·工程化
猫猫不是喵喵.8 小时前
Vue3 Props 属性
前端·javascript·vue.js
醉城夜风~9 小时前
CSS元素显示模式(display)
前端·css
AI大模型-小华10 小时前
Codex 三方充值快速入门指南
java·前端·数据库·chatgpt·ai编程·codex·chatgpt pro
做前端的娜娜子12 小时前
同一链接实现 PC Web 与移动 H5 自适应
前端·掘金·金石计划
小帅不太帅12 小时前
架构没变、规模没变,DeepSeek V4 Flash 正式版凭什么暴涨 47 分?
前端·aigc·deepseek
jarvisuni13 小时前
DeepSeekFlash前端依旧拉垮,而且变慢了很多!
前端·javascript·算法
卷福同学14 小时前
AI编程出海第二步:验证关键词能否做站
前端·人工智能·后端