2 357
edições
m (rev agg) |
|||
Linha 123: | Linha 123: | ||
drop function if exists vbit_DeInterleave; | drop function if exists vbit_DeInterleave; | ||
; | DROP AGGREGATE if exists bitcat_agg(varbit); | ||
CREATE AGGREGATE bitcat_agg(varbit) ( | |||
STYPE = varbit | |||
,SFUNC = bitcat -- \do+ "||" | |||
); | |||
CREATE FUNCTION vbit_to_int(x varbit) returns int as $f$ | CREATE FUNCTION vbit_to_int(x varbit) returns int as $f$ | ||
SELECT ( substring(0::bit(32),bit_length(x)+1) || x )::bit(32)::int | SELECT ( substring(0::bit(32),bit_length(x)+1) || x )::bit(32)::int | ||
Linha 137: | Linha 142: | ||
CREATE FUNCTION vbit_interleave(x varbit, y varbit) returns varbit as $f$ | CREATE FUNCTION vbit_interleave(x varbit, y varbit) returns varbit as $f$ | ||
SELECT | SELECT bitcat_agg( substring(x,i,1) || substring(y,i,1) ) | ||
FROM generate_series(1,bit_length(x)) t(i) | FROM generate_series(1,bit_length(x)) t(i) | ||
$f$ LANGUAGE SQL IMMUTABLE; | $f$ LANGUAGE SQL IMMUTABLE; | ||
Linha 162: | Linha 167: | ||
Cada célula da cobertura ''L0'' já tem seu código de 4 bits (dígito hexadecimal), em seguida qualquer outra célula de qualquer nível hierárquico terá um código ''cbits'' do nível ''L'' com ''L*2'' bits obtidos das coordenadas IJ através da função <code>ints_to_interleavedbits(i,j)</code>. O tamanho de lado da célula do nível ''L'', no caso do Brasil, será <math>2^{20-L}</math> metros. A célula de 1 m é justamente a célula do nível ''L20'', portanto terá <math>20*2=40</math> bits de comprimento, concatenados aos 4 bits de L0 e ao prefixo do país. | Cada célula da cobertura ''L0'' já tem seu código de 4 bits (dígito hexadecimal), em seguida qualquer outra célula de qualquer nível hierárquico terá um código ''cbits'' do nível ''L'' com ''L*2'' bits obtidos das coordenadas IJ através da função <code>ints_to_interleavedbits(i,j)</code>. O tamanho de lado da célula do nível ''L'', no caso do Brasil, será <math>2^{20-L}</math> metros. A célula de 1 m é justamente a célula do nível ''L20'', portanto terá <math>20*2=40</math> bits de comprimento, concatenados aos 4 bits de L0 e ao prefixo do país. | ||
A degeneração geométrica, de quadrado para retângulo, é relativa ao segundo argumento de <code>vbit_interleave(x,y)</code>. Como a função é sempre chamada com a mesma ordem dos argumentos, sempre teremos ou só retangulos orizontais (XY) ou só verticais (YX). | |||
=== Algoritmo e funções finais de resolução === | === Algoritmo e funções finais de resolução === |
edições