Skip to content
Snippets Groups Projects

Added function for visualization of gde_tiles

Merged Felix Delattre requested to merge feature/add-function-gdetiles into master
1 file
+ 76
0
Compare changes
  • Side-by-side
  • Inline
---- Generates vector tiles with values from the `gde_tiles` database table.
CREATE OR REPLACE FUNCTION public.gde_tiles_visualization(
z INTEGER, x INTEGER, y INTEGER
)
RETURNS BYTEA AS
$$
DECLARE
vector_tile BYTEA DEFAULT '';
parent_quadkey TEXT;
inside_tiles INTEGER; -- Number of tiles at zoom level 18 on an axis of a tile with zoom level `z`.
inside_tile_pixels INTEGER;
BEGIN
IF z > 18 THEN
RAISE NOTICE 'Vector tiles cannot be be created for zoom levels higher than 18.';
ELSE
parent_quadkey = convert_xyz_to_quadkey(x, y, z);
inside_tiles = 2 ^ (18 - z);
inside_tile_pixels = 4096 / inside_tiles;
WITH mvtdata AS (
SELECT ST_MakeEnvelope(
inside_tile_pixels * tile_x, inside_tile_pixels * tile_y,
inside_tile_pixels * (tile_x + 1), inside_tile_pixels * (tile_y + 1)
) AS geom,
tiles.*
FROM
gde_tiles tiles,
generate_series(0, inside_tiles - 1) AS tile_x,
generate_series(0, inside_tiles - 1) AS tile_y
WHERE tiles.quadkey
= parent_quadkey || convert_xyz_to_quadkey(tile_x, tile_y, 18 - z)
)
SELECT ST_AsMVT(mvtdata.*, 'gde_tiles', 4096, 'geom')
FROM mvtdata INTO vector_tile;
END IF;
RETURN vector_tile;
END;
$$
LANGUAGE plpgsql STABLE PARALLEL SAFE;
---- Converts a tile identifier from the format x,y,z to a Quadkey.
CREATE OR REPLACE FUNCTION public.convert_xyz_to_quadkey(
x INTEGER, y INTEGER, z INTEGER
)
RETURNS TEXT AS
$$
DECLARE
quadkey TEXT;
quadkey_digit INTEGER;
rx INTEGER;
ry INTEGER;
BEGIN
FOR i IN 1..z LOOP
rx = x % 2;
x = x / 2;
ry = y % 2;
y = y / 2;
IF rx = 0 AND ry = 0 THEN
quadkey_digit = 0;
ELSIF rx = 1 AND ry = 0 THEN
quadkey_digit = 1;
ELSIF rx = 0 AND ry = 1 THEN
quadkey_digit = 2;
ELSIF rx = 1 AND ry = 1 THEN
quadkey_digit = 3;
ELSE
RAISE EXCEPTION 'Failure converting xyz to Quadkey';
END IF;
quadkey = CONCAT(CAST(quadkey_digit AS CHAR), quadkey);
END LOOP;
RETURN quadkey;
END;
$$
LANGUAGE plpgsql IMMUTABLE PARALLEL SAFE;
Loading