矢量地图方案的进一步探讨
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/
1. 背景
在之前多篇文章中我描述了如何编写矢量地图切片工具、如何基于Geoserver来进行矢量切片方案。这两种方案各有局限:
- 矢量地图预切片工具对实时数据的实时更新很难做出及时更新,需人工干预。
- Geoserver切片方案需要依赖于Geoserver地理服务器。
这里,我们可以将方案进一步升级。
2. 整体设计
需要解决的几点:
a.统一矢量数据源,无需针对项目中不同系统采用不同的配图方案。由于项目中环境复杂,往往涉及老系统、新系统、PC端、移动端。对于老系统并不支持矢量切片的解析,难道还要再次对数据配图,采用arcgis切片?
b.摆脱Geoserver的束缚,对于已经有arcgis(10.2以前)的环境的项目,难道还要再安装一个Geoserver?
c.矢量配图得实现可视化,难道每次手写样式文件?
d.即支持切片预处理,也得支持切片的动态更新。
根据这几点要求,做了如下设计:
具体描述为:
a.服务端支持根据PG数据源生成矢量切片。
b.服务端支持根据PG数据源和样式文件生成图片切片。
c.配图平台支持分别生成矢量切片样式文件和图片切片样式文件。
d.前端根据产品版本,分别发送对应格式的切片获取请求。
3. 基于PG的矢量切片生成
9.6以上postgresql+2.4postgis,提供了两个矢量切片的空间函数:ST_AsMVT,ST_AsMVTGeom(mapbox格式),即可生成。但是由于不能保证各项目的PG为此版本以上,这里采用可以普适的方案,服务端基于pbf开发包(java-vector-tile、protobuf-javanano、protobuf-java)来进行。
a.根据瓦片范围查询PG库获取要素(wkt)。
b.对要素解析成geometry格式。
c.将要素的几何坐标转换为屏幕坐标。
d.将此时的要素编码成pbf格式。
测试结果:
4. 基于PG的图片切片生成
在开源架构中,通常为:QGIS、UDig做桌面数据处理工具,Geoserver、MapServer是比较常用的地理服务器,Postgresql+PostGIS作为空间数据库。但是,随着地理数据库PG越来越强大,Geoserver的功能反而在被逐渐弱化。PG可以支持各类空间查询,空间分析,甚至路径分析上。而针对切片的生成,PG+Mapnik的方案,也能很好的解决。
这里选用python进行代码测试:
测试样式文件,编写数据源配置和样式配置:
测试结果:
-----欢迎转载,但保留版权,请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/
如果您觉得本文确实帮助了您,可以微信扫一扫,进行小额的打赏和鼓励,谢谢 ^_^