import * as mars3d from "mars3d"
export let map // mars3d.Map三维地图对象
export let graphicLayer // 矢量图层对象
// 需要覆盖config.json中地图属性参数(当前示例框架中自动处理合并)
export const mapOptions = {
scene: {
center: { lat: 30.468743, lng: 116.499464, alt: 67446, heading: 0, pitch: -45 }
}
}
/**
* 初始化地图业务,生命周期钩子函数(必须)
* 框架在地图初始化完成后自动调用该函数
* @param {mars3d.Map} mapInstance 地图对象
* @returns {void} 无
*/
export function onMounted(mapInstance) {
map = mapInstance // 记录首次创建的map
map.on(mars3d.EventType.click, function (event) {
console.log("监听map,单击了矢量对象", event)
})
// 创建DIV数据图层
graphicLayer = new mars3d.layer.GraphicLayer()
map.addLayer(graphicLayer)
// 在layer上绑定监听事件
graphicLayer.on(mars3d.EventType.click, function (event) {
console.log("监听layer,单击了矢量对象", event)
})
bindLayerPopup() // 在图层上绑定popup,对所有加到这个图层的矢量数据都生效
bindLayerContextMenu() // 在图层绑定右键菜单,对所有加到这个图层的矢量数据都生效
// 加一些演示数据
addDemoGraphic1(graphicLayer)
addDemoGraphic2(graphicLayer)
addDemoGraphic3(graphicLayer)
addDemoGraphic4(graphicLayer)
addDemoGraphic5(graphicLayer)
addDemoGraphic6(graphicLayer)
addDemoGraphic7(graphicLayer)
addDemoGraphic8(graphicLayer)
addDemoGraphic9(graphicLayer)
addDemoGraphic10(graphicLayer)
addDemoGraphic11(graphicLayer)
}
/**
* 释放当前地图业务的生命周期函数
* @returns {void} 无
*/
export function onUnmounted() {
map = null
}
// 一个黑色面板,指向左下角黄色连线
function addDemoGraphic1(graphicLayer) {
const graphic = new mars3d.graphic.DivGraphic({
position: [116.741611, 31.408068, 75.5],
style: {
html: `
`,
horizontalOrigin: Cesium.HorizontalOrigin.LEFT,
verticalOrigin: Cesium.VerticalOrigin.CENTER,
distanceDisplayCondition: new Cesium.DistanceDisplayCondition(0, 400000), // 按视距距离显示
clampToGround: true,
// 高亮时的样式
highlight: {
// type: mars3d.EventType.click,
className: "marsBlackPanel-highlight"
}
},
attr: { remark: "示例1" }
})
graphicLayer.addGraphic(graphic)
}
// 一个渐变的文本面板,中间竖直连线
function addDemoGraphic2(graphicLayer) {
const graphic = new mars3d.graphic.DivGraphic({
position: [116.510732, 31.403786, 176.4],
style: {
html: ``,
offsetY: -60,
horizontalOrigin: Cesium.HorizontalOrigin.CENTER,
verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
distanceDisplayCondition: new Cesium.DistanceDisplayCondition(0, 400000), // 按视距距离显示
// 高亮时的样式
highlight: {
type: mars3d.EventType.click,
className: "marsBlueGradientPnl-highlight"
}
},
attr: { remark: "示例2" }
})
graphicLayer.addGraphic(graphic)
}
//
function addDemoGraphic3(graphicLayer) {
const graphic = new mars3d.graphic.DivGraphic({
position: [116.960075, 31.19609, 237.4],
style: {
html: `安徽欢迎您
`,
horizontalOrigin: Cesium.HorizontalOrigin.CENTER,
verticalOrigin: Cesium.VerticalOrigin.BOTTOM
// 高亮时的样式
// highlight: {
// type: mars3d.EventType.click,
// className: "marsGreenGradientPnl-highlight"
// }
},
attr: { remark: "示例3" }
})
graphicLayer.addGraphic(graphic)
}
// 添加GIF图标,DIV方式
function addDemoGraphic4(graphicLayer) {
const graphic = new mars3d.graphic.DivGraphic({
position: [116.79013, 31.164872, 289],
style: {
html: '
',
distanceDisplayCondition: new Cesium.DistanceDisplayCondition(0, 200000), // 按视距距离显示
horizontalOrigin: Cesium.HorizontalOrigin.CENTER,
verticalOrigin: Cesium.VerticalOrigin.CENTER
},
attr: { remark: "示例4" },
pointerEvents: false // false时不允许拾取和触发任意鼠标事件,但可以穿透div缩放地球
})
graphicLayer.addGraphic(graphic)
}
// 加css动画的扩散点 DivLightPoint
function addDemoGraphic5(graphicLayer) {
const graphic = new mars3d.graphic.DivLightPoint({
position: [116.630276, 31.213813],
style: {
color: "#f33349",
distanceDisplayCondition: new Cesium.DistanceDisplayCondition(0, 200000), // 按视距距离显示
heightReference: Cesium.HeightReference.CLAMP_TO_GROUND
},
attr: { remark: "示例5" },
popup: "测试popup"
})
graphicLayer.addGraphic(graphic)
}
// 内置扩展的动态文本 DivBoderLabel
function addDemoGraphic6(graphicLayer) {
const graphic = new mars3d.graphic.DivBoderLabel({
position: [116.460722, 31.140888, 781],
style: {
text: "火星科技Mars3D平台",
font_size: 15,
font_family: "微软雅黑",
color: "#ccc",
boderColor: "#15d1f2"
},
attr: { remark: "示例6" }
})
graphicLayer.addGraphic(graphic)
}
// 内置扩展的竖立文本 DivBoderLabel
function addDemoGraphic7(graphicLayer) {
const graphic = new mars3d.graphic.DivUpLabel({
position: [116.327136, 30.99723, 914.6],
style: {
text: "我是竖立的文本",
color: "#fff",
font_size: 16,
font_family: "微软雅黑",
lineHeight: 60,
circleSize: 8,
distanceDisplayCondition: new Cesium.DistanceDisplayCondition(0, 100000) // 按视距距离显示
},
attr: { remark: "示例7" }
})
graphicLayer.addGraphic(graphic)
}
// 类似popup/toolitp的自定义html
function addDemoGraphic8(graphicLayer) {
const graphic = new mars3d.graphic.Popup({
position: [116.146461, 31.380152, 395.1],
style: {
html: `这里可以放入任意html代码
Popup和Tooltip也是继承自DivGraphic`,
closeButton: false,
horizontalOrigin: Cesium.HorizontalOrigin.CENTER,
verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
distanceDisplayCondition: new Cesium.DistanceDisplayCondition(0, 200000), // 按视距距离显示
// 高亮时的样式
highlight: {
type: mars3d.EventType.click,
className: "mars3d-template-highlight"
}
},
attr: { remark: "示例8" }
})
graphicLayer.addGraphic(graphic)
}
// 倾斜指向左下角的面板样式
function addDemoGraphic9(graphicLayer) {
const graphic = new mars3d.graphic.DivGraphic({
position: [116.138686, 31.101009, 1230],
style: {
html: ``,
horizontalOrigin: Cesium.HorizontalOrigin.LEFT,
verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
distanceDisplayCondition: new Cesium.DistanceDisplayCondition(0, 200000), // 按视距距离显示
scaleByDistance: new Cesium.NearFarScalar(1000, 1.0, 200000, 0.2),
clampToGround: true
},
attr: { remark: "示例9" },
pointerEvents: false // false时不允许拾取和触发任意鼠标事件,但可以穿透div缩放地球
})
graphicLayer.addGraphic(graphic)
// 刷新局部DOM,不影响面板的其他控件操作
// [建议读取到后端接口数据后主动去修改DOM,比下面演示的实时刷新效率高些]
graphic.on(mars3d.EventType.postRender, function (event) {
const container = event.container // popup对应的DOM
const lablLiuliang = container.querySelector("#lablLiuliang")
if (lablLiuliang) {
lablLiuliang.innerHTML = (Math.random() * 100).toFixed(0) // 测试的随机数
}
const lablYeWei = container.querySelector("#lablYeWei")
if (lablYeWei) {
lablYeWei.innerHTML = mars3d.Util.formatDate(new Date(), "ss.S") // 测试的随机数
}
})
}
// 倾斜指向左下角的面板样式
function addDemoGraphic10(graphicLayer) {
const graphic = new mars3d.graphic.DivGraphic({
position: [116.228043, 30.882207],
style: {
html: ``,
horizontalOrigin: Cesium.HorizontalOrigin.LEFT,
verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
distanceDisplayCondition: new Cesium.DistanceDisplayCondition(0, 200000), // 按视距距离显示
scaleByDistance: new Cesium.NearFarScalar(1000, 1.0, 200000, 0.2),
clampToGround: true
},
attr: { remark: "示例10" },
// 可以传入自定义测试点样式
// testPoint: {
// color: '#ff0000',
// pixelSize: 8,
// },
pointerEvents: false // false时不允许拾取和触发任意鼠标事件,但可以穿透div缩放地球
})
graphicLayer.addGraphic(graphic)
graphic.testPoint = true // 打开测试点,与DIV点进行对比位置调整css
}
// 倾斜指向左下角的面板样式
function addDemoGraphic11(graphicLayer) {
const graphic = new mars3d.graphic.DivGraphic({
position: Cesium.Cartesian3.fromDegrees(116.706926, 30.945346, 457.5),
style: {
html: ``,
horizontalOrigin: Cesium.HorizontalOrigin.LEFT,
verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
distanceDisplayCondition: new Cesium.DistanceDisplayCondition(1000, 200000) // 按视距距离显示
},
attr: { remark: "示例11" }
})
graphicLayer.addGraphic(graphic)
movePoint(graphic) // 动画移动示例
}
//
function movePoint(graphic) {
map.clock.shouldAnimate = true
// 动画移动
const property = new Cesium.SampledPositionProperty()
property.forwardExtrapolationType = Cesium.ExtrapolationType.HOLD
const time = 20 // 移动的时长 ,秒
let tempTime
// 起点
const startPoint = Cesium.Cartesian3.fromDegrees(116.706926, 30.945346, 457.5)
tempTime = map.clock.currentTime // 飞行开始时间
property.addSample(tempTime, startPoint)
// 移动到的第1个目标点
const point1 = Cesium.Cartesian3.fromDegrees(116.311439, 30.76485, 423.7)
tempTime = Cesium.JulianDate.addSeconds(tempTime, time, new Cesium.JulianDate())
property.addSample(tempTime, point1)
// 移动到的第2个目标点
const point2 = Cesium.Cartesian3.fromDegrees(116.63081, 30.786585, 85)
tempTime = Cesium.JulianDate.addSeconds(tempTime, time, new Cesium.JulianDate())
property.addSample(tempTime, point2)
// 移动到的第3个目标点
const point3 = Cesium.Cartesian3.fromDegrees(116.706926, 30.945346, 457.5)
tempTime = Cesium.JulianDate.addSeconds(tempTime, time, new Cesium.JulianDate())
property.addSample(tempTime, point3)
graphic.position = property
}
// 按钮事件
export function startDrawGraphic() {
// 开始绘制
graphicLayer.startDraw({
type: "div",
style: {
html: `
测试DIV点
此处可以绑定任意Html代码和css效果
`,
horizontalOrigin: Cesium.HorizontalOrigin.LEFT,
verticalOrigin: Cesium.VerticalOrigin.BOTTOM
}
})
}
// 在图层绑定Popup弹窗
export function bindLayerPopup() {
graphicLayer.bindPopup(function (event) {
const attr = event.graphic.attr || {}
attr["类型"] = event.graphic.type
attr["来源"] = "我是layer上绑定的Popup"
attr["备注"] = "我支持鼠标交互"
return mars3d.Util.getTemplateHtml({ title: "矢量图层", template: "all", attr: attr })
})
}
// 绑定右键菜单
export function bindLayerContextMenu() {
graphicLayer.bindContextMenu([
{
text: "开始编辑对象",
icon: "fa fa-edit",
show: function (e) {
const graphic = e.graphic
if (!graphic || !graphic.startEditing) {
return false
}
return !graphic.isEditing
},
callback: function (e) {
const graphic = e.graphic
if (!graphic) {
return false
}
if (graphic) {
graphicLayer.startEditing(graphic)
}
}
},
{
text: "停止编辑对象",
icon: "fa fa-edit",
show: function (e) {
const graphic = e.graphic
if (!graphic) {
return false
}
return graphic.isEditing
},
callback: function (e) {
const graphic = e.graphic
if (!graphic) {
return false
}
if (graphic) {
graphicLayer.stopEditing(graphic)
}
}
},
{
text: "删除对象",
icon: "fa fa-trash-o",
show: (event) => {
const graphic = event.graphic
if (!graphic || graphic.isDestroy) {
return false
} else {
return true
}
},
callback: function (e) {
const graphic = e.graphic
if (!graphic) {
return
}
graphicLayer.stopEditing(graphic)
graphicLayer.removeGraphic(graphic)
}
}
])
}
export function updateLayerHasEdit(enabledEdit) {
graphicLayer.hasEdit = enabledEdit
}