Ir para o conteúdo

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

m
→‎Core: de XY para YX e outros ajustes nos nomes de função
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.xyS_collapseTo_ijS(int,int,int,boolean);
drop FUNCTION if exists grid_br.yxS_collapseTo_ijS(int,int,int,boolean);
drop FUNCTION if exists grid_br.xyL_collapseTo_ijL(int,int,int,boolean);
drop FUNCTION if exists grid_br.yxL_collapseTo_ijL(int[]);


CREATE FUNCTION grid_br.xyS_collapseTo_ijS(y int, x int, s int default 1048576, is_half boolean default false) RETURNS int[] AS $f$
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.xyL_collapseTo_ijL(y int, x int, intlevel int default 0) RETURNS int[] AS $f$
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) ) t(ijS)
   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>


'''Construtores de geometria''':
'''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)
;
;
DROP  FUNCTION if exists grid_br.xyS_draw_anycell(int[])
CREATE FUNCTION grid_br.yxS_draw_anycell(
;
CREATE FUNCTION grid_br.xyS_draw_anycell(
   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.'
;
;
CREATE FUNCTION grid_br.xyS_draw_anycell(int[]) RETURNS geometry AS $wrap$
  SELECT grid_br.xyS_draw_anycell($1[1],$1[2],$1[3])
$wrap$ LANGUAGE SQL IMMUTABLE;
</syntaxhighlight>
</syntaxhighlight>


2 384

edições