【问题标题】:Get separate layers in an mvt在 mvt 中获取单独的图层
【发布时间】:2021-05-22 19:29:38
【问题描述】:

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

我正在尝试从 mvt 中获取单独的图层,但我看到的唯一图层是“默认”图层。我使用这个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,考虑到我们必须渲染数百层,我想尽可能避免使用它。 我也试过this。在这种情况下,当我将 layer-ids 的值放入 IN 时,我看到这些图层集被渲染为一个图层。

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

【问题讨论】:

    标签: postgresql mapbox postgis mapbox-gl-js mapbox-gl


    【解决方案1】:

    下面是ST_AsMvt的完整返回签名

    bytea ST_AsMVT(anyelement row, text name, integer extent, text geom_name, text feature_id_name);
    

    稍后在docs

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

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

    【讨论】:

    • 非常感谢,GROUP BY layer 是真正缺少的!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-09
    相关资源
    最近更新 更多