From e2babbeeaa0dc155cb8eccab9b63220bb4961ce1 Mon Sep 17 00:00:00 2001 From: "hong.yang" <hong.yang@ustcinfo.com> Date: Fri, 15 Sep 2023 11:23:52 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E6=81=A2=E5=A4=8D=E8=A2=AB=E5=90=88?= =?UTF-8?q?=E5=B9=B6=E8=A6=86=E7=9B=96=E7=9A=84=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 恢复被合并覆盖的文件 --- .../packages/BasicComponents/Map/index.vue | 308 ++++++++++-------- 1 file changed, 175 insertions(+), 133 deletions(-) diff --git a/data-room-ui/packages/BasicComponents/Map/index.vue b/data-room-ui/packages/BasicComponents/Map/index.vue index 45779a5a..824b31c3 100644 --- a/data-room-ui/packages/BasicComponents/Map/index.vue +++ b/data-room-ui/packages/BasicComponents/Map/index.vue @@ -1,16 +1,9 @@ <template> <div - style="width: 100%; height: 100%" class="bs-design-wrap bs-bar" + style="width: 100%; height: 100%" > - <el-button - v-if="level=='province'&&config.customize.down" - class="button" - type="text" - @click="jumpTo(config)" - > - 返回上一级 - </el-button> + <el-button v-if="currentDeep > 0" class="button" type='text' @click="jumpTo(config)"> 返回上一级</el-button> <div :id="`chart${config.code}`" style="width: 100%; height: 100%" @@ -23,6 +16,7 @@ import * as echarts from 'echarts' import commonMixins from 'data-room-ui/js/mixins/commonMixins.js' import paramsMixins from 'data-room-ui/js/mixins/paramsMixins' import linkageMixins from 'data-room-ui/js/mixins/linkageMixins' + export default { name: 'MapCharts', mixins: [paramsMixins, commonMixins, linkageMixins], @@ -36,22 +30,24 @@ export default { default: () => ({}) } }, - data () { + data() { return { + currentDeep: 0, + mapList: [], charts: null, hasData: false, - level:'', - option:{} + level: '', + option: {} } }, computed: { - Data () { + Data() { return JSON.parse(JSON.stringify(this.config)) } }, watch: { Data: { - handler (newVal, oldVal) { + handler(newVal, oldVal) { if (newVal.w !== oldVal.w || newVal.h !== oldVal.h) { this.$nextTick(() => { this.charts.resize() @@ -61,14 +57,14 @@ export default { deep: true } }, - mounted () { + mounted() { this.chartInit() }, - beforeDestroy () { + beforeDestroy() { this.charts?.clear() }, methods: { - chartInit () { + chartInit() { const config = this.config // key和code相等,说明是一进来刷新,调用list接口 if (this.config.code === this.config.key || this.isPreview) { @@ -77,7 +73,8 @@ export default { // 改变样式 // config = this.changeStyle(res) this.newChart(config) - }).catch(() => {}) + }).catch(() => { + }) } else { // 否则说明是更新,这里的更新只指更新数据(改变样式时是直接调取changeStyle方法),因为更新数据会改变key,调用chart接口 this.changeData(config).then((res) => { @@ -86,10 +83,13 @@ export default { }) } }, - dataFormatting (config, data) { + dataFormatting(config, data) { const dataList = [] data?.data?.forEach(item => { - dataList.push({ name: item[config.customize.name], value: [item[config.customize.xaxis], item[config.customize.yaxis], item[config.customize.value]] }) + dataList.push({ + name: item[config.customize.name], + value: [item[config.customize.xaxis], item[config.customize.yaxis], item[config.customize.value]] + }) }) config.option = { ...config.option, @@ -97,32 +97,36 @@ export default { } return config }, - async jumpTo (config) { - this.level = 'country' - const mapUrl = `${window.BS_CONFIG?.httpConfigs?.baseURL}/static/chinaMap/country/中华人民共和国.json` - const map = await this.$dataRoomAxios.get(decodeURI(mapUrl), {}, true) - this.option.geo.map = '中华人民共和国' - this.changeData({ ...config, customize: { ...config.customize, level: 'country', scope: '中国' } }) - echarts.registerMap('中华人民共和国', map) - this.charts.setOption(this.option, true) + async jumpTo(config) { + this.currentDeep-- + let map = this.mapList[this.currentDeep] + // 移除mapList中的最后一个元素 + this.mapList.pop() + let mapData = JSON.parse(map.geoJson) + this.option.geo.map = map.name; + this.changeData({...config, customize: {...config.customize, level: map.level, scope: map.name}}) + echarts.registerMap(map.name, mapData); + this.charts.setOption(this.option, true); }, - async newChart (config) { + async newChart(config) { + let center1 = config.customize.center1 ? config.customize.center1 + '%' : '50%' + let center2 = config.customize.center2 ? config.customize.center2 + '%' : '50%' this.charts = echarts.init( document.getElementById(`chart${this.config.code}`) ) this.option = { // 背景颜色 backgroundColor: config.customize.backgroundColor, - graphic: [ - ], + graphic: [], geo: { map: config.customize.scope, - zlevel: 10, + zlevel: 9, show: true, - layoutCenter: ['50%', '50%'], + // 地图中心点位置 + layoutCenter: [center1, center2], roam: true, - layoutSize: '100%', - zoom: 1, + layoutSize: "100%", + zoom: config.customize.zoom || 1, label: { // 通常状态下的样式 normal: { @@ -177,97 +181,97 @@ export default { }, series: config.customize.scatter ? [ - // { - // type: 'effectScatter', - // coordinateSystem: 'geo', - // effectType: 'ripple', - // showEffectOn: 'render', - // rippleEffect: { - // period: 10, - // scale: 10, - // brushType: 'fill' - // }, + // { + // type: 'effectScatter', + // coordinateSystem: 'geo', + // effectType: 'ripple', + // showEffectOn: 'render', + // rippleEffect: { + // period: 10, + // scale: 10, + // brushType: 'fill' + // }, - // hoverAnimation: true, - // itemStyle: { - // normal: { - // color: 'rgba(255, 235, 59, .7)', - // shadowBlur: 10, - // shadowColor: '#333' - // } - // }, - // tooltip: { - // formatter(params) { - // return `<p style="text-align:center;line-height: 30px;height:30px;font-size: 14px;border-bottom: 1px solid #7A8698;">${ - // params.name - // }</p> - // <div style="line-height:22px;margin-top:5px">GDP<span style="margin-left:12px;color:#fff;float:right">${ - // params.data?.value[2] || '--' - // }</span></div>` - // }, - // show: true - // }, - // zlevel: 1, - // data: [ - // { name: '西藏自治区', value: [91.23, 29.5, 1] }, - // { name: '黑龙江省', value: [128.03, 47.01, 1007] }, - // { name: '北京市', value: [116.4551, 40.2539, 5007] } - // ] - // } - { - type: 'scatter', - coordinateSystem: 'geo', - symbol: 'pin', - legendHoverLink: true, - symbolSize: [60, 60], - showEffectOn: 'render', - rippleEffect: { - brushType: 'stroke' - }, - hoverAnimation: true, - zlevel: 1, - // 这里渲染标志里的内容以及样式 - label: { - show: true, - formatter (value) { - return value.data.value[2] - }, - color: config.customize.scatterColor - }, - // 标志的样式 - itemStyle: { - normal: { - color: config.customize.scatterBackgroundColor, - shadowBlur: 2, - shadowColor: 'D8BC37' - } + // hoverAnimation: true, + // itemStyle: { + // normal: { + // color: 'rgba(255, 235, 59, .7)', + // shadowBlur: 10, + // shadowColor: '#333' + // } + // }, + // tooltip: { + // formatter(params) { + // return `<p style="text-align:center;line-height: 30px;height:30px;font-size: 14px;border-bottom: 1px solid #7A8698;">${ + // params.name + // }</p> + // <div style="line-height:22px;margin-top:5px">GDP<span style="margin-left:12px;color:#fff;float:right">${ + // params.data?.value[2] || '--' + // }</span></div>` + // }, + // show: true + // }, + // zlevel: 1, + // data: [ + // { name: '西藏自治区', value: [91.23, 29.5, 1] }, + // { name: '黑龙江省', value: [128.03, 47.01, 1007] }, + // { name: '北京市', value: [116.4551, 40.2539, 5007] } + // ] + // } + { + type: 'scatter', + coordinateSystem: 'geo', + symbol: 'pin', + legendHoverLink: true, + symbolSize: [60, 60], + showEffectOn: 'render', + rippleEffect: { + brushType: 'stroke' + }, + hoverAnimation: true, + zlevel: 11, + // 这里渲染标志里的内容以及样式 + label: { + show: true, + formatter(value) { + return value.data.value[2] }, - data: config.option?.data - } - ] + color: config.customize.scatterColor + }, + // 标志的样式 + itemStyle: { + normal: { + color: config.customize.scatterBackgroundColor, + shadowBlur: 2, + shadowColor: 'D8BC37' + } + }, + data: config.option?.data + } + ] : [ - { - type: 'map', - map: config.customize.scope, - geoIndex: 0, - roam: false, - zoom: 1.5, - center: [105, 36], - showLegendSymbol: false, // 存在legend时显示 - data: config.option?.data, - tooltip: { - formatter (params) { - return `<p style="text-align:center;line-height: 30px;height:30px;font-size: 14px;border-bottom: 1px solid #7A8698;">${ - params.name - }</p> + { + type: 'map', + map: config.customize.scope, + geoIndex: 0, + roam: false, + zoom: 1.5, + center: [105, 36], + showLegendSymbol: false, // 存在legend时显示 + data: config.option?.data, + tooltip: { + formatter(params) { + return `<p style="text-align:center;line-height: 30px;height:30px;font-size: 14px;border-bottom: 1px solid #7A8698;">${ + params.name + }</p> <div style="line-height:22px;margin-top:5px">GDP<span style="margin-left:12px;color:#fff;float:right">${ - params.data?.value[2] || '--' - }</span></div>` - }, - show: true - } + params.data?.value[2] || '--' + }</span></div>` + }, + show: true } - ] + } + ] } if (config.customize.visual) { this.option.visualMap = { @@ -280,21 +284,55 @@ export default { } } } - const mapUrl = `${window.BS_CONFIG?.httpConfigs?.baseURL}/static/chinaMap/${config.customize.level}/${config.customize.dataMap}` - const map = await this.$dataRoomAxios.get(decodeURI(mapUrl), {}, true) + let hasMapId = !!config.customize.mapId + // 根据mapId获取地图数据 + let mapInfoUrl = `${window.BS_CONFIG?.httpConfigs?.baseURL}/bigScreen/map/info/${config.customize.mapId}` + // 如果设置了地图id,就用地图id获取地图数据,否则用默认的世界地图 + if (!hasMapId) { + mapInfoUrl = `${window.BS_CONFIG?.httpConfigs?.baseURL}/static/chinaMap/country/中华人民共和国.json` + } + const mapResp = await this.$dataRoomAxios.get(decodeURI(mapInfoUrl), {}, true) + const map = hasMapId ? JSON.parse(mapResp.data.geoJson) : mapResp + if (hasMapId && mapResp.data.uploadedGeoJson !== 1) { + // 没有上传过geoJson + this.$message({ + message: '请先上传地图数据', + type: 'warning' + }) + return + } + this.mapList.push(mapResp.data) echarts.registerMap(config.customize.scope, map) this.charts.setOption(this.option) + // 点击下钻 this.charts.on('click', async (params) => { if (params.name == '') return - if (config.customize.down === false || this.level === 'province') return - this.level = 'province' - const mapUrl = `${window.BS_CONFIG?.httpConfigs?.baseURL}/static/chinaMap/province/${params.name}.json` - const map = await this.$dataRoomAxios.get(decodeURI(mapUrl), {}, true) - this.changeData({ ...config, customize: { ...config.customize, level: 'province', scope: params.name } }) + if (!config.customize.down) { + this.$message({ + message: '该地图未开启下钻', + type: 'warning' + }) + return + } + // 到达允许下钻的层数,则不再下钻 + if (this.currentDeep >= config.customize.downLevel) return + const downMapUrl = `${window.BS_CONFIG?.httpConfigs?.baseURL}/bigScreen/map/data/${this.mapList[this.currentDeep].id}/${params.name}` + const downMap = await this.$dataRoomAxios.get(decodeURI(downMapUrl), {}, false) + // 地图不可用 + if (downMap.available !== 1) { + this.$message({ + message: '未找到该地图配置', + type: 'warning' + }) + return + } + this.currentDeep++ + this.mapList.push(downMap) + this.changeData({...config, customize: {...config.customize, scope: params.name}}) this.option.geo.map = params.name - echarts.registerMap(params.name, map) - this.charts.setOption(this.option, true) - }) + echarts.registerMap(params.name, JSON.parse(downMap.geoJson)); + this.charts.setOption(this.option, true); + }); } } } @@ -302,17 +340,21 @@ export default { <style lang="scss" scoped> @import '../../assets/style/echartStyle'; + .light-theme { background-color: #ffffff; color: #000000; } + .auto-theme { background-color: rgba(0, 0, 0, 0); } -.bs-design-wrap{ + +.bs-design-wrap { position: relative; padding: 0 16px; - .button{ + + .button { position: absolute; z-index: 999; }