整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          Excel一鍵創建32個省份命名的空白工作表的操作

          在領導想要一個具有32個省份的空白工作簿,該如何快速創建呢,難道讓小編一個表一個表的建立,一個表一個表的命名

          (方方格子插件)

          1.先看動圖演示吧

          2.我們可以從網上下載好省份明細,在A列整理好

          3.然后呢我們選擇方方格子插件按鈕

          4.然后選擇工作表操作

          5.選擇創建工作表的操作命令

          6.彈出對話框將內容拷貝去掉

          7.確定后即可完成批量創建

          如果經驗幫到了你,請記得分享!

          之前分享了mapboxgl 互聯網地圖糾偏插件,插件當時只集成了高德地圖。

          文章發布后,有小伙伴在后臺留言,希望插件也能支持百度地圖。

          剛好國慶假期有時間就研究了一下。

          插件加載瓦片原理

          首先,插件之所以能夠正確的加載互聯網地圖瓦片,關鍵是依托經緯度和瓦片編號的互轉算法。

          有了經緯度和瓦片編號的互轉算法,插件就能根據當前地圖窗口4個角的經緯度坐標,算出需要請求的瓦片編號。

          再根據瓦片編號轉經緯度的算法,算出請求到的每一個瓦片在地圖上擺放的經緯度位置。

          這樣瓦片就能正確的顯示在地圖上了。

          然后再監聽地圖范圍的改變,當范圍改變時,重復上述步驟,更新地圖瓦片。

          瓦片編碼方式

          經緯度和瓦片編號的互轉算法,在不同地圖中是不一樣的,這取決于不同地圖的瓦片編碼方式。

          瓦片編碼方式總結下來,可以分為4大類:谷歌XYZ、TMS、QuadTree、百度XYZ。

          我們之前集成的高德地圖瓦片,采用的就是谷歌xyz編碼方式,這種編碼方式,瓦片的坐標原點在世界地圖的左上角,西經180 o北緯85 o左右,瓦片編號規則如下圖所示:

          谷歌xyz編碼方式的經緯度和瓦片編號互轉算法是公開的,詳見:Slippy map tilenames,插件之前就是用的這個。

          百度地圖采用的是自己的百度XYZ方式,瓦片坐標的原點在本初子午線和赤道的交匯處,瓦片編號規則如下圖所示:

          網上有人研究了這4類瓦片編碼方式的,經緯度坐標與瓦片編號互轉算法,并在github上分享了源碼。

          我們把百度的那部分互轉算法拿來,加入到我們的糾偏插件中,這樣糾偏插件就能支持百度地圖了。

          糾偏后效果如下:

          插件升級

          插件這次升級,除了新增百度地圖以外,順帶把平時常用的天地圖、OSM和GEOQ也加了進來。

          天地圖是大地2000坐標系,可以在wgs84坐標地圖上直接使用,誤差很小。OSM地圖直接是wgs84坐標,不需要糾偏。

          所以它兩個在插件中直接使用 mapboxgl 的原生接口,其它地圖則使用我們寫的自定義圖層接口。

          GeoQ地圖瓦片的編碼方式和高德相同,改個瓦片請求地址就可以。

          把它們都收集到一起,看效果,真是爽歪歪

          最后,在 mapboxgl 中還是推薦使用矢量瓦片,展示效果會好很多,上面的柵格瓦片推薦作為補充使用。

          目前網上還沒有免費的矢量瓦片地圖資源,這個問題可以通過本地發布OSM地圖矢量瓦片的方式解決。

          本地發布OSM地圖矢量瓦片的方式可以參考之前寫的文章 OSM地圖本地發布-環境搭建、OSM地圖本地發布-如何生成各省市矢量地圖

          插件地址

          mapboxgl互聯網地圖糾偏插件

          在線示例:http://gisarmory.xyz/blog/index.html?demo=mapboxglMapCorrection4

          代碼地址:http://gisarmory.xyz/blog/index.html?source=mapboxglMapCorrection3

          總結

          1. 之前分享的mapboxgl互聯網地圖糾偏插件只集成了高德地圖,有小伙伴留言希望支持百度地圖。
          2. 插件加載互聯網地圖瓦片的原理是基于經緯度和瓦片編號的互轉算法。
          3. 因為不同地圖使用的瓦片編碼規則不同,所以不同地圖的經緯度和瓦片編號的互轉算法也會不同。
          4. 網上有人分享了不同地圖中,經緯度和瓦片編號的互轉算法,我們把百度地圖的互轉算法拿來使用,這樣插件就能支持百度地圖瓦片的糾偏了。
          5. 本次插件升級除了增加百度地圖外,還增加了天地圖、OSM地圖和GeoQ地圖。

          參考資料

          瓦片地圖原理:

          https://segmentfault.com/a/1190000011276788

          國內主要地圖瓦片坐標系定義及計算原理:

          https://cntchen.github.io/2016/05/09/國內主要地圖瓦片坐標系定義及計算原理/

          Slippy map tilenames:

          https://wiki.openstreetmap.org/wiki/Slippy_map_tilenames


          原文地址:http://gisarmory.xyz/blog/index.html?blog=mapboxglMapCorrection4

          關注《GIS兵器庫》, 只給你網上搜不到的GIS知識技能。

          本文章采用 知識共享署名-非商業性使用-相同方式共享 4.0 國際許可協議 進行許可。歡迎轉載、使用、重新發布,但務必保留文章署名《GIS兵器庫》(包含鏈接: http://gisarmory.xyz/blog/),不得用于商業目的,基于本文修改后的作品務必以相同的許可發布。



          .效果圖1



          2.準備

          2.1 瀏覽器,簡單,絕大多數瀏覽器都支持

          2.2 下載echarts庫js文件

          官網上下載:

          https://www.echartsjs.com/zh/index.html

          2.3 有3個js庫文件下載好放在同一個目錄下,如下導入:

              <script src="jquery.min.js"></script>
          
              <script src="echarts.js"></script>
          
              <script src="china.js"></script>


          3.用txt復制如下代碼,當然也可以直接復制到代碼編輯器中,我用的是微軟vsc

          4.取個名字,建議先后綴為js,然后復制一個,再取名為html,這是本地操作

          圖2



          5.代碼:(js和html的代碼)

          <!DOCTYPE html>
          <html>
          <head>
              <!--代碼聲明,否則容易亂碼-->
              <meta charset="utf-8"> 
              <title>全國各省市支援湖北武漢抗擊新冠疫情圖</title>
          	<!-- .centerItem(展示圖片的畫布大小、邊緣設置) -->
              <style>
                  .centerItem {width:800px;height:500px;background-color: #003077;margin:10px auto 0 auto;}
              </style>
          </head>
           
          <body>
              <!--設置div容器,定義id名字,類=畫布=centerItem-->
              <div id="mapBox" class="centerItem"></div>
              <!-- 引入相關js文件或庫,這個是有點難,尤其是從官網上復制相關代碼時,未指定js文件或庫或插件-->
              <script src="jquery.min.js"></script>
              <script src="echarts.js"></script>
              <script src="china.js"></script>
              <script>
          		// 新版已經不要求加script type="text/javascript"放在里面了
                  // 基于準備好的dom,初始化echarts實例
                  var mapBoxEchart = echarts.init(document.getElementById('mapBox'));
          		// 以下可以從官網上復制相關代碼---
                  var chinaGeoCoordMap = {
          			// 這些地理坐標可以網上查找,也可以放在json中,然后引用
          			'黑龍江': [127.9688, 45.368],
          			'內蒙古': [110.3467, 41.4899],
          			"吉林": [125.8154, 44.2584],
          			'北京市': [116.4551, 40.2539],
          			"遼寧": [123.1238, 42.1216],
          			"河北": [114.4995, 38.1006],
          			"天津": [117.4219, 39.4189],
          			"山西": [112.3352, 37.9413],
          			"陜西": [109.1162, 34.2004],
          			"甘肅": [103.5901, 36.3043],
          			"寧夏": [106.3586, 38.1775],
          			"青海": [101.4038, 36.8207],
          			"新疆": [87.9236, 43.5883],
          			"西藏": [91.11, 29.97],
          			"四川": [103.9526, 30.7617],
          			"重慶": [108.384366, 30.439702],
          			"山東": [117.1582, 36.8701],
          			"河南": [113.4668, 34.6234],
          			"江蘇": [118.8062, 31.9208],
          			"安徽": [117.29, 32.0581],
          			"湖北": [114.3896, 30.6628],
          			"浙江": [119.5313, 29.8773],
          			"福建": [119.4543, 25.9222],
          			"江西": [116.0046, 28.6633],
          			"湖南": [113.0823, 28.2568],
          			"貴州": [106.6992, 26.7682],
          			"云南": [102.9199, 25.4663],
          			"廣東": [113.12244, 23.009505],
          			"廣西": [108.479, 23.1152],
          			"海南": [110.3893, 19.8516],
          			'上海': [121.4648, 31.2891],
          			'舟山': [122.207216, 29.985295],
          			'昆明': [102.9199, 25.4663],
          			'香港': [114.1, 22.2],
          			'澳門': [113.33, 22.13], 
          			'北京': [116.4551, 40.2539],
          			'臺灣': [121.30, 25.03],
          		};
          		// 我把格式整理一下,感覺js代碼格式看著很多括號占一行,很難受
          		var chinaDatas = [
          			[{name: '黑龍江',value: 0}],	
          			[{name: '內蒙古',value: 0}],	
          			[{name: '吉林',value: 0}],	
          			[{name: '遼寧',value: 0}],	
          			[{name: '河北',value: 0}],	
          			[{name: '天津',value: 0}],	
          			[{name: '山西',value: 0}],	
          			[{name: '陜西',value: 0}],	
          			[{name: '甘肅',value: 0}],	
          			[{name: '寧夏',value: 0}],	
          			[{name: '青海',value: 0}],	
          			[{name: '新疆',value: 0}],
          			[{name: '西藏',value: 0}],	
          			[{name: '四川',value: 0}],	
          			[{name: '重慶',value: 0}],	
          			[{name: '山東',value: 0}],	
          			[{name: '河南',value: 0}],	
          			[{name: '江蘇',value: 0}],
          			[{name: '安徽',value: 0}],	
          			[{name: '湖北',value: 0}],	
          			[{name: '浙江',value: 0}],	
          			[{name: '福建',value: 0}],	
          			[{name: '江西',value: 0}],	
          			[{name: '湖南',value: 0}],	
          			[{name: '貴州',value: 0}],
          			[{name: '廣西',value: 0}],	
          			[{name: '海南',value: 0}],	
          			[{name: '上海',value: 0}],	
          			[{name: '昆明',value: 0}],	
          			[{name: '廣東',value: 0}],	
          			[{name: '香港',value: 0}],	
          			[{name: '澳門',value: 0}],	
          			[{name: '北京',value: 0}],
          			[{name: '臺灣',value: 0}],
          			// 我是舟山人,當然支援湖北武漢要用紅色,與眾不同些
          			[{name: '舟山',value: 1}],
          		];
          
          	var convertData = function(data) 
          	   {
          		var res = [];
          		for(var i = 0; i < data.length; i++) 
          		   {
          			var dataItem = data[i];
          			var fromCoord = chinaGeoCoordMap[dataItem[0].name];
          			// 設置湖北坐標點為終止點tocoord
          			var toCoord = [114.3896, 30.6628];
          			if(fromCoord && toCoord) 
          			{res.push([{coord: fromCoord,value: dataItem[0].value}, {coord: toCoord}])}
          		    }
          		return res;
          	    };
          
          	var series = [];
          	[['湖北', chinaDatas]].forEach(function(item, i) 
          	{
          	    console.log(item)
          		series.push(
          			{type: 'lines',zlevel: 2,effect: {show: true,
          											  period: 4, //箭頭指向速度,值越小速度越快
          											  trailLength: 0.02, //特效尾跡長度[0,1]值越大,尾跡越長重
          											  symbol: 'arrow', //箭頭圖標
          											  symbolSize: 5, //圖標大小
          											  },
          			lineStyle: {normal: {
          						width: 1,     //尾跡線條寬度
          						opacity: 1,    //尾跡線條透明度
          						curveness: .3   //尾跡線條曲直度
          						        }
          						},
          			data: convertData(item[1])
          			}, 
          			
          			{type: 'effectScatter',coordinateSystem: 'geo',zlevel: 2,
          			 rippleEffect: { //漣漪特效
          							period: 4, //動畫時間,值越小速度越快
          							brushType: 'stroke', //波紋繪制方式 stroke, fill
          							scale: 4 //波紋圓環最大限制,值越大波紋越大
          							},
          			 label: {normal: {show: true,position: 'right', //顯示位置
          							  offset: [5, 0], //偏移設置
          							  formatter: function(params){return params.data.name}, //圓環顯示文字
          							  fontSize: 13
          							  },
          					emphasis: {show: true}
          					},
          			 symbol: 'circle',symbolSize: function(val) {return 5+ val[2] * 5},  //圓環大小
          			 itemStyle: {normal: {show: false,color: '#f00'}},
          
          			 // item[1]代表舟山到湖北是紅色單獨的,注意上面舟山的values值
          			 data: item[1].map(function(dataItem) 
          						{return {
          								name: dataItem[0].name,
          								value: chinaGeoCoordMap[dataItem[0].name].concat([dataItem[0].value])
          								};
          						}
          			                    ), //這個小括號是map后面的一對,括號太多,看的頭暈,還是python好
          			 }, //type后面的大括號
          			 
          			//被支援點的設置:湖北武漢
          			{type: 'scatter',coordinateSystem: 'geo',zlevel: 2,
          			 rippleEffect: {period: 4,brushType: 'stroke',scale: 4},
          			 label: {normal: {show: true,position: 'right',color: '#0f0',formatter: '{b}',
          							  textStyle: {color: "#0f0"}
          					          },
          					emphasis: {show: true,color: "#f60"}
          				    },
          			 symbol: 'pin',symbolSize: 50,
          			 data: [{name: item[0],value: chinaGeoCoordMap[item[0]].concat([10]),
          				    }],
          			} //type后面的大括號
          		); // push后面的小括號是一對
          	} //和湖北下面的大括號是一對
          	); // 是forEach(function的小括號是一對,看暈了
              
          	// 有時間前面加var,再空一格,注意單復數,與后面setOption括號里保持一致
          	option = {
          		tooltip: 
          		{
          			trigger: 'item',backgroundColor: 'rgba(166, 200, 76, 0.82)',borderColor: '#FFFFCC',
          			showDelay: 0,hideDelay: 0,enterable: true,transitionDuration: 0,
          			extraCssText: 'z-index:100',
          			formatter: function(params, ticket, callback) 
          			    {
          				//根據業務自己拓展要顯示的內容
          				var res = "";
          				var name = params.name;
          				var value = params.value[params.seriesIndex + 1];
          				res = "<span style='color:#fff;'>" + name + "</span><br/>數據:" + value;
          				return res;
          			    }
          		},
          		backgroundColor:"#013954",
          		//圖例值控制
          	    visualMap: { min: 0,max: 1,calculable: true,show: true,
          					color: ['#f44336', '#fc9700', '#ffde00', '#ffde00', '#00eaff'],
          					textStyle: {color: '#fff'}
          		           },
          		geo: {map: 'china',zoom: 1.2,label: {emphasis: {show: false}},
          			  roam: true, //是否允許縮放
          			  itemStyle: {normal: {
          									color: 'rgba(51, 69, 89, .5)', //地圖背景色
          									borderColor: '#516a89', //省市邊界線00fcff 516a89
          									borderWidth: 1
          				                    },
          				         emphasis: {color: 'rgba(37, 43, 61, .5)' } //懸浮背景
          			             }
          		     },
          		series: series
          	}; // 是option的后面的大括號是一對
          
                  // 使用制定的配置項和數據顯示圖表
                  mapBoxEchart.setOption(option);
                  // echart圖表自適應
                  window.addEventListener("resize", function() {mapBoxEchart.resize()});
          </script>
          
          </body>
          </html>

          6.說明一下:這不是python,代碼繁瑣,括號太多,注釋還不一樣。

          6.1 注意小括號(),大括號{}對應

          6.2 注釋說明:

          html中注釋采用:

          <!--xxx-->

          在js代碼中:

          即<script>......</script>中,

          采用://,這個和python的#一樣,是單行注釋。


          7.祝福:

          武漢加油、湖北加油、中國加油!

          武漢必勝、湖北必勝、中國必勝!


          主站蜘蛛池模板: 日韩美一区二区三区| 国产女人乱人伦精品一区二区| 日产亚洲一区二区三区| 99久久精品国产高清一区二区| 在线精品动漫一区二区无广告| 日韩精品一区二区三区大桥未久| 青青青国产精品一区二区| 伊人色综合网一区二区三区| 色欲AV无码一区二区三区| 91久久精一区二区三区大全| 91香蕉福利一区二区三区| 国产在线一区二区三区av| 国产成人无码AV一区二区| 呦系列视频一区二区三区| 香蕉视频一区二区三区| 亚洲一区二区三区久久| 一区二区三区无码高清视频| 亚洲国产成人一区二区三区| 成人免费视频一区| 国产成人无码AV一区二区| 99国产精品欧美一区二区三区| 精品人妻少妇一区二区三区| 中文字幕精品一区二区2021年 | 一区二区三区免费高清视频| 日韩精品在线一区二区| 日本精品一区二区三区视频 | 亚洲综合一区国产精品| 精品久久久久中文字幕一区| 亚洲AV无码片一区二区三区| 在线精品国产一区二区三区| 亚洲精品无码一区二区| 亚洲AV综合色一区二区三区| 国产凸凹视频一区二区| 成人精品一区二区户外勾搭野战| 久久免费视频一区| 波多野结衣一区二区三区高清av| 亚洲国产日韩在线一区| 国产高清视频一区三区| 国产成人综合精品一区| 黑巨人与欧美精品一区| 亚洲av无码一区二区三区观看|