1. 程式人生 > >ol4載入pbf向量切片與樣式定義

ol4載入pbf向量切片與樣式定義

概述

看了一下mapbox的向量切片的展示方式,其核心是定義的一個樣式配置檔案,我就在想:Ol4裡面我是否通過styleFunction的方式實現同樣的效果呢,折騰了一上午,別說,styleFunction真好用,在此分享出來,供大家參看。

mapbox的樣式配置

mapbox樣式配置
如上圖所示,mapbox的樣式定義是通過一個這樣的配置實現的,實現後效果如下:
mapbox載入效果

openlayers4的樣式配置

Ol樣式配置
如上圖所示,我是模仿mapbox的配置檔案,並結合ol4的特性做了一部分修改。實現後效果如下:
ol載入效果

實現

1、向量切片

向量切片是通過geoserver來實現的。實現可參考部落格

Geoserver2.11向量切片與OL3中的呼叫展示。切片圖層是一個layer group,如下圖:
layer group

2、樣式定義檔案

{
    "province": [
        {
            "type": "polygon",
            "fill": {
                "color": "rgba(255, 0, 0, 0)"
            },
            "stroke": {
                "color": "#ccc",
                "width": "3",
                "dash
": [ 5, 5 ] }
} ]
, "lake": [ { "type": "polygon", "fill": { "color": "rgba(0, 0, 255, .3)" }, "stroke": { "color": "rgba(0, 0, 255, .75)"
, "width": "1" }
} ]
, "river": [ { "type": "line", "minZoom": 12, "maxZoom": 18, "stroke": { "color": "rgba(0,0,255,.2)", "width": "2" } } ], "road": [ { "type": "line", "minZoom": 8, "maxZoom": 18, "stroke": { "color": "#ccc", "width": "2" } } ], "railway": [ { "type": "line", "minZoom": 6, "maxZoom": 18, "stroke": { "color": "#ccc", "width": "6" } }, { "type": "line", "minZoom": 6, "maxZoom": 18, "stroke": { "color": "white", "width": "2", "dash": [ 5 ] } } ], "capital": [ { "type": "point", "size": 5, "fill": { "color": "rgba(255, 0, 0, .8)" }, "stroke": { "color": "#f00", "width": "1" }, "label": { "field": "name", "color": "balck", "font": "bold 13px 微軟雅黑", "textAlign": "center", "textBaseline": "top", "offsetY": 6, "offsetX": 0 } } ] }

說明:
1、如上圖所示,每一個圖層對應一個樣式配置;
2、樣式配置是一個數組,主要是為了有些圖層的複合樣式考慮的,例如鐵路的樣式,實現後的效果如下:
鐵路的複合樣式

3、樣式函式

function getFillJson(data) {
    var json = {};
    if (data.color) json.color = data.color;
    return json;
}
function getStrokeJson(data) {
    var json = {};
    if (data.color) json.color = data.color;
    if (data.width) json.width = data.width;
    if (data.dash) json.lineDash = data.dash;
    return json;
}
function getMarkerJson(data) {
    var json = {};

    if (data.size) json.radius = data.size;

    var _fill = data.fill;
    if (_fill) json.fill = new ol.style.Fill(getFillJson(_fill));

    var _stroke = data.stroke;
    if (_stroke) json.stroke = new ol.style.Stroke(getStrokeJson(_stroke));

    return json;
}
function getLabelJson(data, feature) {
    var json = {};
    if (data.field) json.text = feature.get(data.field).toString();
    if (data.color) json.fill = new ol.style.Fill({
        color: data.color
    });
    if (data.textAlign) json.textAlign = data.textAlign;
    if (data.textBaseline) json.textBaseline = data.textBaseline;
    if (data.font) json.font = data.font;
    if (data.offsetX) json.offsetX = data.offsetX;
    if (data.offsetY) json.offsetY = data.offsetY;
    return json;
}

function styleFunction(feature) {
    var layer = feature.get("layer");
    var layerStyle = styleMap[layer];
    if (layerStyle) {
        var styles = [];
        for (var i = 0,
        len = layerStyle.length; i < len; i++) {
            var _styleData = layerStyle[i];
            var _zoom = map.getView().getZoom();
            if (_styleData.minZoom > _zoom || _styleData.maxZoom < _zoom) {
                return;
            } else {
                var _styleJson = {};
                switch (_styleData.type) {
                case "line":
                    {
                        var _stroke = _styleData.stroke;
                        if (_stroke) {
                            _styleJson.stroke = new ol.style.Stroke(getStrokeJson(_stroke));
                        }
                        break;
                    }
                case "polygon":
                    {
                        var _fill = _styleData.fill;
                        if (_fill) _styleJson.fill = new ol.style.Fill(getFillJson(_fill));

                        var _stroke = _styleData.stroke;
                        if (_stroke) _styleJson.stroke = new ol.style.Stroke(getStrokeJson(_stroke));

                        var _label = _styleData.label;
                        if (_label) _styleJson.text = new ol.style.Text(getLabelJson(_label, feature));
                        break;
                    }
                default:
                    {
                        _styleJson.image = new ol.style.Circle(getMarkerJson(_styleData));

                        var _label = _styleData.label;
                        if (_label) _styleJson.text = new ol.style.Text(getLabelJson(_label, feature));

                        break;
                    }
                }
                styles.push(new ol.style.Style(_styleJson));
            }
        }
        return styles;
    } else {
        return null;
    }
}

4、圖層呼叫程式碼

var gridsetName = 'EPSG:900913';
var gridNames = ['EPSG:900913:0', 'EPSG:900913:1', 'EPSG:900913:2', 'EPSG:900913:3', 'EPSG:900913:4', 'EPSG:900913:5', 'EPSG:900913:6', 'EPSG:900913:7', 'EPSG:900913:8', 'EPSG:900913:9', 'EPSG:900913:10', 'EPSG:900913:11', 'EPSG:900913:12', 'EPSG:900913:13', 'EPSG:900913:14', 'EPSG:900913:15', 'EPSG:900913:16', 'EPSG:900913:17', 'EPSG:900913:18', 'EPSG:900913:19', 'EPSG:900913:20', 'EPSG:900913:21', 'EPSG:900913:22', 'EPSG:900913:23', 'EPSG:900913:24', 'EPSG:900913:25', 'EPSG:900913:26', 'EPSG:900913:27', 'EPSG:900913:28', 'EPSG:900913:29', 'EPSG:900913:30'];
var baseUrl = 'http://localhost:6080/geoserver/gwc/service/wmts';
var style = '';
var format = 'application/x-protobuf;type=mapbox-vector';
var layerName = 'layer_china';
var projection = new ol.proj.Projection({
    code: 'EPSG:900913',
    units: 'm',
    axisOrientation: 'neu'
});
var resolutions = [156543.03390625, 78271.516953125, 39135.7584765625, 19567.87923828125, 9783.939619140625, 4891.9698095703125, 2445.9849047851562, 1222.9924523925781, 611.4962261962891, 305.74811309814453, 152.87405654907226, 76.43702827453613, 38.218514137268066, 19.109257068634033, 9.554628534317017, 4.777314267158508, 2.388657133579254, 1.194328566789627, 0.5971642833948135, 0.29858214169740677, 0.14929107084870338, 0.07464553542435169, 0.037322767712175846, 0.018661383856087923, 0.009330691928043961, 0.004665345964021981, 0.0023326729820109904, 0.0011663364910054952, 5.831682455027476E-4, 2.915841227513738E-4, 1.457920613756869E-4];
params = {
    'REQUEST': 'GetTile',
    'SERVICE': 'WMTS',
    'VERSION': '1.0.0',
    'LAYER': layerName,
    'STYLE': style,
    'TILEMATRIX': gridsetName + ':{z}',
    'TILEMATRIXSET': gridsetName,
    'FORMAT': format,
    'TILECOL': '{x}',
    'TILEROW': '{y}'
};

function constructSource() {
    var url = baseUrl + '?'
    for (var param in params) {
        url = url + param + '=' + params[param] + '&';
    }
    url = url.slice(0, -1);

    var source = new ol.source.VectorTile({
        url: url,
        format: new ol.format.MVT({}),
        projection: projection,
        tileGrid: new ol.tilegrid.WMTS({
            tileSize: [256, 256],
            origin: [ - 2.003750834E7, 2.003750834E7],
            resolutions: resolutions,
            matrixIds: gridNames
        })
    });
    return source;
}

var layer = new ol.layer.VectorTile({
    source: constructSource(),
    renderMode: "hybrid",
    declutter: true,
    style: styleFunction
});
型別 內容
qq 1004740957
公眾號 lzugis15
e-mail [email protected]
webgis群 452117357
Android群 337469080
GIS資料視覺化群 458292378

“GIS講堂”知識星球開通了,在星球,我將提供一對一的問答服務,你問我答,期待與你相見。
知識星球二維碼

LZUGIS

相關推薦

ol4載入pbf向量切片樣式定義

概述 看了一下mapbox的向量切片的展示方式,其核心是定義的一個樣式配置檔案,我就在想:Ol4裡面我是否通過styleFunction的方式實現同樣的效果呢,折騰了一上午,別說,styleFunction真好用,在此分享出來,供大家參看。 mapbox

Cesium載入MBTiles向量切片

MBTiles 是由 MapBox 制定的一種將瓦片地圖資料儲存到SQLite資料庫中並可快速使用,管理和分享的規範。該規範由MapBox制定,詳見http://mapbox.com/mbtiles-spec/。 透過資料庫索引的方式提高瓦片索引的效率,比通過瓦

【轉】WPF自定義控制元件樣式(11)-等待/忙/正在載入狀態-控制元件實現

一.前言   申明:WPF自定義控制元件與樣式是一個系列文章,前後是有些關聯的,但大多是按照由簡到繁的順序逐步釋出的等。   本文主要有三種實現方式: 簡單忙碌狀態控制元件BusyBox; Win8/win10效果忙碌狀態控制元件ProgressRing; 彈出非同步等待框WaitingB

H5自定義video功能樣式處理

H5的video非常簡單,方便,有時我們可能需要自己來設定樣式。這是一個自定義的video,自定義的話我們需要對功能進行一些處理,這裡常用的功能幾乎是都用到了,第一次練習程式碼很累贅,之後會慢慢改進。 常用的一些 video API "視訊地址":video.currentSrc; "視訊總時長":v

【轉】WPF自定義控制元件樣式(3)-TextBox & RichTextBox & PasswordBox樣式、水印、Label標籤、功能擴充套件

一.前言.預覽   申明:WPF自定義控制元件與樣式是一個系列文章,前後是有些關聯的,但大多是按照由簡到繁的順序逐步釋出的等。 本文主要是對文字輸入控制元件進行樣式開發,及相關擴充套件功能開發,主要內容包括: 基本文字框TextBox控制元件樣式及擴充套件功能,實現了樣式、水印、Label標籤、功

【轉】WPF自定義控制元件樣式(5)-Calendar/DatePicker日期控制元件自定義樣式及擴充套件

一.前言   申明:WPF自定義控制元件與樣式是一個系列文章,前後是有些關聯的,但大多是按照由簡到繁的順序逐步釋出的等。 本文主要內容: 日曆控制元件Calendar自定義樣式; 日期控制元件DatePicker自定義樣式,及Label標籤、水印、清除日期功能擴充套件; 二.Calend

【轉】WPF自定義控制元件樣式(9)-樹控制元件TreeView選單Menu-ContextMenu

一.前言   申明:WPF自定義控制元件與樣式是一個系列文章,前後是有些關聯的,但大多是按照由簡到繁的順序逐步釋出的等。   本文主要內容: 選單Menu的自定義樣式; 右鍵選單ContextMenu的自定義樣式; 樹控制元件TreeView的自定義樣式,及右鍵選單實現。 二.選單M

【轉】WPF自定義控制元件樣式(8)-ComboBox定義多選控制元件MultComboBox

一.前言   申明:WPF自定義控制元件與樣式是一個系列文章,前後是有些關聯的,但大多是按照由簡到繁的順序逐步釋出的等。   本文主要內容: 下拉選擇控制元件ComboBox的自定義樣式及擴充套件; 自定義多選控制元件MultiComboBox; 二.下拉選擇控制元件ComboBox的自

【轉】WPF自定義控制元件樣式(12)-縮圖ThumbnailImage /gif動畫圖/圖片列表

一.前言   申明:WPF自定義控制元件與樣式是一個系列文章,前後是有些關聯的,但大多是按照由簡到繁的順序逐步釋出的等,若有不明白的地方可以參考本系列前面的文章,文末附有部分文章連結。   本文主要針對WPF專案開發中圖片的各種使用問題,經過總結,把一些經驗分享一下。內容包括: WPF常

【轉】WPF自定義控制元件樣式(13)-自定義窗體Window & 自適應內容大小訊息框MessageBox

一.前言   申明:WPF自定義控制元件與樣式是一個系列文章,前後是有些關聯的,但大多是按照由簡到繁的順序逐步釋出的等。   本文主要內容: 自定義Window窗體樣式; 基於自定義窗體實現自定義MessageBox訊息提示框; 二.自定義Window窗體樣式   自定義的Window

樣式主題定義View 淺談

樣式主題與自定義View 樣式和主題資源都是用於對Android應用進行美化的。 一、樣式: (一)、介紹: 1、概念:Android中的樣式和CSS樣式作用相似,都是用於為介面元素定義顯示風格,它是包含一個或者多個view控制元件屬性的集合。如:需要定義字型

專案角度談向量切片運用以及Geoserver處理自定義規格向量切片方案

1. 背景 向量切圖方案目前已經是很常見的一個方案,在2016年時團隊基於Sharpmap開發了支援不同座標系、不同切圖引數、任意向量資料(點、線、面)的工具。也著手開發了支援向量切圖瀏覽器前端配圖的工具。在當時研究之前,也寫過一篇初步研究的文章:WebGIS中向量切圖的初步研究(http://www.cn

python下word2vec詞向量訓練載入方法

專案中要對短文字進行相似度估計,word2vec是一個很火的工具。本文就word2vec的訓練以及載入進行了總結。word2vec的原理就不描述了,word2vec詞向量工具是由google開發的,輸入為文字文件,輸出為基於這個文字文件的語料庫訓練得到的詞向量模型。通過該模型

UITabBar和UINavigation組合使用定義樣式(iOS)

UITabBarController和UINavigationController組合使用與自定義樣式(iOS)環境版本:mac 10.10 / ios7+ / xcode 6.3大部分APP的介面框架都需要UITabBarController和UINavigationCon

openlayer載入向量切片

資料是GIS的靈魂,沒有資料也就談不上GIS了,資料分為向量資料和柵格資料,柵格資料也有一些短處,缺乏靈活性、實時性,資料完整性受損是比較突出的問題,向量資料不同於柵格資料,比較靈活,資料完整,將兩者結合誕生出—>向量切片,不要被向量這個詞迷惑,向量切片是不可被編輯的

layer 彈出框定義樣式

1 匯入layer.js2 匯入自定義的layer.css @charset "utf-8";body .p_window {border: none; font-size: 12px; font-family: "Microsoft Yahei", sans-serif;}

WPF自定義控制元件樣式:ScrollViewerListBox自定義樣式

一.前言   申明:WPF自定義控制元件與樣式是一個系列文章,前後是有些關聯的,但大多是按照由簡到繁的順序逐步釋出的等,若有不明白的地方可以參考本系列前面的文章,文末附有部分文章連結。 本文主要內容: ScrollViewer的樣式拆解及基本樣式定義

設計網頁錄入信息自己定義server數據接收

dex 網絡 小結 win tar enter doctype iss flash 需求:設計一個註冊網頁用於錄入username和登錄password。並將數據傳入server並顯示出來。 1、前言:網頁提交的 get 和 post 兩種方式。   (1)對於get提

python/Djangof分頁定義分頁

from r+ else active count() 返回 log 多少 pan python/Djangof分頁與自定義分頁 Django分頁 1 ##============================================分頁========

thinkphp 條件查詢 模糊查詢 區間查詢 in 查詢 定義查詢

thinkphp eq => ‘=‘ $map[‘id‘]= array(‘eq‘,‘2‘); neq => ‘<>‘ $map[‘id‘]=array(‘neq‘,2); gt => ‘>‘ $map[‘id‘]=array(‘gt‘,3); egt => ‘>