25 #include "../postgis_config.h"
48 for ( i = 0; i < pa->
npoints; i++ )
52 if ( isnan(p->
x) || isnan(p->
y) ) isnan = 1;
53 else if (ndims > 2 && isnan(p->
z) ) isnan = 1;
54 else if (ndims > 3 && isnan(p->
m) ) isnan = 1;
55 if ( isnan )
continue;
81 LWDEBUGF(2,
"lwgeom_make_geos_friendly enter (type %d)", geom->
type);
111 lwerror(
"lwgeom_make_geos_friendly: unsupported input geometry type: %s (%d)",
151 if (closedring != ring) ring = closedring;
184 for (i = 0; i < poly->
nrings; i++)
189 if (ring_in != ring_out)
192 3,
"lwpoly_make_geos_friendly: ring %d cleaned, now has %d points", i, ring_out->
npoints);
196 LWDEBUGF(3,
"lwpoly_make_geos_friendly: ring %d untouched", i);
199 new_rings[i] = ring_out;
203 poly->
rings = new_rings;
243 uint32_t i, new_ngeoms = 0;
247 LWDEBUG(3,
"lwcollection_make_geos_friendly: returning input untouched");
258 for (i = 0; i < g->
ngeoms; i++)
262 if ( newg != g->
geoms[i] ) {
263 new_geoms[new_ngeoms++] = newg;
273 ret->
geoms = new_geoms;
297 GEOSGeometry* geosout;
300 LWDEBUG(1,
"lwgeom_make_valid enter");
312 if (!lwgeom_out)
lwerror(
"Could not make a geos friendly geometry out of input");
314 LWDEBUGF(4,
"Input geom %p made GEOS-valid as %p", lwgeom_in, lwgeom_out);
317 if ( lwgeom_in != lwgeom_out ) {
327 LWDEBUG(4,
"geom converted to GEOS");
330 #if POSTGIS_GEOS_VERSION < 31000
331 geosout = GEOSMakeValid(geosgeom);
333 if (!make_valid_params) {
334 geosout = GEOSMakeValid(geosgeom);
347 memset(param_list, 0,
sizeof(param_list));
349 GEOSMakeValidParams *params = GEOSMakeValidParams_create();
352 if (strcasecmp(
value,
"linework") == 0) {
353 GEOSMakeValidParams_setMethod(params, GEOS_MAKE_VALID_LINEWORK);
355 else if (strcasecmp(
value,
"structure") == 0) {
356 GEOSMakeValidParams_setMethod(params, GEOS_MAKE_VALID_STRUCTURE);
360 GEOSMakeValidParams_destroy(params);
361 lwerror(
"Unsupported value for 'method', '%s'. Use 'linework' or 'structure'.",
value);
366 if (strcasecmp(
value,
"true") == 0) {
367 GEOSMakeValidParams_setKeepCollapsed(params, 1);
369 else if (strcasecmp(
value,
"false") == 0) {
370 GEOSMakeValidParams_setKeepCollapsed(params, 0);
374 GEOSMakeValidParams_destroy(params);
375 lwerror(
"Unsupported value for 'keepcollapsed', '%s'. Use 'true' or 'false'",
value);
378 geosout = GEOSMakeValidWithParams(geosgeom, params);
379 GEOSMakeValidParams_destroy(params);
382 GEOSGeom_destroy(geosgeom);
383 if (!geosout)
return NULL;
386 GEOSGeom_destroy(geosout);
392 LWDEBUG(3,
"lwgeom_make_valid: forcing multi");
395 assert(lwgeom_in != lwgeom_out);
396 ogeoms[0] = lwgeom_out;
399 lwgeom_out->
bbox = NULL;
char lwgeom_geos_errmsg[LWGEOM_GEOS_ERRMSG_MAXSIZE]
GEOSGeometry * LWGEOM2GEOS(const LWGEOM *lwgeom, uint8_t autofix)
void lwgeom_geos_error(const char *fmt,...)
void(*) LWGEOM GEOS2LWGEOM)(const GEOSGeometry *geom, uint8_t want3d)
static POINTARRAY * ptarray_close2d(POINTARRAY *ring)
LWGEOM * lwline_make_geos_friendly(LWLINE *line)
LWGEOM * lwpoly_make_geos_friendly(LWPOLY *poly)
LWGEOM * lwgeom_make_valid(LWGEOM *lwgeom_in)
Attempts to make an invalid geometries valid w/out losing points.
LWGEOM * lwcollection_make_geos_friendly(LWCOLLECTION *g)
static LWGEOM * lwgeom_make_geos_friendly(LWGEOM *geom)
POINTARRAY * ring_make_geos_friendly(POINTARRAY *ring)
LWGEOM * lwgeom_make_valid_params(LWGEOM *lwgeom_in, char *make_valid_params)
static void ptarray_strip_nan_coords_in_place(POINTARRAY *pa)
LWGEOM * lwcollection_as_lwgeom(const LWCOLLECTION *obj)
void lwgeom_free(LWGEOM *geom)
POINTARRAY * ptarray_addPoint(const POINTARRAY *pa, uint8_t *p, size_t pdims, uint32_t where)
Add a point in a pointarray.
#define POINTTYPE
LWTYPE numbers, used internally by PostGIS.
#define FLAGS_GET_Z(flags)
#define FLAGS_NDIMS(flags)
int lwgeom_is_collection(const LWGEOM *lwgeom)
Determine whether a LWGEOM contains sub-geometries or not This basically just checks that the struct ...
LWPOINT * lwpoint_construct(int32_t srid, GBOX *bbox, POINTARRAY *point)
const char * lwtype_name(uint8_t type)
Return the type name string associated with a type number (e.g.
void ptarray_free(POINTARRAY *pa)
LWGEOM * lwgeom_clone(const LWGEOM *lwgeom)
Clone LWGEOM object.
void * lwalloc(size_t size)
LWCOLLECTION * lwcollection_construct(uint8_t type, int32_t srid, GBOX *bbox, uint32_t ngeoms, LWGEOM **geoms)
int ptarray_is_closed_2d(const POINTARRAY *pa)
This library is the generic geometry handling section of PostGIS.
uint8_t MULTITYPE[NUMTYPES]
Look-up for the correct MULTI* type promotion for singleton types.
#define LWDEBUG(level, msg)
#define LWDEBUGF(level, msg,...)
void void lwerror(const char *fmt,...) __attribute__((format(printf
Write a notice out to the error handler.
static uint8_t * getPoint_internal(const POINTARRAY *pa, uint32_t n)
const char * option_list_search(char **olist, const char *key)
Returns null if the key cannot be found.
void option_list_parse(char *input, char **olist)
option_list is a null-terminated list of strings, where every odd string is a key and every even stri...