tilestrata-postgis-geojson-tiles 插件使用及浅析
条评论tilestrata-postgis-geojson-tiles插件以 PostGIS 为数据源,生成 GeoJSON 格式的矢量瓦片。轻量但功能强大,配置项丰富,效果拔群。
demo 项目可以参考tilestrata-sample-code
1. 安装
| $ npm install tilestrata-postgis-geojson-tiles --save | 
2. 使用
插件的配置比较复杂:
- geometryField( string, 必选) : 数据表中存储地理数据的列名。 (默认 =- "geom")
- sql( function, 必选) : 一个返回 PostGIS 查询语句的函数。 注意防治 sql 注入。 查询语句包含以下内容:- {bbox}(box2d): 缓冲区的 bbox 范围
- {geojson}(text): 被裁剪出来的地理信息数据
 
- pgConfig( object, 必选) : postgres 数据库配置:- {host}(string)
- {password}(string)
- {user}(string)
- {port}(string)
- {database}(string)
 
- simplifyFactor( number, 可选 ) : 地理数据简化程度的参数。 (默认 =- 0.75)
- buffer( number, 可选) : 围绕每个切片的缓冲大小,以像素为单位 (默认 =- 16)
- collectGeometry( boolean, 可选 ) : 在转换成 GeoJson 之前是用 ST_Collect 把多个图形合并成一个简单图形。 (默认 =- false)
- mergeMultiLineStrings( boolean, 可选 ) : 在转换成 GeoJson 之前是和否用 ST_LineMerge 合并 MultiLineStrings 数据。 (默认 =- false)
- dumpGeometry( boolean, 可选 ) : 是否用 ST_Dump 来拆分图形 (默认 =- false)
这里我使用了 demo 中的 world_merc.shp 数据导入了 PostGIS 中作为测试数据源
| const tilestrata = require('tilestrata') | 
3. 效果
demo 项目可以参考tilestrata-sample-code
http://127.0.0.1:9527/world_merc/6/55/25/tile.png对应的栅格瓦片的结果如下图所示

http://127.0.0.1:9527/geojson-tiles/6/55/25/tile.json请求对应的地址获取 GeoJSON 格式的矢量数据:

在geojson.io查看效果如下图所示:

GeoJSON 结果和渲染出来的 png 的图形基本是一致。
4. 代码浅析
从插件功能可以看出来属于Providers类型的插件,那么核心就是 serve 方法。首先插件会根据我们传入的数据库信息来建立 Postgres 对象,这个不需要展开讲。
当请求某个瓦片的时候,插件根据传入的 zxy 信息,调用了@mapbox/sphericalmercator库来把 zxy 坐标转换成 bbox 对象
| var sm = new SphericalMercator({ size: 256 }) | 
在定义图层的时候会传入一个sql函数,里面包含了{bbox}和{geojson}两个预设的字段,在源代码中这两个字段将会分别被计算出来,合成一个 sql 在数据库中进行查询
| // 代码为了便于理解有所精简改动 | 
最后把查询出来的结果封装在FeatureCollection中形成一个完整的 GeoJSON 返回给 tilestrata 就可以了。
| // 组装GeoJSON |