# [postgis-users] Finding that third point on an arc.

Paragon Corporation lr at pcorp.us
Mon Sep 7 10:55:57 PDT 2009

``` Blake,

Would be great if you could add this to the wiki section.
http://trac.osgeo.org/postgis/wiki/UsersWikiplpgsqlfunctions

Though I guess we do need to do a better job of organizing these functions
so they are easier to find.

Thanks,
Regina

-----Original Message-----
From: postgis-users-bounces at postgis.refractions.net
[mailto:postgis-users-bounces at postgis.refractions.net] On Behalf Of Blake
Crosby
Sent: Monday, September 07, 2009 12:03 PM
To: PostGIS Users Discussion
Subject: Re: [postgis-users] Finding that third point on an arc.

For posterity:

Here is a function to do what I want:

CREATE OR REPLACE FUNCTION st_createarc(startpoint geometry, endpoint
geometry, arcenter geometry)
RETURNS geometry AS
\$\$
DECLARE
pointonarc geometry;
thearc text;
BEGIN
pointonarc := ST_Translate( ST_Rotate( ST_Translate( startpoint,
-1*ST_X(arcenter), -1*ST_Y(arcenter)), pi()/5), ST_X(arcenter),
ST_Y(arcenter));
thearc := 'CIRCULARSTRING('||ST_X(startpoint)||'
'||ST_Y(startpoint)||','||ST_X(pointonarc)||'
'||ST_Y(pointonarc)||','||ST_X(endpoint)||' '||ST_Y(endpoint)||')';
RETURN
st_transform(st_curvetoline(st_transform(st_setsrid(thearc,st_srid(arcenter)
),utmzone(arcenter))),st_srid(arcenter));
END;
\$\$
LANGUAGE 'plpgsql' IMMUTABLE;
COMMENT ON FUNCTION st_createarc(geometry,geometry,geometry) IS
'Generates an arc based on starting point, ending point and centre of arc.
All geometries must be of type POINT and this function returns a linestring
of the arc based on the original SRID and 32 points per quarter circle.
Requires the utmzone function.';

Blake Crosby wrote:
> Hello,
>
> I have:
>
> - Starting Point (lat/long, srid=4326) Ps = POINT(-75.7016666666667
> 45.1127777777778)
> - Ending Point (lat/long, srid=4326)
> Pe = POINT(-75.5627777777778 45.0972222222222)
> - Centre of arc (lat/long, srid=4326)
> Pc= POINT(-75.6333333333333 45.1)
>
> I thought I could construct a circular line string, however you need
> an odd number of points. To get that third point, I was going to use
> the rotate function found here:
>
> http://trac.osgeo.org/postgis/wiki/UsersWikiplpgsqlfunctions
>
> To rotate the starting point (Ps) 90 degrees and use that result as
> the third part of arc.
>
> The resulting arc looks more like an ellipse when being projected in
> my final projection.
>
> Does anyone know where I'm going wrong? Essentially I'm doing this:
>
> Rotate Ps:
> select astext(rotateatpoint(st_geomfromtext('POINT(-75.7016666666667
> 45.1127777777778)',4326),-75.7016666666667,45.1127777777778,pi()/2));
>                   astext
> -------------------------------------------
>  POINT(-75.7016666666667 45.1127777777778)
>
> generate arc, and convert to a linestring:
>
> select
> astext(st_curvetoline(st_geomfromtext('CIRCULARSTRING(-75.701666666666
> 7
> 45.1127777777778,-75.5627777777778 45.0972222222222,-75.7016666666667
> 45.1127777777778)',4326)));
>
> Take a look at the screen shot here. The outer arc is the one
> generated here, the inner one is what I need to get.
>
> http://www.blakecrosby.com/arc.png
> _______________________________________________
> postgis-users mailing list
> postgis-users at postgis.refractions.net
> http://postgis.refractions.net/mailman/listinfo/postgis-users
>
_______________________________________________
postgis-users mailing list
postgis-users at postgis.refractions.net
http://postgis.refractions.net/mailman/listinfo/postgis-users

```