import * as mars3d from "mars3d" export let map // mars3d.Map三维地图对象 let tilesetClip export const mapOptions = { scene: { center: { lat: 31.826361, lng: 117.223374, alt: 805, heading: 206, pitch: -38 } } } export const eventTarget = new mars3d.BaseClass() // 事件对象,用于抛出事件到面板中 /** * 初始化地图业务,生命周期钩子函数(必须) * 框架在地图初始化完成后自动调用该函数 * @param {mars3d.Map} mapInstance 地图对象 * @returns {void} 无 */ export function onMounted(mapInstance) { map = mapInstance // 记录map map.fixedLight = true // 固定光照,避免gltf模型随时间存在亮度不一致。 globalNotify( "已知问题提示", `(1) 对3dtiles数据有要求,仅适用于无自带着色器的纹理格式模型。 (2) 目前不支持所有3dtile数据,请替换url进行自测` ) // 加模型 const tilesetLayer = new mars3d.layer.TilesetLayer({ name: "合肥天鹅湖", type: "3dtiles", url: "//data.mars3d.cn/3dtiles/qx-teh/tileset.json", position: { lng: 117.218434, lat: 31.81807, alt: 163 }, maximumScreenSpaceError: 16, maximumMemoryUsage: 1024, dynamicScreenSpaceError: true, cullWithChildrenBounds: false, skipLevelOfDetail: true, preferLeaves: true }) map.addLayer(tilesetLayer) // 模型开挖处理类 tilesetClip = new mars3d.thing.TilesetClip({ layer: tilesetLayer, positions: [ [117.217219, 31.81957, 33.1], [117.220855, 31.818821, 31.8], [117.220938, 31.817249, 30.6], [117.21743, 31.816218, 31.7] ] }) map.addThing(tilesetClip) // 模型加载完成方法一 tilesetLayer.readyPromise.then((e) => { eventTarget.fire("dataLoaded", { list: tilesetClip.list }) }) // 模型加载完成方法二 /* tilesetLayer.on(mars3d.EventType.load, function () { setTimeout(function () { eventTarget.fire("dataLoaded", { list: tilesetClip.list }) }, 100) }) */ // 会执行多次,重新加载一次完成后都会回调 tilesetLayer.on(mars3d.EventType.allTilesLoaded, function (event) { console.log("触发allTilesLoaded事件", event) }) } /** * 释放当前地图业务的生命周期函数 * @returns {void} 无 */ export function onUnmounted() { map = null } // 绘制矩形 export function btnDrawExtent() { map.graphicLayer.clear() map.graphicLayer.startDraw({ type: "rectangle", style: { color: "#007be6", opacity: 0.2, outline: false }, success: function (graphic) { // 绘制成功后回调 const positions = graphic.getOutlinePositions(false) map.graphicLayer.clear() console.log("绘制坐标为", JSON.stringify(mars3d.PointTrans.cartesians2lonlats(positions))) // 方便测试拷贝坐标 const item = tilesetClip.addArea(positions) addTableItem(item) } }) } // 绘制裁剪区 export function btnDraw() { map.graphicLayer.clear() map.graphicLayer.startDraw({ type: "polygon", style: { color: "#007be6", opacity: 0.2, outline: false }, success: function (graphic) { // 绘制成功后回调 const positions = graphic.positionsShow map.graphicLayer.clear() console.log("绘制坐标为", JSON.stringify(mars3d.PointTrans.cartesians2lonlats(positions))) // 方便测试拷贝坐标 const item = tilesetClip.addArea(positions) addTableItem(item) } }) } // 清除 export function removeAll() { map.graphicLayer.clear() tilesetClip.clear() } // 触发自定义事件 addItem function addTableItem(item) { eventTarget.fire("addItem", { item }) } // 定位至模型 export function flyToGraphic(item) { const graphic = tilesetClip.getAreaById(item) map.flyToPositions(graphic.positions) } // 删除模型 export function deletedGraphic(item) { const graphic = tilesetClip.getAreaById(item) tilesetClip.removeArea(graphic) } export function showHideArea(id, selected) { if (selected) { tilesetClip.showArea(id) } else { tilesetClip.hideArea(id) } }