Fei_Xian_Lin_Ye_Fang_Huo/src/components/mars3d/Map.vue

379 lines
8.8 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<template>
<div
:id="`mars3d-container${mapKey}`"
:class="[
'mars3d-container',
customClass,
{ 'mars3d-container-compare-rh': compare },
]"
></div>
</template>
<script>
import Vue from "vue";
import axios from "axios";
import AppInfo from "../../../public/config/app.json";
let GEOSERVER_BASE_API = process.env.VUE_APP_GEOSERVER_URL;
// 为了方便使用,绑定到原型链在其他vue文件直接 this.mars3d 来使用
Vue.prototype.mars3d = window.mars3d;
Vue.prototype.Cesium = mars3d.Cesium;
export default {
name: "mars3dViewer",
props: {
// 初始化配置参数
url: String,
widgetUrl: String,
// 地图唯一性标识
mapKey: {
type: String,
default: "",
},
// 自定义参数
options: Object,
// 是否分屏显示
compare: {
type: Boolean,
default: false,
},
// 是否插入到body元素上
appendToBody: {
type: Boolean,
default: false,
},
// 自定义css类名
customClass: {
type: String,
default: "",
},
},
mounted() {
if (this.appendToBody) {
document.body.appendChild(this.$el);
}
if (this.mapKey) {
this.initMars3d(this.options);
} else {
mars3d.Resource.fetchJson({ url: this.url }).then((data) => {
// 根据沂水县平邑登录获取对应的图层
try{
axios({
method: "get",
url: AppInfo[localStorage.getItem("areaName")].layerurl,
}).then((res) => {
let configLayers = [];
res.data.data.forEach((item, index) => {
let group = null;
group = {
id: parseInt(Math.random() * 10000000),
name: item.serverName,
type: "group",
};
configLayers.unshift(group);
if (item.children && item.children.length > 0) {
item.children.forEach((it, idx) => {
let attribute = JSON.parse(it.attribute);
attribute.pid = group.id;
delete attribute.highlight;
if(attribute.type == "geojson"){
delete attribute.symbol.styleOptions.opacity
delete attribute.symbol.styleOptions.color
}
if(attribute && attribute.symbol && attribute.symbol.styleField && attribute.symbol.styleFieldOptions && Object.keys(attribute.symbol.styleFieldOptions).length>0){
attribute.type = 'geojson';
if(attribute.layers){
attribute.url = "geoserver/ksp/ows?service=WFS&version=1.0.0&request=GetFeature&typeName="+attribute.layers+"&maxFeatures=1000000&outputFormat=application%2Fjson";
}
delete attribute.layers;
// delete attribute.symbol.styleOptions.color;
delete attribute.parameters;
delete attribute.highlight;
// if(!attribute.symbol.styleOptions){
attribute.symbol.styleOptions = {
"opacity": 0.8,
"color": "",
"width": 2,
"clampToGround": true
}
// }
attribute.zIndex = 10000000000;
}
let ipinfo = this.matchHttpIpPort(attribute.url);
if(ipinfo){ // 如果匹配得到则替换为配置文件中的
attribute.url = attribute.url.replace(ipinfo[0],GEOSERVER_BASE_API);
}else{ //如果没有匹配到则直接拼接
attribute.url = GEOSERVER_BASE_API+attribute.url
}
configLayers.unshift(attribute);
});
}
});
data.map3d.layers = configLayers;
this.initMars3d(data.map3d);
});
}catch(e){
this.initMars3d(data.map3d);
}finally{
}
// this.initMars3d(data.map3d)// 构建地图
});
}
},
destroy() {
this[`map${this.mapKey}`].destroy();
delete this[`map${this.mapKey}`];
},
methods: {
matchHttpIpPort(url) { // 匹配“ http://ip:port ”
const ipRegex = /^http\:\/\/\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b\:\b[0-9]{1,5}\//;
const match = url.match(ipRegex);
if (match) {
return match;
}
return null;
},
getLayers() {},
initMars3d(options) {
if (this[`map${this.mapKey}`]) return;
const mapOptions = {
...options,
...this.options,
};
// 创建三维地球场景
var map = new mars3d.Map(`mars3d-container${this.mapKey}`, mapOptions);
this[`map${this.mapKey}`] = map;
// 挂载到全局对象下,所有组件通过 this.map 访问
// Vue.prototype[`map${this.mapKey}`] = map
// 绑定对alert的处理右键弹出信息更美观。
window.haoutil = window.haoutil || {};
window.haoutil.msg = (msg) => {
this.$message.success(msg);
};
window.haoutil.alert = (msg) => {
this.$message.success(msg);
};
//widget处理
if (
!(
typeof this.widgetUrl == "undefined" ||
this.widgetUrl == null ||
this.widgetUrl == ""
)
)
mars3d.Resource.fetchJson({ url: this.widgetUrl }).then((data) => {
this.initStaticWidget(map, data);
});
// 抛出事件
this.$emit("onload", map);
//开场动画
// map.openFlyAnimation({
// // duration1:4,
// // easingFunction1: Cesium.EasingFunction.QUINTIC_IN_OUT,
// callback: function () {
// //动画播放完成后回调
// },
// });
},
//初始化外部静态widget功能兼容使用传统模式开发的一些widget
initStaticWidget(map, widget) {
mars3d.widget.init(map, widget, "/");
},
},
};
</script>
<!-- Add "scoped" attribute to limit CSS to this component only -->
<style>
.mars3d-container {
height: 100%;
height: 100vh;
position: absolute;
top: 0px;
left: 0px;
overflow: hidden;
}
/* 重写Cesium的css */
/**cesium按钮背景色*/
.cesium-button {
background-color: #062020;
color: #e6e6e6;
fill: #e6e6e6;
line-height: 32px;
}
.cesium-viewer-geocoderContainer .cesium-geocoder-input {
background-color: rgba(63, 72, 84, 0.7);
}
.cesium-viewer-geocoderContainer .cesium-geocoder-input:focus {
background-color: rgba(63, 72, 84, 0.9);
}
.cesium-viewer-geocoderContainer .search-results {
background-color: #3f4854;
}
.cesium-geocoder-searchButton {
background-color: #3f4854;
}
.cesium-infoBox-title {
background-color: #3f4854;
}
.cesium-infoBox {
background: rgba(63, 72, 84, 0.9);
}
.cesium-toolbar-button img {
height: 100%;
}
.cesium-performanceDisplay-defaultContainer {
top: auto;
bottom: 35px;
right: 50px;
}
.cesium-performanceDisplay-ms,
.cesium-performanceDisplay-fps {
color: #fff;
}
/**cesium工具栏位置*/
.cesium-viewer-toolbar {
top: auto;
left: auto;
/** right: 460px; **/
bottom: 150px;
}
.cesium-viewer-toolbar > .cesium-toolbar-button,
.cesium-navigationHelpButton-wrapper,
.cesium-viewer-geocoderContainer {
margin-bottom: 5px;
float: right;
clear: both;
text-align: center;
}
.cesium-baseLayerPicker-dropDown {
bottom: 0;
right: 40px;
max-height: 700px;
margin-bottom: 5px;
}
.cesium-navigation-help {
top: auto;
bottom: 0;
right: 40px;
transform-origin: right bottom;
}
.cesium-sceneModePicker-wrapper {
width: auto;
}
.cesium-sceneModePicker-wrapper .cesium-sceneModePicker-dropDown-icon {
float: left;
margin: 0 3px;
}
.cesium-viewer-geocoderContainer .search-results {
left: 0;
right: 40px;
width: auto;
z-index: 9999;
}
.cesium-infoBox-title {
background-color: #3f4854;
}
.cesium-infoBox {
top: 50px;
background: rgba(63, 72, 84, 0.9);
}
/**左下工具栏菜单*/
.toolbar-dropdown-menu-div {
background: rgba(43, 44, 47, 0.8);
border: 1px solid #2b2c2f;
z-index: 991;
position: absolute;
right: 60px;
bottom: 40px;
display: none;
}
.toolbar-dropdown-menu {
min-width: 110px;
padding: 0;
}
.toolbar-dropdown-menu > li {
padding: 0 3px;
margin: 2px 0;
}
.toolbar-dropdown-menu > li > a {
color: #edffff;
display: block;
padding: 4px 10px;
clear: both;
font-weight: normal;
line-height: 1.6;
white-space: nowrap;
text-decoration: none;
}
.toolbar-dropdown-menu > li > a:hover,
.dropdown-menu > li > a:focus {
color: #fff;
background-color: #444d59;
}
.toolbar-dropdown-menu > .active > a,
.dropdown-menu > .active > a:hover,
.dropdown-menu > .active > a:focus {
color: #fff;
background-color: #444d59;
}
.toolbar-dropdown-menu i {
padding-right: 5px;
}
</style>