Эх сурвалжийг харах

reactor:地图修改为3D;

zhangchong 1 жил өмнө
parent
commit
907585bac4

+ 2 - 1
package.json

@@ -11,7 +11,8 @@
     "axios": "^1.5.1",
     "countup.js": "^2.8.0",
     "dayjs": "^1.11.10",
-    "echarts": "^5.4.3",
+    "echarts": "5.5.0",
+    "echarts-gl": "2.0.9",
     "element-plus": "^2.4.0",
     "mitt": "^3.0.1",
     "mockjs": "^1.1.0",

BIN
src/assets/img/home/tool_tip_bg.png


+ 7 - 3
src/plugins/echarts.ts

@@ -1,9 +1,10 @@
-// vue-echarts
 import ECharts from 'vue-echarts'
 import {use} from "echarts/core"
 import {
     CanvasRenderer
 } from 'echarts/renderers'
+import {Map3DChart, Scatter3DChart} from 'echarts-gl/charts';
+import {Geo3DComponent} from 'echarts-gl/components';
 import {
     BarChart, PieChart, MapChart, EffectScatterChart, LineChart, PictorialBarChart, GraphChart, GaugeChart, ScatterChart
 } from 'echarts/charts'
@@ -16,7 +17,7 @@ import {
     VisualMapComponent,
     GeoComponent,
     MarkPointComponent,
-    GraphicComponent
+    GraphicComponent,
 } from 'echarts/components'
 
 use([
@@ -30,7 +31,10 @@ use([
     VisualMapComponent,
     GeoComponent,
     MarkPointComponent,
-    GraphicComponent
+    GraphicComponent,
+    Map3DChart,
+    Scatter3DChart,
+    Geo3DComponent
 ])
 
 export const registerEcharts = (app: any) => {

+ 12 - 8
src/utils/tooltip-auto-show.ts

@@ -14,7 +14,7 @@
  * }
  * @returns {{clearLoop: clearLoop}|undefined}
  */
-export function loopShowTooltip(chart:any, chartOption:any, options:any) {
+export function loopShowTooltip(chart: any, chartOption: any, options: any) {
     let defaultOptions = {
         interval: 2000,
         loopSeries: false,
@@ -28,10 +28,10 @@ export function loopShowTooltip(chart:any, chartOption:any, options:any) {
 
     let dataIndex = 0; // 数据索引,初始化为-1,是为了判断是否是第一次执行
     let seriesIndex = 0; // 系列索引
-    let timeTicket:any;
+    let timeTicket: any;
     let seriesLen = chartOption.series.length; // 系列个数
     let dataLen = 0; // 某个系列数据个数
-    let chartType:any; // 系列类型
+    let chartType: any; // 系列类型
     let first = true;
     let lastShowSeriesIndex = 0;
     let lastShowDataIndex = 0;
@@ -94,7 +94,7 @@ export function loopShowTooltip(chart:any, chartOption:any, options:any) {
                 : seriesIndex;
         let tempType = chartOption.series[tempSeriesIndex].type;
 
-        if (tempType === 'pie' || tempType === 'radar' || tempType === 'map') {
+        if (tempType === 'pie' || tempType === 'radar' || tempType === 'map' || tempType === 'map3D') {
             chart.dispatchAction({
                 type: 'downplay',
                 seriesIndex: lastShowSeriesIndex,
@@ -109,6 +109,7 @@ export function loopShowTooltip(chart:any, chartOption:any, options:any) {
     function autoShowTip() {
         let invalidSeries = 0;
         let invalidData = 0;
+
         function showTip() {
             // chart不在页面中时,销毁定时器
             let dom = chart.getDom();
@@ -143,7 +144,7 @@ export function loopShowTooltip(chart:any, chartOption:any, options:any) {
             chartType = currSeries.type; // 系列类型
             dataLen = currSeries.data.length; // 某个系列的数据个数
 
-            let tipParams:any = {
+            let tipParams: any = {
                 seriesIndex: seriesIndex,
             };
             switch (chartType) {
@@ -201,6 +202,9 @@ export function loopShowTooltip(chart:any, chartOption:any, options:any) {
                 case 'chord':
                     tipParams.name = currSeries.data[dataIndex].name;
                     break;
+                case 'map3D':
+                    tipParams.name = currSeries.data[dataIndex].name;
+                    break;
                 case 'radar': // 雷达图
                     tipParams.seriesIndex = seriesIndex;
                     // tipParams.dataIndex = dataIndex;
@@ -220,7 +224,7 @@ export function loopShowTooltip(chart:any, chartOption:any, options:any) {
                     break;
             }
 
-            if (chartType === 'pie' || chartType === 'radar' || chartType === 'map') {
+            if (chartType === 'pie' || chartType === 'radar' || chartType === 'map' || chartType === 'map3D') {
                 if (!first) {
                     cancelHighlight();
                 }
@@ -263,7 +267,7 @@ export function loopShowTooltip(chart:any, chartOption:any, options:any) {
             clearInterval(timeTicket);
             timeTicket = 0;
 
-            if (chartType === 'pie' || chartType === 'radar' || chartType === 'map') {
+            if (chartType === 'pie' || chartType === 'radar' || chartType === 'map' || chartType === 'map3D') {
                 cancelHighlight();
             }
         }
@@ -271,7 +275,7 @@ export function loopShowTooltip(chart:any, chartOption:any, options:any) {
 
     let zRender = chart.getZr();
 
-    function zRenderMouseMove(param:any) {
+    function zRenderMouseMove(param: any) {
         if (param.event) {
             // 阻止canvas上的鼠标移动事件冒泡
             // param.event.cancelBubble = true;

+ 6 - 8
src/views/home/center-map.vue

@@ -10,7 +10,7 @@
   </div>
 </template>
 <script setup lang="ts">
-import {ref, onMounted, watch} from "vue";
+import {ref, onMounted, watch, nextTick} from "vue";
 import {registerMap, getMap} from "echarts/core";
 import {optionHandle} from "./center.map";
 import {loopShowTooltip} from "@/utils/tooltip-auto-show";
@@ -104,13 +104,11 @@ const tooltipMap = (myChart, option) => {
     // seriesIndex: 默认为0,指定某个系列(option中的series索引)循环显示tooltip,当loopSeries为true时,从seriesIndex系列开始执行。
   });
 };
-setTimeout(() => {
-  tooltipMap(centerMapRef.value!.chart, option.value);
-  centerMapRef.value.setOption(option.value);
-}, 1000);
-
-onMounted(() => {
-  getData();
+onMounted(async () => {
+  await getData();
+  await nextTick(() => {
+    tooltipMap(centerMapRef.value!.chart, option.value);
+  });
 });
 </script>
 

+ 4 - 4
src/views/home/center-top.vue

@@ -3,7 +3,7 @@
     <div class="center-top-box">
       <div class="center-top-box-title">
         <span>今日工单量</span>
-        <span class="center-top-box-title-hb">环比 {{ state.orderDay.toDayQoQ }}%</span>
+        <span class="center-top-box-title-hb">环比 {{ state.orderDay.toDayQoQ }}%</span>
       </div>
       <div class="center-top-box-num">
         <CountFlop :val="state.orderDay.toDayCount"/>
@@ -13,7 +13,7 @@
     <div class="center-top-box">
       <div class="center-top-box-title">
         <span>本月工单量</span>
-        <span class="center-top-box-title-hb">环比 {{ state.orderDay.toMonthQoQ }}%</span>
+        <span class="center-top-box-title-hb">环比 {{ state.orderDay.toMonthQoQ }}%</span>
       </div>
       <div class="center-top-box-num num-2">
         <CountFlop :val="state.orderDay.toMonthCount" suffix=""/>
@@ -23,7 +23,7 @@
     <div class="center-top-box">
       <div class="center-top-box-title">
         <span>本年工单量</span>
-        <span class="center-top-box-title-hb">环比 {{ state.orderDay.toYearQoQ }}%</span>
+        <span class="center-top-box-title-hb">环比 {{ state.orderDay.toYearQoQ }}%</span>
       </div>
       <div class="center-top-box-num num-3">
         <CountFlop :val="state.orderDay.toYearCount" suffix=""/>
@@ -98,11 +98,11 @@ onUnmounted(() => {
 
     &-title {
       display: flex;
-      justify-content: space-between;
       align-items: center;
       font-size: 18px;
 
       &-hb {
+        font-size: 14px;
       }
 
     }

+ 92 - 94
src/views/home/center.map.ts

@@ -4,7 +4,8 @@ const arrow = new Image();
 arrow.src = getImageUrl("home/map_select.png");
 const mapBg = new Image();
 mapBg.src = getImageUrl("home/map_bg.png");
-
+const onetow = new Image();
+onetow.src = getImageUrl("home/123.png");
 export const optionHandle = (regionCode: string,
                              list: object[]) => {
     return {
@@ -71,90 +72,89 @@ export const optionHandle = (regionCode: string,
                 return tipHtml;
             },
         },
-        geo: [
-            {
-                layoutCenter: ['50%', '50%'],//位置
-                layoutSize: '180%',//大小
-                show: true,
-                map: regionCode,
-                roam: false,
-                zoom: 0.65,
-                aspectScale: 1,
-                label: {
-                    show: false,
-                },
-                itemStyle: {
-                    areaColor: {
-                        type: "linear",
-                        x: 1200,
-                        y: 0,
-                        x2: 0,
-                        y2: 0,
-                        colorStops: [{
-                            offset: 0,
-                            color: "rgba(38,134,132,0.35)", // 0% 处的颜色
-                        }, {
-                            offset: 1,
-                            color: "rgba(38,134,132,0.75)", // 50% 处的颜色
-                        },],
-                        global: true, // 缺省为 false
-                    },
-                    borderColor: "#c0f3fb",
-                    borderWidth: 1,
-                    shadowColor: "#8cd3ef",
-                    shadowOffsetY: 10,
-                    shadowBlur: 120,
-                }
-            },
-            {
-                type: "map",
-                map: regionCode,
-                aspectScale: 1,
-                zoom: 0.65,
-                layoutCenter: ["50%", "54%"],
-                layoutSize: "180%",
-                roam: false,
-                silent: true,
-                itemStyle: {
-                    borderWidth: 2,
-                    borderColor: "rgba( 38,134,132,0.8)",
-                    shadowColor: "rgba(29, 111, 165,0.8)",
-                    shadowOffsetY: 10,
-                    shadowBlur: 2,
-                    areaColor: "rgba(5,21,35,0.2)",
-                    borderType: "dashed",
-                },
+        // geo: [
+        //     {
+        //         layoutCenter: ['50%', '50%'],//位置
+        //         layoutSize: '180%',//大小
+        //         show: true,
+        //         map: regionCode,
+        //         roam: false,
+        //         zoom: 0.65,
+        //         aspectScale: 1,
+        //         label: {
+        //             show: false,
+        //         },
+        //         itemStyle: {
+        //             areaColor: {
+        //                 type: "linear",
+        //                 x: 1200,
+        //                 y: 0,
+        //                 x2: 0,
+        //                 y2: 0,
+        //                 colorStops: [{
+        //                     offset: 0,
+        //                     color: "rgba(38,134,132,0.35)", // 0% 处的颜色
+        //                 }, {
+        //                     offset: 1,
+        //                     color: "rgba(38,134,132,0.75)", // 50% 处的颜色
+        //                 },],
+        //                 global: true, // 缺省为 false
+        //             },
+        //             borderColor: "#c0f3fb",
+        //             borderWidth: 1,
+        //             shadowColor: "#8cd3ef",
+        //             shadowOffsetY: 10,
+        //             shadowBlur: 120,
+        //         }
+        //     },
+        //     {
+        //         type: "map",
+        //         map: regionCode,
+        //         aspectScale: 1,
+        //         zoom: 0.65,
+        //         layoutCenter: ["50%", "54%"],
+        //         layoutSize: "180%",
+        //         roam: false,
+        //         silent: true,
+        //         itemStyle: {
+        //             borderWidth: 2,
+        //             borderColor: "rgba( 38,134,132,0.8)",
+        //             shadowColor: "rgba(29, 111, 165,0.8)",
+        //             shadowOffsetY: 10,
+        //             shadowBlur: 2,
+        //             areaColor: "rgba(5,21,35,0.2)",
+        //             borderType: "dashed",
+        //         },
+        //     },
+        // ],
+        geo3D: {
+            show: false,
+            map: regionCode, // 自定义扩展图表类型
+            aspectScale: 1,
+            showLegendSymbol: true,
+            boxDepth: 100, //地图倾斜度
+            regionHeight: 4, //地图厚度
+            label: {
+                show: false,
             },
-        ],
+            itemStyle: {
+                color: "rgba(32,155,252,.7)"
+            }
+        },
         series: [
             {
-                type: "map",
+                type: "map3D",
                 map: regionCode, // 自定义扩展图表类型
                 aspectScale: 1,
-                zoom: 0.65, // 缩放
                 showLegendSymbol: true,
+                boxDepth: 100, //地图倾斜度
+                regionHeight: 4, //地图厚度
                 label: {
                     show: false,
                 },
                 itemStyle: {
-                    areaColor: {
-                        // 纹理填充
-                        image: mapBg, // 支持为 HTMLImageElement, HTMLCanvasElement,不支持路径字符串
-                        repeat: 'repeat', // 是否平铺,可以是 'repeat-x', 'repeat-y', 'no-repeat'
-                        // type: "radial",
-                        // x: 0.5,
-                        // y: 0.5,
-                        // r: 1,
-                        // colorStops: [{
-                        //     offset: 0,
-                        //     color: "rgba(  76,107, 88,.8)", // 0% 处的颜色
-                        // }, {
-                        //     offset: 1,
-                        //     color: "rgba( 60,255,253,.8)", // 100% 处的颜色
-                        // },],
-                        // global: false, // 缺省为 false
-                    },
-                    borderColor: "#666",
+                    color: "rgba(32,155,252,.7)",
+                    borderColor: "#3CFFFD",
                     borderWidth: 1,
 
                 },
@@ -175,24 +175,7 @@ export const optionHandle = (regionCode: string,
                     },
 
                     itemStyle: {
-                        areaColor:
-                            {
-                                image: mapBg, // 支持为 HTMLImageElement, HTMLCanvasElement,不支持路径字符串
-                                repeat: 'repeat', // 是否平铺,可以是 'repeat-x', 'repeat-y', 'no-repeat'
-                                // type: "linear",
-                                // x: 1200,
-                                // y: 1000,
-                                // x2: 0,
-                                // y2: 0,
-                                // colorStops: [{
-                                //     offset: 0,
-                                //     color: "rgba(255,255,255,0.3)", // 0% 处的颜色
-                                // }, {
-                                //     offset: 1,
-                                //     color: "rgba(255,255,255,0.4)", // 50% 处的颜色
-                                // },],
-                                // global: true, // 缺省为 false
-                            },
+                        color: "rgba(255,255,255,0.3)",
                         borderColor: "#fff",
                         borderWidth: 2,
 
@@ -203,7 +186,22 @@ export const optionHandle = (regionCode: string,
                 data: list,
                 select: {
                     disabled: true,
-                }
+                },
+                shading: 'realistic',
+                // 真实感材质相关配置 shading: 'realistic'时有效
+                realisticMaterial: {
+                    detailTexture: '#fff', // 纹理贴图
+                    textureTiling: 1, // 纹理平铺,1是拉伸,数字表示纹理平铺次数
+                    roughness: 0, // 材质粗糙度,0完全光滑,1完全粗糙
+                    metalness: 0, // 0材质是非金属 ,1金属
+                    roughnessAdjust: 0
+                },
+                viewControl: {
+                    distance: 110, // 地图视角 控制初始大小
+                    rotateSensitivity: 1, // 旋转
+                    zoomSensitivity: 1, // 缩放
+                },
+                instancing: true,
             },
         ],
     };

+ 22 - 9
yarn.lock

@@ -667,6 +667,11 @@ chalk@^4.1.2:
   optionalDependencies:
     fsevents "~2.3.2"
 
+claygl@^1.2.1:
+  version "1.3.0"
+  resolved "https://registry.npmmirror.com/claygl/-/claygl-1.3.0.tgz#7a6e2903210519ac358848f5d78070ed211685f3"
+  integrity sha512-+gGtJjT6SSHD2l2yC3MCubW/sCV40tZuSs5opdtn79vFSGUgp/lH139RNEQ6Jy078/L0aV8odCw8RSrUcMfLaQ==
+
 color-convert@^1.9.0:
   version "1.9.3"
   resolved "https://registry.npmmirror.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
@@ -799,13 +804,21 @@ dlv@^1.1.3:
   resolved "https://registry.npmmirror.com/dlv/-/dlv-1.1.3.tgz#5c198a8a11453596e751494d49874bc7732f2e79"
   integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==
 
-echarts@^5.4.3:
-  version "5.4.3"
-  resolved "https://registry.npmmirror.com/echarts/-/echarts-5.4.3.tgz#f5522ef24419164903eedcfd2b506c6fc91fb20c"
-  integrity sha512-mYKxLxhzy6zyTi/FaEbJMOZU1ULGEQHaeIeuMR5L+JnJTpz+YR03mnnpBhbR4+UYJAgiXgpyTVLffPAjOTLkZA==
+echarts-gl@2.0.9:
+  version "2.0.9"
+  resolved "https://registry.npmmirror.com/echarts-gl/-/echarts-gl-2.0.9.tgz#ee228a6c7520a6fb7bbb71ea94394f3637ade033"
+  integrity sha512-oKeMdkkkpJGWOzjgZUsF41DOh6cMsyrGGXimbjK2l6Xeq/dBQu4ShG2w2Dzrs/1bD27b2pLTGSaUzouY191gzA==
+  dependencies:
+    claygl "^1.2.1"
+    zrender "^5.1.1"
+
+echarts@5.5.0:
+  version "5.5.0"
+  resolved "https://registry.npmmirror.com/echarts/-/echarts-5.5.0.tgz#c13945a7f3acdd67c134d8a9ac67e917830113ac"
+  integrity sha512-rNYnNCzqDAPCr4m/fqyUFv7fD9qIsd50S6GDFgO1DxZhncCsNsG7IfUlAlvZe5oSEQxtsjnHiUuppzccry93Xw==
   dependencies:
     tslib "2.3.0"
-    zrender "5.4.4"
+    zrender "5.5.0"
 
 electron-to-chromium@^1.4.601:
   version "1.4.610"
@@ -2514,9 +2527,9 @@ yaml@^2.3.4:
   resolved "https://registry.npmmirror.com/yaml/-/yaml-2.3.4.tgz#53fc1d514be80aabf386dc6001eb29bf3b7523b2"
   integrity sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==
 
-zrender@5.4.4:
-  version "5.4.4"
-  resolved "https://registry.npmmirror.com/zrender/-/zrender-5.4.4.tgz#8854f1d95ecc82cf8912f5a11f86657cb8c9e261"
-  integrity sha512-0VxCNJ7AGOMCWeHVyTrGzUgrK4asT4ml9PEkeGirAkKNYXYzoPJCLvmyfdoOXcjTHPs10OZVMfD1Rwg16AZyYw==
+zrender@5.5.0, zrender@^5.1.1:
+  version "5.5.0"
+  resolved "https://registry.npmmirror.com/zrender/-/zrender-5.5.0.tgz#54d0d6c4eda81a96d9f60a9cd74dc48ea026bc1e"
+  integrity sha512-O3MilSi/9mwoovx77m6ROZM7sXShR/O/JIanvzTwjN3FORfLSr81PsUGd7jlaYOeds9d8tw82oP44+3YucVo+w==
   dependencies:
     tslib "2.3.0"