import * as mars3d from "mars3d" export let map // mars3d.Map三维地图对象 export let graphicLayer // 矢量图层对象 export const eventTarget = new mars3d.BaseClass() // 事件对象,用于抛出事件到面板中 // 需要覆盖config.json中地图属性参数(当前示例框架中自动处理合并) export const mapOptions = { scene: { center: { lat: 30.402686, lng: 116.303632, alt: 48692, heading: 3, pitch: -43 } } } /** * 初始化地图业务,生命周期钩子函数(必须) * 框架在地图初始化完成后自动调用该函数 * @param {mars3d.Map} mapInstance 地图对象 * @returns {void} 无 */ export function onMounted(mapInstance) { map = mapInstance // 记录首次创建的map showDraw() } /** * 释放当前地图业务的生命周期函数 * @returns {void} 无 */ export function onUnmounted() { map = null } function removeLayer() { if (graphicLayer) { graphicLayer.clear() map.removeLayer(graphicLayer, true) graphicLayer = null } if (tilesetLayer) { map.removeLayer(tilesetLayer, true) tilesetLayer = null } } /** * 平台通过draw标绘后保存的geojosn数据(已经内置style了,无需配置symbol) * * @export showDraw * @param {boolean} isFlyTo 布尔值 * @returns {void} */ export function showDraw(isFlyTo) { removeLayer() graphicLayer = new mars3d.layer.GeoJsonLayer({ name: "标绘示例数据", url: "//data.mars3d.cn/file/geojson/mars3d-draw.json", popup: "{type} {name}", queryParameters: { token: "mars3d" // 可以传自定义url参数,如token等 }, symbol: { merge: true, styleOptions: { // 高亮时的样式 highlight: { type: "click", opacity: 0.9 } } }, flyTo: isFlyTo }) map.addLayer(graphicLayer) // load事件,必须在load完成前绑定才能监听 graphicLayer.on(mars3d.EventType.load, function (event) { if (event.layer) { console.log("数据加载完成", event) } }) setTimeout(() => { // readyPromise是可以load加载数据完成后去获取 graphicLayer.readyPromise.then(function (layer) { console.log("readyPromise:数据加载完成", layer) }) }, 5000) // 单击事件 graphicLayer.on(mars3d.EventType.click, function (event) { console.log("单击了图层", event) }) } /** * 点数据 * * @export showPoint * @returns {void} */ export function showPoint() { removeLayer() graphicLayer = new mars3d.layer.GeoJsonLayer({ name: "体育设施点", url: "//data.mars3d.cn/file/geojson/hfty-point.json", symbol: { styleOptions: { image: "img/marker/mark1.png", verticalOrigin: Cesium.VerticalOrigin.BOTTOM, scale: 1, scaleByDistance: true, scaleByDistance_far: 20000, scaleByDistance_farValue: 0.5, scaleByDistance_near: 1000, scaleByDistance_nearValue: 1, // setHeight: 5000, //指定高度 label: { text: "{项目名称}", font_size: 25, color: "#ffffff", outline: true, outlineColor: "#000000", pixelOffsetY: -25, scaleByDistance: true, scaleByDistance_far: 80000, scaleByDistance_farValue: 0.5, scaleByDistance_near: 1000, scaleByDistance_nearValue: 1, distanceDisplayCondition: true, distanceDisplayCondition_far: 80000, distanceDisplayCondition_near: 0 } } }, popup: [ { field: "项目名称", name: "项目名称" }, { field: "建设性质", name: "建设性质" }, { field: "设施级别", name: "设施级别" }, { field: "所属区县", name: "所属区县" }, { field: "建筑内容及", name: "建筑内容" }, { field: "新增用地(", name: "新增用地" }, { field: "开工", name: "开工" }, { field: "总投资(万", name: "总投资" }, { field: "资金来源", name: "资金来源" }, { field: "初步选址", name: "初步选址" }, { field: "设施类型", name: "设施类型" }, { field: "设施等级", name: "设施等级" }, { field: "所在区县", name: "所在区县" }, { field: "具体位置", name: "具体位置" }, { field: "建设内容(", name: "建设内容" }, { field: "用地面积(", name: "用地面积", format: "mars3d.MeasureUtil.formatArea" }, { field: "设施规模(", name: "设施规模" }, { field: "举办者类型", name: "举办者类型" }, { field: "开工时间", name: "开工时间" }, { field: "总投资额(", name: "总投资额", unit: "亿元" }, { field: "项目推进主", name: "项目推进主体" }, { field: "项目进度", name: "项目进度" }, { field: "项目来源", name: "项目来源" }, { field: "备注", name: "备注" } ], flyTo: true }) map.addLayer(graphicLayer) // 绑定事件 graphicLayer.on(mars3d.EventType.load, function (event) { console.log("数据加载完成", event) }) graphicLayer.on(mars3d.EventType.click, function (event) { console.log("单击了图层", event) }) } /** * 显示线数据 * * @export showChinaLine * @returns {void} */ export function showChinaLine() { removeLayer() graphicLayer = new mars3d.layer.GeoJsonLayer({ name: "全国省界", url: "//data.mars3d.cn/file/geojson/areas/100000_full.json", symbol: { type: "polylineP", // polylineCombine,material添加材质方法不同 styleOptions: { width: 2, material: mars3d.MaterialUtil.createMaterial(mars3d.MaterialType.LineFlow, { color: "#00ffff", image: "img/textures/fence-line.png", speed: 10, repeat_x: 10 }), distanceDisplayCondition: true, distanceDisplayCondition_far: 12000000, distanceDisplayCondition_near: 100000, label: { text: "{name}", position: "{center}", // 省会位置center font_size: 30, color: "#ffffff", outline: true, outlineColor: "#000000", scaleByDistance: true, scaleByDistance_far: 60000000, scaleByDistance_farValue: 0.2, scaleByDistance_near: 1000000, scaleByDistance_nearValue: 1, distanceDisplayCondition: true, distanceDisplayCondition_far: 10000000, distanceDisplayCondition_near: 100000, setHeight: 10000 } } }, flyTo: true }) map.addLayer(graphicLayer) // 绑定事件 graphicLayer.on(mars3d.EventType.load, function (event) { console.log("数据加载完成", event) }) } /** * 显示合肥区域面 * * @export showRegion * @returns {void} */ export function showRegion() { removeLayer() graphicLayer = new mars3d.layer.GeoJsonLayer({ name: "合肥市", url: "//data.mars3d.cn/file/geojson/areas/340100_full.json", symbol: { styleOptions: { fill: true, randomColor: true, // 随机色 opacity: 0.3, outline: true, outlineStyle: { color: "#FED976", width: 3, opacity: 1 }, // 高亮时的样式 highlight: { opacity: 0.9 }, label: { // 面中心点,显示文字的配置 text: "{name}", // 对应的属性名称 opacity: 1, font_size: 40, color: "#ffffff", font_family: "楷体", outline: true, outlineColor: "#000000", outlineWidth: 3, background: false, backgroundColor: "#000000", backgroundOpacity: 0.1, font_weight: "normal", font_style: "normal", scaleByDistance: true, scaleByDistance_far: 20000000, scaleByDistance_farValue: 0.1, scaleByDistance_near: 1000, scaleByDistance_nearValue: 1, distanceDisplayCondition: false, distanceDisplayCondition_far: 10000, distanceDisplayCondition_near: 0, visibleDepth: false } } }, popup: "{name}", // "tooltip": "{name}", flyTo: true }) map.addLayer(graphicLayer) // 绑定事件 graphicLayer.on(mars3d.EventType.load, function (event) { console.log("数据加载完成", event) }) graphicLayer.on(mars3d.EventType.click, function (event) { console.log("单击了图层", event) }) } /** * 立体建筑物 * * @export showBuilding * @returns {void} */ export function showBuilding() { removeLayer() graphicLayer = new mars3d.layer.GeoJsonLayer({ name: "建筑物面", url: "//data.mars3d.cn/file/geojson/buildings-demo.json", symbol: { styleOptions: { color: "#0d3685", outlineColor: "#0d3685", opacity: 0.8 }, callback: function (attr, styleOpt) { const diffHeight = Number(attr.floors || 1) * Number(attr.flo_height) return { height: 0, diffHeight: diffHeight } } }, center: { lat: 31.928659, lng: 120.420654, alt: 838, heading: 344, pitch: -42 }, popup: "all", flyTo: true }) map.addLayer(graphicLayer) // 绑定事件 graphicLayer.on(mars3d.EventType.load, function (event) { console.log("数据加载完成", event) }) } /** * 分层分户立体建筑物 * * @export showFloor * @returns {void} */ export function showFloor() { removeLayer() graphicLayer = new mars3d.layer.GeoJsonLayer({ name: "分层分户建筑物面", url: "//data.mars3d.cn/file/geojson/huxing.json", symbol: { styleOptions: { color: "#ffffff", opacity: 0.2, outline: true, outlineColor: "#63AEFF", outlineOpacity: 0.3, highlight: { type: "click", color: "#00ffff", opacity: 0.6 } }, callback: function (attr, styleOpt) { const flrH = attr.floorh || 0 // 底面高度 const lyrH = attr.layerh || 0 // 楼层高度 return { height: flrH, diffHeight: lyrH } } }, // popup: "all", center: { lat: 31.821524, lng: 117.179329, alt: 255, heading: 25, pitch: -48 }, flyTo: true }) map.addLayer(graphicLayer) // 绑定事件 graphicLayer.on(mars3d.EventType.load, function (event) { console.log("数据加载完成", event) }) } /** * 显示面数据(安徽行政区划),鼠标高亮处理 * * @export showPlanningSurface * @returns {void} */ export function showPlanningSurface() { removeLayer() map.setCameraView({ lat: 31.591382, lng: 120.718945, alt: 784, heading: 279, pitch: -67 }) graphicLayer = new mars3d.layer.GeoJsonLayer({ id: 1987, name: "用地规划", url: "//data.mars3d.cn/file/geojson/guihua.json", symbol: { type: "polygonCombine", styleOptions: { opacity: 0.6, color: "#0000FF" }, styleField: "类型", styleFieldOptions: { 一类居住用地: { color: "#FFDF7F" }, 二类居住用地: { color: "#FFFF00" }, 社区服务用地: { color: "#FF6A38" }, 幼托用地: { color: "#FF6A38" }, 商住混合用地: { color: "#FF850A" }, 行政办公用地: { color: "#FF00FF" }, 文化设施用地: { color: "#FF00FF" }, 小学用地: { color: "#FF7FFF" }, 初中用地: { color: "#FF7FFF" }, 体育场用地: { color: "#00A57C" }, 医院用地: { color: "#A5527C" }, 社会福利用地: { color: "#FF7F9F" }, 商业用地: { color: "#FF0000" }, 商务用地: { color: "#7F0000" }, 营业网点用地: { color: "#FF7F7F" }, 一类工业用地: { color: "#A57C52" }, 社会停车场用地: { color: "#C0C0C0" }, 通信用地: { color: "#007CA5" }, 排水用地: { color: "#00BFFF" }, 公园绿地: { color: "#00FF00" }, 防护绿地: { color: "#007F00" }, 河流水域: { color: "#7FFFFF" }, 配建停车场: { color: "#ffffff" }, 道路用地: { color: "#ffffff" } } }, popup: "类型:{类型}" // flyTo: true, }) map.addLayer(graphicLayer) // 下面代码演示如果再config.json中配置的图层,如何绑定额外事件方法 // 绑定config.json中对应图层配置的"id"值图层的单击事件(比如下面是id:1987对应图层) const layerTest = map.getLayer(1987, "id") // 绑定事件 layerTest.on(mars3d.EventType.load, function (event) { console.log("数据加载完成", event) }) layerTest.on(mars3d.EventType.click, function (event) { // 单击事件 console.log("单击了图层", event) }) } /** * 行政区划 ,转为wall显示 * * @export showBoundaryWall * @returns {void} */ export function showBoundaryWall() { removeLayer() map.setCameraView({ lat: 30.561661, lng: 117.663884, alt: 113078, heading: 346, pitch: -43 }) graphicLayer = new mars3d.layer.GeoJsonLayer({ name: "合肥市", url: "//data.mars3d.cn/file/geojson/areas/340100_full.json", symbol: { type: "wall", styleOptions: { diffHeight: 5000, // 墙高 materialType: mars3d.MaterialType.LineFlow, speed: 10, // 速度 image: "img/textures/fence.png", // 图片 repeatX: 1, // 重复数量 axisY: true, // 竖直方向 color: "#00ffff", // 颜色 opacity: 0.6, // 透明度 // 高亮时的样式 highlight: { type: "click", color: "#ffff00" } } }, popup: "{name}" // "tooltip": "{name}", // flyTo: true, }) map.addLayer(graphicLayer) // 绑定事件 graphicLayer.on(mars3d.EventType.load, function (event) { console.log("数据加载完成", event) }) graphicLayer.on(mars3d.EventType.click, function (event) { console.log("单击了图层", event) }) } /** * 显示特殊面数据(单体化) * * @export showMonomer * @returns {void} */ let tilesetLayer export function showMonomer() { removeLayer() // 三维模型 if (!tilesetLayer) { tilesetLayer = new mars3d.layer.TilesetLayer({ name: "文庙", type: "3dtiles", url: "//data.mars3d.cn/3dtiles/qx-simiao/tileset.json", position: { alt: 80.6 }, maximumScreenSpaceError: 1, maximumMemoryUsage: 1024, show: true }) map.addLayer(tilesetLayer) } graphicLayer = new mars3d.layer.GeoJsonLayer({ name: "文庙-单体化", url: " //data.mars3d.cn/file/geojson/dth-wm.json", symbol: { type: "polygonP", styleOptions: { // 单体化默认显示样式 color: "rgba(255, 255, 255, 0.01)", clampToGround: true, classification: true, // 单体化鼠标移入或单击后高亮的样式 highlight: { // type: mars3d.EventType.click, color: "rgba(255,255,0,0.4)" } } }, popup: [ { field: "name", name: "房屋名称" }, { field: "jznf", name: "建造年份" }, { field: "ssdw", name: "所属单位" }, { field: "remark", name: "备注信息" } ], center: { lat: 33.589442, lng: 119.031613, alt: 254, heading: 5, pitch: -37 }, flyTo: true }) map.addLayer(graphicLayer) // 绑定事件 graphicLayer.on(mars3d.EventType.load, function (event) { console.log("数据加载完成", event) }) } /** * 显示世界各国 * * @export showWorld * @returns {void} */ export function showWorld() { removeLayer() map.setCameraView({ lat: 22.564341, lng: 89.44688, alt: 10817167, heading: 0, pitch: -87 }) graphicLayer = new mars3d.layer.GeoJsonLayer({ name: "国界线", url: "//data.mars3d.cn/file/geojson/world.json", symbol: { type: "polygonP", styleOptions: { fill: true, // color: '#ffffff', // opacity: 0.01, randomColor: true, opacity: 0.5, // 高亮时的样式 highlight: { type: "click", color: "#ffff00" } }, styleField: "name", styleFieldOptions: { Russia: { clampToGround: true } } }, popup: "{name} {name_cn}" }) map.addLayer(graphicLayer) // 绑定事件 graphicLayer.on(mars3d.EventType.load, function (event) { console.log("数据加载完成", event) }) graphicLayer.on(mars3d.EventType.click, function (event) { console.log("单击了图层", event) }) } export function setDefuatData() { const defuat = { enabledShowHide: true, enabledPopup: true, enabledTooltip: false, enabledRightMenu: false } eventTarget.fire("defuatData", defuat) }