import * as mars3d from "mars3d"
|
|
export let map // mars3d.Map三维地图对象
|
export let graphicLayer // 矢量图层对象
|
|
// 需要覆盖config.json中地图属性参数(当前示例框架中自动处理合并)
|
export const mapOptions = {
|
scene: {
|
center: { lat: 31.61982, lng: 117.230607, alt: 22746, heading: 2, pitch: -49 }
|
}
|
}
|
|
/**
|
* 初始化地图业务,生命周期钩子函数(必须)
|
* 框架在地图初始化完成后自动调用该函数
|
* @param {mars3d.Map} mapInstance 地图对象
|
* @returns {void} 无
|
*/
|
export function onMounted(mapInstance) {
|
map = mapInstance // 记录map
|
|
// 创建Graphic图层
|
graphicLayer = new mars3d.layer.GraphicLayer()
|
map.addLayer(graphicLayer)
|
|
bindLayerEvent() // 对图层绑定相关事件
|
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
|
graphicLayer.remove()
|
graphicLayer = null
|
}
|
|
function addDemoGraphic1(graphicLayer) {
|
const primitive = new mars3d.graphic.PolygonPrimitive({
|
positions: [
|
[117.218662, 31.800226, 37.68],
|
[117.227836, 31.800388, 32.98],
|
[117.229831, 31.792927, 37.91],
|
[117.222571, 31.791298, 37.04],
|
[117.216327, 31.79375, 37.49]
|
],
|
style: {
|
color: "#00ffff",
|
opacity: 0.4,
|
// clampToGround: true,
|
// classificationType: Cesium.ClassificationType.BOTH,
|
|
label: { text: "鼠标移入会高亮" },
|
// 高亮时的样式(默认为鼠标移入,也可以指定type:'click'单击高亮),构造后也可以openHighlight、closeHighlight方法来手动调用
|
highlight: {
|
// type: mars3d.EventType.click,
|
opacity: 0.8
|
}
|
},
|
attr: { remark: "示例1" }
|
})
|
graphicLayer.addGraphic(primitive) // primitive.addTo(graphicLayer) //另外一种写法
|
}
|
|
// 图片材质
|
function addDemoGraphic2(graphicLayer) {
|
const primitive = new mars3d.graphic.PolygonPrimitive({
|
positions: [
|
[117.187572, 31.823074, 45.53],
|
[117.195377, 31.82418, 43.36],
|
[117.204541, 31.818933, 37.06],
|
[117.19775, 31.809539, 36.59],
|
[117.183832, 31.814237, 38.76]
|
],
|
style: {
|
image: "img/textures/poly-soil.jpg",
|
|
label: {
|
text: "我是火星科技",
|
font_size: 18,
|
color: "#ffffff",
|
distanceDisplayCondition: true,
|
distanceDisplayCondition_far: 500000,
|
distanceDisplayCondition_near: 0
|
}
|
},
|
attr: { remark: "示例2" }
|
})
|
graphicLayer.addGraphic(primitive) // primitive.addTo(graphicLayer) //另外一种写法
|
}
|
|
function addDemoGraphic3(graphicLayer) {
|
const primitive = new mars3d.graphic.PolygonPrimitive({
|
positions: [
|
[117.216386, 31.815376, 35.16],
|
[117.222533, 31.81729, 29.21],
|
[117.22642, 31.814983, 28.43],
|
[117.22681, 31.810739, 28.55],
|
[117.212868, 31.811302, 34.4],
|
[117.212538, 31.81424, 31.87],
|
[117.214681, 31.81402, 32.97]
|
],
|
style: {
|
materialType: mars3d.MaterialType.Water,
|
normalMap: "img/textures/waterNormals.jpg", // 水正常扰动的法线图
|
frequency: 1000.0, // 控制波数的数字。
|
animationSpeed: 0.01, // 控制水的动画速度的数字。
|
amplitude: 10, // 控制水波振幅的数字。
|
specularIntensity: 0.5, // 控制镜面反射强度的数字。
|
baseWaterColor: "#006ab4", // rgba颜色对象基础颜色的水。#00ffff,#00baff,#006ab4
|
blendColor: "#006ab4", // 从水中混合到非水域时使用的rgba颜色对象。
|
clampToGround: true
|
},
|
attr: { remark: "示例3" }
|
})
|
graphicLayer.addGraphic(primitive) // primitive.addTo(graphicLayer) //另外一种写法
|
}
|
|
// 面状:草地面效果
|
function addDemoGraphic4(graphicLayer) {
|
const primitive = new mars3d.graphic.PolygonPrimitive({
|
positions: [
|
[117.319966, 31.842082, 12.29],
|
[117.330034, 31.835286, 11.07],
|
[117.330576, 31.823452, 11.01],
|
[117.311457, 31.821023, 17.11],
|
[117.308954, 31.828975, 16.29]
|
],
|
style: {
|
material: mars3d.MaterialUtil.createMaterial(mars3d.MaterialType.PolyGrass, {
|
grassColor: new Cesium.Color(0.25, 0.4, 0.1, 1.0),
|
dirtColor: new Cesium.Color(0.1, 0.1, 0.1, 1.0),
|
patchiness: 1.5 // 斑驳
|
})
|
},
|
attr: { remark: "示例4" }
|
})
|
graphicLayer.addGraphic(primitive) // primitive.addTo(graphicLayer) //另外一种写法
|
}
|
|
// 面状:木材面效果
|
function addDemoGraphic5(graphicLayer) {
|
const primitive = new mars3d.graphic.PolygonPrimitive({
|
positions: [
|
[117.271662, 31.870639, 21.49],
|
[117.290605, 31.871517, 19.47],
|
[117.302056, 31.858145, 16.27],
|
[117.299439, 31.847545, 14.77],
|
[117.267705, 31.8491, 22.11]
|
],
|
style: {
|
material: mars3d.MaterialUtil.createMaterial(mars3d.MaterialType.PolyWood, {
|
lightWoodColor: new Cesium.Color(0.6, 0.3, 0.1, 1.0),
|
darkWoodColor: new Cesium.Color(0.4, 0.2, 0.07, 1.0),
|
ringFrequency: 10.0, // 环 频率
|
noiseScale: new Cesium.Cartesian2(0.7, 0.5),
|
grainFrequency: 27.0 // 波纹 频率
|
})
|
},
|
attr: { remark: "示例5" }
|
})
|
graphicLayer.addGraphic(primitive) // primitive.addTo(graphicLayer) //另外一种写法
|
}
|
|
// 面状:混合效果
|
function addDemoGraphic6(graphicLayer) {
|
const primitive = new mars3d.graphic.PolygonPrimitive({
|
positions: [
|
[117.154815, 31.853495],
|
[117.181255, 31.854257],
|
[117.182284, 31.848255],
|
[117.184748, 31.840141],
|
[117.180557, 31.835556],
|
[117.180023, 31.833741],
|
[117.166846, 31.833737],
|
[117.155531, 31.833151],
|
[117.154787, 31.835978],
|
[117.151994, 31.839036],
|
[117.150691, 31.8416],
|
[117.151215, 31.844734],
|
[117.154815, 31.853495]
|
],
|
style: {
|
material: mars3d.MaterialUtil.createMaterial(mars3d.MaterialType.PolyBlob, {
|
lightColor: new Cesium.Color(1.0, 1.0, 1.0, 0.5),
|
darkColor: new Cesium.Color(0.0, 0.0, 1.0, 0.5),
|
frequency: 30.0 // 次数
|
})
|
},
|
attr: { remark: "示例6" }
|
})
|
graphicLayer.addGraphic(primitive) // primitive.addTo(graphicLayer) //另外一种写法
|
}
|
|
// 面状: 柏油路面效果
|
function addDemoGraphic7(graphicLayer) {
|
const primitive = new mars3d.graphic.PolygonPrimitive({
|
positions: [
|
[117.208302, 31.85757],
|
[117.234234, 31.858263],
|
[117.234261, 31.833317],
|
[117.207414, 31.834541],
|
[117.208302, 31.85757]
|
],
|
style: {
|
material: mars3d.MaterialUtil.createMaterial(mars3d.MaterialType.PolyAsphalt, {
|
asphaltColor: new Cesium.Color(0.15, 0.15, 0.15, 1.0),
|
bumpSize: 0.005, // 凹凸大小
|
roughness: 0.2 // 粗糙
|
})
|
},
|
attr: { remark: "示例7" }
|
})
|
graphicLayer.addGraphic(primitive) // primitive.addTo(graphicLayer) //另外一种写法
|
}
|
|
// 面状:碎石面效果
|
function addDemoGraphic8(graphicLayer) {
|
const primitive = new mars3d.graphic.PolygonPrimitive({
|
positions: [
|
[117.275127, 31.839641, 25.1],
|
[117.291876, 31.83181, 23.6],
|
[117.289005, 31.82154, 20.1],
|
[117.281431, 31.816607, 23.2],
|
[117.268173, 31.826157, 34.8],
|
[117.268478, 31.82567, 34.2]
|
],
|
style: {
|
width: 5,
|
material: mars3d.MaterialUtil.createMaterial(mars3d.MaterialType.PolyFacet, {
|
lightColor: new Cesium.Color(0.25, 0.25, 0.25, 0.75),
|
darkColor: new Cesium.Color(0.75, 0.75, 0.75, 0.75),
|
frequency: 50.0 // 次数
|
})
|
},
|
attr: { remark: "示例8" }
|
})
|
graphicLayer.addGraphic(primitive) // primitive.addTo(graphicLayer) //另外一种写法
|
}
|
|
function addDemoGraphic9(graphicLayer) {
|
const primitive = new mars3d.graphic.PolygonPrimitive({
|
positions: [
|
[117.261476, 31.799865, 20.8],
|
[117.270864, 31.804957, 26],
|
[117.289609, 31.804853, 25.4],
|
[117.290861, 31.79569, 25.2],
|
[117.268148, 31.788912, 18.5]
|
],
|
style: {
|
height: 50,
|
diffHeight: 300,
|
material: mars3d.MaterialUtil.createMaterial(mars3d.MaterialType.PolyGradient, {
|
color: "#3388cc",
|
alphaPower: 1.5
|
}),
|
label: {
|
text: "Mars3D平台",
|
font_family: "楷体",
|
color: "#ffff00",
|
font_size: 18,
|
setHeight: 400
|
}
|
},
|
attr: { remark: "示例9" }
|
})
|
graphicLayer.addGraphic(primitive) // primitive.addTo(graphicLayer) //另外一种写法
|
}
|
|
function addDemoGraphic10(graphicLayer) {
|
const primitive = new mars3d.graphic.PolygonPrimitive({
|
positions: [
|
// 外环
|
[
|
[117.24586, 31.832682, 38],
|
[117.259349, 31.83163, 33.4],
|
[117.255132, 31.822268, 33.6],
|
[117.247102, 31.822399, 23.6],
|
[117.241675, 31.827205, 30.8]
|
],
|
// 内环
|
[
|
[117.247433, 31.829648, 33.4],
|
[117.253809, 31.828713, 33],
|
[117.252086, 31.824081, 32.6],
|
[117.247597, 31.825922, 31.6]
|
]
|
],
|
style: {
|
color: "#ffff00",
|
opacity: 0.6
|
},
|
attr: { remark: "示例10" }
|
})
|
graphicLayer.addGraphic(primitive) // primitive.addTo(graphicLayer) //另外一种写法
|
}
|
|
function addDemoGraphic11(graphicLayer) {
|
const primitive = new mars3d.graphic.PolygonPrimitive({
|
positions: [
|
[117.232633, 31.816532, 31.2],
|
[117.247045, 31.816953, 25.8],
|
[117.246916, 31.815743, 23.5],
|
[117.243156, 31.811025, 25.7],
|
[117.232491, 31.811307, 27.3]
|
],
|
style: {
|
materialType: mars3d.MaterialType.WaterLight,
|
specularMap: "img/textures/poly-stone.jpg",
|
alpha: 0.6,
|
clampToGround: true
|
},
|
attr: { remark: "示例3" }
|
})
|
graphicLayer.addGraphic(primitive) // primitive.addTo(graphicLayer) //另外一种写法
|
}
|
|
// 生成数据
|
export function addDemoGraphic(count) {
|
graphicLayer.clear()
|
|
showLoading()
|
|
const startTime = new Date().getTime()
|
|
count = count * 10000
|
|
for (let j = 0; j < count; ++j) {
|
const position = randomPoint()
|
const pt1 = mars3d.PointUtil.getPositionByDirectionAndLen(position, 45, 500)
|
const pt2 = mars3d.PointUtil.getPositionByDirectionAndLen(position, 135, 500)
|
const pt3 = mars3d.PointUtil.getPositionByDirectionAndLen(position, 225, 500)
|
const pt4 = mars3d.PointUtil.getPositionByDirectionAndLen(position, 315, 500)
|
|
const primitive = new mars3d.graphic.PolygonPrimitive({
|
positions: [pt1, pt2, pt3, pt4, pt1],
|
style: {
|
height: random(30, 4000),
|
color: Cesium.Color.fromRandom().withAlpha(0.7)
|
},
|
tooltip: "第" + j + "个"
|
})
|
graphicLayer.addGraphic(primitive)
|
}
|
|
hideLoading()
|
const endTime = new Date().getTime()
|
// 两个时间戳相差的毫秒数
|
const usedTime = (endTime - startTime) / 1000
|
globalMsg("共耗时" + usedTime.toFixed(2) + "秒")
|
}
|
|
// 取区域内的随机点
|
function randomPoint() {
|
const jd = random(116.955684 * 1000, 117.474003 * 1000) / 1000
|
const wd = random(31.7576 * 1000, 32.008782 * 1000) / 1000
|
return Cesium.Cartesian3.fromDegrees(jd, wd)
|
}
|
function random(min, max) {
|
return Math.floor(Math.random() * (max - min + 1) + min)
|
}
|
|
// 清除数据
|
|
// 在图层绑定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 })
|
})
|
}
|
|
// 在图层级处理一些事物
|
function bindLayerEvent() {
|
// 在layer上绑定监听事件
|
graphicLayer.on(mars3d.EventType.click, function (event) {
|
console.log("监听layer,单击了矢量对象", event)
|
})
|
/* graphicLayer.on(mars3d.EventType.mouseOver, function (event) {
|
console.log("监听layer,鼠标移入了矢量对象", event)
|
})
|
graphicLayer.on(mars3d.EventType.mouseOut, function (event) {
|
console.log("监听layer,鼠标移出了矢量对象", event)
|
}) */
|
}
|
|
// 绑定右键菜单
|
export function bindLayerContextMenu() {
|
graphicLayer.bindContextMenu([
|
{
|
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
|
}
|
const parent = graphic._parent // 右击是编辑点时
|
graphicLayer.removeGraphic(graphic)
|
if (parent) {
|
graphicLayer.removeGraphic(parent)
|
}
|
}
|
},
|
{
|
text: "计算周长",
|
icon: "fa fa-medium",
|
callback: function (e) {
|
const graphic = e.graphic
|
const strDis = mars3d.MeasureUtil.formatDistance(graphic.distance)
|
globalAlert("该对象的周长为:" + strDis)
|
}
|
},
|
{
|
text: "计算面积",
|
icon: "fa fa-reorder",
|
callback: function (e) {
|
const graphic = e.graphic
|
const strArea = mars3d.MeasureUtil.formatArea(graphic.area)
|
globalAlert("该对象的面积为:" + strArea)
|
}
|
}
|
])
|
}
|