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

◆ lwmpoly_to_points()

LWMPOINT * lwmpoly_to_points ( const LWMPOLY lwmpoly,
uint32_t  npoints,
int32_t  seed 
)

Definition at line 1683 of file liblwgeom/lwgeom_geos.c.

1684{
1685 const LWGEOM* lwgeom = (LWGEOM*)lwmpoly;
1686 double area;
1687 uint32_t i;
1688 LWMPOINT* mpt = NULL;
1689
1690 if (lwgeom_get_type(lwgeom) != MULTIPOLYGONTYPE)
1691 {
1692 lwerror("%s: only multipolygons supported", __func__);
1693 return NULL;
1694 }
1695 if (npoints == 0 || lwgeom_is_empty(lwgeom)) return NULL;
1696
1697 area = lwgeom_area(lwgeom);
1698
1699 for (i = 0; i < lwmpoly->ngeoms; i++)
1700 {
1701 double sub_area = lwpoly_area(lwmpoly->geoms[i]);
1702 int sub_npoints = lround(npoints * sub_area / area);
1703 if (sub_npoints > 0)
1704 {
1705 LWMPOINT* sub_mpt = lwpoly_to_points(lwmpoly->geoms[i], sub_npoints, seed);
1706 if (!mpt)
1707 mpt = sub_mpt;
1708 else
1709 {
1710 uint32_t j;
1711 for (j = 0; j < sub_mpt->ngeoms; j++)
1712 mpt = lwmpoint_add_lwpoint(mpt, sub_mpt->geoms[j]);
1713 /* Just free the shell, leave the underlying lwpoints alone, as they are now owned by
1714 * the returning multipoint */
1715 lwfree(sub_mpt->geoms);
1716 lwgeom_release((LWGEOM*)sub_mpt);
1717 }
1718 }
1719 }
1720 return mpt;
1721}
LWMPOINT * lwpoly_to_points(const LWPOLY *lwpoly, uint32_t npoints, int32_t seed)
LWMPOINT * lwmpoint_add_lwpoint(LWMPOINT *mobj, const LWPOINT *obj)
Definition lwmpoint.c:45
double lwgeom_area(const LWGEOM *geom)
Definition lwgeom.c:1863
#define MULTIPOLYGONTYPE
Definition liblwgeom.h:121
void lwfree(void *mem)
Definition lwutil.c:242
void lwgeom_release(LWGEOM *lwgeom)
Free the containing LWGEOM and the associated BOX.
Definition lwgeom.c:450
double lwpoly_area(const LWPOLY *poly)
Find the area of the outer ring - sum (area of inner rings).
Definition lwpoly.c:434
void lwerror(const char *fmt,...)
Write a notice out to the error handler.
Definition lwutil.c:190
static uint32_t lwgeom_get_type(const LWGEOM *geom)
Return LWTYPE number.
Definition lwinline.h:135
static int lwgeom_is_empty(const LWGEOM *geom)
Return true or false depending on whether a geometry is an "empty" geometry (no vertices members)
Definition lwinline.h:193
uint32_t ngeoms
Definition liblwgeom.h:524
LWPOINT ** geoms
Definition liblwgeom.h:519
uint32_t ngeoms
Definition liblwgeom.h:552
LWPOLY ** geoms
Definition liblwgeom.h:547

References LWMPOINT::geoms, LWMPOLY::geoms, lwerror(), lwfree(), lwgeom_area(), lwgeom_get_type(), lwgeom_is_empty(), lwgeom_release(), lwmpoint_add_lwpoint(), lwpoly_area(), lwpoly_to_points(), MULTIPOLYGONTYPE, LWMPOINT::ngeoms, and LWMPOLY::ngeoms.

Referenced by lwgeom_to_points().

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