gismatthew
路人甲
路人甲
  • 注册日期2016-11-18
  • 发帖数5
  • QQ965258591
  • 铜币7枚
  • 威望3点
  • 贡献值0点
  • 银元0个
  • GIS帝国居民
阅读:2151回复:0

GIS共享與交流 2 (矢量切片)

楼主#
更多 发布于:2016-11-19 16:26
今天想和大家分享WebGIS中使用矢量切片的問題:


TL;DR

我使用的矢量切片發佈工具是tilelive-bridge。

「引子」大家應該在使用Google Map(GM)中留意到,GM加載時是用的柵格切片,數秒後會變為矢量切片。

我們在自己的iPhone上使用Google Map和Apple Map時,加載的也是矢量切片。


視覺上我們留意到矢量切片有如下特點:
- 精美的渲染細節
- 地圖旋轉時標記層可以始終保持不被旋轉
- 無限級的縮放
- 地物對象的自動消隱和抽稀


與柵格切片相比,使用矢量切片主要有以下優點:
- 數據傳輸更快,因為矢量文件通常很小
- 在客戶端就可以進行動態渲染,更靈活控制表現層
- 可以增加較強的交亙性:用JS+CSS就可以去操緃矢量對象
- 服務器端負荷會低,因為耗時的渲染過程不用在服務器上進行


「矢量切片格式」
提到網絡數據交換格式,很自然地我們想到的是JSON。而在GIS業內我們有GeoJSON。當然我們也可以不采用GeoJSON而自己去設計JSON的數據結構以便於我們自己進行數據壓縮。當然已有人去做了,比如TopoJSON。
但有人依然不滿足用明碼去進行數據傳輸,他們想到了二進制格式。所以有了今天很流行的格式:
  - Mapbox首先製訂了開源矢量切片的技術規範,使用的是Google protocol buffers。
  - OpenStreetMap使用的是Mapnik Vector Tiles,是一種基於WKB的二進製文件。
  - 當然,有能力和需要的我們也可以自己去設計自己的二進製格式。


「製作矢量切片」
之前我在做一個項目,需要發佈大量空間數據,基本上是做一個在綫版的ArcCatlog。我想到自己可以嘗試用矢量切片。以下我當時的筆記,記錄了當時我瞭解到的各種可能的方案:


方案一:使用GeoServer (選擇一)
  • 安裝
  • Install JRE 1.8 x86
  • Install GeoServer 2.9.1
  • Get vector tile extension files fromhttp://ares.boundlessgeo.com/geoserver/2.9.x/community-2016-08-03/
  • Install the extension files: copy the 4 jar files to C:\Program Files (x86)\GeoServer 2.9-RC1\webapps\geoserver\WEB-INF\lib
  • Start GeoServer: bin\startup.bat
製作pbf切片configuration:
  • change the URL setting in the script as desired (line 155 for pbf format)
  • Launch cmd.exe, cd C:\Users\mel044\Documents\GitHub\VectorTiles\back-end
  • Run the script: C:\Python27\ArcGISx6410.3\python.exe
  • createTilesGeojson.py
客戶端使用
  • Leaflet.MapboxVectorTile
問題:前端Leaflet.MapboxVectorTile有不少bug,許多功能需要自己去實現。deadend。

方案一:使用GeoServer (選擇二)
 使用PGRestAPI,但失敗了因為
  • hard to install & trouble-shooting
  • this package has been discontintued and its installation requires really old dependencies
方案三:使用Mapnik
失敗,因為在我的Mac OS X上安裝總不成功。

方案四:Mapbox的Mapbox Studio
我找到了Mapbox的在綫數據發佈IDE,可以把自己的數據導入和使用。但是
  • 我無法導出製作的矢量切片文件,(因為項目數據要放在自己服務器上)
  • Mapbox對免費用戶上傳的數據文件個數和大小有限制

方案五:Mapbox的Mapbox Studio Classic
這是Mapbox早期產品,以不被在綫IDE(上面)所取代,但依然可以在Mapbox下載。我嘗試此方案可以。如果有朋友想採用此方案。以下是詳細步驟:
  • Add a new layer
  • Rename it to a better name (default is 'data'), which will be used as itsid at the front-end to reference it
  • Save the project (otherwise you cannot download mbtiles)
  • Go to "Settings".Set up Minzoon/Maxzoom
  • "Export to MBTiles"
Copy the generated mbtiles file to the serverhost it on the server
生成的mbtiles實則是個sqlite數據庫,裡面就是矢量切片。可以用別的(NodeJS)工具去發佈。前台用Mapbox GL JS。這個方案最大的問題是準備矢量切片全要手動完成。不現實。deadend。


方案六:NodeJS
在我看到NodeJS時,發現目前此方案為最優方案。其實NodeJS有許多插件支持矢量切片的發佈。我使用的是tilelive-bridge它其實發佈的是你的矢量數據的mapnik的XML配置文件。當然,你需要自己去產生這個文件,其規範可以Google到。那tilelive-bridge支持的gis數據有哪些呢?因為它支持OGR可以識別的所有格式,因此我們有許多的選擇。另外,如果你的數據不是以文件形式存放(比如是在Database服務器裡)也沒問題,因為它還支持OGR虛拟格式
在我的項目裡,我的矢量數據都存放在ESRI的File GDB項目數據庫裡,因為除了發佈成WebGIS,我的客戶還要使用ArcMap去操作數據。
我想對比哪個辧案效率更快:
  • File GDB --> SQLite --> tilelive-bridge
  • File GDB -->  tilelive-bridge
結果 File GDB -->  tilelive-bridge 效率勝出。

前端使用Mapbox GL JS。它是開源的項目,而且有許多功能可以直接使用,API:https://www.mapbox.com/mapbox-gl-js/api/

推薦些資源:
喜欢0 评分0
興趣:Web,GIS,RS,開源,開發 個人QQ:965258591 QQ群:571477266
游客

返回顶部