1. 程式人生 > >基於mapnik做切片服務器的幾點總結

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

www. 道路 window 參數 屬性。 logs 範圍 相對 出現

文章版權由作者李曉暉和博客園共有,若轉載請於明顯處標明出處: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/

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

                      技術分享圖片

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