2469{
2474 double az1, az2;
2475 double result;
2476 int32_t srids[4];
2477 int i = 0;
2478 int j = 0;
2479 int err_code = 0;
2480 int n_args = PG_NARGS();
2481
2482
2483 for (i = 0; i < n_args; i++)
2484 {
2485 seri_geoms[i] = PG_GETARG_GSERIALIZED_P(i);
2487 {
2488 if (i == 3)
2489 {
2490 n_args = 3;
2491 }
2492 else
2493 {
2494 err_code = 1;
2495 break;
2496 }
2497 }
2498 else
2499 {
2501 {
2502 err_code = 2;
2503 break;
2504 }
2505 else
2506 {
2508 if (srids[0] != srids[i])
2509 {
2510 err_code = 3;
2511 break;
2512 }
2513 }
2514 }
2515 }
2516 if (err_code > 0)
2517 switch (err_code)
2518 {
2519 default:
2520 for (j = 0; j <= i; j++)
2521 PG_FREE_IF_COPY(seri_geoms[j], j);
2522
2523 case 1:
2524 lwpgerror("Empty geometry");
2525 PG_RETURN_NULL();
2526 break;
2527
2528 case 2:
2529 lwpgerror("Argument must be POINT geometries");
2530 PG_RETURN_NULL();
2531 break;
2532
2533 case 3:
2534 lwpgerror("Operation on mixed SRID geometries");
2535 PG_RETURN_NULL();
2536 break;
2537 }
2538
2539 for (i = 0; i < n_args; i++)
2540 {
2543 if (!lwpoint)
2544 {
2545 for (j = 0; j < n_args; j++)
2546 PG_FREE_IF_COPY(seri_geoms[j], j);
2547 lwpgerror("Error unserializing geometry");
2548 PG_RETURN_NULL();
2549 }
2550
2552 {
2553
2554
2555
2556 lwpgerror("Error extracting point");
2557 PG_RETURN_NULL();
2558 }
2559
2560
2561 }
2562
2563
2564
2565
2566
2567
2568 if (n_args == 3)
2569 {
2571 PG_RETURN_NULL();
2573 PG_RETURN_NULL();
2574 }
2575 else
2576 {
2578 PG_RETURN_NULL();
2580 PG_RETURN_NULL();
2581 }
2582 result = az2 - az1;
2583 result += (result < 0) * 2 * M_PI;
2584 PG_RETURN_FLOAT8(result);
2585}
int32_t gserialized_get_srid(const GSERIALIZED *g)
Extract the SRID from the serialized form (it is packed into three bytes so this is a handy function)...
LWGEOM * lwgeom_from_gserialized(const GSERIALIZED *g)
Allocate a new LWGEOM from a GSERIALIZED.
int gserialized_is_empty(const GSERIALIZED *g)
Check if a GSERIALIZED is empty without deserializing first.
uint32_t gserialized_get_type(const GSERIALIZED *g)
Extract the geometry type from the serialized form (it hides in the anonymous data area,...
int azimuth_pt_pt(const POINT2D *p1, const POINT2D *p2, double *ret)
Compute the azimuth of segment AB in radians.
int getPoint2d_p(const POINTARRAY *pa, uint32_t n, POINT2D *point)
#define POINTTYPE
LWTYPE numbers, used internally by PostGIS.
static LWPOINT * lwgeom_as_lwpoint(const LWGEOM *lwgeom)