[postgis-users] How to add circle to Postgis database?
marco vieira
maovieira at gmail.com
Fri Mar 9 10:46:09 PST 2007
Thank's Bruce!
It is much better. I wrote this function a long time ago but it is still
useful.
2007/3/8, Bruce Rindahl <rindahl at lrcwe.com>:
>
> Ellipses can be made directly using Affine transformations. The idea is
> to create a circle (buffer), distort along the x & y axis (scale), rotate to
> the correct angle and then transform to the final location.
>
>
>
> To mimic your parameters an ellipse is
>
>
>
>
> translate(rotate(scale(buffer(makepoint('0','0'),1,slices/4),a,b),alpha),cx,cy)
>
>
>
> Note the buffer function has an optional parameter that defines the number
> of line segments for a quarter circle (thus the slices/4 – the default is 8)
>
> You can also rotate the ellipse thru an angle alpha (radians).
>
>
>
> The above should be much faster.
>
>
>
> Bruce Rindahl
>
>
> ------------------------------
>
> *From:* postgis-users-bounces at postgis.refractions.net [mailto:postgis-users-bounces at postgis.refractions.net]
> *On Behalf Of *marco vieira
> *Sent:* Thursday, March 08, 2007 5:54 AM
> *To:* PostGIS Users Discussion
> *Subject:* Re: [postgis-users] How to add circle to Postgis database?
>
>
>
> I wrote this function to draw ellipses (or circles) in PG.
> Feel free to make changes and send to the list.
>
> Parameters:
> cx,cy: Center of ellipse
> a: major semi-axis
> b: minor semi-axis
> slices: number of vertices of polygon that define the ellipse. As big as
> this value smoothed is the curve.
>
> -- Function: make_ellipse(cx float8, cy float8, a float8, b float8, slices
> float8)
>
> -- DROP FUNCTION make_ellipse(cx float8, cy float8, a float8, b float8,
> slices float8);
>
> CREATE OR REPLACE FUNCTION make_ellipse(cx float8, cy float8, a float8, b
> float8, slices float8)
> RETURNS geometry AS
> $BODY$
> declare
> cx alias for $1;
> cy alias for $2;
> a alias for $3;
> b alias for $4;
> slices alias for $5;
> i float;
> geom geometry;
> begin
> i := 0.0;
> execute 'create table tempo(ii float,the_geom geometry) with oids;';
> WHILE i < 2.0*pi() LOOP
> execute 'insert into tempo select
> '||i||'::float,makepoint('||cx+a*cos(i)||','||cy+b*sin(i)||');';
> i := i+2.0*pi()/slices;
> END LOOP;
> execute 'select setsrid(makepolygon(makeline(the_geom)),4170) from
> tempo;' into geom;
> execute 'drop table tempo;';
> return geom;
> end;
> $BODY$
> LANGUAGE 'plpgsql' VOLATILE;
> ALTER FUNCTION make_ellipse(cx float8, cy float8, a float8, b float8,
> slices float8) OWNER TO marco;
> GRANT EXECUTE ON FUNCTION make_ellipse(cx float8, cy float8, a float8, b
> float8, slices float8) TO public;
>
>
> 2007/3/7, Brent Wood <pcreso at pcreso.com >:
>
>
>
>
> OK, I've trimmed all the other content, but my request is slightly off the
> main
> subject.
>
> Does anyone have any comments/advice on what I am doing in this subject
> area?
> The discusison so far suggests I could usefully learm something here :-)
>
>
> So far I've used a local custom equal area projection (Albers EA from
> memory) I
> created for my purposes.
>
> I was looking at the recorded start positions for fishing trawls along
> with the
> distance towed and gear width to derive an estimated swept area held as a
> circle centred on the start point. As I want the circles to represent a
> comparable area whether they at lat 20S or 60S, I used an equal area
> projection
> to create them.
>
> Mu limited understanding was that despite the circles being defined by a
> radius, an equal area was better than equidistant for this.
>
> I'm storing them as lat/long (EPSG:4326 projection with longs 0-360 as
> they
> cross the 180 meridian... sigh...). In this projection the circles display
> as
> ellipses, exactly as they should, but this does confuse some around here
> :-)
>
>
> Is there a better way to achieve this?
>
> Thanks,
>
> Brent
> _______________________________________________
> postgis-users mailing list
> postgis-users at postgis.refractions.net
> http://postgis.refractions.net/mailman/listinfo/postgis-users
>
>
>
>
> --
> Marco Vieira
> +55 21 9499-6800
> e-mail: maovieira at gmail.com
>
> _______________________________________________
> postgis-users mailing list
> postgis-users at postgis.refractions.net
> http://postgis.refractions.net/mailman/listinfo/postgis-users
>
>
--
Marco Vieira
+55 21 9499-6800
e-mail: maovieira at gmail.com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osgeo.org/pipermail/postgis-users/attachments/20070309/db5b0c97/attachment.html>
More information about the postgis-users
mailing list