PostGIS  3.7.0dev-r@@SVN_REVISION@@

◆ LWGEOM_azimuth()

Datum LWGEOM_azimuth ( PG_FUNCTION_ARGS  )

Definition at line 2478 of file lwgeom_functions_basic.c.

2479 {
2480  GSERIALIZED *geom;
2481  LWPOINT *lwpoint;
2482  POINT2D p1, p2;
2483  double result;
2484  int32_t srid;
2485 
2486  /* Extract first point */
2487  geom = PG_GETARG_GSERIALIZED_P(0);
2488  lwpoint = lwgeom_as_lwpoint(lwgeom_from_gserialized(geom));
2489  if (!lwpoint)
2490  {
2491  PG_FREE_IF_COPY(geom, 0);
2492  lwpgerror("Argument must be POINT geometries");
2493  PG_RETURN_NULL();
2494  }
2495  srid = lwpoint->srid;
2496  if (!getPoint2d_p(lwpoint->point, 0, &p1))
2497  {
2498  PG_FREE_IF_COPY(geom, 0);
2499  lwpgerror("Error extracting point");
2500  PG_RETURN_NULL();
2501  }
2502  lwpoint_free(lwpoint);
2503  PG_FREE_IF_COPY(geom, 0);
2504 
2505  /* Extract second point */
2506  geom = PG_GETARG_GSERIALIZED_P(1);
2507  lwpoint = lwgeom_as_lwpoint(lwgeom_from_gserialized(geom));
2508  if (!lwpoint)
2509  {
2510  PG_FREE_IF_COPY(geom, 1);
2511  lwpgerror("Argument must be POINT geometries");
2512  PG_RETURN_NULL();
2513  }
2514  if (lwpoint->srid != srid)
2515  {
2516  PG_FREE_IF_COPY(geom, 1);
2517  lwpgerror("Operation on mixed SRID geometries");
2518  PG_RETURN_NULL();
2519  }
2520  if (!getPoint2d_p(lwpoint->point, 0, &p2))
2521  {
2522  PG_FREE_IF_COPY(geom, 1);
2523  lwpgerror("Error extracting point");
2524  PG_RETURN_NULL();
2525  }
2526  lwpoint_free(lwpoint);
2527  PG_FREE_IF_COPY(geom, 1);
2528 
2529  /* Standard return value for equality case */
2530  if ((p1.x == p2.x) && (p1.y == p2.y))
2531  {
2532  PG_RETURN_NULL();
2533  }
2534 
2535  /* Compute azimuth */
2536  if (!azimuth_pt_pt(&p1, &p2, &result))
2537  {
2538  PG_RETURN_NULL();
2539  }
2540 
2541  PG_RETURN_FLOAT8(result);
2542 }
char result[OUT_DOUBLE_BUFFER_SIZE]
Definition: cu_print.c:267
LWGEOM * lwgeom_from_gserialized(const GSERIALIZED *g)
Allocate a new LWGEOM from a GSERIALIZED.
Definition: gserialized.c:268
int azimuth_pt_pt(const POINT2D *p1, const POINT2D *p2, double *ret)
Compute the azimuth of segment AB in radians.
Definition: measures.c:2509
void lwpoint_free(LWPOINT *pt)
Definition: lwpoint.c:213
int getPoint2d_p(const POINTARRAY *pa, uint32_t n, POINT2D *point)
Definition: lwgeom_api.c:342
static LWPOINT * lwgeom_as_lwpoint(const LWGEOM *lwgeom)
Definition: lwinline.h:127
POINTARRAY * point
Definition: liblwgeom.h:471
int32_t srid
Definition: liblwgeom.h:472
double y
Definition: liblwgeom.h:390
double x
Definition: liblwgeom.h:390

References azimuth_pt_pt(), getPoint2d_p(), lwgeom_as_lwpoint(), lwgeom_from_gserialized(), lwpoint_free(), LWPOINT::point, result, LWPOINT::srid, POINT2D::x, and POINT2D::y.

Here is the call graph for this function: