You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

121 lines
2.6 KiB

<template>
<div class="emergency-container">
<MarsMap
:url="configUrl"
:options="mapOptions"
map-key="emergency"
@onload="marsOnload"
/>
</div>
</template>
<script setup>
import MarsMap from "@/components/mars-work/mars-map.vue";
import mapOptions from "../mapOptions";
import { onUnmounted } from "vue";
import wallImg from "@/assets/images/visualization/fence-top.png";
//地图配置
const configUrl = "lib/config/config.json";
let mapData = null;
let mapLayer = {};
// 渲染徐汇区面
const initAreaCover = async () => {
const jsonData = await mars3d.Util.fetchJson({
url: "/lib/geoJson/xuhuiArea.json",
});
const arr = mars3d.Util.geoJsonToGraphics(jsonData); // 解析geojson
arr.forEach((item) => {
inintEntity(item, "#8EF4FF");
});
};
const inintEntity = (data, lineColor, height, outline = true,) => {
const polylineGraphic = new mars3d.graphic.PolygonEntity({
positions: data.positions,
style: {
fill:false,
outline: outline, //是否有边框
outlineWidth: 3,
outlineColor: lineColor,
height:height
},
});
mapLayer.arealayer.addGraphic(polylineGraphic);
};
/**
*
* @param positions
*/
const inintEntityWall = (positions) => {
const wall = new mars3d.graphic.WallPrimitive({
positions: positions,
style: {
setHeight: -2500,
diffHeight: 2500, // 墙高
width: 100,
materialType: mars3d.MaterialType.Image2,
materialOptions: {
image: wallImg,
color: "#144C8F",
},
},
});
mapLayer.arealayer.addGraphic(wall);
};
/**
* 风貌区
*/
const initStyleFeatures = async () => {
const jsonData = await mars3d.Util.fetchJson({
url: "/lib/geoJson/park-rectangle.json",
});
const arr = mars3d.Util.geoJsonToGraphics(jsonData); // 解析geojson
inintEntity(arr[0],"#395EB0",10,false);
};
/**
* 地图构建完成
* @param map
*/
const marsOnload = (map) => {
mapData = map;
createMapLayer();
initAreaCover();
initStyleFeatures();
};
/**
* 创建地图矢量图层
*/
const createMapLayer = () => {
mapLayer.arealayer = new mars3d.layer.GraphicLayer();
mapLayer.styleFeatures = new mars3d.layer.GraphicLayer();
mapData.addLayer(mapLayer.arealayer);
mapData.addLayer(mapLayer.styleFeatures);
};
/**
* 销毁一些数据防止影响性能
*/
onUnmounted(() => {
if (mapData) {
mapData.destroy();
mapData = null;
}
mapLayer.arealayer?.clear();
mapLayer.styleFeatures?.clear();
mapLayer = null;
});
</script>
<style scoped>
.emergency-container {
height: 100%;
}
</style>