1. 程式人生 > >GeoServer釋出地圖服務並在OpenLayers中顯示:shp的WMS服務和GeoTIFF的WTMS服務

GeoServer釋出地圖服務並在OpenLayers中顯示:shp的WMS服務和GeoTIFF的WTMS服務

GeoServer釋出的地圖服務結構如下:

  1. 必須建立一個工作區,該工作區下可以存放多組無關資料。也就是說,工作區的作用就類似於一個資料夾,僅僅用於分類。
  2. 在工作區下新增資料儲存。資料儲存即一組相關資料。通常,一個地區的地圖可能是單個檔案構成,也可能是多個檔案構成,但這都算是一組相關資料,即一個數據儲存。一個工作區下可以新增多個數據儲存。
  3. 每個資料儲存下往往有一個或多個圖層。例如山東地圖,這個資料儲存是多個shp構成,匯入後,每個shp都是一個圖層,每個圖層都可單獨進行釋出。只有被髮布的圖層才能在資料的Layer Preview下進行檢視。

所以,釋出地圖的過程為:建立工作區→新增資料儲存→釋出圖層。

注意由於圖層只能一個一個釋出,無法一次性發布多個,所以當需要釋出一個新的圖層時,可以選擇圖層→新增新的資源:

然後選擇已有的資料儲存,就可以檢視圖層列表了:

建立資料來源時,有3個選擇:

  1. 向量資料來源:儲存基礎形狀資料,放縮不產生失真。
  2. 柵格資料來源:儲存柵格化圖片資料,放縮會失真。
  3. 其他資料來源

因此,對於路徑類的資料,往往都是向量資料;對於瓦片類的資料,往往都是柵格資料。

釋出WMS服務:向量資料shp

向量資料中,使用較多的是shapefiles,也就是:

上面的Directory of spatial files(shapefiles)用於選擇有多個.shp檔案的資料夾。

下面的Shapefile用於選擇單個.shp檔案。

然後在圖層列表中進行釋出。

通常,座標參考系會自動填入:

若沒有自動填入,則可以手動選擇一個。

注意邊框和經緯度邊框需要點選一下計算:

計算後會填入具體的座標值。

然後釋出即可。

釋出後,點選資料→Layer Preview,在右側找到目標圖層,點OpenLayers,即可彈出新頁面檢視。

釋出WMTS服務:柵格資料GeoTIFF

柵格資料中,使用較多的是GeoTIFF:

GeoTIFF是一種地圖源資料,地圖每一級都由1個.tif和1個.tfw構成:

選擇新增GeoTIFF,然後選擇工作區,自定義資料來源名稱,選擇URL。URL即具體的.tif檔案:

每次只能選擇一個tif,所以對於多級地圖,需要多次重複新增柵格資料來源,將每一個tif都新增進來。

儲存後,會跳轉到新建圖層頁面,剛才新增的tif已經新增到了圖層列表中。

點擊發布:

跳轉到釋出頁面。其邊框座標會自動計算,不用點選。

點選Tile Caching選項卡:

修改最下方的zoom levels:

這裡定義為4/17,是因為地圖最低等級為4級,最高等級為17級。將Published zoom levels和Cached zoom levels修改為一致即可。

儲存。

這樣,就將第4級地圖的tif釋出為圖層了。重複上述步驟,將其他各級地圖的tif也加入資料來源併發布為圖層。

然後對這些地圖源資料進行切圖,將各級地圖切為瓦片:

點選左側的Tile Caching下的Tile Layers:

找到剛才釋出的圖層,點右側的Seed/truncate:

注意其中的Zoom start和Zoom stop,將其都設為與當前地圖等級相同即可(4級地圖都設為04,5級地圖都設為05,6級地圖都設為06……)

然後點Submit,會跳轉到提交頁面,GeoServer就會生成切圖。

切圖的生成路徑為:

GeoServer安裝目錄/data_dir/gwc/工作區_圖層名

其他地圖等級的圖層也按照相同方式切片。

然後將其他地圖的切片資料夾複製到第4級的切片資料夾下:

然後就可檢視地圖了:

選擇一種圖片格式,會開啟一個預覽頁面(後面要用到)

然後可以用滑鼠中鍵進行放縮。

第一次由於要生成更多的快取細節,會稍微慢一點。

於是切片服務WMTS就釋出完成了。

OpenLayers中載入WMTS地圖服務

要在OpenLayers中載入,則首先檢視頁面右側的服務能力,點選WTMS下的1.0.0:

會彈出一個視窗,顯示XML檔案內容:

其中,有多個<ows>標籤的href屬性都標明瞭WMTS的服務地址。記下這個服務地址,後面要用到

然後回到前面開啟的預覽頁面,在頁面上點右鍵:

選檢查,會彈出開發者工具。檢視左側Elements標籤下的內容,開啟<head>標籤下的最後一個<script>標籤:

該<script>就是GeoServer生成的地圖Demo頁面主要內容。

在內容上點左鍵會全部選中,然後在程式碼上點右鍵,在彈出選單中選擇Copy→Copy outerHTML,會將內容全部複製。

然後將這些js內容貼上到一個文字文件中,後面要用到

新建一個頁面:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<link rel="stylesheet" href="v5.2.0-dist/ol.css">
		<script src="v5.2.0-dist/ol.js"></script>
	</head>
	<body>
		<div id="map"></div>
		<script></script>		
	</body>
</html>

在該空白頁面中做了幾個工作:

  • 引入OpenLayers庫。這裡引入的是本地庫檔案,根據自己的實際情況修改。
  • 添加了一個<div>,其id為map
  • 添加了一個空白<script>。

注意作為地圖容器的<div>沒有設定大小,這樣預設會平鋪。可以為其設定widthheight樣式來控制<div>的大小。

將前面文字文件中儲存的js程式碼貼上到<script>標籤中。

js程式碼較長,其結構大致如下:

<script>

    function init() {

       // 顯示座標

       function ScaleControl(opt_options) {

           ...

       };

       ol.inherits(ScaleControl, ol.control.Control);

       ScaleControl.prototype.setMap = function(map) {

           ...

       }

       // 顯示座標結束

       // 基本屬性

       var gridsetName = 'EPSG:4326';

      var gridNames = ['EPSG:4326:3', 'EPSG:4326:4', 'EPSG:4326:5', 'EPSG:4326:6', 'EPSG:4326:7', 'EPSG:4326:8', 'EPSG:4326:9', 'EPSG:4326:10', 'EPSG:4326:11', 'EPSG:4326:12', 'EPSG:4326:13', 'EPSG:4326:14', 'EPSG:4326:15'];

       var baseUrl = '../service/wmts';

       var style = '';

       var format = 'image/png';

       var infoFormat = 'text/html';

       var layerName = 'shandong:L04';

       var projection = new ol.proj.Projection({

           code: 'EPSG:4326',

           units: 'degrees',

           axisOrientation: 'neu'

       });

       var resolutions = [0.087890625, 0.0439453125, 0.02197265625, 0.010986328125, 0.0054931640625, 0.00274658203125, 0.001373291015625, 6.866455078125E-4, 3.4332275390625E-4, 1.71661376953125E-4, 8.58306884765625E-5, 4.291534423828125E-5, 2.1457672119140625E-5];

       baseParams = ['VERSION', 'LAYER', 'STYLE', 'TILEMATRIX', 'TILEMATRIXSET', 'SERVICE', 'FORMAT'];

       params = {

           ...

       };

       // 構建layersource

       function constructSource() {

           ...

       }

       // 構建layer

       var layer = new ol.layer.Tile({

           source: constructSource()

       });

       // 構建view

       var view = new ol.View({

           ...

       });

       // 構建map

       var map = new ol.Map({

           controls: ol.control.defaults({

              attribution: false

           }).extend([

              new ol.control.MousePosition(),

              new ScaleControl()

           ]),

           layers: [layer],

           target: 'map',

           view: view

       });

       map.getView().fit([112.49999999999864, 21.943045533437925, 134.99999999999838, 40.97989806961972], map.getSize());

       // 設定左上角STYLE

       window.setParam = function(name, value) {

           ...

       }

       // 設定左上角STYLE結束

       // 單擊地圖事件

       map.on('singleclick', function(evt) {

           ...

       });

       // 單擊地圖事件結束

    }

</script>

刪掉上面藍色的程式碼部分:

  • 刪掉顯示座標
  • 刪掉new ol.Mapcontrols屬性。
  • 刪掉設定左上角STYLE
  • 刪掉單擊地圖事件

使用前面記下的服務地址替換baseUrl:

整個<script>只定義了一個init()函式,但並沒有呼叫。在<script>最後新增:

init();

儲存,在瀏覽器中開啟頁面即可看到地圖。