1. 程式人生 > >GIS初學者,最新OpenLayers WMTS 天地圖,OpenLayers載入天地圖、呼叫天地圖WMTS示例、tianditu、EPSG:3857、EPSG:4326

GIS初學者,最新OpenLayers WMTS 天地圖,OpenLayers載入天地圖、呼叫天地圖WMTS示例、tianditu、EPSG:3857、EPSG:4326

2018最新OpenLayers天地圖載入可行方案,天地圖WMTS呼叫,OpenLayers 天地圖 WMTS GetCapabilities GetTile

最近要了解Web GIS方面的知識,對我這些外行人來說比較吃力,用OpenLayers載入天地圖也遇到了小打擊,一番折騰,終於做到僅僅顯示了,把過程簡單記錄下:

首先是百度一輪,看了不少部落格,感覺差不多後,自己動手就是不成功,繼續摸索後勉強算把地圖加載出來了,下面是我的基本過程:

1、天地圖現在要註冊才能用,以前應該不用註冊(網上的程式碼以前寫的,我使用不成功)

到這裡,已經有WMTS的連結了,接著就使用OpenLayers來呼叫這個WMTS的連結來顯示地圖。

2、編寫OpenLayers呼叫WMTS服務來顯示地圖的程式碼(我的做法是到官網複製相關Demo的程式碼,然後修改)

在Demo程式碼的基礎上,我調整後能成功顯示的程式碼如下(可能有些多餘的程式碼):

(檔案 index.html 程式碼)

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Using Parcel with OpenLayers</title>
    <style>
	  html,body{ padding:0; margin: 0; }
      .map {
        width: 600px;
        height: 400px;
		float:left;
		margin: 10px 0 0 10px;
      }
    </style>
  </head>
  <body>
    <div id="map1" class="map"></div>
    <script src="./index.js"></script>
  </body>
</html>

(檔案 index.js 程式碼)

import Map from 'ol/Map.js';
import View from 'ol/View.js';
import {defaults as defaultControls} from 'ol/control.js';
import {getWidth, getTopLeft} from 'ol/extent.js';
import TileLayer from 'ol/layer/Tile.js';
import {get as getProjection} from 'ol/proj.js';
import OSM from 'ol/source/OSM.js';
import WMTS from 'ol/source/WMTS.js';
import WMTSTileGrid from 'ol/tilegrid/WMTS.js';


var projection = getProjection('EPSG:3857');
var projectionExtent = projection.getExtent();
var size = getWidth(projectionExtent) / 256;
var resolutions = new Array(18);
var matrixIds = new Array(18);
for (var z = 1; z < 19; ++z) {
	// generate resolutions and matrixIds arrays for this WMTS
	resolutions[z] = size / Math.pow(2, z);
	matrixIds[z] = z;
}

var webKey = 'f50a580b75898a7e26dca2dfe3ad910e';

var wmtsUrl_1 = 'http://t{0-7}.tianditu.gov.cn/vec_w/wmts?tk='; //向量底圖
var wmtsUrl_2 = 'http://t{0-7}.tianditu.gov.cn/cva_w/wmts?tk='; //向量註記

var wmtsUrl_3 = 'http://t{0-7}.tianditu.gov.cn/img_w/wmts?tk='; //影像底圖
var wmtsUrl_4 = 'http://t{0-7}.tianditu.gov.cn/cia_w/wmts?tk='; //影像註記

var wmtsUrl_5 = 'http://t{0-7}.tianditu.gov.cn/ter_w/wmts?tk='; //地形底圖
var wmtsUrl_6 = 'http://t{0-7}.tianditu.gov.cn/cta_w/wmts?tk='; //地形註記

var wmtsUrl_7 = 'http://t{0-7}.tianditu.gov.cn/ibo_w/wmts?tk='; //境界(省級以上)
var wmtsUrl_8 = 'http://t{0-7}.tianditu.gov.cn/eva_w/wmts?tk='; //向量英文註記
var wmtsUrl_9 = 'http://t{0-7}.tianditu.gov.cn/eia_w/wmts?tk='; //影像英文註記

var map1 = new Map({
	layers: [
	  new TileLayer({
		opacity: 0.7,
		source: new WMTS({
		  url: wmtsUrl_1 + webKey,
		  layer: 'vec',
		  matrixSet: 'w',
		  format: 'tiles',
		  style: 'default',
		  projection: projection,
		  tileGrid: new WMTSTileGrid({
			origin: getTopLeft(projectionExtent),
			resolutions: resolutions,
			matrixIds: matrixIds
		  }),	  
		  wrapX: true
		})
	  }),
	  new TileLayer({
		opacity: 0.7,
		source: new WMTS({
		  url: wmtsUrl_2 + webKey,
		  layer: 'cva',
		  matrixSet: 'w',
		  format: 'tiles',
		  style: 'default',
		  projection: projection,
		  tileGrid: new WMTSTileGrid({
			origin: getTopLeft(projectionExtent),
			resolutions: resolutions,
			matrixIds: matrixIds
		  }),	  
		  wrapX: true
		})
	  })
	],
	target: 'map1',
	view: new View({
	  center: [-11158582, 4813697],
	  zoom: 4
	})
});

效果顯示如圖:

3、程式碼中有些關鍵的引數,導致我開始一直不成功,下面簡單說明一下程式碼

主要是“source”裡面的“layer、matrixSet、format、style”這幾個引數,
這幾個引數不能亂寫,得由WMTS的GetCapabilities介面返回的結果來決定,
你也可以百度下“WMTS GetCapabilities”瞭解更多!

程式碼中這幾個引數,如圖:

4、天地圖有好幾份底圖資料,我為了看看效果,把它都顯示了一下

目前天地圖有這些WMTS服務介面,如圖:

下面我都用OpenLayers呼叫看看效果唄,如圖:

參考:(看了比較多部落格,參考了哪些文章,沒記錄下來,比較雜。。。)

(完)