rt-sim-training-client/src/views/jlmap/index.vue

300 lines
7.5 KiB
Vue
Raw Normal View History

2019-07-25 10:32:29 +08:00
<template>
2019-08-29 17:16:33 +08:00
<div class="jlmap-canvas" :style="{ width: width+'px', height: height+'px' }">
<div :id="canvasId" style="background: #000;" />
<progress-bar ref="progressBar" />
<zoom-box v-if="!isScreen" :scale-rate="dataZoom.scaleRate" @setShrink="setShrink" @setMagnify="setMagnify" />
2019-07-25 13:26:20 +08:00
<div v-if="show" class="zoom-view" :style="{ width: width +'px'}">
<el-form :model="dataZoom" label-width="60px" size="mini" inline>
2019-08-09 15:10:13 +08:00
<el-form-item :label="$t(`global.offset`)">
<el-input v-model="dataZoom.offsetX" :disabled="true" />
2019-07-25 13:26:20 +08:00
</el-form-item>
<el-form-item>
<el-input v-model="dataZoom.offsetY" :disabled="true" />
2019-07-25 13:26:20 +08:00
</el-form-item>
2019-08-09 15:10:13 +08:00
<el-form-item :label="$t(`global.zoom`)" style="float: right">
<el-input v-model="dataZoom.scaleRate" :disabled="true" />
2019-07-25 13:26:20 +08:00
</el-form-item>
</el-form>
2019-07-25 10:32:29 +08:00
</div>
2019-07-25 13:26:20 +08:00
</div>
2019-07-25 10:32:29 +08:00
</template>
<script>
2019-07-25 13:26:20 +08:00
import Vue from 'vue';
import localStore from 'storejs';
import Jlmap from '@/jmap/map';
import ZoomBox from './zoom/zoom';
import ProgressBar from '@/views/components/progressBar/index';
import { mapGetters } from 'vuex';
import { TrainingMode } from '@/scripts/ConstDic';
2019-08-02 14:54:51 +08:00
import { EventBus } from '@/scripts/event-bus';
2019-07-25 10:32:29 +08:00
2019-07-25 13:26:20 +08:00
export default {
name: 'JlmapVisual',
components: {
ZoomBox,
ProgressBar
},
data() {
return {
loading: true,
dataZoom: {
offsetX: '0',
offsetY: '0',
scaleRate: '1'
},
sectionActive: false,
operate: null
};
},
computed: {
...mapGetters('training', [
'mode',
'offsetStationCode'
]),
canvasId() {
const canvasId = ['map', (Math.random().toFixed(5)) * 100000].join('_');
this.$store.dispatch('config/setCurrentCancasId', { id: canvasId });
return canvasId;
},
width() {
return this.$store.state.config.width;
},
height() {
2019-10-24 18:28:06 +08:00
return this.$store.state.config.height - 30;
},
2019-07-25 13:26:20 +08:00
show() {
2019-08-29 17:16:33 +08:00
if (this.mode == TrainingMode.EDIT || this.mode == TrainingMode.MAP_EDIT) {
2019-07-25 13:26:20 +08:00
return true;
}
return false;
},
isScreen() {
return this.$route.params.mode == 'dp' || this.$store.state.training.roles == 'BigScreen';
2019-07-25 13:26:20 +08:00
}
},
watch: {
'$store.state.map.map': function (val, old) {
2019-07-25 14:03:26 +08:00
try {
2019-07-31 09:13:37 +08:00
if (val) {
this.setMap(val);
} else {
this.mapViewLoaded(false);
}
2019-07-25 14:03:26 +08:00
} catch (error) {
2019-07-26 17:35:58 +08:00
console.log('[ERROR] ', error);
2019-07-25 13:26:20 +08:00
this.mapViewLoaded(false);
}
},
'$store.state.training.rezoomCount': function (val, old) {
2019-07-25 15:44:23 +08:00
this.setCenter(this.$store.state.training.offsetStationCode);
2019-07-25 13:26:20 +08:00
},
'$store.state.config.canvasSizeCount': function (val) {
this.resetSize();
},
'$store.state.menuOperation.magnifyCount': function () {
this.setMagnify();
},
'$store.state.menuOperation.shrinkCount': function () {
this.setShrink();
},
$route() {
this.mapViewLoaded(true);
}
},
created() {
2019-08-02 14:54:51 +08:00
EventBus.$on('viewLoading', (loading) => {
2019-08-05 15:12:06 +08:00
this.mapViewLoaded(loading);
2019-07-26 15:52:50 +08:00
});
2019-08-02 14:54:51 +08:00
EventBus.$on('viewProgressAt', (percentage) => {
2019-08-05 15:12:06 +08:00
this.mapViewProgressAt(percentage);
2019-07-26 15:52:50 +08:00
});
2019-08-02 14:54:51 +08:00
EventBus.$on('refresh', () => {
2019-08-05 15:12:06 +08:00
this.refresh(this.$store.state.map.map);
2019-07-29 15:23:55 +08:00
});
2019-07-25 13:26:20 +08:00
},
mounted() {
this.initLoadPage();
},
2019-08-02 14:54:51 +08:00
beforeDestroy() {
EventBus.$off('refresh');
EventBus.$off('viewLoading');
EventBus.$off('viewProgressAt');
2019-08-29 17:16:33 +08:00
this.$store.dispatch('map/mapClear');
2019-07-25 13:26:20 +08:00
if (this.$jlmap) {
this.$jlmap.dispose();
}
},
methods: {
// 初始化jlmap
initLoadPage() {
document.getElementById(this.canvasId).oncontextmenu = function (e) {
2019-07-25 13:26:20 +08:00
return false;
};
2019-07-25 10:32:29 +08:00
2019-07-25 13:26:20 +08:00
Vue.prototype.$jlmap = new Jlmap({
dom: document.getElementById(this.canvasId),
config: {
renderer: 'canvas',
width: this.width,
height: this.height
},
options: {
scaleRate: 1,
offsetX: 0,
offsetY: 0
},
methods: {
2019-07-25 18:25:04 +08:00
dataLoaded: this.handleDataLoaded,
viewLoaded: this.handleViewLoaded,
2019-07-29 15:23:55 +08:00
stateLoaded: this.handleStateLoaded
2019-07-25 13:26:20 +08:00
}
});
2019-07-25 10:32:29 +08:00
2019-07-25 18:25:04 +08:00
this.$jlmap.on('dataZoom', this.onDataZoom, this);
2019-07-25 13:26:20 +08:00
this.$jlmap.on('selected', this.onSelected, this);
this.$jlmap.on('contextmenu', this.onContextMenu, this);
2019-07-25 10:32:29 +08:00
2019-07-25 13:26:20 +08:00
window.document.oncontextmenu = function () {
return false;
};
},
// 重置jlmap宽高
resetSize() {
this.$nextTick(() => {
this.$jlmap && this.$jlmap.resize({ width: this.width, height: this.height });
2019-07-25 10:32:29 +08:00
2019-07-25 13:26:20 +08:00
this.$store.dispatch('training/updateOffsetStationCode', { offsetStationCode: this.offsetStationCode });
2019-07-25 10:32:29 +08:00
2019-07-25 13:26:20 +08:00
setTimeout(() => {
this.$store.dispatch('config/resetCanvasOffset');
this.$store.dispatch('training/emitTipFresh');
}, 100);
});
},
2019-07-25 15:44:23 +08:00
// 设置显示图级
setLayerVisible(layer) {
this.$jlmap && this.$jlmap.setLayerVisible(layer);
2019-07-25 13:26:20 +08:00
},
2019-07-25 15:44:23 +08:00
// 设置显示图层
setLevelVisible(levels) {
this.$jlmap && this.$jlmap.setLevelVisible(levels);
2019-07-25 13:26:20 +08:00
},
// 设置显示中心
2019-07-25 15:44:23 +08:00
setCenter(deviceCode) {
2019-07-25 14:19:55 +08:00
this.$jlmap && this.$jlmap.setCenter(deviceCode);
2019-07-25 13:26:20 +08:00
},
// 地图数据加载完成
handleDataLoaded() {
2019-07-26 15:59:31 +08:00
this.$store.dispatch('map/mapDataLoaded');
},
// 地图视图加载完成
handleViewLoaded() {
2019-07-26 15:59:31 +08:00
this.$store.dispatch('map/mapViewLoaded');
2019-07-31 15:54:20 +08:00
if (!this.$store.state.training.prdType) {
this.mapViewLoaded(false);
}
},
// 地图状态加载完成
handleStateLoaded() {
this.mapViewLoaded(false);
},
// 地图视图更新
handleViewUpdate() {
},
// 地图状态更新
handleStateUpdate() {
2019-07-25 18:25:04 +08:00
},
// 视图参数改变
handleOptionsUpdate(options) {
},
2019-08-29 17:16:33 +08:00
// 视图缩放事件
2019-07-25 13:26:20 +08:00
onDataZoom(dataZoom) {
this.dataZoom.offsetX = dataZoom.offsetX.toFixed(1) + '';
this.dataZoom.offsetY = dataZoom.offsetY.toFixed(1) + '';
this.dataZoom.scaleRate = dataZoom.scaleRate + '';
2019-07-25 10:32:29 +08:00
2019-08-29 17:16:33 +08:00
const skinCode = this.$store.getters['map/skinCode'];
if (skinCode) {
2019-07-25 13:26:20 +08:00
const param = {
scaleRate: this.dataZoom.scaleRate,
offsetY: this.dataZoom.offsetY,
2019-08-29 17:16:33 +08:00
offsetX: this.dataZoom.offsetX,
skinCode: skinCode
2019-07-25 13:26:20 +08:00
};
2019-08-29 17:16:33 +08:00
this.$store.dispatch('map/updateZoom', this.dataZoom);
localStore.set(`scaleRate_${skinCode}`, JSON.stringify(param)); // 保存缩放倍数
2019-07-25 13:26:20 +08:00
}
this.$store.dispatch('training/emitTipFresh');
},
// 点击选择事件
onSelected(em) {
this.$emit('onSelect', em);
},
// 右键点击事件
onContextMenu(em) {
this.$emit('onMenu', em);
},
// 设置地图加载状态
mapViewLoaded(loading) {
this.loading = loading;
if (loading) {
2019-10-24 09:46:58 +08:00
this.$refs.progressBar&&this.$refs.progressBar.start();
2019-07-25 13:26:20 +08:00
} else {
2019-10-24 09:46:58 +08:00
this.$refs.progressBar&&this.$refs.progressBar.end(true);
2019-07-25 13:26:20 +08:00
}
},
// 设置地图加载进度
mapViewProgressAt(percentage) {
this.$nextTick(() => {
this.$refs.progressBar.progressAt(percentage);
});
},
// 设置新的地图数据
setMap(map) {
this.$jlmap.setMap(map, this.$store.state.map.mapDevice);
2019-07-25 13:26:20 +08:00
},
// 刷新地图数据
refresh(map) {
},
// 缩小
setShrink() {
2019-07-30 12:44:51 +08:00
this.$jlmap.setOptions({type: 'zoom', scale: -1});
2019-07-25 13:26:20 +08:00
},
// 放大
setMagnify() {
2019-07-30 12:44:51 +08:00
this.$jlmap.setOptions({type: 'zoom', scale: 1});
2019-07-25 13:26:20 +08:00
}
}
};
2019-07-25 10:32:29 +08:00
</script>
<style rel="stylesheet/scss" lang="scss" scoped>
.jlmap-canvas {
position: relative;
-moz-user-select: none;
-o-user-select: none;
-khtml-user-select: none;
-webkit-user-select: none;
-ms-user-select: none;
user-select: none;
}
.zoom-view {
2019-10-23 19:15:02 +08:00
// position: fixed;
position: absolute;
2019-07-25 10:32:29 +08:00
height: 28px;
}
/deep/ {
.el-form.el-form--inline {
height: 28px !important;
line-height: 28px !important
}
.el-loading-mask {
background-color: rgba(0, 0, 0, 0.3);
}
}
2019-07-25 10:30:30 +08:00
</style>