基于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/
如果您觉得本文确实帮助了您,可以微信扫一扫,进行小额的打赏和鼓励,谢谢 ^_^
最新文章
- Hibernate —— 映射关联关系(附录)
- 在Solr中配置和使用ansj分词
- Python的高级特性11:拓展基本数据类型(dict)
- html字符字体转换
- 开源PLM软件Aras详解二 汉化以及界面
- MarkDown写blog(测试)
- Spring-MongoDB简单操作
- python 上下文管理器
- android 系统应用在运行时被卸载
- 如何实现Windows Phone代码与Unity相互通信(插件方式)
- App.Config 在windows 服务中的应用问题
- 打印 上一主题 下一主题 利用cURL实现单个文件分多段同时下载,支持断点续传(修订版)
- css布局之块上下左右居中
- Xcode 静态库调试策略
- Python实现XML文件解析
- 在WinForm应用程序中快速实现多语言的处理
- [dedecms]隐藏栏目不生成静态页面
- Spring:获取容器中的Bean
- 部署---阿里云服务器,linux, ubuntu ,部署django用到的一些命令
- SSH免密码登录配置方法详解
热门文章
- C#之Socket的简单使用
- 创建一个 Spring Boot 项目,你会几种方法?
- 【Android Studio安装部署系列】十七、Android studio引用第三方库、jar、so、arr文件
- 在 EFCore 定义的实体中进行 FreeSql 开发
- CAP带你轻松玩转Asp.Net Core消息队列
- wow.js让css3动画变动更有趣(滚动页面动画模拟懒加载特效)
- 关于elementUi tab组件路由跳转卡死问题
- [转]MS Excel VBO option missing in Blue Prism
- 量化投资技术分析工具---ipython使用
- flink源码编译(windows环境)