在 mvt 中获取单独的图层

问题描述 投票:0回答:1

我们的平台目前使用 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 新手,我不确定我是否做错或遗漏了什么任何建议都表示赞赏)

postgresql mapbox postgis mapbox-gl-js mapbox-gl
1个回答
4
投票
以下是

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 用作 
“源图层”

© www.soinside.com 2019 - 2024. All rights reserved.