H3_ToChildren - Amazon Redshift

O Amazon Redshift não permitirá mais a criação de funções definidas pelo usuário (UDFs) do Python a partir de 1.º de novembro de 2025. Se quiser usar UDFs do Python, você deve criá-las antes dessa data. As UDFs do Python existentes continuarão a funcionar normalmente. Para ter mais informações, consulte a publicação de blog .

H3_ToChildren

H3_toChildren exibe uma lista de IDs de células H3 filhas em uma resolução especificada para determinado índice H3. Para obter informações sobre a indexação H3, consulte H3.

Sintaxe

H3_ToChildren(index, resolution)

Argumentos

Índice do

Um valor de tipo de dados BIGINT ou VARCHAR que representa o índice de uma célula H3, ou uma expressão que determina o valor de um desses tipos de dados.

resolução

Um valor do tipo de dados INTEGER ou uma expressão avaliada como um tipo INTEGER. O valor representa a resolução dos IDs de células filhas. O valor deve ser um número inteiro entre a resolução do índice de entrada e 15, inclusive.

Tipo de retorno

SUPER: representa uma lista de IDs de células H3.

Se o índice ou a resolução forem NULL, então NULL será exibido.

Se o índice for inválido, será retornado um erro.

Se a resolução não estiver entre a resolução do índice e 15, inclusive, um erro será exibido.

Se o tamanho de saída exceder o limite máximo de tamanho SUPER, um erro será exibido.

Exemplos

O comando SQL a seguir insere um VARCHAR que representa o índice de uma célula H3 e um INTEGER que representa a resolução desejada de todos os filhos e exibe uma matriz SUPER contendo os filhos na resolução 6.

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

O comando SQL a seguir insere um BIGINT que representa o índice de uma célula H3 e um INTEGER que representa a resolução desejada de todos os filhos e exibe uma matriz SUPER contendo os filhos na resolução 6.

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

Observação: uma diferença de 7 ou menos entre a resolução e a resolução do índice é segura.

O exemplo a seguir demonstra uma solução alternativa para consultas que excedem o limite de tamanho SUPER. Quando a diferença de resolução entre o índice H3 de entrada e a resolução filha desejada é muito grande (maior que 7). Esse procedimento resolve o problema expandindo gradualmente os filhos em etapas menores (máximo de cinco níveis de resolução por vez) e armazenando os resultados finais em uma tabela criada pelo usuário.

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;