文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处: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/

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

                              

最新文章

  1. Hibernate —— 映射关联关系(附录)
  2. 在Solr中配置和使用ansj分词
  3. Python的高级特性11:拓展基本数据类型(dict)
  4. html字符字体转换
  5. 开源PLM软件Aras详解二 汉化以及界面
  6. MarkDown写blog(测试)
  7. Spring-MongoDB简单操作
  8. python 上下文管理器
  9. android 系统应用在运行时被卸载
  10. 如何实现Windows Phone代码与Unity相互通信(插件方式)
  11. App.Config 在windows 服务中的应用问题
  12. 打印 上一主题 下一主题 利用cURL实现单个文件分多段同时下载,支持断点续传(修订版)
  13. css布局之块上下左右居中
  14. Xcode 静态库调试策略
  15. Python实现XML文件解析
  16. 在WinForm应用程序中快速实现多语言的处理
  17. [dedecms]隐藏栏目不生成静态页面
  18. Spring:获取容器中的Bean
  19. 部署---阿里云服务器,linux, ubuntu ,部署django用到的一些命令
  20. SSH免密码登录配置方法详解

热门文章

  1. C#之Socket的简单使用
  2. 创建一个 Spring Boot 项目,你会几种方法?
  3. 【Android Studio安装部署系列】十七、Android studio引用第三方库、jar、so、arr文件
  4. 在 EFCore 定义的实体中进行 FreeSql 开发
  5. CAP带你轻松玩转Asp.Net Core消息队列
  6. wow.js让css3动画变动更有趣(滚动页面动画模拟懒加载特效)
  7. 关于elementUi tab组件路由跳转卡死问题
  8. [转]MS Excel VBO option missing in Blue Prism
  9. 量化投资技术分析工具---ipython使用
  10. flink源码编译(windows环境)