PostGIS  3.1.6dev-r@@SVN_REVISION@@

◆ ptarray_length_spheroid()

double ptarray_length_spheroid ( const POINTARRAY pa,
const SPHEROID s 
)

Definition at line 3234 of file lwgeodetic.c.

3235 {
3236  GEOGRAPHIC_POINT a, b;
3237  double za = 0.0, zb = 0.0;
3238  POINT4D p;
3239  uint32_t i;
3240  int hasz = LW_FALSE;
3241  double length = 0.0;
3242  double seglength = 0.0;
3243 
3244  /* Return zero on non-sensical inputs */
3245  if ( ! pa || pa->npoints < 2 )
3246  return 0.0;
3247 
3248  /* See if we have a third dimension */
3249  hasz = FLAGS_GET_Z(pa->flags);
3250 
3251  /* Initialize first point */
3252  getPoint4d_p(pa, 0, &p);
3253  geographic_point_init(p.x, p.y, &a);
3254  if ( hasz )
3255  za = p.z;
3256 
3257  /* Loop and sum the length for each segment */
3258  for ( i = 1; i < pa->npoints; i++ )
3259  {
3260  seglength = 0.0;
3261  getPoint4d_p(pa, i, &p);
3262  geographic_point_init(p.x, p.y, &b);
3263  if ( hasz )
3264  zb = p.z;
3265 
3266  /* Special sphere case */
3267  if ( s->a == s->b )
3268  seglength = s->radius * sphere_distance(&a, &b);
3269  /* Spheroid case */
3270  else
3271  seglength = spheroid_distance(&a, &b, s);
3272 
3273  /* Add in the vertical displacement if we're in 3D */
3274  if ( hasz )
3275  seglength = sqrt( (zb-za)*(zb-za) + seglength*seglength );
3276 
3277  /* Add this segment length to the total */
3278  length += seglength;
3279 
3280  /* B gets incremented in the next loop, so we save the value here */
3281  a = b;
3282  za = zb;
3283  }
3284  return length;
3285 }
char * s
Definition: cu_in_wkt.c:23
#define LW_FALSE
Definition: liblwgeom.h:108
#define FLAGS_GET_Z(flags)
Definition: liblwgeom.h:179
int getPoint4d_p(const POINTARRAY *pa, uint32_t n, POINT4D *point)
Definition: lwgeom_api.c:126
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:948
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:428
double z
Definition: liblwgeom.h:428
double y
Definition: liblwgeom.h:428
lwflags_t flags
Definition: liblwgeom.h:445
uint32_t npoints
Definition: liblwgeom.h:441

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 lwgeom_length_spheroid().

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