PostGIS 3.7.0dev-r@@SVN_REVISION@@
Loading...
Searching...
No Matches

◆ lwgeom_project_spheroid()

LWPOINT * lwgeom_project_spheroid ( const LWPOINT r,
const SPHEROID spheroid,
double  distance,
double  azimuth 
)

Calculate a projected point given a source point, a distance and a bearing.

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

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

Definition at line 1967 of file lwgeodetic.c.

1968{
1969 GEOGRAPHIC_POINT geo_source, geo_dest;
1970 POINT4D pt_dest;
1971 double x, y;
1972 LWPOINT *lwp;
1973 int has_z, has_m;
1974
1975 /* Normalize distance to be positive*/
1976 if ( distance < 0.0 ) {
1977 distance = -distance;
1978 azimuth += M_PI;
1979 }
1980
1981 /* Normalize azimuth */
1982 azimuth -= 2.0 * M_PI * floor(azimuth / (2.0 * M_PI));
1983
1984 /* Check the distance validity */
1985 if ( distance > (M_PI * spheroid->radius) )
1986 {
1987 lwerror("Distance must not be greater than %g", M_PI * spheroid->radius);
1988 return NULL;
1989 }
1990
1991 /* Convert to ta geodetic point */
1992 x = lwpoint_get_x(r);
1993 y = lwpoint_get_y(r);
1996 geographic_point_init(x, y, &geo_source);
1997
1998 /* Try the projection */
1999 if( spheroid_project(&geo_source, spheroid, distance, azimuth, &geo_dest) == LW_FAILURE )
2000 {
2001 LWDEBUGF(3, "Unable to project from (%g %g) with azimuth %g and distance %g", x, y, azimuth, distance);
2002 lwerror("Unable to project from (%g %g) with azimuth %g and distance %g", x, y, azimuth, distance);
2003 return NULL;
2004 }
2005
2006 /* Build the output LWPOINT */
2007 pt_dest.x = rad2deg(longitude_radians_normalize(geo_dest.lon));
2008 pt_dest.y = rad2deg(latitude_radians_normalize(geo_dest.lat));
2009 pt_dest.z = has_z ? lwpoint_get_z(r) : 0.0;
2010 pt_dest.m = has_m ? lwpoint_get_m(r) : 0.0;
2011 lwp = lwpoint_make(r->srid, has_z, has_m, &pt_dest);
2013 return lwp;
2014}
char * r
Definition cu_in_wkt.c:24
void lwgeom_set_geodetic(LWGEOM *geom, int value)
Set the FLAGS geodetic bit on geometry an all sub-geometries and pointlists.
Definition lwgeom.c:992
LWGEOM * lwpoint_as_lwgeom(const LWPOINT *obj)
Definition lwgeom.c:372
double lwpoint_get_m(const LWPOINT *point)
Definition lwpoint.c:107
#define LW_FAILURE
Definition liblwgeom.h:96
double lwpoint_get_x(const LWPOINT *point)
Definition lwpoint.c:63
int lwgeom_has_z(const LWGEOM *geom)
Return LW_TRUE if geometry has Z ordinates.
Definition lwgeom.c:962
LWPOINT * lwpoint_make(int32_t srid, int hasz, int hasm, const POINT4D *p)
Definition lwpoint.c:206
double lwpoint_get_z(const LWPOINT *point)
Definition lwpoint.c:89
#define LW_TRUE
Return types for functions with status returns.
Definition liblwgeom.h:93
int lwgeom_has_m(const LWGEOM *geom)
Return LW_TRUE if geometry has M ordinates.
Definition lwgeom.c:969
double lwpoint_get_y(const LWPOINT *point)
Definition lwpoint.c:76
double longitude_radians_normalize(double lon)
Convert a longitude to the range of -PI,PI.
Definition lwgeodetic.c:50
double latitude_radians_normalize(double lat)
Convert a latitude to the range of -PI/2,PI/2.
Definition lwgeodetic.c:78
void geographic_point_init(double lon, double lat, GEOGRAPHIC_POINT *g)
Initialize a geographic point.
Definition lwgeodetic.c:180
#define rad2deg(r)
Definition lwgeodetic.h:81
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:128
#define LWDEBUGF(level, msg,...)
Definition lwgeom_log.h:106
void void lwerror(const char *fmt,...) __attribute__((format(printf
Write a notice out to the error handler.
static double distance(double x1, double y1, double x2, double y2)
Definition lwtree.c:1032
Point in spherical coordinates on the world.
Definition lwgeodetic.h:54
double m
Definition liblwgeom.h:414
double x
Definition liblwgeom.h:414
double z
Definition liblwgeom.h:414
double y
Definition liblwgeom.h:414
double radius
Definition liblwgeom.h:380

References distance(), geographic_point_init(), GEOGRAPHIC_POINT::lat, latitude_radians_normalize(), GEOGRAPHIC_POINT::lon, longitude_radians_normalize(), LW_FAILURE, LW_TRUE, LWDEBUGF, lwerror(), lwgeom_has_m(), lwgeom_has_z(), lwgeom_set_geodetic(), lwpoint_as_lwgeom(), lwpoint_get_m(), lwpoint_get_x(), lwpoint_get_y(), lwpoint_get_z(), lwpoint_make(), POINT4D::m, r, rad2deg, SPHEROID::radius, spheroid_project(), POINT4D::x, POINT4D::y, and POINT4D::z.

Referenced by geography_project(), and lwgeom_project_spheroid_lwpoint().

Here is the call graph for this function:
Here is the caller graph for this function: