Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- * Creates a star with given parameters (an optimized version exists).
- *
- * Needs both PostgreSQL and Postgis.
- *
- * Please contact jansen (at) terrestris (dot) de when you use this function.
- *
- * @language PL/PGSQL
- * @see selectoid.wordpress.com
- * @license MIT, http://www.opensource.org/licenses/mit-license.php
- * @copyright 2008, M. Jansen jansen (at) terrestris (dot) de
- */
- CREATE OR REPLACE FUNCTION ST_StarAtPoint(
- IN point geometry,
- IN inner_radius NUMERIC,
- IN outer_radius NUMERIC,
- IN number_of_spikes INTEGER,
- IN additional_rotation_degrees NUMERIC
- ) RETURNS GEOMETRY AS
- $body$
- DECLARE
- star_geometry_wkt text := '';
- i INTEGER := 0;
- angle NUMERIC;
- additional_rotation_angle NUMERIC;
- baseline_inner geometry;
- baseline_outer geometry;
- rotation_point geometry := 'POINT(0 0)'::geometry;
- BEGIN
- IF (inner_radius > outer_radius) THEN
- RAISE EXCEPTION 'Inner radius must not be greater than outer radius.';
- END IF;
- IF (number_of_spikes < 3) THEN
- RAISE EXCEPTION 'A star must have at least three corners.';
- END IF;
- angle = radians(360/number_of_spikes);
- additional_rotation_angle = radians(additional_rotation_degrees);
- baseline_outer = ST_RotateZ(ST_MakeLine(rotation_point, ST_MakePoint(ST_X(rotation_point), ST_Y(rotation_point) + outer_radius)), additional_rotation_angle);
- baseline_inner = ST_RotateZ(ST_MakeLine(rotation_point, ST_MakePoint(ST_X(rotation_point), ST_Y(rotation_point) + inner_radius)), additional_rotation_angle + (angle/2));
- WHILE (i < number_of_spikes) LOOP
- star_geometry_wkt = star_geometry_wkt || (ST_X(ST_EndPoint(ST_RotateZ(baseline_outer, angle * i))) + ST_X(point)) || ' ' || ST_Y(ST_EndPoint(ST_RotateZ(baseline_outer, angle * i))) + ST_Y(point) || ',';
- star_geometry_wkt = star_geometry_wkt || (ST_X(ST_EndPoint(ST_RotateZ(baseline_inner, angle * i))) + ST_X(point)) || ' ' || ST_Y(ST_EndPoint(ST_RotateZ(baseline_inner, angle * i))) + ST_Y(point) || ',';
- i = i + 1;
- END LOOP;
- star_geometry_wkt = star_geometry_wkt || (ST_X(ST_EndPoint(baseline_outer)) + ST_X(point)) || ' ' || (ST_Y(ST_EndPoint(baseline_outer)) + ST_Y(point));
- star_geometry_wkt = 'POLYGON((' || star_geometry_wkt || '))';
- RETURN star_geometry_wkt::geometry;
- END;
- $body$
- LANGUAGE plpgsql;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement