PostGIS  2.3.8dev-r@@SVN_REVISION@@

◆ geography_azimuth()

Datum geography_azimuth ( PG_FUNCTION_ARGS  )

Definition at line 1014 of file geography_measurement.c.

References geography_segmentize(), gserialized_get_srid(), gserialized_get_type(), lwgeom_as_lwpoint(), lwgeom_azumith_spheroid(), lwgeom_free(), lwgeom_from_gserialized(), lwgeom_is_empty(), PG_FUNCTION_INFO_V1(), POINTTYPE, and s.

Referenced by geography_project().

1015 {
1016  LWGEOM *lwgeom1 = NULL;
1017  LWGEOM *lwgeom2 = NULL;
1018  GSERIALIZED *g1 = NULL;
1019  GSERIALIZED *g2 = NULL;
1020  double azimuth;
1021  SPHEROID s;
1022  uint32_t type1, type2;
1023 
1024  /* Get our geometry object loaded into memory. */
1025  g1 = PG_GETARG_GSERIALIZED_P(0);
1026  g2 = PG_GETARG_GSERIALIZED_P(1);
1027 
1028  /* Only return for points. */
1029  type1 = gserialized_get_type(g1);
1030  type2 = gserialized_get_type(g2);
1031  if ( type1 != POINTTYPE || type2 != POINTTYPE )
1032  {
1033  elog(ERROR, "ST_Azimuth(geography, geography) is only valid for point inputs");
1034  PG_RETURN_NULL();
1035  }
1036 
1037  lwgeom1 = lwgeom_from_gserialized(g1);
1038  lwgeom2 = lwgeom_from_gserialized(g2);
1039 
1040  /* EMPTY things cannot be used */
1041  if ( lwgeom_is_empty(lwgeom1) || lwgeom_is_empty(lwgeom2) )
1042  {
1043  lwgeom_free(lwgeom1);
1044  lwgeom_free(lwgeom2);
1045  elog(ERROR, "ST_Azimuth(geography, geography) cannot work with empty points");
1046  PG_RETURN_NULL();
1047  }
1048 
1049  /* Initialize spheroid */
1050  spheroid_init_from_srid(fcinfo, gserialized_get_srid(g1), &s);
1051 
1052  /* Calculate the direction */
1053  azimuth = lwgeom_azumith_spheroid(lwgeom_as_lwpoint(lwgeom1), lwgeom_as_lwpoint(lwgeom2), &s);
1054 
1055  /* Clean up */
1056  lwgeom_free(lwgeom1);
1057  lwgeom_free(lwgeom2);
1058 
1059  PG_FREE_IF_COPY(g1, 0);
1060  PG_FREE_IF_COPY(g2, 1);
1061 
1062  /* Return NULL for unknown (same point) azimuth */
1063  if( isnan(azimuth) )
1064  {
1065  PG_RETURN_NULL();
1066  }
1067 
1068  PG_RETURN_FLOAT8(azimuth);
1069 }
uint32_t gserialized_get_type(const GSERIALIZED *s)
Extract the geometry type from the serialized form (it hides in the anonymous data area...
Definition: g_serialized.c:69
double lwgeom_azumith_spheroid(const LWPOINT *r, const LWPOINT *s, const SPHEROID *spheroid)
Calculate the bearing between two points on a spheroid.
Definition: lwgeodetic.c:2061
LWGEOM * lwgeom_from_gserialized(const GSERIALIZED *g)
Allocate a new LWGEOM from a GSERIALIZED.
void lwgeom_free(LWGEOM *geom)
Definition: lwgeom.c:1063
LWPOINT * lwgeom_as_lwpoint(const LWGEOM *lwgeom)
Definition: lwgeom.c:93
char * s
Definition: cu_in_wkt.c:23
#define POINTTYPE
LWTYPE numbers, used internally by PostGIS.
Definition: liblwgeom.h:84
int lwgeom_is_empty(const LWGEOM *geom)
Return true or false depending on whether a geometry is an "empty" geometry (no vertices members) ...
Definition: lwgeom.c:1310
int32_t gserialized_get_srid(const GSERIALIZED *s)
Extract the SRID from the serialized form (it is packed into three bytes so this is a handy function)...
Definition: g_serialized.c:83
Here is the call graph for this function:
Here is the caller graph for this function: