Openlayers:海量圖形渲染之WebGL渲染

最近由于在工作中涉及到了海量圖形渲染的問題,因此我開始研究相關的解決方案。我在網絡上尋找相關的解決方案時發現許多的文章都提到利用Openlayers中的WebGLPointsLayer類,可以實現渲染海量的點,之后我又了解到利用WebGLVectorLayer類可以渲染其它的圖形。經過測試我發現利用WebGL圖層真的可以簡單方案實現對海量圖形的渲染,但是其對ol版本有很高的要求。

一、WebGL渲染的現狀

1.版本要求高

在使用的過程中我發現,WebGLPointsLayerWebGLVectorLayer屬于是最新的實驗性的API,它們對ol版本的要求很高(我一開始使用的10.1.0的ol當中居然都沒有WebGLVectorLayer類,我升級到最新的10.5.0版本后才可以使用)。

WebGLVectorLayer需要至少10.3.0的版本才能使用。

2.缺乏參考資料

目前我再官方的API文檔中搜索WebGLPointsLayerWebGLVectorLayer均無相關的API介紹。

想要了解它們的使用方式我推薦參考以下的幾個官方示例:

  1. Icon Sprites with WebGL
  2. WebGL Vector Layer
  3. WebGL points layer

3.謹慎使用WebGL矢量圖層

總的來說WebGL矢量圖層是一種十分方便快捷的解決海量圖形渲染問題的方案,我個人感覺這種WebGL渲染也應該是Openlayers未來的一個更新方向。

但是目前這些接口并不穩定未來可能會發生變化,并且目前恐怕也很少有項目會去使用最新版本的ol,因此不推薦在生產項目中使用這種方案來解決海量圖形渲染問題。

二、使用WebGLPointsLayer渲染點

在下面的示例中我隨機生成了10w個點并通過WebGLPointsLayer渲染到了地圖中。

webgl渲染10w點

/***@abstract 生成當前地圖范圍內的隨機點數據* @param {*} map* @param {number} count 點數量* @returns*/
export const randomPointFeature = (map, count) => {const point = turf.randomPoint(count, {bbox: map.getView().calculateExtent(map.getSize()),});const features = new GeoJSON().readFeatures(point);return features;
};

import { Vector as VectorSource } from "ol/source";
import WebGLPointsLayer from "ol/layer/WebGLPoints";function addRiver_webgl_point() {//生成10w+點const features = randomPointFeature(window.map, 100000);const pointSource = new VectorSource({features,});let style = {"circle-radius": 3,"circle-fill-color": "red",};const pointLayer = new WebGLPointsLayer({source: pointSource,style,});window.map.addLayer(pointLayer);Message.success("10w+點添加成功!");
}

三、使用WebGLVectorLayer渲染圖形

WebGLPointsLayer圖層只能添加點要素,如果要添加線或面要素則需要使用WebGLVectorLayer圖層,下面的示例中我展示了使用WebGLVectorLayer圖層向地圖中渲染了一個由20w+的多邊形組成的河流三角網。

webgl渲染河流三角網

import WebGLVectorLayer from "ol/layer/WebGLVector.js";
import { Vector as VectorSource } from "ol/source";
import GeoJSON from "ol/format/GeoJSON.js";// 河流三角網數據
import riverGrid from "@/assets/geojson/LDJ.json";function addRiver_webgl() {// 讀取GeoJSON數據const riverMeshFeatures = new GeoJSON().readFeatures(riverGrid, {dataProjection: "EPSG:4547",featureProjection: "EPSG:4326",});const riverSource = new VectorSource({features: riverMeshFeatures,});const style = {"stroke-color": ["*", ["get", "COLOR"], [220, 0, 0]],"stroke-width": 4.5,"fill-color": ["*", ["get", "COLOR"], [255, 255, 255, 0.3]],};const riverLayer = new WebGLVectorLayer({source: riverSource,style,});window.map.addLayer(riverLayer);Message.success("河流三角網添加成功!");
}

四、flat樣式

使用WebGL渲染矢量圖形的流程非常簡單,基本上就是創建一個矢量數據源,然后在將其添加到WebGL矢量圖層中。

我個人感覺其中唯一的難點就是“給圖層設置樣式”,WebGL圖層不能使用Style類來設置樣式(如果用了會報錯),需要使用 flat樣式。

// ? 錯誤的樣式設置方式
const style = new Style({image: new CircleStyle({radius: 5,fill: new Fill({color: "rgba(255, 0, 0, 0.5)",}),stroke: new Stroke({color: "#333",width: 1,}),}),
});// ? 正確的樣式設置方式
let style = {"circle-radius": 3,"circle-fill-color": "red",
};

我也是第一次接觸到 flat樣式 (感覺有種既視感,似乎在哪里見過類似的東西 mapbox?),之后有時間我會好好研究一下。

參考資料

  1. 259:vue+openlayers: 顯示海量多邊形數據,10ms加載完成_webglvectorlayerrenderer-CSDN博客
  2. OpenLayers教程11_在OpenLayers中啟用WebGL渲染_openlayers webgl-CSDN博客
  3. Icon Sprites with WebGL
  4. WebGL Vector Layer
  5. WebGL points layer

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/76227.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/76227.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/76227.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

替換jeecg圖標

替換jeecg圖標 ant-design-vue-jeecg/src/components/tools/Logo.vue <!-- <img v-else src"~/assets/logo.svg" alt"logo">-->

Codeforces Round 970 (Div. 3)題解

題目地址 https://codeforces.com/contest/2008 銳評 本次D3的前四題還是比較簡單的&#xff0c;沒啥難度區分&#xff0c;基本上差不多&#xff0c;屬于手速題。E的碼量比F大一些&#xff0c;實現略顯復雜一些。G的數學思維較明顯&#xff0c;如果很久沒有訓練這個知識點&a…

操作系統:線程間同步之事件集

事件集是線程間同步的機制之一&#xff0c;一個事件集可以包含多個事件&#xff0c;利用事件集可以完成一對多、多對多的線程間同步。 目錄 一、事件集舉例說明 二、事件集工作機制 三、RT-Thread為實例說明 四、事件集的應用場合 一、事件集舉例說明 以坐公交車為例&…

基于springboot鉆孔數據管理系統的設計與實現(源碼+lw+部署文檔+講解),源碼可白嫖!

摘要 本鉆孔數據管理系統采用B/S架構&#xff0c;數據庫是MySQL&#xff0c;網站的搭建與開發采用了先進的Java語言、Hadoop、數據可視化技術進行編寫&#xff0c;使用了Spring Boot框架。該系統從兩個對象&#xff1a;由管理員和用戶來對系統進行設計構建。用戶主要功能包括&…

全雙工分軌語音數據集:讓AI實現無縫對話

清晨&#xff0c;智能音箱根據指令-播放音樂&#xff1b;駕駛途中&#xff0c;車載助手同步處理導航與來電&#xff1b;智能會議工具無縫切換多語種對話……語音交互技術正快速融入生活。然而&#xff0c;用戶對于對話體驗追求更自然、更流暢&#xff0c;實時理解&#xff0c;動…

Python 網絡請求利器:requests 包詳解與實戰

諸神緘默不語-個人技術博文與視頻目錄 文章目錄 一、前言二、安裝方式三、基本使用1. 發起 GET 請求2. 發起 POST 請求 四、requests請求調用常用參數1. URL2. 數據data3. 請求頭 headers4. 參數 params5. 超時時間 timeout6. 文件上傳 file&#xff1a;上傳純文本文件流7. jso…

linux入門四:Linux 編譯器

一、C 語言編譯器 GCC&#xff1a;開啟編程之旅 1.1 GCC 安裝&#xff1a;一站式工具鏈 GCC&#xff08;GNU Compiler Collection&#xff09;是 Linux 下最常用的 C/C 編譯器&#xff0c;支持多種編程語言。安裝命令&#xff08;適用于 Debian/Ubuntu 系統&#xff09;&…

建筑兔零基礎自學記錄69|爬蟲Requests-2

Requests庫初步嘗試 #導入requests庫 import requests #requests.get讀取百度網頁 rrequests.get(http://www.baidu.com) #輸出讀取網頁狀態 print(r.status_code) #輸出網頁源代碼 print(r.text) HTTP 狀態碼是三位數字&#xff0c;用于表示 HTTP 請求的結果。常見的狀態碼有…

Web測試流程及注意點

在Web工程過程中&#xff0c;基于Web系統的測試、確認和驗收是一項重要而富有挑戰性的工作。基于Web的系統測試與傳統的軟件測試不同&#xff0c;它不但需要檢查和驗證是否按照設計的要求運行&#xff0c;而且還要測試系統在不同用戶的瀏覽器端的顯示是否合適。 重要的是&…

基于MATLAB/simulink的信號調制仿真--AM調制

實驗內容&#xff1a; 假設y(t)(20.5*2cos&#xff08;2*pi*1000*t&#xff09;)*5cos&#xff08;2*pi*2*1e4*t&#xff09;調幅系統&#xff0c;請將一個頻率為1000HZ的余弦波信號&#xff0c;通過進行AM調制&#xff0c;載波信號頻率為20kHZ的余弦波&#xff0c;調制度ma0.…

通信協議詳解(十):PSI5 —— 汽車安全傳感器的“抗干擾狙擊手”

一、PSI5是什么&#xff1f; 一句話秒懂 PSI5就像傳感器界的“防彈信使”&#xff1a;在汽車安全系統&#xff08;如氣囊&#xff09;中&#xff0c;用兩根線同時完成供電數據傳輸&#xff0c;即便車禍時線路受損&#xff0c;仍能確保關鍵信號準確送達&#xff01; 基礎概念…

數據結構與算法-圖論-復習1(單源最短路,全源最短路,最小生成樹)

1. 單源最短路 單一邊權 BFS 原理&#xff1a;由于邊權為單一值&#xff0c;可使用廣度優先搜索&#xff08;BFS&#xff09;來求解最短路。BFS 會逐層擴展節點&#xff0c;由于邊權相同&#xff0c;第一次到達某個節點時的路徑長度就是最短路徑長度。 用法&#xff1a;適用…

【WRF理論第十七期】單向/雙向嵌套機制(含namelist.input詳細介紹)

WRF運行的單向/雙向嵌套機制 準備工作&#xff1a;WRF運行的基本流程namelist.input的詳細設置&time_control 設置&domain 嵌套結構&bdy_control 配置部分 namelist 其他注意事項Registry.EM 運行 ARW 嵌套雙向嵌套&#xff08;two-way nesting&#xff09;單向嵌套…

怎么查看蘋果手機和ipad的設備信息和ios udid

你知道嗎&#xff1f;我們每天使用的iPhone和iPad&#xff0c;其實隱藏著大量詳細的硬件與系統信息。除了常見的系統版本和序列號外&#xff0c;甚至連電池序列號、攝像頭序列號、銷售地區、芯片型號等信息&#xff0c;也都可以輕松查到&#xff01; 如果你是開發者、維修工程…

matlab內置的git軟件版本管理功能

1、matlab多人協作開發比普通的嵌入式軟件開發困難很多 用過matlab的人都知道&#xff0c;版本管理對于matlab來說真的很費勁&#xff0c;今天介紹的這個工具也不是說它就解決了這個痛點&#xff0c;只是讓它變得簡單一點。版本管理肯定是不可或缺的&#xff0c;干就完了 2、…

vscode集成deepseek實現輔助編程(銀河麒麟系統)【詳細自用版】

針對開發者用戶&#xff0c;可在Visual Studio Code中接入DeepSeek&#xff0c;實現輔助編程。 可參考我往期文章在銀河麒麟系統環境下部署DeepSeek&#xff1a;基于銀河麒麟桌面&&服務器操作系統的 DeepSeek本地化部署方法【詳細自用版】 一、前期準備 &#xff08…

Java 大廠面試題 -- JVM 深度剖析:解鎖大廠 Offe 的核心密鑰

最近佳作推薦&#xff1a; Java大廠面試高頻考點&#xff5c;分布式系統JVM優化實戰全解析&#xff08;附真題&#xff09;&#xff08;New&#xff09; Java大廠面試題 – JVM 優化進階之路&#xff1a;從原理到實戰的深度剖析&#xff08;2&#xff09;&#xff08;New&#…

數據庫實踐題目:在線書店管理系統

完整的數據庫實踐題目&#xff1a;在線書店管理系統 數據庫表結構及示例數據 書籍表(books) CREATE TABLE books ( book_id INT PRIMARY KEY, title VARCHAR(100) NOT NULL, author VARCHAR(50) NOT NULL, publisher VARCHAR(50), publish_year INT, category VARCHAR(30), …

Linux 入門指令(1)

&#xff08;1&#xff09;ls指令 ls -l可以縮寫成 ll 同時一個ls可以加多個后綴 比如 ll -at (2)pwd指令 &#xff08;3&#xff09;cd指令 cd .是當前目錄 &#xff08;4&#xff09;touch指令 &#xff08;5&#xff09;mkdir指令 &#xff08;6&#xff09;rmdir和rm…

圖靈逆向——題七-千山鳥飛絕

目錄列表 過程分析headers頭部M參數分析載荷x參數分析響應數據解密分析 代碼實現 一進來還是一個無限debugger&#xff0c;前面有講怎么過&#xff0c;這里直接過掉~ 老規矩&#xff0c;養成習慣&#xff0c;先看請求頭里有沒有加密參數發現好像是有個M&#xff0c;它是個32位…