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 |