2 402
edições
m (estrutura) |
m (→Core: de XY para YX e outros ajustes nos nomes de função) |
||
Linha 16: | Linha 16: | ||
<syntaxhighlight lang="sql" style="font-size: 80%;"> | <syntaxhighlight lang="sql" style="font-size: 80%;"> | ||
-- Core functions: | -- Core functions: | ||
drop FUNCTION if exists grid_br. | drop FUNCTION if exists grid_br.yxS_collapseTo_ijS(int,int,int,boolean); | ||
drop FUNCTION if exists grid_br. | drop FUNCTION if exists grid_br.yxL_collapseTo_ijL(int[]); | ||
CREATE FUNCTION grid_br. | CREATE FUNCTION grid_br.yxS_collapseTo_ijS(y int, x int, s int default 1048576, is_half boolean default false) RETURNS int[] AS $f$ | ||
SELECT array[ (y-6727000)/CASE WHEN is_half AND s>=2 THEN s/2 ELSE s END, (x-2715000)/s, s ] | SELECT array[ (y-6727000)/CASE WHEN is_half AND s>=2 THEN s/2 ELSE s END, (x-2715000)/s, s ] | ||
$f$ language SQL IMMUTABLE; | $f$ language SQL IMMUTABLE; | ||
CREATE FUNCTION grid_br. | CREATE FUNCTION grid_br.yxL_collapseTo_ijL(yxL int[]) RETURNS int[] AS $f$ | ||
SELECT array[ $ijS[1], $ijS[2], intlevel ] | SELECT array[ $ijS[1], $ijS[2], intlevel ] | ||
FROM ( SELECT grid_br.xyS_collapseTo_ijS($1, $2, (2^(20-intlevel/10.0))::int, (intlevel%2)=1) ) | FROM ( | ||
$f$ language SQL IMMUTABLE | SELECT grid_br.xyS_collapseTo_ijS( $1[1], $1[2], (2^(20-intlevel/10.0))::int, (intlevel%2)=1 ) AS ijS | ||
; | FROM ( SELECT COALESCE($1[3],0) ) t1(intlevel) | ||
) t2 | |||
$f$ language SQL IMMUTABLE; | |||
</syntaxhighlight> | </syntaxhighlight> | ||
''' | '''Construção da geometria''': | ||
Como vimos a referência é o ponto inferior esquerdo do contorno da célula, basta criar os demais 3 pontos de um quadrado. Na função abaixo a menor célula tem 1 metro pois necessitaria fração para menos que 1 m. | Como vimos a referência é o ponto inferior esquerdo do contorno da célula, basta criar os demais 3 pontos de um quadrado. Na função abaixo a menor célula tem 1 metro pois necessitaria fração para menos que 1 m. | ||
Linha 36: | Linha 38: | ||
DROP FUNCTION if exists grid_br.xyS_draw_anycell(int,int,int) | DROP FUNCTION if exists grid_br.xyS_draw_anycell(int,int,int) | ||
; | ; | ||
CREATE FUNCTION grid_br.yxS_draw_anycell( | |||
CREATE FUNCTION grid_br. | |||
y int, -- Yref | y int, -- Yref | ||
x int, -- Xref (XY=canto inferior esquerdo) | x int, -- Xref (XY=canto inferior esquerdo) | ||
Linha 51: | Linha 51: | ||
IS 'Draws a square-cell using the requested ref-point, with the requested side size.' | IS 'Draws a square-cell using the requested ref-point, with the requested side size.' | ||
; | ; | ||
</syntaxhighlight> | </syntaxhighlight> | ||
edições