|
| 1 | +-- Lightweight demo functions that do not depend on external datasets |
| 2 | +CREATE SCHEMA IF NOT EXISTS postgisftw; |
| 3 | + |
| 4 | +-- us_grid with id |
| 5 | +CREATE OR REPLACE FUNCTION postgisftw.us_grid( |
| 6 | + num_x integer DEFAULT 10, |
| 7 | + num_y integer DEFAULT 10) |
| 8 | +RETURNS TABLE(id text, geom geometry) |
| 9 | +AS $$ |
| 10 | +DECLARE |
| 11 | + lon_min CONSTANT numeric := -128; |
| 12 | + lon_max CONSTANT numeric := -64; |
| 13 | + lat_min CONSTANT numeric := 24; |
| 14 | + lat_max CONSTANT numeric := 49; |
| 15 | + dlon numeric; |
| 16 | + dlat numeric; |
| 17 | +BEGIN |
| 18 | + dlon := (lon_max - lon_min) / num_x; |
| 19 | + dlat := (lat_max - lat_min) / num_y; |
| 20 | + RETURN QUERY |
| 21 | + SELECT |
| 22 | + x.x::text || '_' || y.y::text AS fid, |
| 23 | + ST_MakeEnvelope( |
| 24 | + lon_min + (x.x - 1) * dlon, lat_min + (y.y - 1) * dlat, |
| 25 | + lon_min + x.x * dlon, lat_min + y.y * dlat, 4326 |
| 26 | + ) AS geom |
| 27 | + FROM generate_series(1, num_x) AS x(x) |
| 28 | + CROSS JOIN generate_series(1, num_y) AS y(y); |
| 29 | +END; |
| 30 | +$$ LANGUAGE plpgsql STABLE STRICT; |
| 31 | + |
| 32 | +COMMENT ON FUNCTION postgisftw.us_grid IS 'Generates a grid of rectangles covering the USA'; |
| 33 | + |
| 34 | +-- us_grid without id |
| 35 | +CREATE OR REPLACE FUNCTION postgisftw.us_grid_noid( |
| 36 | + num_x integer DEFAULT 10, |
| 37 | + num_y integer DEFAULT 10) |
| 38 | +RETURNS TABLE(geom geometry) |
| 39 | +AS $$ |
| 40 | +DECLARE |
| 41 | + lon_min CONSTANT numeric := -128; |
| 42 | + lon_max CONSTANT numeric := -64; |
| 43 | + lat_min CONSTANT numeric := 24; |
| 44 | + lat_max CONSTANT numeric := 49; |
| 45 | + dlon numeric; |
| 46 | + dlat numeric; |
| 47 | +BEGIN |
| 48 | + dlon := (lon_max - lon_min) / num_x; |
| 49 | + dlat := (lat_max - lat_min) / num_y; |
| 50 | + RETURN QUERY |
| 51 | + SELECT |
| 52 | + ST_MakeEnvelope( |
| 53 | + lon_min + (x.x - 1) * dlon, lat_min + (y.y - 1) * dlat, |
| 54 | + lon_min + x.x * dlon, lat_min + y.y * dlat, 4326 |
| 55 | + ) AS geom |
| 56 | + FROM generate_series(1, num_x) AS x(x) |
| 57 | + CROSS JOIN generate_series(1, num_y) AS y(y); |
| 58 | +END; |
| 59 | +$$ LANGUAGE plpgsql STABLE STRICT; |
| 60 | + |
| 61 | +-- geo_grid over arbitrary extent |
| 62 | +CREATE OR REPLACE FUNCTION postgisftw.geo_grid( |
| 63 | + num_x integer DEFAULT 10, |
| 64 | + num_y integer DEFAULT 10, |
| 65 | + lon_min numeric DEFAULT -180.0, |
| 66 | + lat_min numeric DEFAULT -90.0, |
| 67 | + lon_max numeric DEFAULT 180.0, |
| 68 | + lat_max numeric DEFAULT 90.0) |
| 69 | +RETURNS TABLE(id text, geom geometry) |
| 70 | +AS $$ |
| 71 | +DECLARE |
| 72 | + dlon numeric; |
| 73 | + dlat numeric; |
| 74 | +BEGIN |
| 75 | + dlon := (lon_max - lon_min) / num_x; |
| 76 | + dlat := (lat_max - lat_min) / num_y; |
| 77 | + RETURN QUERY |
| 78 | + SELECT |
| 79 | + x.x::text || '_' || y.y::text AS id, |
| 80 | + ST_MakeEnvelope( |
| 81 | + lon_min + (x.x - 1) * dlon, lat_min + (y.y - 1) * dlat, |
| 82 | + lon_min + x.x * dlon, lat_min + y.y * dlat, 4326 |
| 83 | + ) AS geom |
| 84 | + FROM generate_series(1, num_x) AS x(x) |
| 85 | + CROSS JOIN generate_series(1, num_y) AS y(y); |
| 86 | +END; |
| 87 | +$$ LANGUAGE plpgsql IMMUTABLE STRICT; |
| 88 | + |
| 89 | +COMMENT ON FUNCTION postgisftw.geo_grid IS 'Generates a grid of rectangles over a geographic extent'; |
| 90 | + |
| 91 | +-- Simple buffer function (no external deps) |
| 92 | +CREATE OR REPLACE FUNCTION postgisftw.buffer( |
| 93 | + input geometry DEFAULT 'POINT(0 0)'::geometry, |
| 94 | + dist numeric DEFAULT 10) |
| 95 | +RETURNS TABLE(geom geometry) |
| 96 | +AS $$ |
| 97 | +BEGIN |
| 98 | + RETURN QUERY SELECT ST_Buffer(ST_SetSRID(input, 4326), dist) AS geom; |
| 99 | +END; |
| 100 | +$$ LANGUAGE plpgsql STABLE STRICT; |
| 101 | + |
0 commit comments