我在Postgres 12中具有一个plpgsql函数,该函数返回SETOF bytea
,然后在服务器上将其制成单个bytea
:
CREATE OR REPLACE FUNCTION public.get_tile(z integer, x integer, y integer)
RETURNS SETOF bytea
LANGUAGE plpgsql
STABLE PARALLEL SAFE
AS $function$
BEGIN
RETURN QUERY EXECUTE FORMAT('
WITH bounds AS (
SELECT ST_TileEnvelope(%s, %s, %s) AS geom
)
SELECT
ST_AsMVT(mvtgeom, ''lyr_'' || layer_id, 4096, ''geom'', ''feature_id'')
FROM (
SELECT
ST_AsMVTGeom(t.geom, bounds.geom, 4096, 0) AS geom,
id AS feature_id,
layer_id
FROM my_geom_table t, bounds
WHERE ST_Intersects(t.geom, bounds.geom)
) mvtgeom
GROUP BY layer_id',
z, x, y
);
END;
$function$;
有人告诉我,如果在查询中进行串联,则该过程可能会更高效。我知道bytea
可以与||
串联,但是我不知道如何将SETOF bytea
串联成一个。
顺便说一句,多行的原因是给每一层正确的名称('lyr' || layer_id
,这是几何图形表上的列)。
是否可以更新此功能以返回一行,其中包含每一层的所有图块数据?
[string_agg(expression, delimiter)
也可以聚合string_agg(expression, delimiter)
。