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

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

                              

基于mapnik做切片服务器的几点总结的更多相关文章

  1. Windows 7下 搭建 基于 ssh 的sftp 服务器

    Windows  xp 下 搭建 基于  ssh 的sftp 服务器,服务器端可以用 freesshd,F-secure server等,filezilla server不可用,之前傻乎乎的用file ...

  2. Haproxy基于ACL做访问控制

    author:JevonWei 版权声明:原创作品 haproxy配置文档 https://cbonte.github.io/haproxy-dconv/ 基于ACL做访问控制(四层代理) 网络拓扑 ...

  3. openfire:基于开源 Openfire 聊天服务器 - 开发Openfire聊天记录插件

    基于开源 Openfire 聊天服务器 - 开发Openfire聊天记录插件 上一篇文章介绍到怎么在自己的Java环境中搭建openfire插件开发的环境,同时介绍到怎样一步步简单的开发openfir ...

  4. sqoop数据迁移(基于Hadoop和关系数据库服务器之间传送数据)

    1:sqoop的概述: (1):sqoop是apache旗下一款“Hadoop和关系数据库服务器之间传送数据”的工具.(2):导入数据:MySQL,Oracle导入数据到Hadoop的HDFS.HIV ...

  5. 基于开源 Openfire 聊天服务器 - 开发Openfire聊天记录插件

    原文:http://www.cnblogs.com/hoojo/archive/2013/03/29/openfire_plugin_chatlogs_plugin_.html 随笔-150  评论- ...

  6. http-server 基于nodejs的http服务器

    http-server所用场景: 作为前端的同学来说,想要运行一段代码,但又没有必要使用tomcat或是Apache http server,这个时候,一个简单的轻量的http-server就能搞定. ...

  7. 基于mosquitto的MQTT服务器---SSL/TLS 单向认证+双向认证

    基于mosquitto的MQTT服务器---SSL/TLS 单向认证+双向认证 摘自:https://blog.csdn.net/ty1121466568/article/details/811184 ...

  8. 乐鑫esp8266基于freeRtos实现私有服务器本地远程OTA升级

    目录 一.前言: 二.回顾下OTA的流程: 三.lwip网络框架的知识的使用: 四.如何处理服务器返回的数据? 五.扇区的擦除和烧写? 六.如何调用? 七.好好享用吧! 八.下载: 九.工程截图: 代 ...

  9. Pull Request的过程、基于git做的协同开发、git常见的一些命令、git实现代码的review、git实现版本的管理、gitlab、GitHub上为开源项目贡献代码

    前言: Pull Request的流程 1.fork 首先是找到自己想要pull request的项目, 然后点击fork按钮,此时就会在你的仓库中多出来一个仓库,格式是:自己的账户名/想要pull ...

随机推荐

  1. 图解:HTTP 范围请求,助力断点续传、多线程下载的核心原理

    题图:by Charles Loyer 一.序 Hi,大家好,我是承香墨影! HTTP 协议在网络知识中占据了重要的地位,HTTP 协议最基础的就是请求和响应的报文,而报文又是由报文头(Header) ...

  2. TensorFlow从1到2(三)数据预处理和卷积神经网络

    数据集及预处理 从这个例子开始,相当比例的代码都来自于官方新版文档的示例.开始的几个还好,但随后的程序都将需要大量的算力支持.Google Colab是一个非常棒的云端实验室,提供含有TPU/GPU支 ...

  3. Golang 入门 : 结构体(struct)

    Go 通过类型别名(alias types)和结构体的形式支持用户自定义类型,或者叫定制类型.试图表示一个现实世界中的实体. 结构体由一系列命名的元素组成,这些元素又被称为字段,每个字段都有一个名称和 ...

  4. spring boot整合spring5-webflux从0开始的实战及源码解析

    上篇文章<你的响应阻塞了没有?--Spring-WebFlux源码分析>介绍了spring5.0 新出来的异步非阻塞服务,很多读者说太理论了,太单调了,这次我们就通过一个从0开始的实例实战 ...

  5. 设计模式之组合模式——Java语言描述

    组合模式又叫做部分整体模式,适用于把一组相似的对象当作一个单一的对象.组合模式依据树形结构来组合对象,用来表示部分以及整体层次 介绍 意图 将对象组合成树形结构以表示"部分-整体" ...

  6. css常见的各种布局下----三列布局

    css 三列布局,左右固定宽度右边自适应 1不使用定位,只使用浮动可以实现左右固定,中间宽度自适应布局 1.1.1 自适应部分一定要放第一个位子,使用浮动,并且设置宽度为100%,不设置浮动元素内容不 ...

  7. CSS消除button标签的默认样式

    button{ /*消除button的默认样式*/ /*这种写法是对所有的button标签同时生效*/ margin: 0px; padding: 0px; /*自定义边框*/ border: 0px ...

  8. 关于elementUi tab组件路由跳转卡死问题

    好久没来了,周五项目终于要上线了(*^▽^*),上线之前测出一个很恶心的bug真真是... 项目:Vue + elementUi   后台管理项目 问题描述:登录后首次通过侧边栏路由跳转到主页面有ta ...

  9. iOS----------Mac维修预约-如何找到电脑维修单

    先打开苹果官网,找到技术支持 2.选择维修选项 3.查看维修状态 4.显示维修时间订单

  10. Postman 安装

    前言 安装前的准备: 1.Chrome 浏览器的扩展插件来进行的安装,并非单独应用程序. 2.电脑上已经安装了 Chrome 浏览器 3.本文章适用操作系统  window7 一,非官方安装 个人不建 ...