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

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

1.背景

        在地圖服務器的總體方案中,移動端採用矢量切片,樣式解析採用thinkgeo定義的thinkgeo_stylejson(https://wiki.thinkgeo.com/wiki/thinkgeo_stylejson)規範,該規範對屬性過濾等作了詳細描述,不過實際運用中也發現還有很多須要優化的地方須要本身修改。同時咱們開發了一套在線配圖平臺(相似mapboxstudio),用於生產該配圖文件。linux

        針對PC端,咱們依然採用瓦片圖片,即爲兼容老項目展現,也由於PC端範圍更大展現圖片性能更好,同時PC端的分辨率比較固定,展現圖片受分辨率影響相對較小。而基於GDAL來實現影像切片是可行的(已實現),可是若是要實現對矢量數據的渲染和切片則須要尋找其餘途徑了。以前博客中簡單介紹過了mapnik,經過其能夠快速實現對矢量數據進行配圖和切片。git

         最後,爲了實現配圖平臺一次配圖便可同時支持矢量展現和切片展現,須要研究一套thinkgeo_sytlejson與mapnik的style互起色制。github

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

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

2.1.1原理

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

 

       可是,該比例尺與咱們地圖切圖時定義的比例尺之間如何換算關係?windows

  如下爲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/

                                                                              若是您以爲本文確實幫助了您,能夠微信掃一掃,進行小額的打賞和鼓勵,謝謝 ^_^

                                                                                     

相關文章
相關標籤/搜索