SHOW:
|
|
- or go back to the newest paste.
1 | CREATE OR replace FUNCTION left_shift( p_val INT8, | |
2 | p_shift INT8) returns int8 | |
3 | AS | |
4 | $$ | |
5 | DECLARE | |
6 | BEGIN | |
7 | RETURN trunc(p_val * power(2,p_shift)); | |
8 | END; | |
9 | $$ LANGUAGE 'plpgsql' immutable; | |
10 | ||
11 | CREATE OR replace FUNCTION morton (p_col INT8, | |
12 | p_row INT8) returns int8 | |
13 | AS | |
14 | $$ | |
15 | /* this procedure calculates the Morton number of a cell | |
16 | at the given row and col[umn] | |
17 | Written: D.M. Mark, Jan 1984; | |
18 | Converted to Vax/VMS: July 1985 | |
19 | Converted to PostgreSQL, Simon Greener, 2010 | |
20 | */ | |
21 | DECLARE | |
22 | v_row int8 := 0; | |
23 | v_col int8 := 0; | |
24 | v_key int8; | |
25 | v_level int8; | |
26 | v_left_bit int8; | |
27 | v_right_bit int8; | |
28 | v_quadrant int8; | |
29 | BEGIN | |
30 | v_row := p_row; | |
31 | v_col := p_col; | |
32 | v_key := 0; | |
33 | v_level := 0; | |
34 | WHILE ((v_row>0) | |
35 | OR | |
36 | ( | |
37 | v_col>0 | |
38 | ) | |
39 | ) | |
40 | LOOP | |
41 | /* Split off the row (left_bit) and column (right_bit) bits and | |
42 | then combine them to form a bit-pair representing the quadrant */ | |
43 | v_left_bit := v_row % 2; | |
44 | v_right_bit := v_col % 2; | |
45 | v_quadrant := v_right_bit + 2*v_left_bit; | |
46 | v_key := v_key + left_shift( v_quadrant,( 2 * v_level ) ); | |
47 | /* row, column, and level are then modified before the loop continues */ | |
48 | v_row := v_row / 2; | |
49 | v_col := v_col / 2; | |
50 | v_level := v_level + 1; | |
51 | END LOOP; | |
52 | RETURN (v_key); | |
53 | END; | |
54 | $$ LANGUAGE 'plpgsql' immutable; |