基础概念
栅格数据、矢量数据
这部分份内容我就不赘述了,感兴趣的请自行传送浏览。
矢量数据:传送门
栅格数据:传送门
栅格数据、矢量数据对比:传送门A、传送门B、传送门C
推荐关于栅格数据的博客:栅格那点事儿
栅格切片、矢量切片
栅格切片
栅格切片图层将底图作为图像文件(例如,JPG 或 PNG 格式)交付给客户端应用程序,这些图像文件已经预渲染并存储在服务器上,并由客户端按原样显示。栅格切片图层最适合于为您的地图提供地理环境的底图,例如影像(比如在世界影像底图中)或基于要素的地图,例如地形、国家地理、海洋和其他底图。栅格切片图层也可以由静态业务图层组成,例如数据的专题地图。
切片图层格式可通过 Internet 快速传输,并且很容易为大多数常见的地图软件应用程序所理解,因此这些底图不仅与 ArcGIS 和使用 ArcGIS API 构建的 Web 应用程序兼容,还与使用 OGC 协议(例如 WMS/WMTS)的第三方应用程序兼容。栅格切片图层的其他优点如下:
• 适用于各种应用程序和设备(Web、桌面和移动设备),其中包括 ArcMap 等桌面应用程序和旧版 web 浏览器。
• 提供高端制图功能,如高级标注放置和符号系统。
• 支持各种栅格数据源,如影像和高程数据。
• 可通过 Web 制图应用程序打印。
矢量切片
矢量切片图层引用一组 web 可用的矢量切片以及这些切片应被绘制的相应样式。矢量切片与栅格切片类似,但是它们存储数据的矢量表示。也就是说,地理要素以客户端应用程序可理解的格式表示为点、线和面。不同于栅格切片图层,矢量切片图层能够适应显示设备的分辨率,并且可以改变样式以用于多种用途。矢量切片文件比栅格切片文件更小,这意味着制图更快、性能更好。切片访问性能和矢量绘制的结合使切片能够适应任意显示分辨率(设备不同,分辨率可能不同)。
相关资源:
MVT
Mapbox矢量图块规范:传送门
矢量切片的意义
个人愚见:
- 相对栅格数据,数据传输量更小,前端体验更好。
- 相对栅格数据,粒度更小,可以控制到要素级别,支持按需获取。
- 实时性更好,支持数据更新,切图更快。
- 信息保存更完整,细节保存完整。
- 样式可修改,定制型更强。
矢量切片实现
awesome-vector-tiles(关于矢量切片实现的一下资料,算是比较全的了)
Mapnik
基础
关于Mapnik、Python-Mapnik的基础概念、安装、学习资料,参考上一篇:传送门
Mapnik XML文件配置
- XML配置官方资料:传送门
<Map srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +no_defs" background-color="#00000000">
<Layer name="grid_polygons" status="on" srs="+proj=longlat +ellps=GRS80 +no_defs ">
<StyleName>grid_polygons</StyleName>
<Datasource>
<Parameter name="table">(select geom from grid_polygons) as grid_polygons</Parameter>
<Parameter name="type">postgis</Parameter>
<Parameter name="host">localhost</Parameter>
<Parameter name="port">5432</Parameter>
<Parameter name="user">postgres</Parameter>
<Parameter name="password">postgres</Parameter>
<Parameter name="dbname">postgres</Parameter>
<Parameter name="max_size">20</Parameter>
</Datasource>
</Layer>
<Style name="grid_polygons">
<Rule>
<PolygonSymbolizer fill="#FF7F24"/>
<LineSymbolizer stroke-width=".5" stroke="#000000"/>
</Rule>
</Style>
</Map>
Mapnik 优化策略
Flask框架
Flask 是一个 Python 实现的 Web 开发微框架,轻巧简单容易上手。
官方资料:传送门
矢量切片服务端
参考代码:传送门
矢量切片前端渲染
这块可以使用Openlayers或Leaflet开发,前端这块的代码我就不贴了。
测试结果
500-600w的面数据,13-14级 实时加载无压力,12级略慢。
最后附上一张效果图: