import * as mars3d from "mars3d"
|
|
export let map // mars3d.Map三维地图对象
|
export let tilesetFlood
|
|
export const mapOptions = {
|
scene: {
|
center: { lat: 31.797067, lng: 117.21963, alt: 1512, heading: 360, pitch: -36 }
|
}
|
}
|
|
export const eventTarget = new mars3d.BaseClass() // 事件对象,用于抛出事件到面板中
|
|
/**
|
* 初始化地图业务,生命周期钩子函数(必须)
|
* 框架在地图初始化完成后自动调用该函数
|
* @param {mars3d.Map} mapInstance 地图对象
|
* @returns {void} 无
|
*/
|
export function onMounted(mapInstance) {
|
map = mapInstance // 记录map
|
|
globalNotify(
|
"已知问题提示",
|
`(1) 对3dtiles数据有要求,仅适用于无自带着色器的纹理格式模型。
|
(2) 目前不支持所有3dtile数据,请替换url进行自测`
|
)
|
|
|
map.fixedLight = true // 固定光照,避免gltf模型随时间存在亮度不一致。
|
addLayer()
|
}
|
|
/**
|
* 释放当前地图业务的生命周期函数
|
* @returns {void} 无
|
*/
|
export function onUnmounted() {
|
map = null
|
}
|
|
function addLayer() {
|
// 加模型
|
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)
|
|
// 会执行多次,重新加载一次完成后都会回调
|
tilesetLayer.on(mars3d.EventType.allTilesLoaded, function (event) {
|
console.log("触发allTilesLoaded事件", event)
|
})
|
|
// 模型淹没处理类
|
tilesetFlood = new mars3d.thing.TilesetFlood({
|
layer: tilesetLayer,
|
floodAll: false
|
})
|
map.addThing(tilesetFlood)
|
|
tilesetFlood.on(mars3d.EventType.start, function (e) {
|
console.log("开始分析", e)
|
})
|
tilesetFlood.on(mars3d.EventType.change, function (e) {
|
const height = e.height
|
eventTarget.fire("heightChange", { height })
|
})
|
tilesetFlood.on(mars3d.EventType.end, function (e) {
|
console.log("结束分析", e)
|
})
|
}
|
|
// 高度选择
|
export function onChangeHeight(height) {
|
tilesetFlood.height = height
|
}
|
|
// 修改分析方式
|
export function changeFloodType(val) {
|
if (val === "1") {
|
tilesetFlood.floodAll = true
|
} else {
|
tilesetFlood.floodAll = false
|
}
|
}
|
|
// 绘制矩形
|
export function btnDrawExtent() {
|
stop()
|
map.graphicLayer.clear()
|
map.graphicLayer.startDraw({
|
type: "rectangle",
|
style: {
|
color: "#007be6",
|
opacity: 0.2,
|
outline: false
|
},
|
success: function (graphic) {
|
// 绘制成功后回调
|
const positions = graphic.getOutlinePositions(false)
|
|
tilesetFlood.addArea(positions)
|
}
|
})
|
}
|
// 绘制多边形
|
export function btnDraw() {
|
stop()
|
map.graphicLayer.clear()
|
map.graphicLayer.startDraw({
|
type: "polygon",
|
style: {
|
color: "#007be6",
|
opacity: 0.5,
|
outline: false
|
},
|
success: function (graphic) {
|
// 绘制成功后回调
|
const positions = graphic.positionsShow
|
|
tilesetFlood.addArea(positions)
|
|
console.log("绘制坐标为", JSON.stringify(mars3d.PointTrans.cartesians2lonlats(positions))) // 方便测试拷贝坐标
|
}
|
})
|
}
|
|
// 开始分析
|
export function begin(data) {
|
if (!tilesetFlood.floodAll && tilesetFlood.length === 0) {
|
globalMsg("请首先绘制分析区域!")
|
return false
|
}
|
map.graphicLayer.clear()
|
|
const minValue = Number(data.minHeight)
|
const maxValue = Number(data.maxHeight)
|
const speed = Number(data.speed)
|
if (minValue <= 27) {
|
globalMsg("最低海拔过低,请耐心等候几秒")
|
}
|
if (minValue > maxValue) {
|
globalMsg("当前最低海拔高于最高海拔")
|
return false
|
}
|
|
console.log("当前参数", { minHeight: minValue, maxHeight: maxValue })
|
|
tilesetFlood.setOptions({
|
minHeight: minValue,
|
maxHeight: maxValue,
|
speed: speed
|
})
|
|
tilesetFlood.start()
|
return true
|
}
|
|
export function stop() {
|
tilesetFlood.clear()
|
}
|