osmc:Metodologia/Algoritmo SQL/Lib: mudanças entre as edições

m
rev agg
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  string_agg(( substring(x,i,1)||substring(y,i,1) )::text,'')::varbit
   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 ===
2 357

edições