import * as mars3d from "mars3d"
export let map // mars3d.Map三维地图对象
let routeLayer
let gaodeRoute
// 当前页面业务相关
let startGraphic
let endPointArr
let poiLayer
let queryGaodePOI
// 需要覆盖config.json中地图属性参数(当前示例框架中自动处理合并)
export const mapOptions = {
scene: {
center: { lat: 31.812769, lng: 117.250545, alt: 18500, heading: 358, pitch: -81 }
}
}
// 自定义事件
export const eventTarget = new mars3d.BaseClass() // 事件对象,用于抛出事件到面板中
/**
* 初始化地图业务,生命周期钩子函数(必须)
* 框架在地图初始化完成后自动调用该函数
* @param {mars3d.Map} mapInstance 地图对象
* @returns {void} 无
*/
export function onMounted(mapInstance) {
map = mapInstance // 记录map
// 创建矢量数据图层
routeLayer = new mars3d.layer.GraphicLayer()
map.addLayer(routeLayer)
gaodeRoute = new mars3d.query.GaodeRoute({})
queryGaodePOI = new mars3d.query.GaodePOI({})
// 创建矢量数据图层
poiLayer = new mars3d.layer.GraphicLayer()
map.addLayer(poiLayer)
poiLayer.bindPopup(function (event) {
const item = event.graphic.attr
let inHtml = '
'
const type = String(item.type).trim()
if (type) {
inHtml += "
" + type + "
"
}
const xzqh = String(item.xzqh).trim()
if (xzqh) {
inHtml += "
" + xzqh + "
"
}
const tel = String(item.tel).trim()
if (tel) {
inHtml += "
" + tel + "
"
}
if (item.address) {
const address = item.address.trim()
inHtml += "
" + address + "
"
}
inHtml += "
"
return inHtml
})
}
/**
* 释放当前地图业务的生命周期函数
* @returns {void} 无
*/
export function onUnmounted() {
map = null
}
// 起点
export function startPoint() {
if (startGraphic) {
startGraphic.remove()
startGraphic = null
}
routeLayer.clear()
return map.graphicLayer
.startDraw({
type: "billboard",
style: {
image: "img/marker/start.png",
horizontalOrigin: Cesium.HorizontalOrigin.CENTER,
verticalOrigin: Cesium.VerticalOrigin.BOTTOM
}
})
.then((graphic) => {
startGraphic = graphic
const point = graphic.point
point.format()
return point.lng + "," + point.lat
})
}
// 终点
export function endPoint() {
showLoading()
routeLayer.clear()
poiLayer.clear()
endPointArr = null
const extent = map.getExtent() // 当前视域内
queryGaodePOI.queryPolygon({
text: "企业",
polygon: [
[extent.xmin, extent.ymin],
[extent.xmin, extent.ymax],
[extent.xmax, extent.ymax],
[extent.xmax, extent.ymin]
],
page: 0,
count: 10,
success: function (res) {
hideLoading()
const count = res.count
eventTarget.fire("end", { count })
addEndPointEntity(res.list)
},
error: function (msg) {
globalMsg(msg)
hideLoading()
}
})
}
// 开始分析
export function btnAnalyse(type, count) {
if (!startGraphic || !endPointArr || endPointArr.length === 0) {
globalMsg("请设置起点和查询目的地")
return
}
showLoading()
queryRoute(type)
}
function queryRoute(type) {
const startPoint = startGraphic.coordinate
const points = []
endPointArr.forEach((item) => {
points.push([startPoint, [item.x, item.y]])
})
gaodeRoute.queryArr({
type: Number(type), // GaodeRouteType枚举类型
points: points,
success: function (data) {
hideLoading()
showRouteResult(data)
},
error: function (msg) {
hideLoading()
globalAlert(msg)
}
})
}
function showRouteResult(data) {
for (let i = 0; i < data.length; i++) {
const item = data[i]
if (!item) {
continue
}
const lnglats = item.points
if (!lnglats || lnglats.length < 1) {
continue
}
const name = endPointArr[i].name
const time = mars3d.Util.formatTime(item.allDuration)
const distance = mars3d.MeasureUtil.formatDistance(item.allDistance)
const html = "目的地:" + name + "