vue3对接腾讯地图渲染3d模型注意事项

81 阅读2分钟

1、引入腾讯地图api

  • 1.1 不用传统的方法在index.html 通过头部链接引入,主要是因为,后面使用困难会造成内存泄漏,作用域混乱(涉及多处使用地图的地方)。
  • 1.2 通过 index.ts 动态的加载腾讯地图api,具体作法如下,好处是,不会造成内存泄露,即开即用。不会造成作用域混乱的问题,因为每个地图map都是一个单例作用域,创建和销毁都是独立的。

/**

  • 腾讯地图API加载器
  • 用于动态加载腾讯地图API

*/

export function TMapLoader(key: string) {

return new Promise(function (resolve, reject) {

if ((window as any).TMap) {

resolve((window as any).TMap);

return;

}

const script = document.createElement("script");

// 移除 model 库,基础加载

script.src = https://map.qq.com/api/gljs?v=1.exp&key=${key}&libraries=view,geometry,visualization,model;

script.async = true;

script.onload = () => {

if ((window as any).TMap) {

resolve((window as any).TMap);

} else {

reject(new Error("TMap 加载失败"));

}

};

document.body.appendChild(script);

});

}

  • 1.3 注意事项 此方法引入模型库会报错,告诉我们不应该用响应式的方法去调用模型库的方法,正确的做法是将模型库的方法单独抽成一个ts方法,通用的方法,在调用模型库的时候需要用markRaw方法来操作一下,这时候才可以正确的使用模型库的方法,具体代码如下

import { markRaw } from "vue";

/**

  • GLTF模型加载选项接口

*/

export interface GLTFModelOptions {

url: string; // 模型文件路径

map: any; // 地图实例

id: string; // 模型ID

position: any; // 模型位置(TMap.LatLng对象)

scale?: number[]; // 模型缩放比例

mask?: any; // 模型可见范围

onLoaded?: () => void; // 模型加载成功回调

onLoadFailed?: () => void; // 模型加载失败回调

}

/**

  • 加载GLTF模型到地图
  • @param TMap TMap API实例
  • @param options 模型加载选项
  • @returns 模型实例

*/

export const loadGLTFModel = (TMap: any, options: GLTFModelOptions): any => {

const {

url,

map,

id,

position,

scale = [1, 1, 1],

mask,

onLoaded,

onLoadFailed,

} = options;

// 创建模型实例

const modelInstance = markRaw(

new TMap.model.GLTFModel({

url,

map,

id,

position,

scale,

mask,

})

);

// 模型资源加载完成回调

modelInstance.on("loaded", () => {

// 调用用户提供的加载成功回调

if (onLoaded) {

onLoaded();

}

});

// 模型加载失败回调

modelInstance.on("load_failed", () => {

// 调用用户提供的加载失败回调

if (onLoadFailed) {

onLoadFailed();

}

});

return modelInstance;

};

/**

  • 销毁模型实例
  • @param modelInstance 模型实例

*/

export const destroyGLTFModel = (modelInstance: any): void => {

if (modelInstance) {

modelInstance.remove(); // 调用模型实例的销毁方法

}

};

  • 1.4 简单说一下这个方法,GLTFModel 需要我们传递几项参数,首先url: 模型的地址,这个模型地址可以是本地也可以是网络在线地址,map: 告诉gltf 要将此模型渲染到那个地图上去,id: 模型的唯一id, position: 模型的位置,类型是 Tmap.LatLng , scale: 模型缩放比例[1,1,1] ,mask: 模型遮罩层 需要传递 TMap.LatLng(coord[1], coord[0]) 数组类型的多边形遮罩层数据,也就是模型围成的多边形数据。
  • 1.5 此时通过上面的操作就能正确的调用并渲染一个3d模型在帝都的特定位置,并且可以清除模型内的腾讯地图自带的白膜数据 如 poi 3d建筑。