delphi bmp繪制矢量文件效率慢_聊一聊矢量瓦片的常識

一、矢量瓦片的基本原理和相關格式

現階段,電子地圖瓦片主要使用兩種方式,一種是傳統的柵格瓦片,另外一種是新出的矢量瓦片(Vector Tiles),前者是采用四叉樹金字塔模型的分級方式,將地圖切割成無數大小相等的矩形柵格圖片,由這些矩形柵格圖片按照一定規則拼接成不同層級的地圖顯示。

矢量瓦片類似柵格瓦片,是將矢量數據用多層次模型分割成矢量要素描述文件存儲在服務器端,再到客戶端根據指定樣式進行渲染繪制地圖,在單個矢量瓦片上存儲著投影于一個矩形區域內的幾何信息和屬性信息。當客戶端通過分布式網絡獲取矢量瓦片、地圖標注字體、圖標、樣式文件等數據后,最終在客戶端進行渲染輸出地圖。

矢量瓦片沒有統一數據標注,mapbox基于Google protocol buffers制定了MAPBOX CECTOR TILE SPECIFICATION通用的矢量瓦片數據標準,被許多公司和組織采用。

矢量瓦片數據組織分成兩層,一層是地圖表達范圍內的瓦片數據集組織模型,另一層是單個瓦片內要素的組織模型。

矢量瓦片數據集的組織模型類似柵格瓦片金字塔模型,包含坐標系、投影方式、瓦片編號已實現任意精度、空間位置與矢量瓦片的對應關系,并被柵格瓦片規范相互兼容,這樣方便將矢量瓦片轉換成柵格瓦片,畢竟兩者采用相似的投影方式和瓦片編號方式。

單個瓦片要素的組織模型將幾何信息和屬性信息分開存儲,幾何信息主要包括點、線、面和未知要素類,元數據信息包含了圖層屬性和要素屬性。

用于描述矢量瓦片屬性信息和幾何信息的文件格式主要有GML/Cesium Vector Tiles/GeoJson(.json)/TopoJSON(.topjson)/Google Protocol Buffers(PBF),其中GeoJSON是一種基于Javascript對象表示法的地理空間信息數據交換格式,通用性強,易讀取,幾乎所有的GIS引擎都支持該格式的動態渲染電子地圖數據,但該格式還是容易有信息冗余的情況。TopoJSON是在GeoJSON上共享幾何要素拓撲編碼,減少冗余信息的數據格式,但它的讀取性較差,支持該格式的軟件不多,所有每次讀取需要使用專門的工具進行轉換才可以,支持該格式的軟件有著名的Web三維軟件Cesium JS(該產品是有AGI公司開發的一款開源三維地圖的JS庫,主要是可以用于時空數據領域的一些三維開發,它在github上已經有6.2K個star了,github地址如下:https://github.com/CesiumGS/cesium),PBF是一種更高效輕便的結構化數據存儲格式,將矢量瓦片數據打包成矢量瓦片包可以便于網絡傳輸和數據庫存儲,常見的矢量瓦片有VTPK格式(用于ArcGIS)、MBTiles格式(用于SQLite數據庫存儲)等。

雖然矢量瓦片也采用金字塔的方式進行存儲數據,但是由于其默認網格數較高,以PBF為例,單個矢量瓦片的網格是4096*4096,所以在視網膜屏等設備上也顯示地很清楚,而不會出現鋸齒,同時這個網格數可以隨時進行修改調整,以更精確的方式來記錄幾何位置信息從而適應不同屏幕的要求。同時,在矢量瓦片中,會將其幾何信息轉換成指令集表達,再將指令存儲到32位無符號整數進行存儲。而在存儲屬性信息時,則是以不同的形式表示,geojson直接標注,PBF則是用索引號進行標注。

矢量瓦片之所以能夠在客戶端進行快速渲染,主要得益于客戶端圖形渲染技術的發展,推動了地圖渲染引擎的快速發展,常見的圖形渲染技術有OpenGL/WebGL等,而OpenGL和WebGL是底層3D繪圖技術標注,根據這些標準衍生出了許多地圖渲染引擎,例如使用OpenGL 圖形API的開源3D渲染引擎Tangram(包括用于瀏覽器渲染引擎Tangram-JS和移動終端渲染引擎Tangram-ES,該產品有mapzen開源提供,github地址為https://github.com/tangrams/tangram,具有1.7K個star)、Mapbox使用的Mapbox GL地圖渲染引擎(包含瀏覽器渲染引擎Mapbox GL JS和移動端渲染引擎Mapbox GL Native,github地址為https://github.com/mapbox/mapbox-gl-js ,具有6.4k個star)。

矢量瓦片所使用的樣式文件是用來在客戶端定義繪制地圖數據源、繪制順序和繪制樣式等規則的文件,比如Mapbox使用的json樣式文件可以讓用戶利用Mapbox GL JS地圖引擎實時渲染出互動性強的3D場景地圖。

二、矢量瓦片和柵格瓦片的優劣勢

使用矢量瓦片地圖來提供地圖比柵格瓦片地圖有更好的顯示效果,互動性也強,實現二三維一體化,更新速度快,地圖樣式快速切換,占用空間少,無極縮放顯示等特點。

其中占用空間少是和柵格瓦片進行的對比,傳統的柵格瓦片每一張瓦片大小在十幾KB左右,雖然看上去每張瓦片的大小不大,但是若放到全國或世界范圍內來看的,需要的瓦片數據量極大,按照四叉樹金字塔切割的柵格瓦片的上一級的某張瓦片可以切割成下一級的四張瓦片,因此,瓦片的總量也是極快的增加,甚至最終所需存儲空間可以達到TB級別,而矢量瓦片就相對小很對,以全國數據的切圖來看,最終所需的切圖所需存儲空間也僅需要GB級別的就可以了。同時,由于矢量瓦片的渲染是在客戶端進行的,它僅需要將請求到的數據按照樣式文件進行渲染即可,這讓矢量瓦片在不改變切圖比例與地圖內容的情況下,可以很快的調整地圖樣式,而不用為調整地圖樣式而重新進行切圖,并且矢量瓦片和柵格瓦片雖然都需要對矢量數據進行切圖預處理,但實際上由于矢量瓦片切圖僅是針對幾何信息和屬性信息進行分層處理,所以它相對于柵格瓦片需要對圖像分割來說速度要快很對,全國數據的柵格切圖工作基本上是以周為單位的處理,而矢量瓦片可能僅需幾天時間,這對于某些需要快速處理的項目來說具有先天優勢,簡單的將矢量瓦片和柵格瓦片的優劣勢進行比較后,可以得到以下表格內容:

瓦片形式優勢劣勢
矢量瓦片瓦片占用空間低,瓦片切圖效率高,渲染地圖效果快,可以隨時動態調整地圖樣式,地圖分辨率高。對客戶端性能要求比較高,對舊設備兼容性存在問題。
柵格瓦片瓦片提前渲染,對客戶端性能要求低,性能穩定。瓦片占用空間高,瓦片切圖效率低,無法隨時動態調整地圖樣式,地圖分辨率低,加載速度比較慢。

鑒于矢量瓦片的優勢以及各方面的考慮,現在大部分互聯網地圖服務提供商都開始在其網站上提供的地圖服務換成矢量瓦片進行地圖展示,這里面就包括百度地圖、高德地圖、騰訊地圖、谷歌地圖等,但是依然會有不少互聯網地圖服務提供商依據在提供柵格瓦片地圖,這里有搜狗地圖、Bing Map、天地圖·北京等。(以上信息是截止本次文章撰寫時統計的,不排除后來存在變動。)

三、矢量瓦片切片的主要技術流程

雖有現在矢量瓦片已經逐步成為一張地圖瓦片的主流方式,但是各大廠商的切片工具和運行環境卻還是各不相同,常用的矢量瓦片切片工具有Mapbox的Mapbox Studio和Tippecanoe(前者需要訪問Mapbox的在線服務,后者為Mapbox的開源產品)、OGC的開源產品GeoServer、Esri的ArcGIS Pro、Osgeo的開源產品MapServer等,這些工具都可以對矢量數據按照矢量瓦片要求進行切圖,雖然這些工具不一致,但它們都需要遵循矢量四叉書金字塔模型的原理,將矢量數據發布成各自格式的矢量瓦片數據包,同時,它們的主要技術方法是一致,基本按照以下流程進行:

①獲取矢量數據;

1.1、獲取矢量文件(.shp/.tab等);

1.2、矢量數據入庫形成矢量數據表格;

②矢量瓦片制作;

2.1、獲取切圖范圍、切圖方式、切圖等級等信息,確保切片后能滿足使用;

2.2、獲取多層矢量瓦片數據表;

2.3、將矢量瓦片文件(Geojson/Topojson/PBF等)放入到不同圖層下;

③服務發布與展示

3.1、以服務的形式將矢量瓦片發布出來,并提供給客戶端;

3.2、客戶端按照一定調用規則調用矢量瓦片服務,并按照樣式文件進行前端渲染展示。

b76b58680d5146514fc86ef966987b3b.png

矢量瓦片切片的主要技術流程

基本上大部分的切片工具都是按照這一流程對矢量數據進行的切片工作,即使是不同的廠商和切片工具,只需要按照類似過程進行處理即可完成切片工作,另外在2018年,OGC也參與到矢量瓦片這一技術的研究中,驗證了相關信息, 并形成了相關報告,詳見https://www.ogc.org/projects/initiatives/vt-pilot-2018 。

另外,不同切片工具按照不同的切片方案產生的矢量瓦片數據占用存儲大小也不一致,主要原因是在于其保留的矢量瓦片的屬性信息不同導致的,在瓦片幾何信息一致的情況下,切片方案內制定的矢量瓦片屬性信息規則不一樣,其最終產生的矢量瓦片規則也會存在差異,這種差異最終影響的不僅僅是矢量瓦片占用的存儲空間,也會影響切片工具在進行切圖工作所需要耗費的時間上,例如ArcGIS Pro在進行切片是會按照一定抽稀策略來對矢量數據的屬性信息進行抽稀,僅保留有用的屬性信息,而使用GeoServer的切片工具則會保留全部的屬性信息,這就導致兩種最終切片的存儲空間的巨大差異,例如一個城市的地圖,用ArcGIS Pro切片會有幾百MB的矢量瓦片包,而用GeoServer則會需要幾百GB的矢量瓦片包,因此在使用不同切片工具生產矢量瓦片的時候需要考慮到這些內容。

四、跨平臺調用矢量瓦片數據

由于矢量瓦片沒有統一標準,因此我們在互聯網上常見的使用矢量瓦片的互聯網地圖在制作矢量瓦片的時候只需要遵循矢量四叉樹金字塔模型的原理即可,因此,高德地圖、百度地圖等互聯網地圖提供商在使用矢量瓦片的時候紛紛按照自己的矢量瓦片原則進行地圖切片,這就導致了你在使用它的地圖瓦片時,必須按照它制定的規則進行渲染才能將地圖顯示出來,那么不同切圖工具切出來的矢量瓦片是否夠相互調用了,答案是肯定的,但是你在調用它的瓦片時還是需要遵守它的切圖規則來進行。

跨平臺調用的時候,可以通過架設一套微服務來將請求的矢量瓦片數據規格轉成被請求的矢量瓦片數據規格,通過微服務將客戶端的請求進行重新編碼后發送至服務器端進行請求,再將服務器端的返回的數據按照客戶端的請求規格再次進行編碼后返回給客戶端進行渲染展現。

05ebf7134f0f1b5eadbd14a8a76e9a37.png

跨平臺調用矢量瓦片數據示意圖

具體如何實現跨越參考不同平臺的的開發文檔進行設置,這里就不在細聊了,再聊下去就不是常識了。

另外附上一些可以參考的開發文檔的訪問鏈接:

①GeoServer開發文檔:https://docs.geoserver.org/

②MapServer開發文檔:https://www.osgeo.cn/mapserver/documentation.html

③tippecanoe開發文檔:https://github.com/mapbox/tippecanoe

④Mapbox GL JS開發文檔:https://docs.mapbox.com/mapbox-gl-js/api/

⑤Mapbox Vector Tiles API 開發文檔:https://docs.mapbox.com/api/maps/#vector-tiles

⑥ArcGIS Pro快速入門教程:https://pro.arcgis.com/zh-cn/pro-app/get-started/introducing-arcgis-pro.htm

⑦Cesium開發手冊:https://cesium.com/docs/

參考文獻:

[1]胡振彪, 趙軍, 韓磊,等. 矢量電子地圖瓦片制作性能評估與應用[J]. 測繪科學, 2020, v.45;No.260(02):142-148+169.

[2]翁世杰, 朱雪堅, 黃婷,等. 基于Mapbox矢量切片在線配圖平臺的設計與實現[J]. 地理信息世界, 2018, v.25;No.130(04):72-76.

[3]陳舉平,丁建勛.矢量瓦片地圖關鍵技術研究[J].地理空間信息,2017,15(08):44-47+10.

[4]ESCAGE.【GISER && Painter】矢量切片(Vector tile)[EB/OL].https://www.cnblogs.com/escage/p/6387529.html,2017-02-13.

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

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

相關文章

python生成器與迭代器。

生成器 在python 中一邊循環一邊計算的機制,叫做生成器(generator)。 通過列表生成式,我們可以直接創建一個列表。但是,收到內存的限制,列表容量肯定是有限的。而且,創建一個包含100萬個元素的列表,不僅占用…

centos mysql 設置_CentOS下MySQL安裝后配置和設置-阿里云開發者社區

CentOS下MySQL安裝后配置和設置:1:安裝完成路徑:1、數據庫目錄/var/lib/mysql/2、配置文件/usr/share/mysql(mysql.server命令及配置文件)3、啟動腳本/etc/rc.d/init.d/(啟動腳本文件mysql的目錄)4、相關命令/usr/bin(mysqladmin mysqldump等命令)注:1~3…

python怎樣將list轉化成字典_在python 中如何將 list 轉化成 dictionary

原標題:在python 中如何將 list 轉化成 dictionary 問題1:如何將一個list轉化成一個dictionary? 問題描述:比如在python中我有一個如下的list,其中奇數位置對應字典的key,偶數位置為相應的value解決方案: 1…

vscode gcc debug dbg gdb c cpp c++ cuckoo monitor

為什么80%的碼農都做不了架構師?>>> 裝cygwin 或者mingGW,裝gcc工具鏈,并將cygwin的bin目錄加入環境變量PATH中。 ctrlshiftb {// See https://go.microsoft.com/fwlink/?LinkId733558// for the documentation about the tasks…

hive索引

創建 hive (zmgdb)> create index index_t1 on table v_t1(name) > as > org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler > with > deferred rebuild in table save_index_t1_table; OK Time …

python爬取知網論文關鍵詞_Python爬蟲根據關鍵詞爬取知網論文摘要并保存到數據庫中...

由于實驗室需要一些語料做研究,語料要求是知網上的論文摘要,但是目前最新版的知網爬起來有些麻煩,所以我利用的是知網的另外一個搜索接口 搜索出來的結果和知網上的結果幾乎一樣 在這個基礎上,我簡單看了些網頁的結構,…

網頁中查看pdf文檔

2019獨角獸企業重金招聘Python工程師標準>>> 介紹&#xff1a; PDFObject 是一個 JavaScript 庫&#xff0c;用來在HTML中動態嵌入 PDF 文檔。 實現代碼&#xff1a; <script type"text/javascript" src"pdfobject.js"></script>…

導入導出數據

導入數據 從文件中裝載數據 hive>LOAD DATA [LOCAL] INPATH ... [OVERWRITE] INTO TABLE t2 [PARTITION (provincebeijing)]; LOCAL&#xff1a;linux本地的文件。無LOCAL&#xff1a;是hdfs的文件 注意&#xff1a; 從本地文件系統中將數據導入到Hive表的過程中&#xf…

python opencv 讀取視頻流不解碼_python + opencv: 解決不能讀取視頻的問題

博主一開始使用python2.7和Opencv2.4.10來獲取攝像頭圖像&#xff0c;程序如下&#xff1a; cap cv2.VideoCapture(0) ret, frame cap.read()使用這個程序能夠打開攝像頭并獲取圖像&#xff0c;一切正常。 接著想使用OpenCv播放視頻&#xff0c;按照官方教程只要將VideoCaptu…

jmeter提取mysql返回值_jmeter連接數據庫和提取數據庫返回值

一、在MySQL命令行中&#xff0c;驗證MySQL是否能正常登陸。若不能登陸&#xff0c;則重置MySQL的密碼。二、下載mysql-connector-java-5.1.45-bin.jar&#xff0c;將其放入Jmeter安裝目錄的lib目錄下。完成MySQL數據庫的驅動。三、右鍵“線程組”->“配置元件”->“JDBC…

[轉] Lodash

與underscore 類似 &#xff0c; 是1個js庫&#xff0c;內部封裝了諸多對字符串、數組、對象等常見數據類型的處理函數。 模塊組成 Lodash 提供的輔助函數主要分為以下幾類&#xff0c;函數列表和用法實例請查看 Lodash 的官方文檔&#xff1a; Array&#xff0c;適用于數組類型…

讀模式與寫模式

RDBMS是寫模式 Hive是讀模式 我們傳統的關系型數據庫RDBMS是寫模式。在RDBMS里&#xff0c;我們對表進行數據操作時候&#xff0c;RDBMS會用數據庫的第一第二第三范式去檢查數據的規范性&#xff0c;如果不符合規范&#xff0c;數據庫就拒絕數據的加載和操作。這個驗證過程消耗…

用python畫雨滴_Python編程從入門到實踐練習(雨滴)

雨滴&#xff1a;尋找一幅雨滴圖像&#xff0c;并創建一系列整齊排列的雨滴。讓這些雨滴往下落&#xff0c;直到到達屏幕后消失。 先說今天的問題&#xff1a; 1.在更改函數形參時&#xff0c;調用的時候也要修改&#xff0c;否則會出現AttributeError 值得注意的是&#xff1a…

python你是否也走進了這個誤區了_Python是不是被嚴重高估了?

是python被曲解了python有非常強的局限性&#xff0c;那就是只適合在io和網絡或其他整合組件上耗費大量時間的快速迭代跨平臺需求&#xff0c;比如爬蟲和下載快速迭代才能顯示出python作為腳本語言不用編譯的優勢&#xff0c;而io和網絡的大量時間消耗才能掩蓋python本身糟糕透…

Hive文件格式

Hive有四種文件格式&#xff1a;TextFile&#xff0c;SequenceFile&#xff0c;RCFile&#xff0c;ORC TextFile 默認的格式&#xff0c;文本格式。 SequenceFile 簡介 見&#xff1a;http://blog.csdn.net/zengmingen/article/details/52242768 操作 hive (zmgdb)>cre…

learnpythonthehardway下載_Python【十一】:階段小結

今天來將前一段時間學習的Python的知識系統地梳理一遍&#xff0c;接下來開始實際的編程實踐了。 一、Python實驗環境搭建 使用Python編程&#xff0c;首先要有一個開發環境&#xff0c;如同C/C上又VS2008家族一樣&#xff0c;Linux/MacOS上的部署情況這里不再詳述&#xff0c;…

python使用ssh 中文_Python3制作簡易SSH登錄工具

下載W3Cschool手機App&#xff0c;0基礎隨時隨地學編程>>戳此了解導語做這個的起因大概是&#xff1a;電腦里的Xshell不知道為啥突然顯示“評估期已過”之類的提示。。。記得之前認證學校郵箱后是可以免費使用的。。。蒼天繞過誰。。。想起上次認證學校郵箱過了N個小時才…

hive java導入CVS

原文&#xff1a;http://bbs.chinahadoop.cn/thread-5343-1-1.html ---------------------------------------------------------------------------------- 本文的目的是hive讀取cvs文件&#xff0c;忽略字段中‘\,’&#xff0c;最終還是以,來分割文本 cvs格式是以逗號,隔開…

Django 博客教程(三):創建應用和編寫數據庫模型

創建 django 博客應用 在上一章節中我們創建了 django 博客的工程&#xff0c;并且成功地運行了它。然而這一切都是 django 為我們創建的項目初始內容&#xff0c;django 不可能為我們初始化生成我們需要的博客代碼&#xff0c;這些功能性代碼都得由我們自己編寫。 django 鼓勵…