1. 程式人生 > >Ubuntu16.04 Flask+Python-Mapnik + PostGIS 向量切片初體驗

Ubuntu16.04 Flask+Python-Mapnik + PostGIS 向量切片初體驗

基礎概念

柵格資料、向量資料

這部分份內容我就不贅述了,感興趣的請自行傳送瀏覽。
向量資料:傳送門
柵格資料:傳送門
柵格資料、向量資料對比:傳送門A傳送門B傳送門C
推薦關於柵格資料的部落格:柵格那點事兒

柵格切片、向量切片

柵格切片
柵格切片圖層將底圖作為影象檔案(例如,JPG 或 PNG 格式)交付給客戶端應用程式,這些影象檔案已經預渲染並存儲在伺服器上,並由客戶端按原樣顯示。柵格切片圖層最適合於為您的地圖提供地理環境的底圖,例如影像(比如在世界影像底圖中)或基於要素的地圖,例如地形、國家地理、海洋和其他底圖。柵格切片圖層也可以由靜態業務圖層組成,例如資料的專題地圖。

切片圖層格式可通過 Internet 快速傳輸,並且很容易為大多數常見的地圖軟體應用程式所理解,因此這些底圖不僅與 ArcGIS 和使用 ArcGIS API 構建的 Web 應用程式相容,還與使用 OGC 協議(例如 WMS/WMTS)的第三方應用程式相容。柵格切片圖層的其他優點如下:
• 適用於各種應用程式和裝置(Web、桌面和移動裝置),其中包括 ArcMap 等桌面應用程式和舊版 web 瀏覽器。
• 提供高階製圖功能,如高階標註放置和符號系統。
• 支援各種柵格資料來源,如影像和高程資料。
• 可通過 Web 製圖應用程式列印。

向量切片
向量切片圖層引用一組 web 可用的向量切片以及這些切片應被繪製的相應樣式。向量切片與柵格切片類似,但是它們儲存資料的矢量表示。也就是說,地理要素以客戶端應用程式可理解的格式表示為點、線和麵。不同於柵格切片圖層,向量切片圖層能夠適應顯示裝置的解析度,並且可以改變樣式以用於多種用途。向量切片檔案比柵格切片檔案更小,這意味著製圖更快、效能更好。切片訪問效能和向量繪製的結合使切片能夠適應任意顯示解析度(裝置不同,解析度可能不同)。

相關資源:

MVT

Mapbox向量圖塊規範:傳送門

向量切片的意義

個人愚見:

  • 相對柵格資料,資料傳輸量更小,前端體驗更好。
  • 相對柵格資料,粒度更小,可以控制到要素級別,支援按需獲取。
  • 實時性更好,支援資料更新,切圖更快。
  • 資訊儲存更完整,細節儲存完整。
  • 樣式可修改,定製型更強。

向量切片實現

awesome-vector-tiles(關於向量切片實現的一下資料,算是比較全的了)

Mapnik

基礎

關於Mapnik、Python-Mapnik的基礎概念、安裝、學習資料,參考上一篇:傳送門

Mapnik XML檔案配置

<Map srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m [email protected] +no_defs" background-color="#00000000">
    <Layer name="grid_polygons" status="on" srs="+proj=longlat +ellps=GRS80 +no_defs ">
        <StyleName>grid_polygons</StyleName>
        <Datasource>
            <Parameter name="table">(select geom from grid_polygons) as grid_polygons</Parameter>
            <Parameter name="type">postgis</Parameter>
            <Parameter name="host">localhost</Parameter>
            <Parameter name="port">5432</Parameter>
            <Parameter name="user">postgres</Parameter>
            <Parameter name="password">postgres</Parameter>
            <Parameter name="dbname">postgres</Parameter>
            <Parameter name="max_size">20</Parameter>
        </Datasource>
    </Layer>
    <Style name="grid_polygons">
        <Rule>
            <PolygonSymbolizer fill="#FF7F24"/>
            <LineSymbolizer stroke-width=".5" stroke="#000000"/>
        </Rule>
    </Style>
</Map>
  • 座標系查詢:傳送門(這塊主要是在xml配置座標系時使用)

  • 縮放級別和縮放比例尺分母對應關係:傳送門

Mapnik 優化策略

Flask框架

Flask 是一個 Python 實現的 Web 開發微框架,輕巧簡單容易上手。
官方資料:傳送門

向量切片服務端

參考程式碼:傳送門

向量切片前端渲染

這塊可以使用Openlayers或Leaflet開發,前端這塊的程式碼我就不貼了。

測試結果

500-600w的面數據,13-14級 實時載入無壓力,12級略慢。

最後附上一張效果圖:
在這裡插入圖片描述