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