Vue Echarts製作自定義3D地圖

Vue Echarts製作自定義3D地圖

引用插件版本: “echarts”: “^4.1.0”,“echarts-gl”: “^1.1.1”

上代碼:注意xicheng.json爲自定義map文件

<style scoped>
  h2{
    text-align: center;
    padding: 30px;
    font-size: 18px;
  }
  #chart_example{
    width: 100%;
    height: 600px;
    /* border: 1px solid red; */
    margin: 0 auto;
  }
</style>
<template>
  <div>
    <h2>3D示意圖</h2>
    <div id="chart_example">
 
    </div>
  </div>
</template>
 
<script>
  import echarts from 'echarts'
  import echartsgl from 'echarts-gl' 
  var cywc_zyq = require('../../static/xicheng.json')  //引入geojson文件
  export default {
    data() {
      return {}
    },
    mounted() {
      let this_ = this;
      let myChart = echarts.init(document.getElementById('chart_example'));
	  // 註冊地圖名字(tongren)和數據(geoJson)
      echarts.registerMap('xicheng',cywc_zyq,{});
			
			// 隱藏動畫加載效果。
			myChart.hideLoading();			
			
			// 圖表配置項		
			var option = {
				
					title : {							// 標題
						top : '5%',
						text : '自定義3D地圖',
						subtext : '',
						x : 'center',
						textStyle : {
							color : '#ccc'
						}
					},
	
					tooltip : {							// 提示框
						trigger : 'item',
						formatter : function(params) {
							return params.name;
						}
					},
					
				    series: [{
				    	type: 'map3D',			  // 系列類型
				    	name: 'map3D',			  // 系列名稱
			            map: 'xicheng',           // 地圖類型。echarts-gl 中使用的地圖類型同 geo 組件相同(ECharts 中提供了兩種格式的地圖數據,一種是可以直接 script 標籤引入的 js 文件,引入後會自動註冊地圖名字和數據。還有一種是 JSON 文件,需要通過 AJAX 異步加載後手動註冊。)
				        
				        // 環境貼圖,支持純顏色值,漸變色,全景貼圖的 url。默認爲 'auto',在配置有 light.ambientCubemap.texture 的時候會使用該紋理作爲環境貼圖。否則則不顯示環境貼圖。
 				        environment: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{      // 配置爲垂直漸變的背景
				          offset: 0, color: '#00aaff' // 天空顏色           
				        }, {
				          offset: 0.7, color: '#998866' // 地面顏色
				        }, {
				          offset: 1, color: '#998866' // 地面顏色
				        }], false),
				        
				        label: {                // 標籤的相關設置
				            show: true,                 // (地圖上的城市名稱)是否顯示標籤 [ default: false ]
				            //distance: 50,               // 標籤距離圖形的距離,在三維的散點圖中這個距離是屏幕空間的像素值,其它圖中這個距離是相對的三維距離
				            //formatter:,               // 標籤內容格式器
				            textStyle: {                // 標籤的字體樣式
				                color: '#000',                  // 地圖初始化區域字體顏色
				                fontSize: 8,                    // 字體大小
				                opacity: 1,                     // 字體透明度
				                backgroundColor: 'rgba(0,23,11,0)'      // 字體背景色
				            },
				        },
				        
				        itemStyle: {            // 三維地理座標系組件 中三維圖形的視覺屬性,包括顏色,透明度,描邊等。
				            color: 'rgba(95,158,160,0.5)',       // 地圖板塊的顏色
				            opacity: 1,                 // 圖形的不透明度 [ default: 1 ]
				            borderWidth: 0.5,           // (地圖板塊間的分隔線)圖形描邊的寬度。加上描邊後可以更清晰的區分每個區域   [ default: 0 ]
				            borderColor: '#000'         // 圖形描邊的顏色。[ default: #333 ]
				        },
				        
				        emphasis: {             // 鼠標 hover 高亮時圖形和標籤的樣式 (當鼠標放上去時  label和itemStyle 的樣式) 
				            label: {                // label高亮時的配置
				                show: true,
				                textStyle: {
				                    color: '#fff',      // 高亮時標籤顏色變爲 白色
				                    fontSize: 15,       // 高亮時標籤字體 變大
				                }
				            },
				            itemStyle: {            // itemStyle高亮時的配置
				                areaColor: '#66ffff',   // 高亮時地圖板塊顏色改變
				            }
				        },
				        
				        groundPlane: {			// 地面可以讓整個組件有個“擺放”的地方,從而使整個場景看起來更真實,更有模型感。
				        	show: false,				// 是否顯示地面。[ default: false ]
				        	color: '#aaa'			// 地面顏色。[ default: '#aaa' ]
				        },
				        
				        regions: [{				// 可對單個地圖區域進行設置
				        	name: '二區',		// 所對應的地圖區域的名稱
				        	//regionHeight: '',			// 區域的高度,可以設置不同的高度用來表達數據的大小。當 GeoJSON 爲建築的數據時,也可以通過這個值表示簡直的高度。
				        	itemStyle: {				// 單個區域的樣式設置
					            color: '#00FF00',
					            opacity: 1,
					            borderWidth: 0.4,
					            borderColor: '#5F9EA0'
					        },
				        }, {
				        	name: '一區',
				        	itemStyle: {
					            color: '#EEEE00',
					            opacity: 1,
					            borderWidth: 0.4,
					            borderColor: '#5F9EA0'
					        },
				        }],
				        
				        //shading: 'lambert',       // 三維地理座標系組件中三維圖形的着色效果,echarts-gl 中支持下面三種着色方式:
				                                        // 'color' 只顯示顏色,不受光照等其它因素的影響。
				                                        // 'lambert' 通過經典的 lambert 着色表現光照帶來的明暗。
				                                        // 'realistic' 真實感渲染,配合 light.ambientCubemap 和 postEffect 使用可以讓展示的畫面效果和質感有質的提升。ECharts GL 中使用了基於物理的渲染(PBR) 來表現真實感材質。
				        // realisticMaterial: {}    // 真實感材質相關的配置項,在 shading 爲'realistic'時有效。
				        // lambertMaterial: {}      // lambert 材質相關的配置項,在 shading 爲'lambert'時有效。
				        // colorMaterial: {}        // color 材質相關的配置項,在 shading 爲'color'時有效。
				        
				        light: {                    // 光照相關的設置。在 shading 爲 'color' 的時候無效。  光照的設置會影響到組件以及組件所在座標系上的所有圖表。合理的光照設置能夠讓整個場景的明暗變得更豐富,更有層次。
				            main: {                     // 場景主光源的設置,在 globe 組件中就是太陽光。
				                color: '#fff',              //主光源的顏色。[ default: #fff ] 
				                intensity: 1.2,             //主光源的強度。[ default: 1 ]
				                shadow: false,              //主光源是否投射陰影。默認關閉。    開啓陰影可以給場景帶來更真實和有層次的光照效果。但是同時也會增加程序的運行開銷。
				                //shadowQuality: 'high',      // 陰影的質量。可選'low', 'medium', 'high', 'ultra' [ default: 'medium' ]
				                alpha: 55,                  // 主光源繞 x 軸,即上下旋轉的角度。配合 beta 控制光源的方向。[ default: 40 ]
				                beta: 10                    // 主光源繞 y 軸,即左右旋轉的角度。[ default: 40 ]
				            },
				            ambient: {                  // 全局的環境光設置。
				                color: '#fff',              // 環境光的顏色。[ default: #fff ]
				                intensity: 0.5              // 環境光的強度。[ default: 0.2 ]
				            }
				        },
				        
				        viewControl: {			// 用於鼠標的旋轉,縮放等視角控制。
				        	projection: 'perspective',		// 投影方式,默認爲透視投影'perspective',也支持設置爲正交投影'orthographic'。
				        	autoRotate: false,				// 是否開啓視角繞物體的自動旋轉查看。[ default: false ] 
				        	autoRotateDirection: 'cw',		// 物體自傳的方向。默認是 'cw' 也就是從上往下看是順時針方向,也可以取 'ccw',既從上往下看爲逆時針方向。
				        	autoRotateSpeed: 10,			// 物體自傳的速度。單位爲角度 / 秒,默認爲10 ,也就是36秒轉一圈。
				        	autoRotateAfterStill: 3,		// 在鼠標靜止操作後恢復自動旋轉的時間間隔。在開啓 autoRotate 後有效。[ default: 3 ]
				        	damping: 0,						// 鼠標進行旋轉,縮放等操作時的遲滯因子,在大於等於 1 的時候鼠標在停止操作後,視角仍會因爲一定的慣性繼續運動(旋轉和縮放)。[ default: 0.8 ]
				        	rotateSensitivity: 1,			// 旋轉操作的靈敏度,值越大越靈敏。支持使用數組分別設置橫向和縱向的旋轉靈敏度。默認爲1, 設置爲0後無法旋轉。	rotateSensitivity: [1, 0]——只能橫向旋轉; rotateSensitivity: [0, 1]——只能縱向旋轉。
				        	zoomSensitivity: 1,				// 縮放操作的靈敏度,值越大越靈敏。默認爲1,設置爲0後無法縮放。
				        	panSensitivity: 1,				// 平移操作的靈敏度,值越大越靈敏。默認爲1,設置爲0後無法平移。支持使用數組分別設置橫向和縱向的平移靈敏度
				        	panMouseButton: 'left',			// 平移操作使用的鼠標按鍵,支持:'left' 鼠標左鍵(默認);'middle' 鼠標中鍵 ;'right' 鼠標右鍵(注意:如果設置爲鼠標右鍵則會阻止默認的右鍵菜單。)
				        	rotateMouseButton: 'left',		// 旋轉操作使用的鼠標按鍵,支持:'left' 鼠標左鍵;'middle' 鼠標中鍵(默認);'right' 鼠標右鍵(注意:如果設置爲鼠標右鍵則會阻止默認的右鍵菜單。)
				        	
				        	distance: 200,					// [ default: 100 ] 默認視角距離主體的距離,對於 grid3D 和 geo3D 等其它組件來說是距離中心原點的距離,對於 globe 來說是距離地球表面的距離。在 projection 爲'perspective'的時候有效。
				        	minDistance: 40,				// [ default: 40 ] 視角通過鼠標控制能拉近到主體的最小距離。在 projection 爲'perspective'的時候有效。
				        	maxDistance: 400,				// [ default: 400 ] 視角通過鼠標控制能拉遠到主體的最大距離。在 projection 爲'perspective'的時候有效。
				        	
				        	alpha: 40, 						// 視角繞 x 軸,即上下旋轉的角度。配合 beta 可以控制視角的方向。[ default: 40 ]
				        	beta: 15,						// 視角繞 y 軸,即左右旋轉的角度。[ default: 0 ]
				        	minAlpha: -360,					// 上下旋轉的最小 alpha 值。即視角能旋轉到達最上面的角度。[ default: 5 ]
				        	maxAlpha: 360,					// 上下旋轉的最大 alpha 值。即視角能旋轉到達最下面的角度。[ default: 90 ]
				        	minBeta: -360,					// 左右旋轉的最小 beta 值。即視角能旋轉到達最左的角度。[ default: -80 ]
				        	maxBeta: 360,					// 左右旋轉的最大 beta 值。即視角能旋轉到達最右的角度。[ default: 80 ]
				        	
				        	center: [0,0,0],				// 視角中心點,旋轉也會圍繞這個中心點旋轉,默認爲[0,0,0]。
				        	
				        	animation: true,				// 是否開啓動畫。[ default: true ]
				        	animationDurationUpdate: 1000,	// 過渡動畫的時長。[ default: 1000 ]
				        	animationEasingUpdate: 'cubicInOut'		// 過渡動畫的緩動效果。[ default: cubicInOut ]
				        },
				        
						data: [ 				// 可對單個地圖區域進行設置
							{name: '第一區',   	// 所對應的地圖區域的名稱
							 value: 17000,
							 regionHeight: '20',	// 區域的高度,可以設置不同的高度用來表達數據的大小。當 GeoJSON 爲建築的數據時,也可以通過這個值表示簡直的高度。
							 itemStyle: {			// 單個區域的樣式設置
					            color: '#EEEE00',
					            opacity: 1,
					            borderWidth: 0.4,
					            borderColor: '#5F9EA0'
							 },
							},
							{name: '第二區', 
							 value: 1000,
							 regionHeight: '100',
							 itemStyle: {				// 單個區域的樣式設置
					            color: '#00FF00',
					            opacity: 1,
					            borderWidth: 0.4,
					            borderColor: '#5F9EA0'
							 },
							},
							{name: '第三區', value: 5000},
							{name: '第四區', value: 20000},
							{name: '第五區', value: 25000},
							{name: '第六區', value: 30000},
							{name: '第七區', value: 18000},
							{name: '第八區', value: 2300},
							{name: '三作業區', value: 20000},
							{name: '預留', value: 16000},
							{name: '', value: 28000}
						]
			        }]
			};
			
			// 設置圖表實例的配置項以及數據,萬能接口,所有參數和數據的修改都可以通過setOption完成,ECharts 會合並新的參數和數據,然後刷新圖表。
			myChart.setOption(option);

    //   myChart.setOption(option);
      myChart.on('click', function (param) {
            console.info('點擊' + JSON.stringify(param.data) ) // 柱狀圖上的數值並不會彈出
            // this.openMessage() // 這個方法也沒執行
            //可根據 param.data.name 進行判斷 跳轉 第七區
      })
 
      //建議加上以下這一行代碼,不加的效果圖如下(當瀏覽器窗口縮小的時候)。超過了div的界限(紅色邊框)
      window.addEventListener('resize',function() {myChart.resize()});
    },
    methods: {},
    watch: {},
    created() {
 
    }
  }
</script>

效果圖:可以旋轉查看

``

效果圖:可以旋轉查看
在這裏插入圖片描述
在這裏插入圖片描述

一點,地圖塊名稱未顯示。待調試 ··

繪製自定義地圖地址:http://geojson.io
參考鏈接:https://www.cnblogs.com/telwanggs/p/11056515.html
https://www.jianshu.com/p/7337c2f56876?from=groupmessage&isappinstalled=0

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章