一、概述
本篇文章介紹如何發佈矢量切片數據,並且介紹了相關矢量切片插件的安裝,以及使用OpenLayers進行圖層數據的調用,和樣式的修改等內容。
二、矢量切片的優點
矢量切片的優點是:
1、數據在客戶端渲染(例如,OpenLayers),而不是在服務端。這允許不同的地圖應用程序使用不同的樣式去渲染一個地圖,而不需要事先在服務端(比如GeoServer)進行預先的樣式配置。
2、矢量切片的大小通常比圖片小,這可以使得數據傳輸得更快以及使用更低的帶寬。
3、GeoServer內嵌的GeoWebCache可以有效地存儲矢量切片數據。由於樣式由客戶端配置,而不是在服務器配置,因此GeoWebCache只需要存儲矢量切片,而不需要存儲樣式配置。
4、由於在客戶端上可以獲取到矢量數據,所以不需要相應地增加帶寬,就可以繪製分辨率很高的地圖。
5、客戶端可以本地訪問實際的要素信息(屬性信息和幾何信息),所以可以進行非常複雜和精細的要素渲染。
另一方面,矢量切片的主要缺點是需要對地理數據進行預處理,以便客戶端能夠完成所需的繪圖(類似於圖像瓦片地圖的預處理數據)。考慮到這一點,矢量切片只能用於渲染。雖然是矢量格式,但是它們不可編輯,矢量切片是爲了讀取和渲染優化的格式,如果想在客戶端編輯要素,最適合的是使用OGC的WFS。
三、矢量切片格式
GeoServer可以生成三種格式的矢量切片:GeoJSON,TopoJSON,MapBox Vector(MVT)。這些矢量切片格式也得到OpenLayers和其他客戶端地圖引擎的支持。
注意:當使用矢量切片時,請確保使用最新的客戶端地圖引擎,老版的地圖引擎不支持矢量切片並會產生渲染錯誤。建議使用最新版的OpenLayers(目前最新版位v6.2.1)。
格式 | MIME | 描述 |
MapBox Vector(MVT) | application/x-protobuf;type=mapbox-vector | 推薦的格式。 這是一種高效的二進制格式,幾乎所有的矢量切片應用程序都支持這種格式。 MVT是生產環境中首選的矢量切片格式。 |
GeoJSON | application/json;type=geojson | 這是一種人類可讀的JSON格式。 雖然許多GIS應用程序支持GeoJSON數據集, 但很少有矢量切片應用程序支持這種格式的切片。 OpenLayers支持這種格式的矢量切片。 |
TopoJSON | application/json;type=topojson | 這是一種非常複雜,但有一點人類可讀性的JSON格式,對多邊形覆蓋很好,但是很少有矢量切片應用程序支持它。 OpenLayers支持這種格式的矢量切片。 |
四、安裝矢量切片插件
GeoServer的矢量切片插件是官方的插件,可以在GeoServer Download頁面中下載。
1、在GeoServer官網的下載頁面找到Vector Tiles鏈接,如下圖所示:
或者直接打開下載地址進行下載:https://sourceforge.net/projects/geoserver/files/GeoServer/2.16.0/extensions/geoserver-2.16.0-vectortiles-plugin.zip/download
注意:其中的版本號一定要和您當前安裝的GeoServer版本相一致,否則有可能會出現一些問題。當前演示用的GeoServer版本號是:2.16.0
2、將下載的內容解壓(jar包),如下圖所示:
3、將解壓出來的文件複製到GeoServer的WEB-INF/lib文件夾下,如下圖所示:
4、重新啓動GeoServer。
5、接下來,驗證矢量切片擴展是否已安裝成功,打開GeoServer的Web管理界面,並登陸系統,然後打開《圖層》管理頁面,如下圖所示:
6、如上圖所示,在《圖層》列表中單擊任意一個矢量圖層,然後會打開《編輯圖層》頁面,如下圖所示:
7、在上圖所示的頁面中點擊《Tile Caching》選項卡,如下圖所示:
如果可以看到這些選項,那麼就表示擴展已經安裝成功了。
五、發佈矢量切片
具體發佈過程可以參考《GeoServer入門學習:04-發佈Shapfile地圖數據》文章,地址是:https://blog.csdn.net/gjysk/article/details/103101473
六、創建OpenLayers應用程序
1、創建OpenLayers的前端HTML項目。
2、下載最新版本的OpenLayers,可以從官網地址下載:https://openlayers.org/download
3、解壓OpenLayers文件,並將壓縮包中的以下文件複製到項目文件夾中:
- ol.js
- ol-debug.js
- ol.css
4、在項目目錄中創建名爲index.html的文件,並且將一下代碼複製到該文件中:
<!DOCTYPE html -->
<html>
<head>
<title>Vector tiles</title>
<script src="ol.js"></script>
<link rel="stylesheet" href="ol.css">
<style>
html,
body {
font-family: sans-serif;
width: 100%;
}
.map {
height: 500px;
width: 100%;
}
</style>
</head>
<body>
<h3>Mapbox Protobuf - vector tiles</h3>
<div id="map" class="map"></div>
<script>
var style_simple = new ol.style.Style({
fill: new ol.style.Fill({
color: '#ADD8E6'
}),
stroke: new ol.style.Stroke({
color: '#880000',
width: 1
})
});
function simpleStyle(feature) {
return style_simple;
}
var layer = 'opengeo:countries';
var projection_epsg_no = '900913';
var map = new ol.Map({
target: 'map',
view: new ol.View({
center: [0, 0],
zoom: 2
}),
layers: [new ol.layer.VectorTile({
style: simpleStyle,
source: new ol.source.VectorTile({
tilePixelRatio: 1,
tileGrid: ol.tilegrid.createXYZ({
maxZoom: 19
}),
format: new ol.format.MVT(),
url: '/geoserver/gwc/service/tms/1.0.0/' + layer +
'@EPSG%3A' + projection_epsg_no + '@pbf/{z}/{x}/{-y}.pbf'
})
})]
});
</script>
</body>
</html>
5、運行項目,並且打開index.html頁面,並驗證輸出是否顯示沒有任何錯誤,然後會看到類似於如下的效果:
七、修改矢量切片的樣式
就像前面所描述的那樣,這些矢量切片是在客戶端中渲染的,所以我們只需要更改客戶端應用程序中相關的樣式命令就能修改矢量切片的樣式,而不需要對GeoServer(服務器端)進行任何更改,也不必在GeoServer中重新生成矢量切片。下面,我們示例幾個簡單的修改操作。
1、將填充顏色改爲light green:
var style_simple = new ol.style.Style({
fill: new ol.style.Fill({
color: 'lightgreen'
}),
stroke: new ol.style.Stroke({
color: '#880000',
width: 1
})
});
2、保存文件並刷新瀏覽器,可以看到地圖的填充顏色變爲如下圖的效果了:
3、我們也可以構建基於屬性的樣式。這個數據集包含了一個屬性(region_un),該屬性包含國家所在的區域。讓我們通過在現有樣式下面添加另一個樣式定義來高亮渲染非洲國家。
var style_highlighted = new ol.style.Style({
fill: new ol.style.Fill({
color: 'yellow'
}),
stroke: new ol.style.Stroke({
color: '#880000',
width: 1
})
});
4、替換現有的樣式函數:
function simpleStyle(feature) {
return style_simple;
}
替換爲下面這個:
function simpleStyle(feature) {
if (feature.get("region_un") == "Africa") {
return style_highlighted;
}
return style_simple;
}
5、保存文件並刷新瀏覽器,可以看到如下的效果:
如上圖所示,可以看到非洲區域的填充顏色已經修改爲黃色了。
八、參考資料
https://blog.csdn.net/qq_35732147/article/details/89354557