6 | | -- Function: ST_Cardinal_Direction(azimuth float8) |
7 | | -- Returns N, NW, W, SW, S, SE, E, or NE from an azimuth direction |
8 | | -- By: Mike Toews |
9 | | -- |
10 | | -- Usage: |
11 | | -- postgis=# SELECT ST_Cardinal_Direction( |
12 | | -- postgis(# ST_Azimuth('POINT(3 5)', 'POINT(5 5)')); |
13 | | -- st_cardinal_direction |
14 | | -- ----------------------- |
15 | | -- E |
16 | | -- (1 row) |
17 | | -- |
18 | | -- DROP FUNCTION ST_Cardinal_Direction(float8); |
| 6 | CREATE OR REPLACE FUNCTION ST_CardinalDirection(azimuth float8) RETURNS character varying AS |
| 7 | $BODY$SELECT CASE |
| 8 | WHEN $1 < 0.0 THEN 'less than 0' |
| 9 | WHEN degrees($1) < 22.5 THEN 'N' |
| 10 | WHEN degrees($1) < 67.5 THEN 'NE' |
| 11 | WHEN degrees($1) < 112.5 THEN 'E' |
| 12 | WHEN degrees($1) < 157.5 THEN 'SE' |
| 13 | WHEN degrees($1) < 202.5 THEN 'S' |
| 14 | WHEN degrees($1) < 247.5 THEN 'SW' |
| 15 | WHEN degrees($1) < 292.5 THEN 'W' |
| 16 | WHEN degrees($1) < 337.5 THEN 'NW' |
| 17 | WHEN degrees($1) <= 360.0 THEN 'N' |
| 18 | END;$BODY$ LANGUAGE sql IMMUTABLE COST 100; |
| 19 | COMMENT ON FUNCTION ST_CardinalDirection(float8) IS 'input azimuth in radians; returns N, NW, W, SW, S, SE, E, or NE'; |
| 20 | }}} |
20 | | CREATE OR REPLACE FUNCTION ST_Cardinal_Direction(azimuth float8) |
21 | | RETURNS character varying AS |
22 | | $BODY$SELECT CASE |
23 | | WHEN $1 < 0.0 THEN 'less than 0' |
24 | | WHEN $1*180/pi() < 22.5 THEN 'N' |
25 | | WHEN $1*180/pi() < 67.5 THEN 'NE' |
26 | | WHEN $1*180/pi() < 112.5 THEN 'E' |
27 | | WHEN $1*180/pi() < 157.5 THEN 'SE' |
28 | | WHEN $1*180/pi() < 202.5 THEN 'S' |
29 | | WHEN $1*180/pi() < 247.5 THEN 'SW' |
30 | | WHEN $1*180/pi() < 292.5 THEN 'W' |
31 | | WHEN $1*180/pi() < 337.5 THEN 'NW' |
32 | | WHEN $1*180/pi() <= 360.0 THEN 'N' |
33 | | END;$BODY$ LANGUAGE sql IMMUTABLE COST 100; |
34 | | COMMENT ON FUNCTION ST_Cardinal_Direction(float8) IS 'input azimuth in radians; returns N, NW, W, SW, S, SE, E, or NE'; |
| 22 | Example: |
| 23 | {{{ |
| 24 | SELECT |
| 25 | degrees(ST_Azimuth(origin, pt)) AS azimuth_in_degrees, |
| 26 | ST_CardinalDirection(ST_Azimuth(origin, pt)) |
| 27 | FROM ( |
| 28 | SELECT |
| 29 | 'POINT(0 0)'::geometry AS origin, |
| 30 | ST_MakePoint(cos(radians(x)), sin(radians(x))) AS pt |
| 31 | FROM generate_series(0, 365, 15) AS x |
| 32 | ) AS f; |
| 33 | |
| 34 | azimuth_in_degrees | st_cardinaldirection |
| 35 | -----------------------+---------------------- |
| 36 | 90 | E |
| 37 | 75 | E |
| 38 | 60 | NE |
| 39 | 45 | NE |
| 40 | 30 | NE |
| 41 | 15 | N |
| 42 | 3.50835464926744e-015 | N |
| 43 | 345 | N |
| 44 | 330 | NW |
| 45 | 315 | NW |
| 46 | 300 | NW |
| 47 | 285 | W |
| 48 | 270 | W |
| 49 | 255 | W |
| 50 | 240 | SW |
| 51 | 225 | SW |
| 52 | 210 | SW |
| 53 | 195 | S |
| 54 | 180 | S |
| 55 | 165 | S |
| 56 | 150 | SE |
| 57 | 135 | SE |
| 58 | 120 | SE |
| 59 | 105 | E |
| 60 | 90 | E |
| 61 | (25 rows) |