基于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/

                                                                              若是您以为本文确实帮助了您,能够微信扫一扫,进行小额的打赏和鼓励,谢谢 ^_^

                                                                                     

相关文章
相关标签/搜索