基於mapnik做切片服務器的幾點總結


 文章版權由作者李曉暉和博客園共有,若轉載請於明顯處標明出處:http://www.cnblogs.com/naaoveGIS/

1.背景

        在地圖服務器的整體方案中,移動端采用矢量切片,樣式解析采用thinkgeo定義的thinkgeo_stylejson(https://wiki.thinkgeo.com/wiki/thinkgeo_stylejson)規范,該規范對屬性過濾等做了詳細描述,不過實際運用中也發現還有不少需要優化的地方需要自己修改。同時我們開發了一套在線配圖平台(類似mapboxstudio),用於生產該配圖文件。

        針對PC端,我們依然采用瓦片圖片,即為兼容老項目展示,也因為PC端范圍更大展示圖片性能更好,同時PC端的分辨率比較固定,展示圖片受分辨率影響相對較小。而基於GDAL來實現影像切片是可行的(已實現),但是如果要實現對矢量數據的渲染和切片則需要尋找其他途徑了。之前博客中簡單介紹過了mapnik,通過其可以快速實現對矢量數據進行配圖和切片。

         最后,為了實現配圖平台一次配圖即可同時支持矢量展示和切片展示,需要研究一套thinkgeo_sytlejson與mapnik的style互轉機制。

2.mapnik樣式屬性的幾個核心點總結

2.1 根據地圖比例尺實現樣式過濾

2.1.1原理

        根據wiki中描述(https://github.com/mapnik/mapnik/wiki/XMLConfigReference),mapnik支持通過設置比例尺區間以控制該樣式在哪個區間內展示。

 

       但是,該比例尺與我們地圖切圖時定義的比例尺之間如何換算關系?

  以下為mapnik的中的轉換源碼:

 

        對於為何這么換算處理,mapnik也是給了自己說明的,感興趣的朋友可以詳細了解一下(https://github.com/mapnik/mapnik/wiki/ScaleAndPpi):

 

        這里我直接給出計算邏輯:

        當地圖為經緯度坐標系時,map_scale / pixel_size

        當地圖為平面坐標系時,map_scale / pixel_size* meters_per_degree,即:

 

2.1.2配置編寫

        雖然實現了對比例尺的轉換計算,但是具體配置編寫中,比如我們地圖有0-6七個級別,我們需要某個樣式在1-2生效,此時該如何配置?我們並不能單純的將1級別換算比例尺賦給max,將2級別的比例尺賦給min,我們應該對1級別的比例尺適當加上一個向上偏移量,對2級別減去一個向下偏移量,使1和2級別完全包含其中。

 

2.2 屬性過濾

        Rule規則中提供filter屬性來實現屬性過濾。

        但是該過濾條件其實是嚴格區分數字或字符串的。比如圖層有一個字段叫做kind,為字符串類型,則此時kind=1將無法過濾。同樣,如果kind為數字,則kind=’1’又無法生效。如何兼容解決這個問題呢?當然如果我們事先知道字段類型也是OK的,但是,如果字段類型我們無法提前知道呢?

        此時,我們可以用一個有點無奈的方案:使用or連接。具體為:kind=1 or kind=’1’。經測試,可行。

2.3 注記控制

       Mapnik對TextSymbolizer定義了不少屬性,假如我們要展示道路的注記,如果缺少某些配置,其效果會出現十分大的偏差,因為注記默認屬性並不是沿道路展示的:

 

    但是加上placement='line'屬性后,便可實現沿路網展示:

 

    還有諸如很多其他屬性,這里不再一一舉例。

3.編寫切片服務器

        目前mapnik3系列均不支持windows系統。如果需要兼容windows和linux,只能采用2系列。同時,mapnik支持python或C++編寫,這里采用的是python編寫。

        切片服務器邏輯為:

        a.外部發起請求,傳入level、X、Y。

        b.在緩存瓦片文件夾中判斷是否存在該瓦片,如果存在,則直接返回。

        c.如果不存在,根據地圖切片參數,基於level、X、Y算出此時瓦片的地理范圍,生成該瓦片並同時保存至緩存瓦片文件夾。

 

4.thinkgeo_style與mapnik_style之間的轉換探索

        Thinkgeo_style中的樣式豐富度是要高於mapnik的,同時也會出現mapnik中某些樣式屬性在geo中不存在。為此,我們制定了以下一個轉換思路:

        a.設計thinkgeo_style與mapnik屬性之間的轉換字典表,其中包含mapnik屬性的默認值,如:

 

        b.設計mapnik_style的模板文件,即樣式中默認一定有的屬性。

        目前,轉換程序還處於驗證階段,后續篇章再做詳細描述。

 

                                 -----歡迎轉載,但保留版權,請於明顯處標明出處:http://www.cnblogs.com/naaoveGIS/

                                                                              如果您覺得本文確實幫助了您,可以微信掃一掃,進行小額的打賞和鼓勵,謝謝 ^_^

                                                                                     

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM