功能同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 | 圖層名稱。預設為字串 |
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)