gpsfold: Remove $Id$ at EOF.
[gpstools.git] / branches / gpst.gpsman-format / postgres / create_funcs.sql
blob9bcf6e954da20ac3138e91ed02a63e6bd828c049
1 -- $Id$
3 -- Returnerer navnet på det nærmeste veipunktet i wayp.
4 CREATE OR REPLACE FUNCTION clname(point) RETURNS text
5 AS $$
6 SELECT name FROM (
7         SELECT
8             name,
9             ($1 <-> coor)
10             AS avs
11             FROM wayp
12             WHERE ($1 <-> coor) < 0.05
13             ORDER BY avs
14             LIMIT 1
15     ) AS s;
16 $$ LANGUAGE SQL;
18 -- Returnerer avstanden (i grader) til det nærmeste veipunktet i wayp.
19 CREATE OR REPLACE FUNCTION cldist(point) RETURNS numeric
20 AS $$
21 SELECT round(avs::numeric, 5) FROM (
22         SELECT
23             ($1 <-> coor)
24             AS avs
25             FROM wayp
26             WHERE ($1 <-> coor) < 0.05
27             ORDER BY avs
28             LIMIT 1
29     ) AS s;
30 $$ LANGUAGE SQL;
32 -- Beregn koordinater for et tidspunkt som ligger mellom to 
33 -- trackpunkter.
34 CREATE OR REPLACE FUNCTION findpos(currtime timestamptz) RETURNS point AS $$
35 DECLARE
36     firstdate timestamptz;
37     lastdate timestamptz;
38     firsttime timestamptz;
39     firstcoor point;
40     lasttime timestamptz;
41     lastcoor point;
42     currlat numeric;
43     currlon numeric;
44 BEGIN
45     -- RAISE NOTICE '-----------------------------------';
46     SELECT INTO firstdate date
47         FROM logg
48         ORDER BY date
49         LIMIT 1;
50     SELECT INTO lastdate date
51         FROM logg
52         ORDER BY date DESC
53         LIMIT 1;
54     IF currtime < firstdate OR currtime > lastdate THEN
55         return(NULL);
56     END IF;
58     SELECT INTO firsttime date
59         FROM logg
60         WHERE date <= currtime
61         ORDER BY date DESC
62         LIMIT 1;
63     SELECT INTO firstcoor coor
64         FROM logg
65         WHERE date <= currtime
66         ORDER BY date DESC
67         LIMIT 1;
68     SELECT INTO lasttime date
69         FROM logg
70         WHERE date >= currtime
71         ORDER BY date
72         LIMIT 1;
73     SELECT INTO lastcoor coor
74         FROM logg
75         WHERE date >= currtime
76         ORDER BY date
77         LIMIT 1;
78     -- RAISE NOTICE 'currtime = %', currtime;
79     -- RAISE NOTICE 'firsttime = %, firstcoor = %', firsttime, firstcoor;
80     -- RAISE NOTICE 'lasttime = %, lastcoor = %', lasttime, lastcoor;
82     IF firsttime = lasttime THEN
83         RETURN(firstcoor);
84     END IF;
86     currlat = firstcoor[0] + 
87     (
88         (
89             lastcoor[0]-firstcoor[0]
90         ) *
91         (
92             (
93                 EXTRACT(EPOCH FROM currtime)-EXTRACT(EPOCH FROM firsttime)
94             )
95             /
96             (
97                 EXTRACT(EPOCH FROM lasttime)-EXTRACT(EPOCH FROM firsttime)
98             )
99         )
100     );
101     currlon = firstcoor[1] + 
102     (
103         (
104             lastcoor[1]-firstcoor[1]
105         ) *
106         (
107             (
108                 EXTRACT(EPOCH FROM currtime)-EXTRACT(EPOCH FROM firsttime)
109             )
110             /
111             (
112                 EXTRACT(EPOCH FROM lasttime)-EXTRACT(EPOCH FROM firsttime)
113             )
114         )
115     );
116     -- RAISE NOTICE 'currcoor = (%,%)', currlat, currlon;
117     RETURN (currlat,currlon);
118 END;
119 $$ LANGUAGE plpgsql;
121 CREATE OR REPLACE FUNCTION wherepos(currtime timestamptz) RETURNS text AS $$
122 DECLARE
123     currpos point;
124     currsted text;
125     currdist numeric;
126     currlat numeric(9, 6);
127     currlon numeric(9, 6);
128 BEGIN
129     currpos = findpos(currtime);
130     currlat = currpos[0];
131     currlon = currpos[1];
132     currsted = clname(currpos);
133     currdist = cldist(currpos);
134     RETURN(currtime || ' - ' || currlat::text || ' ' || currlon::text || ' - ' || currsted || ' - ' || currdist);
135 END;
136 $$ LANGUAGE plpgsql;
138 -- Returnerer antall sekunder sia midnatt for en dato.
139 CREATE OR REPLACE FUNCTION secmidnight(timestamptz) RETURNS double precision
140 AS $$
141 SELECT extract(hour from $1) * 3600 + extract(minute from $1) * 60 + extract(second from $1);
142 $$ LANGUAGE SQL;