功能同ST_AsMVT,但是相较于ST_AsMVT,基于不同矢量要素之间的关系,过滤对显示效果影响较小的矢量要素,从而减小MVT大小,提升可视化效率。过滤的效果由新增参数scale_factor控制。新增参数 mvt_size_limit,限制一个MVT可以包含的矢量要素上限。

语法

bytea ST_AsMVTEx(anyelement row);
bytea ST_AsMVTEx(anyelement row, int4 scale_factor);
bytea ST_AsMVTEx(anyelement row, int4 scale_factor, int4 mvt_size_limit);
bytea ST_AsMVTEx(anyelement row, int4 scale_factor, int4 mvt_size_limit, text name);
bytea ST_AsMVTEx(anyelement row, int4 scale_factor, int4 mvt_size_limit, text name, int4 extent);
bytea ST_AsMVTEx(anyelement row, int4 scale_factor, int4 mvt_size_limit, text name, int4 extent, text geom_name);
bytea ST_AsMVTEx(anyelement row, int4 scale_factor, int4 mvt_size_limit, text name, int4 extent, text geom_name, text feature_id_name);

返回值

返回一个表示图层瓦片的二进制MVT数据,瓦片的内容是由row集合确定。

参数

参数名称

描述

row

至少包含一个几何列的行数据。

scale_factor

控制过滤效果的参数,参数值越大,则有越多矢量要素被过滤,生成的MVT越小。

取值范围:1~extent-1,默认值为1。

mvt_size_limit

生成的MVT包含的矢量要素数目上限。超出上限的矢量要素则会被丢弃。

默认值为INTEGER最大值,即2147483647。

name

图层名称。默认为字符串default

extent

规范定义的屏幕空间中的切片范围。默认值为4096。

geom_name

行数据中几何列的名称。默认为第一个几何列。

feature_id_name

行数据中功能ID列的名称。如果为NULL或负数,则不设置功能ID。匹配名称和有效类型(smallint、integer、bigint)的第一列将用作功能ID,任何后续列将添加为属性。不支持JSON属性。

描述

  • 功能同ST_AsMVT,但是通过过滤对显示效果影响较小的矢量要素来减小MVT的大小,可提升可视化效率,过滤效果由参数scale_factor决定,scale_factor的取值范围为1~extent-1,值越大,过滤效果越明显。

  • 参数mvt_size_limit限制MVT包含的矢量要素上限。若经过上述过滤后,矢量要素的数目大于mvt_size_limit,则会随机选取多余的矢量要素丢弃。

  • 若参数extent的值非常大,对性能会有影响。

  • 不适合面积普遍很大的面数据集。

示例

-- 创建矢量数据表,并插入一个面数据、一个线数据、9998个点数据
CREATE TABLE example_table(id integer, geom Geometry);
INSERT INTO example_table(id, geom) VALUES
  (1, ST_MakeEnvelope(150, 75, 170, 80, 4326));
INSERT INTO example_table(id, geom) VALUES
  (2, ST_GeomFromText('LINESTRING(-160 -70, 160 -70)', 4326));
INSERT INTO example_table(id, geom)
SELECT i,
  ST_SetSRID(ST_MakePoint((random() * 20) + 150, (random() * 10) + 70), 4326)
FROM generate_series(3, 10000) i;

-- 使用scale_factor=1
WITH mvtgeom AS
(
      SELECT ST_AsMVTGeom(geom, ST_Transform(ST_TileEnvelope(1, 1, 0), 4326)) FROM example_table
      WHERE geom && ST_Transform(ST_TileEnvelope(1, 1, 0), 4326)
)
SELECT length(ST_AsMVTEx(mvtgeom.*, 1)) FROM mvtgeom;

length
-------
  54237
(1 row)

-- 使用scale_factor=4
WITH mvtgeom AS
(
      SELECT ST_AsMVTGeom(geom, ST_Transform(ST_TileEnvelope(1, 1, 0), 4326)) FROM example_table
      WHERE geom && ST_Transform(ST_TileEnvelope(1, 1, 0), 4326)
)
SELECT length(ST_AsMVTEx(mvtgeom.*, 4)) FROM mvtgeom;

length
-------
  39211
(1 row)

-- 使用scale_factor=4, 限制MVT包含的矢量数据数目上限为100
WITH mvtgeom AS
(
      SELECT ST_AsMVTGeom(geom, ST_Transform(ST_TileEnvelope(1, 1, 0), 4326)) FROM example_table
      WHERE geom && ST_Transform(ST_TileEnvelope(1, 1, 0), 4326)
)
SELECT length(ST_AsMVTEx(mvtgeom.*, 4, 100)) FROM mvtgeom;

length
-------
  1117
(1 row)

-- 使用scale_factor=4, 限制MVT包含的矢量数据数目上限为100,设置瓦片分辨率为10000*10000,定义图层名为'layer_name'
WITH mvtgeom AS
(
      SELECT ST_AsMVTGeom(geom, ST_Transform(ST_TileEnvelope(1, 1, 0), 4326), 10000) FROM example_table
      WHERE geom && ST_Transform(ST_TileEnvelope(1, 1, 0), 4326)
)
SELECT length(ST_AsMVTEx(mvtgeom.*, 4, 100, 'layer_name', 10000)) FROM mvtgeom;

length
-------
  1220
(1 row)

-- 使用scale_factor=4, 限制MVT包含的矢量数据数目上限为100,设置瓦片分辨率为10000*10000,定义图层名为'layer_name'
-- 手动给出几何列和ID列的列名分别为'geom_field'和'id_field'
WITH mvtgeom AS
(
      SELECT ST_AsMVTGeom(geom, ST_Transform(ST_TileEnvelope(1, 1, 0), 4326), 10000) AS geom_field, id AS id_field FROM example_table
      WHERE geom && ST_Transform(ST_TileEnvelope(1, 1, 0), 4326)
)
SELECT length(ST_AsMVTEx(mvtgeom.*, 4, 100, 'layer_name', 10000, 'geom_field', 'id_field')) FROM mvtgeom;

length
-------
  1520
(1 row)