H3_ToChildren - Amazon Redshift

Amazon Redshift dejará de admitir la creación de nuevas UDF de Python a partir del 1 de noviembre de 2025. Si desea utilizar las UDF de Python, créelas antes de esa fecha. Las UDF de Python existentes seguirán funcionando con normalidad. Para obtener más información, consulte la publicación del blog.

H3_ToChildren

H3_ToChildren devuelve una lista de los ID de las celdas H3 secundarias con una resolución específica para un índice H3 determinado. Para obtener más información acerca de la indexación H3, consulte H3.

Sintaxis

H3_ToChildren(index, resolution)

Argumentos

Índice de

Un valor de tipo de datos BIGINT o VARCHAR que representa el índice de una celda H3, o una expresión que toma el valor de uno de estos tipos de datos.

resolution

Es un valor de tipo de dato INTEGER o una expresión que toma el valor de un tipo INTEGER. El valor representa la resolución de los ID de celda secundarios. El valor debe ser un entero entre la resolución del índice de entrada y 15, ambos incluidos.

Tipo de retorno

SUPER: representa una lista de ID de celda H3.

Si el índice o la resolución son NULL, se devuelve NULL.

Si index no es válido, se devuelve un error.

Si la resolución no está entre la resolución del índice y 15, ambos inclusive, se devuelve un error.

Si el tamaño de salida supera el límite máximo de tamaño SUPER, se devuelve un error.

Ejemplos

El siguiente código SQL ingresa un valor VARCHAR que representa el índice de una celda H3 y un valor INTEGER que representa la resolución deseada de todos los elementos secundarios, y devuelve una matriz SUPER que contiene los secundarios en resolución 6.

SELECT H3_ToChildren('85283473fffffff', 6);
h3_tochildren -------------------------------------------------------------------------------------------------------------------------------------- [604189641121202175,604189641255419903,604189641389637631,604189641523855359,604189641658073087,604189641792290815,604189641926508543]

El siguiente código SQL ingresa un valor BIGINT que representa el índice de una celda H3 y un valor INTEGER que representa la resolución deseada de todos los elementos secundarios, y devuelve una matriz SUPER que contiene los secundarios en resolución 6.

SELECT H3_ToChildren(599686042433355775, 6);
h3_tochildren -------------------------------------------------------------------------------------------------------------------------------------- [604189641121202175,604189641255419903,604189641389637631,604189641523855359,604189641658073087,604189641792290815,604189641926508543]

Nota: Una diferencia de 7 o menos entre la resolución y la resolución del índice es segura.

En el ejemplo siguiente, se muestra una solución alternativa para las consultas que superan el límite de tamaño SUPER. Cuando la diferencia de resolución entre el índice H3 de entrada y la resolución secundaria deseada es demasiado grande (superior a 7). Este procedimiento resuelve el problema expandiendo gradualmente la secundaria en pasos más pequeños (máximo 5 niveles de resolución a la vez) y almacenando los resultados finales en una tabla creada por el usuario.

CREATE OR REPLACE PROCEDURE generate_h3_children() LANGUAGE plpgsql AS $$ BEGIN -- Drop and create h3_children table that will contain the results DROP TABLE IF EXISTS h3_children; CREATE TABLE h3_children ( h3_index BIGINT, child_res INTEGER, children SUPER ); -- Create temporary table for steps DROP TABLE IF EXISTS h3_steps; CREATE TABLE h3_steps ( h3_index BIGINT, current_res INTEGER, target_res INTEGER, h3_array SUPER ); -- Initial insert into h3_steps INSERT INTO h3_steps SELECT h3_index, H3_Resolution(h3_index), child_res, ARRAY(h3_index) FROM h3_indexes; -- Insert from your table with h3_index and child_res as columns -- Loop until we reach target resolution -- We expect at most 3 iterations considering that we can start at resolution -- 0 and target/child resolution equal to 15 (0 -> 5 -> 10 -> 15) WHILE EXISTS ( SELECT 1 FROM h3_steps h GROUP BY h3_index, target_res HAVING MAX(current_res) < target_res ) LOOP -- Populate the h3_steps table with the tables that need to -- reach closer to the target res INSERT INTO h3_steps SELECT h.h3_index, LEAST(h.current_res + 5, h.target_res), -- Do not exceed target res h.target_res, -- Take the children of the child cell at resolution current_res of the -- h3_index H3_ToChildren(c.child::BIGINT, LEAST(h.current_res + 5, h.target_res)) FROM h3_steps h, UNNEST(h.h3_array) AS c(child) WHERE h.current_res < h.target_res AND h.current_res = (SELECT MAX(current_res) FROM h3_steps WHERE h3_index = h.h3_index ); END LOOP; -- Store final results INSERT INTO h3_children SELECT h3_index AS h3_index, target_res AS child_res, h3_array AS children FROM h3_steps WHERE current_res = target_res; END; $$; -- Create the source table for H3_ToChildren queries CREATE TABLE h3_indexes ( h3_index BIGINT, child_res INTEGER, PRIMARY KEY (h3_index, child_res) ); INSERT INTO h3_indexes (h3_index, child_res) VALUES (x'8001fffffffffff'::BIGINT, 11); -- Execute the procedure CALL generate_h3_children(); -- View results SELECT * FROM h3_children;