zoukankan      html  css  js  c++  java
  • 基于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/

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

                                                                                         

  • 相关阅读:
    Python 购物车程序(文件版)
    Python 购物车程序
    Python多级菜单显示和登录小接口
    ARM体系结构与编程-第五章
    ARM体系结构与编程-第四章
    ARM的IRQ模式和FIQ模式
    C结构体的初始化和赋值
    ARM体系结构与编程-第三章
    函数调用过程分析
    关于STM32-M3/M4的MSP和PSP
  • 原文地址:https://www.cnblogs.com/naaoveGIS/p/10719879.html
Copyright © 2011-2022 走看看