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

◆ ptarray_length_spheroid()

double ptarray_length_spheroid ( const POINTARRAY pa,
const SPHEROID s 
)

Definition at line 3092 of file lwgeodetic.c.

3093{
3094 GEOGRAPHIC_POINT a, b;
3095 double za = 0.0, zb = 0.0;
3096 POINT4D p;
3097 uint32_t i;
3098 int hasz = LW_FALSE;
3099 double length = 0.0;
3100 double seglength = 0.0;
3101
3102 /* Return zero on non-sensical inputs */
3103 if ( ! pa || pa->npoints < 2 )
3104 return 0.0;
3105
3106 /* See if we have a third dimension */
3107 hasz = FLAGS_GET_Z(pa->flags);
3108
3109 /* Initialize first point */
3110 getPoint4d_p(pa, 0, &p);
3111 geographic_point_init(p.x, p.y, &a);
3112 if ( hasz )
3113 za = p.z;
3114
3115 /* Loop and sum the length for each segment */
3116 for ( i = 1; i < pa->npoints; i++ )
3117 {
3118 seglength = 0.0;
3119 getPoint4d_p(pa, i, &p);
3120 geographic_point_init(p.x, p.y, &b);
3121 if ( hasz )
3122 zb = p.z;
3123
3124 /* Special sphere case */
3125 if ( s->a == s->b )
3126 seglength = s->radius * sphere_distance(&a, &b);
3127 /* Spheroid case */
3128 else
3129 seglength = spheroid_distance(&a, &b, s);
3130
3131 /* Add in the vertical displacement if we're in 3D */
3132 if ( hasz )
3133 seglength = sqrt( (zb-za)*(zb-za) + seglength*seglength );
3134
3135 /* Add this segment length to the total */
3136 length += seglength;
3137
3138 /* B gets incremented in the next loop, so we save the value here */
3139 a = b;
3140 za = zb;
3141 }
3142 return length;
3143}
char * s
Definition cu_in_wkt.c:23
#define LW_FALSE
Definition liblwgeom.h:94
#define FLAGS_GET_Z(flags)
Definition liblwgeom.h:165
int getPoint4d_p(const POINTARRAY *pa, uint32_t n, POINT4D *point)
Definition lwgeom_api.c:125
void geographic_point_init(double lon, double lat, GEOGRAPHIC_POINT *g)
Initialize a geographic point.
Definition lwgeodetic.c:180
double sphere_distance(const GEOGRAPHIC_POINT *s, const GEOGRAPHIC_POINT *e)
Given two points on a unit sphere, calculate their distance apart in radians.
Definition lwgeodetic.c:896
double spheroid_distance(const GEOGRAPHIC_POINT *a, const GEOGRAPHIC_POINT *b, const SPHEROID *spheroid)
Computes the shortest distance along the surface of the spheroid between two points,...
Definition lwspheroid.c:79
Point in spherical coordinates on the world.
Definition lwgeodetic.h:54
double x
Definition liblwgeom.h:414
double z
Definition liblwgeom.h:414
double y
Definition liblwgeom.h:414
lwflags_t flags
Definition liblwgeom.h:431
uint32_t npoints
Definition liblwgeom.h:427

References POINTARRAY::flags, FLAGS_GET_Z, geographic_point_init(), getPoint4d_p(), LW_FALSE, POINTARRAY::npoints, s, sphere_distance(), spheroid_distance(), POINT4D::x, POINT4D::y, and POINT4D::z.

Referenced by geography_interpolate_points(), geography_substring(), and lwgeom_length_spheroid().

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