使用 ECharts GL 實現 3D 中國地圖點位飛線效果

前言

在現代數據可視化領域,3D 地圖飛線效果是一種非常吸引人的展示方式,特別適合展示地理空間關系和數據流動。本文將詳細解析如何使用 ECharts GL 在 Vue 項目中實現一個 3D 中國地圖飛線效果。

技術棧

  • Vue.js 2.x/3.x

  • ECharts 5.x

  • ECharts GL 2.x

核心實現步驟

1. 準備工作

首先需要安裝必要的依賴:

npm install echarts echarts-gl --save

2. 基礎地圖配置

import * as echarts from 'echarts'
import "echarts-gl";
import chinaJson from '@/utils/chinaOutline.json'export default {mounted() {this.initChart()},methods: {initChart() {const dom = this.$refs.chartRef;this.myChart = echarts.init(dom);echarts.registerMap('china', chinaJson);// ...其他配置}}
}

3. 數據處理

我們需要準備兩類數據:

  1. 城市點位數據?- 用于在地圖上顯示城市位置

  2. 飛線數據?- 用于顯示從起點到各城市的連線

const FROMCITY = [113.28064, 23.125177]  // 起點坐標(深圳)
const FROMCITYCOORD = [113.28064, 23.125177]// 處理飛線數據
const linesData = this.cityList.map(city => ({fromName: FROMCITY,toName: city.city,coords: [[FROMCITYCOORD[0], FROMCITYCOORD[1], 1], [city.provinceCapitalX, city.provinceCapitalY, 1]],
}));// 處理散點數據
const scatterData = this.cityList.map(city => ({name: city.city.replace('市', ''),value: [city.provinceCapitalX, city.provinceCapitalY, 1],
}));

4. 3D 地圖核心配置

geo3D: {map: 'china',regionHeight: 8,  // 區域高度itemStyle: {color: 'RGBA(153, 249, 235, 1)',  // 地圖基礎顏色borderWidth: 1.5},viewControl: {distance: 110,  // 觀察距離alpha: 60,      // 上下旋轉角度beta: 0         // 左右旋轉角度},// ...其他配置
}

5. 飛線系列配置

{type: 'lines3D',effect: {show: true,period: 4,            // 動畫周期trailWidth: 4,        // 尾跡寬度symbol: 'arrow',      // 箭頭符號color: 'rgba(255,255,255, 1)'},lineStyle: {width: 1.5,color: '#1AD9FF',     // 飛線顏色opacity: 0.8},data: linesData         // 飛線數據
}

6. 城市點位配置

{type: 'scatter3D',symbol: 'circle',symbolSize: 14,label: {show: true,formatter: '{b}',     // 顯示城市名稱color: '#FFF'},itemStyle: {color: '#FFA601'      // 點顏色},data: scatterData       // 散點數據
}

完整代碼解析

setChartInit() {const dom = this.$refs.chartRef;this.myChart = this.myChart || echarts.init(dom);// 注冊地圖echarts.registerMap('china', chinaJson);// 準備數據const linesData = this.cityList.map(city => ({fromName: FROMCITY,toName: city.city,coords: [[FROMCITYCOORD[0], FROMCITYCOORD[1], 1], [city.provinceCapitalX, city.provinceCapitalY, 1]],}));const scatterData = this.cityList.map(city => ({name: city.city.replace('市', ''),value: [city.provinceCapitalX, city.provinceCapitalY, 1],}));// 配置項const option = {// 3D地圖配置geo3D: {map: 'china',regionHeight: 8,// ...其他geo3D配置},series: [// 飛線系列{type: 'lines3D',// ...飛線配置data: linesData},// 點位系列{type: 'scatter3D',// ...點位配置data: scatterData}]};this.myChart.setOption(option);
}

完整代碼

<template><div class="chartRef" ref="chartRef" style="height: 100%;width: 100%" />
</template>
<script>import * as echarts from 'echarts'
import '@/utils/chinaMap'
import "echarts-gl";
import chinaJson from '@/utils/chinaOutline.json'const FROMCITY = [113.28064, 23.125177]
const FROMCITYCOORD = [113.28064, 23.125177]export default {name: 'Demo',data() {return {cityList:[{"id": 0,"city": "紹興市","provinceCapitalX": "120.15358","provinceCapitalY": "30.287458","num": 200},{"id": 1,"city": "北京市","provinceCapitalX": "116.405289","provinceCapitalY": "39.904987","num": 200},{"id": 2,"city": "嘉興市","provinceCapitalX": "120.15358","provinceCapitalY": "30.287458","num": 200},{"id": 3,"city": "錦州市","provinceCapitalX": "118.76741","provinceCapitalY": "41.796768","num": 200},{"id": 4,"city": "臨沂市","provinceCapitalX": "120.15358","provinceCapitalY": "30.287458","num": 200},{"id": 5,"city": "深圳市","provinceCapitalX": "113.28064","provinceCapitalY": "23.125177","num": 200}
],}},mounted() {this.getData()},watch: {},methods: {// 地圖組件初始加載setChartInit() {const dom = this.$refs.chartRef;this.myChart = this.myChart || echarts.init(dom);echarts.registerMap('china', chinaJson);const linesData = this.cityList.map(city => ({fromName: FROMCITY,toName: city.city,coords: [[FROMCITYCOORD[0], FROMCITYCOORD[1], 1], [city.provinceCapitalX, city.provinceCapitalY, 1]],}));const scatterData = this.cityList.map(city => ({name: city.city.replace('市', ''),value: [city.provinceCapitalX, city.provinceCapitalY, 1],}));const option = {tooltip: {trigger: 'axis',axisPointer: {type: 'shadow'}},backgroundColor: 'transparent',geo3D: {zlevel: 1,type: 'geo3D',coordinateSystem: 'geo3D',map: 'china',regionHeight: 8,roam: false,silent: false, select: {disabled: false},itemStyle: {borderColor: 'RGBA(37, 182, 144, 0)',color: 'RGBA(153, 249, 235, 1)',borderWidth: 1.5},shading: "realistic",realisticMaterial: {detailTexture: "./bg.png",textureTiling: 1,blendMode: 'Additive', // 可選值:Additive / Subtractive / Multiply 等},light: {main: {intensity: 1.2,shadow: true,shadowQuality: 'high'},ambient: {intensity: 0.3}},viewControl: {distance: 110,alpha: 60,beta: 0,autoRotate: false,rotateSensitivity: 1,zoomSensitivity: 1,panSensitivity: 1},emphasis: {label: {show: true,color: 'RGBA(255, 255, 255, 1)',fontSize: 14,},itemStyle: {color: 'RGBA(255, 255, 255, 1)',borderWidth: 4,borderColor: "RGBA(255,255,255, 1)",regionHeight: 25,opacity: 1,shadowColor: 'RGBA(153, 249, 235, 1)'}},},series: [// 飛線系列{type: 'lines3D',coordinateSystem: 'geo3D',zlevel: 2,silent: true,effect: {show: true,period: 4,trailWidth: 4,trailLength: 0.4,symbol: 'arrow',symbolSize: 16,color: 'rgba(255,255,255, 1)'},lineStyle: {width: 1.5,color: '#1AD9FF',opacity: 0.8},data: linesData},// 點位系列{type: 'scatter3D',coordinateSystem: 'geo3D',zlevel: 3,symbol: 'circle',symbolSize: 14,silent: false,label: {show: true,position: 'right',formatter: '{b}',textStyle: {color: '#FFF',fontSize: 14}},itemStyle: {color: '#FFA601'},emphasis: {label: {show: false},itemStyle: {color: '#1AD9FF'}},data: scatterData}]}this.myChart.setOption(option);}}
}
</script><style scoped lang="scss"></style>

效果優化技巧

  1. 動畫效果:通過調整?effect.period?可以改變飛線動畫速度

  2. 視覺層次:使用?zlevel?控制不同圖層的疊加順序

  3. 光照效果:調整?light?配置可以改變地圖的明暗效果

  4. 交互體驗:配置?viewControl?可以控制地圖的旋轉、縮放等交互行為

常見問題解決

  1. 地圖不顯示

    • 確保正確注冊了地圖 JSON 數據

    • 檢查容器是否有固定寬高

  2. 飛線不顯示

    • 檢查坐標數據格式是否正確

    • 確保 lines3D 系列被正確添加到 series 中

  3. 性能問題

    • 數據量過大時考慮簡化或聚合數據

    • 使用?silent: true?減少不必要的交互檢測

總結

通過 ECharts GL 實現 3D 地圖飛線效果,可以為地理空間數據提供更加直觀的展示方式。本文詳細介紹了從數據準備到最終實現的完整流程,以及各種配置項的用途和優化技巧。這種可視化方式特別適合展示城市間的關聯關系、物流路線、人口遷移等場景。

希望這篇技術解析能幫助你在項目中實現類似的效果。如果有任何問題,歡迎在評論區討論。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/92506.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/92506.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/92506.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Redis對象編碼

前言 Redis中提供多種數據結構&#xff1a;string、list、map、set、zset等&#xff0c;關于上述多種數據類型的底層實現原理&#xff0c;Redis針對不同的數據類型對應的不同使用場景從時間和空間上進行平衡選擇不同的對象編碼方式。本文大致介紹一些Redis對象編碼方式以及在上…

12-Django項目實戰-登錄短信驗證

1.路由配置 2.對接第三方短信接口 詳細內容請點擊 3.視圖函數 def sms_view(request):"""短信驗證視圖邏輯1.獲取請求體的數據[phone]2.調用封裝的短信發送接口&#xff0c;實現發送短信"""data json.loads(request.body)phone data.get(&q…

Java技術棧/面試題合集(11)-設計模式篇

場景 Java入門、進階、強化、擴展、知識體系完善等知識點學習、性能優化、源碼分析專欄分享: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/140870227 通過對面試題進行系統的復習可以對Java體系的知識點進行查漏補缺。 注: 博客: 霸道流氓氣質-CSDN博…

Linux系統:Ext系列文件系統(軟件篇)

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄[TOC](文章目錄)一&#xff0c;ext2文件系統1-1 宏觀認識1-2 Block Group1-3 塊組內部構成1-3-1 超級塊(Super Block)1-3-2 塊組描述符表GDT(Group Descriptor Table…

14. isaacsim4.2教程-April Tags/給相機加噪聲

1. 前言April Tags 是一種視覺標簽&#xff08;類似 QR 碼&#xff09;&#xff0c;用于通過相機進行定位和識別。它們通常用于計算機視覺任務中&#xff0c;幫助機器人識別和定位自己在物理空間中的位置&#xff0c;或者識別和追蹤特定對象。前提條件啟用 ROS 橋接&#xff1a…

Kafka + 時間輪 + 數據庫實現延遲隊列方案

Kafka 原生不支持延遲隊列功能。而RabbitMQ、RocketMQ及Redis等其他消息隊列原生支持延遲隊列。 RabbitMQ RocketMQ Redis 實現方式 通過插件實現&#xff0c;消息進入延遲隊列后根據配置時間過濾轉發。 原生支持&#xff0c;發送消息時設置延遲級別&#xff0c;定時任務處…

力扣 hot100 Day69

287. 尋找重復數 給定一個包含 n 1 個整數的數組 nums &#xff0c;其數字都在 [1, n] 范圍內&#xff08;包括 1 和 n&#xff09;&#xff0c;可知至少存在一個重復的整數。 假設 nums 只有 一個重復的整數 &#xff0c;返回 這個重復的數 。 你設計的解決方案必須 不修改…

Android 的CameraX的使用(配置,預覽,拍照,圖像分析,錄視頻)

Android Studio 版本號:2024.1.2 CameraX是Jetpack系列中的一個庫,它基于Camera2 API構建,但提供了更高層次的抽象。 CameraX 三大核心用例: Preview預覽 ,ImageCapture拍照和 VideoCapture錄視頻 一、創建項目,進行環境配置 CameraX 需要一些屬于 Java 8 的方法,因此…

【機器學習深度學習】微調訓練數據質量

目錄 前言 一、為什么數據質量評估很重要 二、數據質量評估的核心維度 三、數據質量的可量化維度&#xff08;必須要測的指標&#xff09; 四、多答案、多類型數據的取舍與優化 場景 A&#xff1a;一個問題有多個相似回答 場景 B&#xff1a;多個類型數據&#xff0c;每…

從DeepSeek-V3到Kimi K2,大型語言模型架構對比

文章目錄 摘要 **稀疏化與專家系統** **注意力機制優化** **歸一化與穩定性設計** 模型架構對比詳析 DeepSeek-V3 vs Llama 4 Maverick Qwen3 vs SmolLM3 Kimi 2的突破 1 DeepSeek V3/R1 1.1 多頭潛在注意力(MLA) 1.2 混合專家系統(MoE) 1.3 DeepSeek 總結 2 OLMo 2 2.1 歸…

Unity筆記(二)——Time、Vector3、位置位移、角度、旋轉、縮放、看向

寫在前面寫本系列的目的(自用)是回顧已經學過的知識、記錄新學習的知識或是記錄心得理解&#xff0c;方便自己以后快速復習&#xff0c;減少遺忘。這里只有部分語法知識。五、Time時間相關1、時間縮放比例概念&#xff1a;可以通過UnityEngine.Time類的timeScale屬性控制游戲時…

vue+vite項目中怎么定義一個環境變量可以在開發環境和生產環境使用不同的值,并且可以在vue頁面和index.html通用。

首先我們需要下載一個插件vite-plugin-html然后再項目最外層和index.html同級目錄下新建.env.development和.env.production兩個項目并且定義你想要的環境變量名:注意要以VITE_開頭VITE_APP_MAP_TOKEN1233444然后vite.config.js文件import { defineConfig,loadEnv } from vite…

Python-深度學習--2信息熵,條件熵(ID3決策樹),KL散度

一、信息熵&#xff08;Entropy&#xff09;的計算與應用信息熵用于衡量一個概率分布的不確定性&#xff0c;值越大表示分布越分散&#xff08;不確定性越高&#xff09;。1. 數學定義對于離散概率分布 P&#xff0c;信息熵公式為&#xff1a;&#xff08;通常以 2 為底單位是比…

國產化Word處理控件Spire.Doc教程:Python提取Word文檔中的文本、圖片、表格等

在現代辦公場景中&#xff0c;Word文檔已成為信息存儲與交流的重要載體&#xff0c;承載著關鍵的業務數據、結構化表格、可視化圖表以及協作批注等重要內容。面對日益增長的文檔處理需求&#xff0c;傳統的人工操作方式已難以滿足效率與準確性的雙重標準。采用Python實現Word文…

Spring IOC 原理

Spring IoC&#xff08;控制反轉&#xff09;是Spring框架的核心機制&#xff0c;其原理是通過容器管理對象生命周期和依賴關系&#xff0c;實現解耦。 1. 控制反轉&#xff08;IoC&#xff09;核心思想 傳統模式&#xff1a;對象主動創建依賴&#xff08;如new Service()&…

VSCode:基礎使用 / 使用積累

官網 Visual Studio Code - Code Editing. Redefined 記錄一、更新依賴 嘗試刪除yarn.lock文件 記錄二、“解決沖突”的方式變了 更新后&#xff0c;“解決沖突”的方式變了&#xff0c;有的時候能選中兩者&#xff0c;有的時候不能 現在又更新了&#xff0c;回復到了原來…

tcp 確認應答和超時時間

1. 確認應答之間的時間&#xff08;RTT&#xff09;這是指 從發送方發送數據到接收方返回確認&#xff08;ACK&#xff09;之間的時間。它反映的是數據傳輸的 往返延遲。例如&#xff0c;發送方發送一個數據包&#xff0c;接收方收到后&#xff0c;回傳一個確認包&#xff08;A…

圖的應用-最短路徑

最短路徑的典型用途&#xff1a;交通網絡的問題——從甲地到乙地之間是否有公路連通&#xff1f;在有多條通路的情況下&#xff0c;哪一條路最短&#xff1f;交通網絡用有向網來表示&#xff1a;頂點——表示地點&#xff0c;弧——表示兩個地點有路連通&#xff0c;弧上的權值…

【qt5_study】1.Hello world

模板 作為初學者我們選擇第一個Application(Qt)和 Qt Widgets Application,所謂的模板就是 Qt為了方便開發程序,在新建工程時可以讓用戶基于一種模板來編寫程序,包括 cpp文件, ui文件都已經快速的創建,而不用用戶手動創建這些文件。 基類 這里默認選擇的基類為 QMainWin…

項目構想|文生圖小程序

Date: August 4, 2025項目介紹 &#x1f44b;&#xff0c;我們通過 Vibe Coding 做一個文字生成圖片的小程序。 我們會從需求分析、技術選型、UI設計、項目構筑到最后打包&#xff0c;一路嘗試 Vibe Coding 實現。 創建項目 創建文件夾&#xff1a;ai-pic-mini-app 采用 Git 進…