在 mvt 中获取单独的图层

Get separate layers in an mvt

我们的平台目前使用 pbf tiles(on s3) 在前端的 Mapbox 上渲染矢量图层。 pbf 瓦片内部有单独的层,我们使用 Mapbox 层的源层 属性 将它们设置为单独的层。我们现在正在转向 PostGIS,我们希望避免 s3 并直接在前端将矢量图块渲染为 mvt。

我试图从 mvt 中获取单独的图层,但我看到的唯一图层是 'default' 图层。我使用这个 vizualizer tool 识别了这个。我目前正在使用此查询获取 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;

This 问题与我的问题非常接近,但答案建议使用 UNION,考虑到我们必须渲染数百层,我想尽可能避免使用 UNION。 我也试过。在这种情况下,当我将 layer-ids 的值放入 IN 时,我看到这些层集被渲染为一层。

(为了了解矢量切片的生成方式,我需要探索一些东西,以便我知道单独的层是如何生成的吗?我是 PostGIS 的新手,我不确定我是否在做有什么不对或遗漏的东西。任何建议表示赞赏)

下面是 ST_AsMvt

的完整 return 签名
bytea ST_AsMVT(anyelement row, text name, integer extent, text geom_name, text feature_id_name);

稍后在 docs:

name is the name of the layer. Default is the string "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)
     )
)
SELECT
  ST_AsMVT(
    mvtgeom.*,
    'layer_' || layer -- this is the layer name argument
  ) AS mvt
FROM
  mvtgeom
GROUP BY
  layer;

这个 name 属性, 顺便说一句,是 mapbox 用作 "source layer"