基于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做切片服务器的几点总结_第1张图片

       但是,该比例尺与我们地图切图时定义的比例尺之间如何换算关系?

  以下为mapnik的中的转换源码:

 基于mapnik做切片服务器的几点总结_第2张图片

        对于为何这么换算处理,mapnik也是给了自己说明的,感兴趣的朋友可以详细了解一下(https://github.com/mapnik/mapnik/wiki/ScaleAndPpi):

 基于mapnik做切片服务器的几点总结_第3张图片

        这里我直接给出计算逻辑:

        当地图为经纬度坐标系时,map_scale / pixel_size

        当地图为平面坐标系时,map_scale / pixel_size* meters_per_degree,即:

 基于mapnik做切片服务器的几点总结_第4张图片

2.1.2配置编写

        虽然实现了对比例尺的转换计算,但是具体配置编写中,比如我们地图有0-6七个级别,我们需要某个样式在1-2生效,此时该如何配置?我们并不能单纯的将1级别换算比例尺赋给max,将2级别的比例尺赋给min,我们应该对1级别的比例尺适当加上一个向上偏移量,对2级别减去一个向下偏移量,使1和2级别完全包含其中。

 基于mapnik做切片服务器的几点总结_第5张图片

2.2 属性过滤

        Rule规则中提供filter属性来实现属性过滤。

        但是该过滤条件其实是严格区分数字或字符串的。比如图层有一个字段叫做kind,为字符串类型,则此时kind=1将无法过滤。同样,如果kind为数字,则kind=’1’又无法生效。如何兼容解决这个问题呢?当然如果我们事先知道字段类型也是OK的,但是,如果字段类型我们无法提前知道呢?

        此时,我们可以用一个有点无奈的方案:使用or连接。具体为:kind=1 or kind=’1’。经测试,可行。

2.3 注记控制

       Mapnik对TextSymbolizer定义了不少属性,假如我们要展示道路的注记,如果缺少某些配置,其效果会出现十分大的偏差,因为注记默认属性并不是沿道路展示的:

 基于mapnik做切片服务器的几点总结_第6张图片

    但是加上placement='line'属性后,便可实现沿路网展示:

 基于mapnik做切片服务器的几点总结_第7张图片

    还有诸如很多其他属性,这里不再一一举例。

3.编写切片服务器

        目前mapnik3系列均不支持windows系统。如果需要兼容windows和linux,只能采用2系列。同时,mapnik支持python或C++编写,这里采用的是python编写。

        切片服务器逻辑为:

        a.外部发起请求,传入level、X、Y。

        b.在缓存瓦片文件夹中判断是否存在该瓦片,如果存在,则直接返回。

        c.如果不存在,根据地图切片参数,基于level、X、Y算出此时瓦片的地理范围,生成该瓦片并同时保存至缓存瓦片文件夹。

 基于mapnik做切片服务器的几点总结_第8张图片

4.thinkgeo_style与mapnik_style之间的转换探索

        Thinkgeo_style中的样式丰富度是要高于mapnik的,同时也会出现mapnik中某些样式属性在geo中不存在。为此,我们制定了以下一个转换思路:

        a.设计thinkgeo_style与mapnik属性之间的转换字典表,其中包含mapnik属性的默认值,如:

 基于mapnik做切片服务器的几点总结_第9张图片

        b.设计mapnik_style的模板文件,即样式中默认一定有的属性。

        目前,转换程序还处于验证阶段,后续篇章再做详细描述。

 

                                 -----欢迎转载,但保留版权,请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/

                                                                              如果您觉得本文确实帮助了您,可以微信扫一扫,进行小额的打赏和鼓励,谢谢 ^_^

                                                                                     基于mapnik做切片服务器的几点总结_第10张图片

 

你可能感兴趣的:(基于mapnik做切片服务器的几点总结)