From 66aac0c5298d0a54d0b6b7b522c2a5f557955455 Mon Sep 17 00:00:00 2001 From: Felix Delattre <fd@gfz-potsdam.de> Date: Thu, 28 Apr 2022 10:00:14 +0000 Subject: [PATCH] Added function for visualization of gde_tiles --- migrations/00013_vector_tiles_functions.sql | 76 +++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 migrations/00013_vector_tiles_functions.sql diff --git a/migrations/00013_vector_tiles_functions.sql b/migrations/00013_vector_tiles_functions.sql new file mode 100644 index 0000000..0b91b13 --- /dev/null +++ b/migrations/00013_vector_tiles_functions.sql @@ -0,0 +1,76 @@ +---- 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; -- GitLab