我们的平台目前使用 pbftiles(在 s3 上)在前端的 Mapbox 上渲染矢量图层。 pbf 图块内有单独的图层,我们使用 Mapbox 图层的 source-layer 属性将它们设置为单独图层的样式。我们现在正在转向 PostGIS,我们希望避免 s3 并直接在前端将矢量切片渲染为 mvt。
我试图从 mvt 中获取单独的图层,但我看到的唯一图层是“默认”图层。我使用这个 vizualizer 工具 识别了这一点。我目前正在使用此查询获取 mvt -
WITH mvtgeom AS (
SELECT ST_AsMVTGeom(ST_Transform(ST_Force2D(geom), 3857),
ST_TileEnvelope(${z}, ${x}, ${y}))
AS geom,
layer,
gid
FROM site-name
WHERE ST_Intersects(geom, ST_Transform(ST_TileEnvelope(${z}, ${x}, ${y}), 4326)))
SELECT ST_AsMVT(mvtgeom.*) AS mvt FROM mvtgeom;
这个问题与我的问题非常接近,但答案建议使用 UNION,考虑到我们必须渲染数百层,我希望尽可能避免使用 UNION。 我也尝试过这个。在这种情况下,当我将图层 ID 的值放入 IN 中时,我看到这些图层组被渲染为一个图层。
(我是否需要探索一些东西才能了解矢量切片是如何生成的,以便我知道单独的图层是如何准确生成的?我是 PostGIS 新手,我不确定我是否做错或遗漏了什么任何建议都表示赞赏)
ST_AsMvt
bytea ST_AsMVT(anyelement row, text name, integer extent, text geom_name, text feature_id_name);
稍后在文档中:
name 是图层的名称。默认值是字符串“default”。尝试使用 id(或标签,或每个图层特定的其他内容)为每个图层创建不同的图层名称:
WITH mvtgeom AS (
SELECT
ST_AsMVTGeom(ST_Transform(ST_Force2D(geom), 3857) AS geom
, layer
, gid
FROM
site-name
WHERE
ST_Intersects(
geom,
ST_Transform(ST_TileEnvelope(${z}, ${x}, ${y}), 4326)
)
),
tiles as (
SELECT
ST_AsMVT(
mvtgeom.*,
'layer_' || layer -- this is the layer name argument
) AS mvt
FROM
mvtgeom
GROUP BY
layer
)
-- return single tile composed of layers
SELECT string_agg(mvt, '') from tiles;
这个 name
属性,顺便说一下,就是 Mapbox 用作“源图层”