最近的工作主要是做后端地图渲染引擎,所以接触到了mapnik。比较强大,想把学习过程记录下来。好了,废话少说。什么是MapnikMapnik是一个具有地图渲染功能的开源库,可以为包括Postgis、Shapefile、Geojson、SQLite等多种数据源提供空间数据计算和可视化服务,包括png瓦片和矢量图瓦片,utfGrid,在同时支持自定义渲染风格配置,灵活性高,提供c++、python、node接口。目前开源社区有很多基于Mapnik封装的成熟产品,比如windshaft、tileliev-mapnik等。Vectortile(mvt)渲染在我的理解中,vectortile就是将向量表示的空间数据和属性数据按照特定的编码方式(GoogleProtocolBuffers)进行编码。GoogleProtocolBuffers是一种多语言、多平台、易于扩展的数据序列化格式,使用这种编码方式,可以最大程度保证矢量数据的准确性,提高客户端的渲染效率和查询效率和服务器。具体可以参考:https://github.com/jingsam/ve...和https://github.com/mapbox/vec...以PostGIS为例,Mapnik库对vector的整个工作流程瓦片渲染是:先根据url坐标范围extent中的z、x、y参数计算出瓦片,然后对extent和每个几何元素的最小外接矩形进行叠加计算,得到瓦片中的所有几何对象,最后通过Postgis库函数ST_AsMVT将所有几何对象聚合成矢量瓦片,伪代码如下:letvt=newMapnik.VectorTile(z,x,y);letmap=newMapnik.Map(256,256,'+init=epsg:3857');map.fromStringSync(xml);//xml为配置对象,详见https://github.com/mapnik/mapnik/wiki/XMLConfigReferencemap.render(vt,(err,tile)=>{if(err)throwerr;//tile是获取到的数据console.log(tile.getData())})网格瓦片(PNG)渲染网格瓦片是将空间数据按照指定的颜色样式以图片的形式绘制出来。它是作为图片绘制的,是前端可视化时绘制在canvas上的像素点,所以它的属性信息会丢失,需要和utfGrid同步使用。栅格瓦片的渲染过程与矢量瓦片类似,只是最后一步不是聚合,而是按照指定样式逐像素绘制;在mapnik中,栅格瓦片的渲染主要有两种方式,1)直接Rendering;2)通过矢量瓦片进行渲染,伪码表如下:直接渲染letimage=newMapnik.Image(256,256);letmap=newMapnik.Map(256,256,'+init=epsg:3857');map.fromStringSync(xml);map.render(image,{},function(err,image){if(err)throwerr;image.encodeSync('png')});通过矢量瓦片渲染letvt=newMapnik.VectorTile(z,x,y);vt.addDataSync(tile);//tile就是上面生成的矢量tileletmap=newMapnik.Map(256,256,'+init=epsg:3857');map.fromStringSync(xml);vt.render(this.map,newMapnik.Image(256,256),function(error,buffer){if(error)throwerror;buffer.encodeSync('png')});一个比较简单的介绍mapnik的地理数据渲染功能,然后会做一个比较简单的地图渲染服务器。第一次使用技术博客可能不太到位。请前辈多多指教
