PostGIS  2.5.7dev-r@@SVN_REVISION@@

◆ ptarray_segmentize_sphere()

static POINTARRAY* ptarray_segmentize_sphere ( const POINTARRAY pa_in,
double  max_seg_length 
)
static

Create a new point array with no segment longer than the input segment length (expressed in radians!)

Parameters
pa_in- input point array pointer
max_seg_length- maximum output segment length in radians

Definition at line 1684 of file lwgeodetic.c.

1685 {
1686  POINTARRAY *pa_out;
1687  int hasz = ptarray_has_z(pa_in);
1688  int hasm = ptarray_has_m(pa_in);
1689  POINT4D p1, p2;
1690  POINT3D q1, q2;
1691  GEOGRAPHIC_POINT g1, g2;
1692  uint32_t i;
1693 
1694  /* Just crap out on crazy input */
1695  if ( ! pa_in )
1696  lwerror("%s: null input pointarray", __func__);
1697  if ( max_seg_length <= 0.0 )
1698  lwerror("%s: maximum segment length must be positive", __func__);
1699 
1700  /* Empty starting array */
1701  pa_out = ptarray_construct_empty(hasz, hasm, pa_in->npoints);
1702 
1703  /* Simple loop per edge */
1704  for (i = 1; i < pa_in->npoints; i++)
1705  {
1706  getPoint4d_p(pa_in, i-1, &p1);
1707  getPoint4d_p(pa_in, i, &p2);
1708  geographic_point_init(p1.x, p1.y, &g1);
1709  geographic_point_init(p2.x, p2.y, &g2);
1710 
1711  /* Skip duplicate points (except in case of 2-point lines!) */
1712  if ((pa_in->npoints > 2) && p4d_same(&p1, &p2))
1713  continue;
1714 
1715  /* How long is this edge? */
1716  double d = sphere_distance(&g1, &g2);
1717 
1718  if (d > max_seg_length)
1719  {
1720  geog2cart(&g1, &q1);
1721  geog2cart(&g2, &q2);
1722  /* 3-d end points, XYZM end point, current edge size, min edge size */
1723  ptarray_segmentize_sphere_edge_recursive(&q1, &q2, &p1, &p2, d, max_seg_length, pa_out);
1724  }
1725  /* If we don't segmentize, we need to add first point manually */
1726  else
1727  {
1728  ptarray_append_point(pa_out, &p1, LW_TRUE);
1729  }
1730  }
1731  /* Always add the last point */
1732  ptarray_append_point(pa_out, &p2, LW_TRUE);
1733  return pa_out;
1734 }
POINTARRAY * ptarray_construct_empty(char hasz, char hasm, uint32_t maxpoints)
Create a new POINTARRAY with no points.
Definition: ptarray.c:70
int getPoint4d_p(const POINTARRAY *pa, uint32_t n, POINT4D *point)
Definition: lwgeom_api.c:123
int ptarray_append_point(POINTARRAY *pa, const POINT4D *pt, int allow_duplicates)
Append a point to the end of an existing POINTARRAY If allow_duplicate is LW_FALSE,...
Definition: ptarray.c:156
#define LW_TRUE
Return types for functions with status returns.
Definition: liblwgeom.h:76
int p4d_same(const POINT4D *p1, const POINT4D *p2)
Definition: lwalgorithm.c:31
int ptarray_has_z(const POINTARRAY *pa)
Definition: ptarray.c:36
int ptarray_has_m(const POINTARRAY *pa)
Definition: ptarray.c:43
void geographic_point_init(double lon, double lat, GEOGRAPHIC_POINT *g)
Initialize a geographic point.
Definition: lwgeodetic.c:180
static int ptarray_segmentize_sphere_edge_recursive(const POINT3D *p1, const POINT3D *p2, const POINT4D *v1, const POINT4D *v2, double d, double max_seg_length, POINTARRAY *pa)
Definition: lwgeodetic.c:1633
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
void geog2cart(const GEOGRAPHIC_POINT *g, POINT3D *p)
Convert spherical coordinates to cartesian coordinates on unit sphere.
Definition: lwgeodetic.c:404
void lwerror(const char *fmt,...)
Write a notice out to the error handler.
Definition: lwutil.c:190
Point in spherical coordinates on the world.
Definition: lwgeodetic.h:53
double x
Definition: liblwgeom.h:355
double y
Definition: liblwgeom.h:355
uint32_t npoints
Definition: liblwgeom.h:374
unsigned int uint32_t
Definition: uthash.h:78

References geog2cart(), geographic_point_init(), getPoint4d_p(), LW_TRUE, lwerror(), POINTARRAY::npoints, p4d_same(), ptarray_append_point(), ptarray_construct_empty(), ptarray_has_m(), ptarray_has_z(), ptarray_segmentize_sphere_edge_recursive(), sphere_distance(), POINT4D::x, and POINT4D::y.

Referenced by lwgeom_segmentize_sphere().

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