3 -- clname(): Returnerer navnet på det nærmeste veipunktet i wayp.
4 CREATE OR REPLACE FUNCTION clname(point) RETURNS text -- {{{
12 WHERE ($1 <-> coor) < 0.05
19 -- cldist(): Returnerer avstanden (i grader) til det nærmeste veipunktet i wayp.
20 CREATE OR REPLACE FUNCTION cldist(point) RETURNS numeric -- {{{
22 SELECT round(avs::numeric, 5) FROM (
27 WHERE ($1 <-> coor) < 0.05
31 $$ LANGUAGE SQL; -- }}}
33 -- findpos(): Beregn koordinater for et tidspunkt som ligger mellom to trackpunkter.
34 CREATE OR REPLACE FUNCTION findpos(currtime timestamptz) RETURNS point AS $$ -- {{{
36 firstdate timestamptz;
38 firsttime timestamptz;
45 SELECT INTO firstdate date
49 SELECT INTO lastdate date
53 IF currtime < firstdate OR currtime > lastdate THEN
57 SELECT INTO firsttime date
59 WHERE date <= currtime
62 SELECT INTO firstcoor coor
64 WHERE date <= currtime
67 SELECT INTO lasttime date
69 WHERE date >= currtime
72 SELECT INTO lastcoor coor
74 WHERE date >= currtime
78 IF firsttime = lasttime THEN
82 currlat = firstcoor[0] +
85 lastcoor[0] - firstcoor[0]
89 extract(EPOCH FROM currtime) - extract(EPOCH FROM firsttime)
93 extract(EPOCH FROM lasttime) - extract(EPOCH FROM firsttime)
97 currlon = firstcoor[1] +
100 lastcoor[1] - firstcoor[1]
104 extract(EPOCH FROM currtime) - extract(EPOCH FROM firsttime)
108 extract(EPOCH FROM lasttime) - extract(EPOCH FROM firsttime)
112 RETURN(currlat, currlon);
114 $$ LANGUAGE plpgsql; -- }}}
116 -- wherepos(): Returnerer en streng med dato, posisjon, nærmeste navn og avstand til nærmeste punkt.
117 CREATE OR REPLACE FUNCTION wherepos(currtime timestamptz) RETURNS text AS $$ -- {{{
122 currlat numeric(9, 6);
123 currlon numeric(9, 6);
125 currpos = findpos(currtime);
126 currlat = currpos[0];
127 currlon = currpos[1];
128 currsted = clname(currpos);
129 currdist = cldist(currpos);
130 RETURN(currtime || ' - ' || currlat::text || ' ' || currlon::text || ' - ' || currsted || ' - ' || currdist);
132 $$ LANGUAGE plpgsql; -- }}}
134 -- loop_wayp_new(): Loop gjennom alle entryene i wayp_new og legg dem inn i systemet.
135 CREATE OR REPLACE FUNCTION loop_wayp_new() RETURNS void AS $$ -- {{{
140 UPDATE wayp_new SET coor = point(
141 round(coor[0]::numeric, 6),
142 round(coor[1]::numeric, 6)
145 curr_id = (SELECT id FROM wayp_new ORDER BY id LIMIT 1);
146 IF curr_id IS NOT NULL THEN
147 RAISE NOTICE 'curr_id er ikke null: %', curr_id;
148 currpoint = (SELECT coor FROM wayp_new WHERE id = curr_id);
149 IF (SELECT coor FROM wayp WHERE coor[0] = currpoint[0] AND coor[1] = currpoint[1] LIMIT 1) IS NOT NULL THEN
150 RAISE NOTICE '% finnes allerede i wayp', currpoint;
151 INSERT INTO wayp_rej SELECT * FROM wayp_new WHERE id = curr_id;
153 RAISE NOTICE '% er ikke i wayp', currpoint;
154 INSERT INTO wayp SELECT * FROM wayp_new WHERE id = curr_id;
156 DELETE FROM wayp_new WHERE id = curr_id;
158 RAISE NOTICE 'curr_id er null';
163 $$ LANGUAGE plpgsql; -- }}}
165 -- update_trackpoint(): Oppdater alle feltene i en viss omkrets av punktet som spesifiseres.
166 CREATE OR REPLACE FUNCTION update_trackpoint(currpoint point) RETURNS void AS $$ -- {{{
168 RAISE NOTICE 'starter update_trackpoint(%), %', currpoint, clname(currpoint);
169 UPDATE logg SET sted = clname(coor), dist = cldist(coor)
170 WHERE ($1 <-> coor) < 0.05;
171 RAISE NOTICE 'update_trackpoint(%) er ferdig', currpoint;
176 -- secmidnight(): Returnerer antall sekunder sia midnatt for en dato.
177 CREATE OR REPLACE FUNCTION secmidnight(timestamptz) RETURNS double precision -- {{{
179 SELECT extract(HOUR FROM $1) * 3600 + extract(MINUTE FROM $1) * 60 + extract(SECOND FROM $1);
180 $$ LANGUAGE SQL; -- }}}