PostGIS  2.1.10dev-r@@SVN_REVISION@@
LWPOINT* lwgeom_project_spheroid ( const LWPOINT r,
const SPHEROID spheroid,
double  distance,
double  azimuth 

Calculate the location of a point on a spheroid, give a start point, bearing and distance.

Calculate the location of a point on a spheroid, give a start point, bearing and distance.

r- location of first point.
spheroid- spheroid definition.
distance- distance, in units of the spheroid def'n.
azimuth- azimuth in radians.
s - location of projected point.

Definition at line 1992 of file lwgeodetic.c.

References geographic_point_init(), GEOGRAPHIC_POINT::lat, latitude_radians_normalize(), GEOGRAPHIC_POINT::lon, longitude_radians_normalize(), LW_FAILURE, LW_TRUE, LWDEBUGF, lwerror(), lwgeom_set_geodetic(), lwpoint_as_lwgeom(), lwpoint_construct(), lwpoint_get_x(), lwpoint_get_y(), POINT4D::m, ptarray_construct(), ptarray_set_point4d(), rad2deg, SPHEROID::radius, spheroid_project(), LWPOINT::srid, pixval::x, POINT4D::x, pixval::y, POINT4D::y, and POINT4D::z.

Referenced by geography_project().

1993 {
1994  GEOGRAPHIC_POINT geo_source, geo_dest;
1995  POINT4D pt_dest;
1996  double x, y;
1997  POINTARRAY *pa;
1998  LWPOINT *lwp;
2000  /* Check the azimuth validity, convert to radians */
2001  if ( azimuth < -2.0 * M_PI || azimuth > 2.0 * M_PI )
2002  {
2003  lwerror("Azimuth must be between -2PI and 2PI");
2004  return NULL;
2005  }
2007  /* Check the distance validity */
2008  if ( distance < 0.0 || distance > (M_PI * spheroid->radius) )
2009  {
2010  lwerror("Distance must be between 0 and %g", M_PI * spheroid->radius);
2011  return NULL;
2012  }
2014  /* Convert to ta geodetic point */
2015  x = lwpoint_get_x(r);
2016  y = lwpoint_get_y(r);
2017  geographic_point_init(x, y, &geo_source);
2019  /* Try the projection */
2020  if( spheroid_project(&geo_source, spheroid, distance, azimuth, &geo_dest) == LW_FAILURE )
2021  {
2022  LWDEBUGF(3, "Unable to project from (%g %g) with azimuth %g and distance %g", x, y, azimuth, distance);
2023  lwerror("Unable to project from (%g %g) with azimuth %g and distance %g", x, y, azimuth, distance);
2024  return NULL;
2025  }
2027  /* Build the output LWPOINT */
2028  pa = ptarray_construct(0, 0, 1);
2029  pt_dest.x = rad2deg(longitude_radians_normalize(geo_dest.lon));
2030  pt_dest.y = rad2deg(latitude_radians_normalize(;
2031  pt_dest.z = pt_dest.m = 0.0;
2032  ptarray_set_point4d(pa, 0, &pt_dest);
2033  lwp = lwpoint_construct(r->srid, NULL, pa);
2035  return lwp;
2036 }
void ptarray_set_point4d(POINTARRAY *pa, int n, const POINT4D *p4d)
Definition: lwgeom_api.c:501
double x
Definition: liblwgeom.h:308
POINTARRAY * ptarray_construct(char hasz, char hasm, uint32_t npoints)
Construct an empty pointarray, allocating storage and setting the npoints, but not filling in any inf...
Definition: ptarray.c:49
double longitude_radians_normalize(double lon)
Convert a longitude to the range of -PI,PI.
Definition: lwgeodetic.c:27
double m
Definition: liblwgeom.h:308
double radius
Definition: liblwgeom.h:274
Point in spherical coordinates on the world.
Definition: lwgeodetic.h:33
int spheroid_project(const GEOGRAPHIC_POINT *r, const SPHEROID *spheroid, double distance, double azimuth, GEOGRAPHIC_POINT *g)
Given a location, an azimuth and a distance, computes the location of the projected point...
Definition: lwspheroid.c:232
#define LW_FAILURE
Definition: liblwgeom.h:54
void lwerror(const char *fmt,...)
Write a notice out to the error handler.
Definition: lwutil.c:67
double lwpoint_get_x(const LWPOINT *point)
Definition: lwpoint.c:48
#define rad2deg(r)
Definition: lwgeodetic.h:61
#define LW_TRUE
Return types for functions with status returns.
Definition: liblwgeom.h:51
double z
Definition: liblwgeom.h:308
tuple x
Datum distance(PG_FUNCTION_ARGS)
void lwgeom_set_geodetic(LWGEOM *geom, int value)
Set the FLAGS geodetic bit on geometry an all sub-geometries and pointlists.
Definition: lwgeom.c:814
int32_t srid
Definition: liblwgeom.h:366
double latitude_radians_normalize(double lat)
Convert a latitude to the range of -PI/2,PI/2.
Definition: lwgeodetic.c:55
void geographic_point_init(double lon, double lat, GEOGRAPHIC_POINT *g)
Initialize a geographic point.
Definition: lwgeodetic.c:157
double lwpoint_get_y(const LWPOINT *point)
Definition: lwpoint.c:58
LWGEOM * lwpoint_as_lwgeom(const LWPOINT *obj)
Definition: lwgeom.c:254
LWPOINT * lwpoint_construct(int srid, GBOX *bbox, POINTARRAY *point)
Definition: lwpoint.c:96
double y
Definition: liblwgeom.h:308
#define LWDEBUGF(level, msg,...)
Definition: lwgeom_log.h:55
tuple y

Here is the call graph for this function:

Here is the caller graph for this function: