[postgis-tickets] r16409 - Format lwgeom_geos_clean.c before digging in
Darafei
komzpa at gmail.com
Thu Feb 22 07:52:47 PST 2018
Author: komzpa
Date: 2018-02-22 07:52:47 -0800 (Thu, 22 Feb 2018)
New Revision: 16409
Modified:
trunk/liblwgeom/lwgeom_geos_clean.c
Log:
Format lwgeom_geos_clean.c before digging in
References #2508
Modified: trunk/liblwgeom/lwgeom_geos_clean.c
===================================================================
--- trunk/liblwgeom/lwgeom_geos_clean.c 2018-02-22 13:42:00 UTC (rev 16408)
+++ trunk/liblwgeom/lwgeom_geos_clean.c 2018-02-22 15:52:47 UTC (rev 16409)
@@ -22,7 +22,6 @@
*
**********************************************************************/
-
#include "liblwgeom.h"
#include "lwgeom_geos.h"
#include "liblwgeom_internal.h"
@@ -36,7 +35,6 @@
/* #define PARANOIA_LEVEL 2 */
#undef LWGEOM_PROFILE_MAKEVALID
-
/*
* Return Nth vertex in GEOSGeometry as a POINT.
* May return NULL if the geometry has NO vertexex.
@@ -53,7 +51,7 @@
int gn;
GEOSGeometry* ret;
- switch ( GEOSGeomTypeId(g_in) )
+ switch (GEOSGeomTypeId(g_in))
{
case GEOS_MULTIPOINT:
case GEOS_MULTILINESTRING:
@@ -60,11 +58,11 @@
case GEOS_MULTIPOLYGON:
case GEOS_GEOMETRYCOLLECTION:
{
- for (gn=0; gn<GEOSGetNumGeometries(g_in); ++gn)
+ for (gn = 0; gn < GEOSGetNumGeometries(g_in); ++gn)
{
const GEOSGeometry* g = GEOSGetGeometryN(g_in, gn);
- ret = LWGEOM_GEOS_getPointN(g,n);
- if ( ret ) return ret;
+ ret = LWGEOM_GEOS_getPointN(g, n);
+ if (ret) return ret;
}
break;
}
@@ -72,12 +70,12 @@
case GEOS_POLYGON:
{
ret = LWGEOM_GEOS_getPointN(GEOSGetExteriorRing(g_in), n);
- if ( ret ) return ret;
- for (gn=0; gn<GEOSGetNumInteriorRings(g_in); ++gn)
+ if (ret) return ret;
+ for (gn = 0; gn < GEOSGetNumInteriorRings(g_in); ++gn)
{
const GEOSGeometry* g = GEOSGetInteriorRingN(g_in, gn);
ret = LWGEOM_GEOS_getPointN(g, n);
- if ( ret ) return ret;
+ if (ret) return ret;
}
break;
}
@@ -86,37 +84,34 @@
case GEOS_LINESTRING:
case GEOS_LINEARRING:
break;
-
}
seq_in = GEOSGeom_getCoordSeq(g_in);
- if ( ! seq_in ) return NULL;
- if ( ! GEOSCoordSeq_getSize(seq_in, &sz) ) return NULL;
- if ( ! sz ) return NULL;
+ if (!seq_in) return NULL;
+ if (!GEOSCoordSeq_getSize(seq_in, &sz)) return NULL;
+ if (!sz) return NULL;
- if ( ! GEOSCoordSeq_getDimensions(seq_in, &dims) ) return NULL;
+ if (!GEOSCoordSeq_getDimensions(seq_in, &dims)) return NULL;
seq_out = GEOSCoordSeq_create(1, dims);
- if ( ! seq_out ) return NULL;
+ if (!seq_out) return NULL;
- if ( ! GEOSCoordSeq_getX(seq_in, n, &val) ) return NULL;
- if ( ! GEOSCoordSeq_setX(seq_out, n, val) ) return NULL;
- if ( ! GEOSCoordSeq_getY(seq_in, n, &val) ) return NULL;
- if ( ! GEOSCoordSeq_setY(seq_out, n, val) ) return NULL;
- if ( dims > 2 )
+ if (!GEOSCoordSeq_getX(seq_in, n, &val)) return NULL;
+ if (!GEOSCoordSeq_setX(seq_out, n, val)) return NULL;
+ if (!GEOSCoordSeq_getY(seq_in, n, &val)) return NULL;
+ if (!GEOSCoordSeq_setY(seq_out, n, val)) return NULL;
+ if (dims > 2)
{
- if ( ! GEOSCoordSeq_getZ(seq_in, n, &val) ) return NULL;
- if ( ! GEOSCoordSeq_setZ(seq_out, n, val) ) return NULL;
+ if (!GEOSCoordSeq_getZ(seq_in, n, &val)) return NULL;
+ if (!GEOSCoordSeq_setZ(seq_out, n, val)) return NULL;
}
return GEOSGeom_createPoint(seq_out);
}
-
-
-LWGEOM * lwcollection_make_geos_friendly(LWCOLLECTION *g);
-LWGEOM * lwline_make_geos_friendly(LWLINE *line);
-LWGEOM * lwpoly_make_geos_friendly(LWPOLY *poly);
+LWGEOM* lwcollection_make_geos_friendly(LWCOLLECTION* g);
+LWGEOM* lwline_make_geos_friendly(LWLINE* line);
+LWGEOM* lwpoly_make_geos_friendly(LWPOLY* poly);
POINTARRAY* ring_make_geos_friendly(POINTARRAY* ring);
/*
@@ -125,8 +120,8 @@
* May return the input untouched (if already valid).
* May return geometries of lower dimension (on collapses)
*/
-static LWGEOM *
-lwgeom_make_geos_friendly(LWGEOM *geom)
+static LWGEOM*
+lwgeom_make_geos_friendly(LWGEOM* geom)
{
LWDEBUGF(2, "lwgeom_make_geos_friendly enter (type %d)", geom->type);
switch (geom->type)
@@ -139,18 +134,18 @@
case LINETYPE:
/* lines need at least 2 points */
- return lwline_make_geos_friendly((LWLINE *)geom);
+ return lwline_make_geos_friendly((LWLINE*)geom);
break;
case POLYGONTYPE:
/* polygons need all rings closed and with npoints > 3 */
- return lwpoly_make_geos_friendly((LWPOLY *)geom);
+ return lwpoly_make_geos_friendly((LWPOLY*)geom);
break;
case MULTILINETYPE:
case MULTIPOLYGONTYPE:
case COLLECTIONTYPE:
- return lwcollection_make_geos_friendly((LWCOLLECTION *)geom);
+ return lwcollection_make_geos_friendly((LWCOLLECTION*)geom);
break;
case CIRCSTRINGTYPE:
@@ -159,7 +154,9 @@
case MULTISURFACETYPE:
case MULTICURVETYPE:
default:
- lwerror("lwgeom_make_geos_friendly: unsupported input geometry type: %s (%d)", lwtype_name(geom->type), geom->type);
+ lwerror("lwgeom_make_geos_friendly: unsupported input geometry type: %s (%d)",
+ lwtype_name(geom->type),
+ geom->type);
break;
}
return 0;
@@ -178,13 +175,10 @@
POINTARRAY* newring;
/* close the ring if not already closed (2d only) */
- if ( ! ptarray_is_closed_2d(ring) )
+ if (!ptarray_is_closed_2d(ring))
{
/* close it up */
- newring = ptarray_addPoint(ring,
- getPoint_internal(ring, 0),
- FLAGS_NDIMS(ring->flags),
- ring->npoints);
+ newring = ptarray_addPoint(ring, getPoint_internal(ring, 0), FLAGS_NDIMS(ring->flags), ring->npoints);
ring = newring;
}
return ring;
@@ -199,26 +193,19 @@
/* close the ring if not already closed (2d only) */
closedring = ptarray_close2d(ring);
- if (closedring != ring )
- {
- ring = closedring;
- }
+ if (closedring != ring) ring = closedring;
/* return 0 for collapsed ring (after closeup) */
- while ( ring->npoints < 4 )
+ while (ring->npoints < 4)
{
- POINTARRAY *oring = ring;
+ POINTARRAY* oring = ring;
LWDEBUGF(4, "ring has %d points, adding another", ring->npoints);
/* let's add another... */
- ring = ptarray_addPoint(ring,
- getPoint_internal(ring, 0),
- FLAGS_NDIMS(ring->flags),
- ring->npoints);
- if ( oring != ring_in ) ptarray_free(oring);
+ ring = ptarray_addPoint(ring, getPoint_internal(ring, 0), FLAGS_NDIMS(ring->flags), ring->npoints);
+ if (oring != ring_in) ptarray_free(oring);
}
-
return ring;
}
@@ -225,36 +212,35 @@
/* Make sure all rings are closed and have > 3 points.
* May return the input untouched.
*/
-LWGEOM *
-lwpoly_make_geos_friendly(LWPOLY *poly)
+LWGEOM*
+lwpoly_make_geos_friendly(LWPOLY* poly)
{
LWGEOM* ret;
- POINTARRAY **new_rings;
+ POINTARRAY** new_rings;
uint32_t i;
/* If the polygon has no rings there's nothing to do */
- if ( ! poly->nrings ) return (LWGEOM*)poly;
+ if (!poly->nrings) return (LWGEOM*)poly;
/* Allocate enough pointers for all rings */
- new_rings = lwalloc(sizeof(POINTARRAY*)*poly->nrings);
+ new_rings = lwalloc(sizeof(POINTARRAY*) * poly->nrings);
/* All rings must be closed and have > 3 points */
- for (i=0; i<poly->nrings; i++)
+ for (i = 0; i < poly->nrings; i++)
{
POINTARRAY* ring_in = poly->rings[i];
POINTARRAY* ring_out = ring_make_geos_friendly(ring_in);
- if ( ring_in != ring_out )
+ if (ring_in != ring_out)
{
- LWDEBUGF(3, "lwpoly_make_geos_friendly: ring %d cleaned, now has %d points", i, ring_out->npoints);
+ LWDEBUGF(
+ 3, "lwpoly_make_geos_friendly: ring %d cleaned, now has %d points", i, ring_out->npoints);
ptarray_free(ring_in);
}
else
- {
LWDEBUGF(3, "lwpoly_make_geos_friendly: ring %d untouched", i);
- }
- assert ( ring_out );
+ assert(ring_out);
new_rings[i] = ring_out;
}
@@ -266,10 +252,10 @@
}
/* Need NO or >1 points. Duplicate first if only one. */
-LWGEOM *
-lwline_make_geos_friendly(LWLINE *line)
+LWGEOM*
+lwline_make_geos_friendly(LWLINE* line)
{
- LWGEOM *ret;
+ LWGEOM* ret;
if (line->points->npoints == 1) /* 0 is fine, 2 is fine */
{
@@ -276,9 +262,9 @@
#if 1
/* Duplicate point */
line->points = ptarray_addPoint(line->points,
- getPoint_internal(line->points, 0),
- FLAGS_NDIMS(line->points->flags),
- line->points->npoints);
+ getPoint_internal(line->points, 0),
+ FLAGS_NDIMS(line->points->flags),
+ line->points->npoints);
ret = (LWGEOM*)line;
#else
/* Turn into a point */
@@ -293,38 +279,36 @@
}
}
-LWGEOM *
-lwcollection_make_geos_friendly(LWCOLLECTION *g)
+LWGEOM*
+lwcollection_make_geos_friendly(LWCOLLECTION* g)
{
- LWGEOM **new_geoms;
- uint32_t i, new_ngeoms=0;
- LWCOLLECTION *ret;
+ LWGEOM** new_geoms;
+ uint32_t i, new_ngeoms = 0;
+ LWCOLLECTION* ret;
/* enough space for all components */
- new_geoms = lwalloc(sizeof(LWGEOM *)*g->ngeoms);
+ new_geoms = lwalloc(sizeof(LWGEOM*) * g->ngeoms);
ret = lwalloc(sizeof(LWCOLLECTION));
memcpy(ret, g, sizeof(LWCOLLECTION));
- ret->maxgeoms = g->ngeoms;
+ ret->maxgeoms = g->ngeoms;
- for (i=0; i<g->ngeoms; i++)
+ for (i = 0; i < g->ngeoms; i++)
{
LWGEOM* newg = lwgeom_make_geos_friendly(g->geoms[i]);
- if ( newg ) new_geoms[new_ngeoms++] = newg;
+ if (newg) new_geoms[new_ngeoms++] = newg;
}
ret->bbox = NULL; /* recompute later... */
ret->ngeoms = new_ngeoms;
- if ( new_ngeoms )
- {
+ if (new_ngeoms)
ret->geoms = new_geoms;
- }
else
{
free(new_geoms);
ret->geoms = NULL;
- ret->maxgeoms = 0;
+ ret->maxgeoms = 0;
}
return (LWGEOM*)ret;
@@ -347,14 +331,12 @@
*/
point = LWGEOM_GEOS_getPointN(lines, 0);
- if ( ! point ) return NULL;
+ if (!point) return NULL;
- LWDEBUGF(3,
- "Boundary point: %s",
- lwgeom_to_ewkt(GEOS2LWGEOM(point, 0)));
+ LWDEBUGF(3, "Boundary point: %s", lwgeom_to_ewkt(GEOS2LWGEOM(point, 0)));
noded = GEOSUnion(lines, point);
- if ( NULL == noded )
+ if (NULL == noded)
{
GEOSGeom_destroy(point);
return NULL;
@@ -363,9 +345,9 @@
GEOSGeom_destroy(point);
LWDEBUGF(3,
- "LWGEOM_GEOS_nodeLines: in[%s] out[%s]",
- lwgeom_to_ewkt(GEOS2LWGEOM(lines, 0)),
- lwgeom_to_ewkt(GEOS2LWGEOM(noded, 0)));
+ "LWGEOM_GEOS_nodeLines: in[%s] out[%s]",
+ lwgeom_to_ewkt(GEOS2LWGEOM(lines, 0)),
+ lwgeom_to_ewkt(GEOS2LWGEOM(noded, 0)));
return noded;
}
@@ -381,31 +363,24 @@
GEOSGeom gout;
GEOSGeom geos_bound;
GEOSGeom geos_cut_edges, geos_area, collapse_points;
- GEOSGeometry *vgeoms[3]; /* One for area, one for cut-edges */
- unsigned int nvgeoms=0;
+ GEOSGeometry* vgeoms[3]; /* One for area, one for cut-edges */
+ unsigned int nvgeoms = 0;
- assert (GEOSGeomTypeId(gin) == GEOS_POLYGON ||
- GEOSGeomTypeId(gin) == GEOS_MULTIPOLYGON);
+ assert(GEOSGeomTypeId(gin) == GEOS_POLYGON || GEOSGeomTypeId(gin) == GEOS_MULTIPOLYGON);
geos_bound = GEOSBoundary(gin);
- if ( NULL == geos_bound )
- {
- return NULL;
- }
+ if (NULL == geos_bound) return NULL;
- LWDEBUGF(3,
- "Boundaries: %s",
- lwgeom_to_ewkt(GEOS2LWGEOM(geos_bound, 0)));
+ LWDEBUGF(3, "Boundaries: %s", lwgeom_to_ewkt(GEOS2LWGEOM(geos_bound, 0)));
/* Use noded boundaries as initial "cut" edges */
#ifdef LWGEOM_PROFILE_MAKEVALID
- lwnotice("ST_MakeValid: noding lines");
+ lwnotice("ST_MakeValid: noding lines");
#endif
-
geos_cut_edges = LWGEOM_GEOS_nodeLines(geos_bound);
- if ( NULL == geos_cut_edges )
+ if (NULL == geos_cut_edges)
{
GEOSGeom_destroy(geos_bound);
lwnotice("LWGEOM_GEOS_nodeLines(): %s", lwgeom_geos_errmsg);
@@ -419,46 +394,40 @@
GEOSGeometry* po;
#ifdef LWGEOM_PROFILE_MAKEVALID
- lwnotice("ST_MakeValid: extracting unique points from bounds");
+ lwnotice("ST_MakeValid: extracting unique points from bounds");
#endif
pi = GEOSGeom_extractUniquePoints(geos_bound);
- if ( NULL == pi )
+ if (NULL == pi)
{
GEOSGeom_destroy(geos_bound);
- lwnotice("GEOSGeom_extractUniquePoints(): %s",
- lwgeom_geos_errmsg);
+ lwnotice("GEOSGeom_extractUniquePoints(): %s", lwgeom_geos_errmsg);
return NULL;
}
- LWDEBUGF(3,
- "Boundaries input points %s",
- lwgeom_to_ewkt(GEOS2LWGEOM(pi, 0)));
+ LWDEBUGF(3, "Boundaries input points %s", lwgeom_to_ewkt(GEOS2LWGEOM(pi, 0)));
#ifdef LWGEOM_PROFILE_MAKEVALID
- lwnotice("ST_MakeValid: extracting unique points from cut_edges");
+ lwnotice("ST_MakeValid: extracting unique points from cut_edges");
#endif
po = GEOSGeom_extractUniquePoints(geos_cut_edges);
- if ( NULL == po )
+ if (NULL == po)
{
GEOSGeom_destroy(geos_bound);
GEOSGeom_destroy(pi);
- lwnotice("GEOSGeom_extractUniquePoints(): %s",
- lwgeom_geos_errmsg);
+ lwnotice("GEOSGeom_extractUniquePoints(): %s", lwgeom_geos_errmsg);
return NULL;
}
- LWDEBUGF(3,
- "Boundaries output points %s",
- lwgeom_to_ewkt(GEOS2LWGEOM(po, 0)));
+ LWDEBUGF(3, "Boundaries output points %s", lwgeom_to_ewkt(GEOS2LWGEOM(po, 0)));
#ifdef LWGEOM_PROFILE_MAKEVALID
- lwnotice("ST_MakeValid: find collapse points");
+ lwnotice("ST_MakeValid: find collapse points");
#endif
collapse_points = GEOSDifference(pi, po);
- if ( NULL == collapse_points )
+ if (NULL == collapse_points)
{
GEOSGeom_destroy(geos_bound);
GEOSGeom_destroy(pi);
@@ -467,12 +436,10 @@
return NULL;
}
- LWDEBUGF(3,
- "Collapse points: %s",
- lwgeom_to_ewkt(GEOS2LWGEOM(collapse_points, 0)));
+ LWDEBUGF(3, "Collapse points: %s", lwgeom_to_ewkt(GEOS2LWGEOM(collapse_points, 0)));
#ifdef LWGEOM_PROFILE_MAKEVALID
- lwnotice("ST_MakeValid: cleanup(1)");
+ lwnotice("ST_MakeValid: cleanup(1)");
#endif
GEOSGeom_destroy(pi);
@@ -480,13 +447,11 @@
}
GEOSGeom_destroy(geos_bound);
- LWDEBUGF(3,
- "Noded Boundaries: %s",
- lwgeom_to_ewkt(GEOS2LWGEOM(geos_cut_edges, 0)));
+ LWDEBUGF(3, "Noded Boundaries: %s", lwgeom_to_ewkt(GEOS2LWGEOM(geos_cut_edges, 0)));
/* And use an empty geometry as initial "area" */
geos_area = GEOSGeom_createEmptyPolygon();
- if ( ! geos_area )
+ if (!geos_area)
{
lwnotice("GEOSGeom_createEmptyPolygon(): %s", lwgeom_geos_errmsg);
GEOSGeom_destroy(geos_cut_edges);
@@ -501,13 +466,13 @@
*/
while (GEOSGetNumGeometries(geos_cut_edges))
{
- GEOSGeometry* new_area=0;
- GEOSGeometry* new_area_bound=0;
- GEOSGeometry* symdif=0;
- GEOSGeometry* new_cut_edges=0;
+ GEOSGeometry* new_area = 0;
+ GEOSGeometry* new_area_bound = 0;
+ GEOSGeometry* symdif = 0;
+ GEOSGeometry* new_cut_edges = 0;
#ifdef LWGEOM_PROFILE_MAKEVALID
- lwnotice("ST_MakeValid: building area from %d edges", GEOSGetNumGeometries(geos_cut_edges));
+ lwnotice("ST_MakeValid: building area from %d edges", GEOSGetNumGeometries(geos_cut_edges));
#endif
/*
@@ -515,16 +480,15 @@
*/
new_area = LWGEOM_GEOS_buildArea(geos_cut_edges);
- if ( ! new_area ) /* must be an exception */
+ if (!new_area) /* must be an exception */
{
GEOSGeom_destroy(geos_cut_edges);
GEOSGeom_destroy(geos_area);
- lwnotice("LWGEOM_GEOS_buildArea() threw an error: %s",
- lwgeom_geos_errmsg);
+ lwnotice("LWGEOM_GEOS_buildArea() threw an error: %s", lwgeom_geos_errmsg);
return NULL;
}
- if ( GEOSisEmpty(new_area) )
+ if (GEOSisEmpty(new_area))
{
/* no more rings can be build with thes edges */
GEOSGeom_destroy(new_area);
@@ -536,7 +500,8 @@
*/
#ifdef LWGEOM_PROFILE_MAKEVALID
- lwnotice("ST_MakeValid: ring built with %d cut edges, saving boundaries", GEOSGetNumGeometries(geos_cut_edges));
+ lwnotice("ST_MakeValid: ring built with %d cut edges, saving boundaries",
+ GEOSGetNumGeometries(geos_cut_edges));
#endif
/*
@@ -544,13 +509,13 @@
* further cut edges later)
*/
new_area_bound = GEOSBoundary(new_area);
- if ( ! new_area_bound )
+ if (!new_area_bound)
{
/* We did check for empty area already so
* this must be some other error */
lwnotice("GEOSBoundary('%s') threw an error: %s",
- lwgeom_to_ewkt(GEOS2LWGEOM(new_area, 0)),
- lwgeom_geos_errmsg);
+ lwgeom_to_ewkt(GEOS2LWGEOM(new_area, 0)),
+ lwgeom_geos_errmsg);
GEOSGeom_destroy(new_area);
GEOSGeom_destroy(geos_area);
return NULL;
@@ -557,7 +522,7 @@
}
#ifdef LWGEOM_PROFILE_MAKEVALID
- lwnotice("ST_MakeValid: running SymDifference with new area");
+ lwnotice("ST_MakeValid: running SymDifference with new area");
#endif
/*
@@ -564,14 +529,13 @@
* Now symdif new and old area
*/
symdif = GEOSSymDifference(geos_area, new_area);
- if ( ! symdif ) /* must be an exception */
+ if (!symdif) /* must be an exception */
{
GEOSGeom_destroy(geos_cut_edges);
GEOSGeom_destroy(new_area);
GEOSGeom_destroy(new_area_bound);
GEOSGeom_destroy(geos_area);
- lwnotice("GEOSSymDifference() threw an error: %s",
- lwgeom_geos_errmsg);
+ lwnotice("GEOSSymDifference() threw an error: %s", lwgeom_geos_errmsg);
return NULL;
}
@@ -592,19 +556,18 @@
*/
#ifdef LWGEOM_PROFILE_MAKEVALID
- lwnotice("ST_MakeValid: computing new cut_edges (GEOSDifference)");
+ lwnotice("ST_MakeValid: computing new cut_edges (GEOSDifference)");
#endif
new_cut_edges = GEOSDifference(geos_cut_edges, new_area_bound);
GEOSGeom_destroy(new_area_bound);
- if ( ! new_cut_edges ) /* an exception ? */
+ if (!new_cut_edges) /* an exception ? */
{
/* cleanup and throw */
GEOSGeom_destroy(geos_cut_edges);
GEOSGeom_destroy(geos_area);
/* TODO: Shouldn't this be an lwerror ? */
- lwnotice("GEOSDifference() threw an error: %s",
- lwgeom_geos_errmsg);
+ lwnotice("GEOSDifference() threw an error: %s", lwgeom_geos_errmsg);
return NULL;
}
GEOSGeom_destroy(geos_cut_edges);
@@ -612,37 +575,25 @@
}
#ifdef LWGEOM_PROFILE_MAKEVALID
- lwnotice("ST_MakeValid: final checks");
+ lwnotice("ST_MakeValid: final checks");
#endif
- if ( ! GEOSisEmpty(geos_area) )
- {
+ if (!GEOSisEmpty(geos_area))
vgeoms[nvgeoms++] = geos_area;
- }
else
- {
GEOSGeom_destroy(geos_area);
- }
- if ( ! GEOSisEmpty(geos_cut_edges) )
- {
+ if (!GEOSisEmpty(geos_cut_edges))
vgeoms[nvgeoms++] = geos_cut_edges;
- }
else
- {
GEOSGeom_destroy(geos_cut_edges);
- }
- if ( ! GEOSisEmpty(collapse_points) )
- {
+ if (!GEOSisEmpty(collapse_points))
vgeoms[nvgeoms++] = collapse_points;
- }
else
- {
GEOSGeom_destroy(collapse_points);
- }
- if ( 1 == nvgeoms )
+ if (1 == nvgeoms)
{
/* Return cut edges */
gout = vgeoms[0];
@@ -651,12 +602,11 @@
{
/* Collect areas and lines (if any line) */
gout = GEOSGeom_createCollection(GEOS_GEOMETRYCOLLECTION, vgeoms, nvgeoms);
- if ( ! gout ) /* an exception again */
+ if (!gout) /* an exception again */
{
/* cleanup and throw */
/* TODO: Shouldn't this be an lwerror ? */
- lwnotice("GEOSGeom_createCollection() threw an error: %s",
- lwgeom_geos_errmsg);
+ lwnotice("GEOSGeom_createCollection() threw an error: %s", lwgeom_geos_errmsg);
/* TODO: cleanup! */
return NULL;
}
@@ -663,7 +613,6 @@
}
return gout;
-
}
static GEOSGeometry*
@@ -679,44 +628,40 @@
{
GEOSGeometry** lines;
GEOSGeometry** points;
- GEOSGeometry* mline_out=0;
- GEOSGeometry* mpoint_out=0;
- GEOSGeometry* gout=0;
- uint32_t nlines=0, nlines_alloc;
- uint32_t npoints=0;
- uint32_t ngeoms=0, nsubgeoms;
+ GEOSGeometry* mline_out = 0;
+ GEOSGeometry* mpoint_out = 0;
+ GEOSGeometry* gout = 0;
+ uint32_t nlines = 0, nlines_alloc;
+ uint32_t npoints = 0;
+ uint32_t ngeoms = 0, nsubgeoms;
uint32_t i, j;
ngeoms = GEOSGetNumGeometries(gin);
nlines_alloc = ngeoms;
- lines = lwalloc(sizeof(GEOSGeometry*)*nlines_alloc);
- points = lwalloc(sizeof(GEOSGeometry*)*ngeoms);
+ lines = lwalloc(sizeof(GEOSGeometry*) * nlines_alloc);
+ points = lwalloc(sizeof(GEOSGeometry*) * ngeoms);
- for (i=0; i<ngeoms; ++i)
+ for (i = 0; i < ngeoms; ++i)
{
const GEOSGeometry* g = GEOSGetGeometryN(gin, i);
GEOSGeometry* vg;
vg = LWGEOM_GEOS_makeValidLine(g);
- if ( GEOSisEmpty(vg) )
+ if (GEOSisEmpty(vg))
{
/* we don't care about this one */
GEOSGeom_destroy(vg);
}
- if ( GEOSGeomTypeId(vg) == GEOS_POINT )
- {
+ if (GEOSGeomTypeId(vg) == GEOS_POINT)
points[npoints++] = vg;
- }
- else if ( GEOSGeomTypeId(vg) == GEOS_LINESTRING )
- {
+ else if (GEOSGeomTypeId(vg) == GEOS_LINESTRING)
lines[nlines++] = vg;
- }
- else if ( GEOSGeomTypeId(vg) == GEOS_MULTILINESTRING )
+ else if (GEOSGeomTypeId(vg) == GEOS_MULTILINESTRING)
{
- nsubgeoms=GEOSGetNumGeometries(vg);
+ nsubgeoms = GEOSGetNumGeometries(vg);
nlines_alloc += nsubgeoms;
- lines = lwrealloc(lines, sizeof(GEOSGeometry*)*nlines_alloc);
- for (j=0; j<nsubgeoms; ++j)
+ lines = lwrealloc(lines, sizeof(GEOSGeometry*) * nlines_alloc);
+ for (j = 0; j < nsubgeoms; ++j)
{
const GEOSGeometry* gc = GEOSGetGeometryN(vg, j);
/* NOTE: ownership of the cloned geoms will be
@@ -728,55 +673,39 @@
{
/* NOTE: return from GEOSGeomType will leak
* but we really don't expect this to happen */
- lwerror("unexpected geom type returned "
- "by LWGEOM_GEOS_makeValid: %s",
- GEOSGeomType(vg));
+ lwerror("unexpected geom type returned by LWGEOM_GEOS_makeValid: %s", GEOSGeomType(vg));
}
}
- if ( npoints )
+ if (npoints)
{
- if ( npoints > 1 )
- {
- mpoint_out = GEOSGeom_createCollection(GEOS_MULTIPOINT,
- points, npoints);
- }
+ if (npoints > 1)
+ mpoint_out = GEOSGeom_createCollection(GEOS_MULTIPOINT, points, npoints);
else
- {
mpoint_out = points[0];
- }
}
- if ( nlines )
+ if (nlines)
{
- if ( nlines > 1 )
- {
- mline_out = GEOSGeom_createCollection(
- GEOS_MULTILINESTRING, lines, nlines);
- }
+ if (nlines > 1)
+ mline_out = GEOSGeom_createCollection(GEOS_MULTILINESTRING, lines, nlines);
else
- {
mline_out = lines[0];
- }
}
lwfree(lines);
- if ( mline_out && mpoint_out )
+ if (mline_out && mpoint_out)
{
points[0] = mline_out;
points[1] = mpoint_out;
- gout = GEOSGeom_createCollection(GEOS_GEOMETRYCOLLECTION,
- points, 2);
+ gout = GEOSGeom_createCollection(GEOS_GEOMETRYCOLLECTION, points, 2);
}
- else if ( mline_out )
- {
+ else if (mline_out)
gout = mline_out;
- }
- else if ( mpoint_out )
- {
+
+ else if (mpoint_out)
gout = mpoint_out;
- }
lwfree(points);
@@ -793,27 +722,31 @@
LWGEOM_GEOS_makeValidCollection(const GEOSGeometry* gin)
{
int nvgeoms;
- GEOSGeometry **vgeoms;
+ GEOSGeometry** vgeoms;
GEOSGeom gout;
int i;
nvgeoms = GEOSGetNumGeometries(gin);
- if ( nvgeoms == -1 ) {
+ if (nvgeoms == -1)
+ {
lwerror("GEOSGetNumGeometries: %s", lwgeom_geos_errmsg);
return 0;
}
- vgeoms = lwalloc( sizeof(GEOSGeometry*) * nvgeoms );
- if ( ! vgeoms ) {
+ vgeoms = lwalloc(sizeof(GEOSGeometry*) * nvgeoms);
+ if (!vgeoms)
+ {
lwerror("LWGEOM_GEOS_makeValidCollection: out of memory");
return 0;
}
- for ( i=0; i<nvgeoms; ++i ) {
- vgeoms[i] = LWGEOM_GEOS_makeValid( GEOSGetGeometryN(gin, i) );
- if ( ! vgeoms[i] ) {
+ for (i = 0; i < nvgeoms; ++i)
+ {
+ vgeoms[i] = LWGEOM_GEOS_makeValid(GEOSGetGeometryN(gin, i));
+ if (!vgeoms[i])
+ {
int j;
- for (j = 0; j<i-1; j++)
+ for (j = 0; j < i - 1; j++)
GEOSGeom_destroy(vgeoms[j]);
lwfree(vgeoms);
/* we expect lwerror being called already by makeValid */
@@ -823,22 +756,20 @@
/* Collect areas and lines (if any line) */
gout = GEOSGeom_createCollection(GEOS_GEOMETRYCOLLECTION, vgeoms, nvgeoms);
- if ( ! gout ) /* an exception again */
+ if (!gout) /* an exception again */
{
/* cleanup and throw */
- for ( i=0; i<nvgeoms; ++i ) GEOSGeom_destroy(vgeoms[i]);
+ for (i = 0; i < nvgeoms; ++i)
+ GEOSGeom_destroy(vgeoms[i]);
lwfree(vgeoms);
- lwerror("GEOSGeom_createCollection() threw an error: %s",
- lwgeom_geos_errmsg);
+ lwerror("GEOSGeom_createCollection() threw an error: %s", lwgeom_geos_errmsg);
return NULL;
}
lwfree(vgeoms);
return gout;
-
}
-
static GEOSGeometry*
LWGEOM_GEOS_makeValid(const GEOSGeometry* gin)
{
@@ -850,17 +781,15 @@
*/
ret_char = GEOSisValid(gin);
- if ( ret_char == 2 )
+ if (ret_char == 2)
{
/* I don't think should ever happen */
lwerror("GEOSisValid(): %s", lwgeom_geos_errmsg);
return NULL;
}
- else if ( ret_char )
+ else if (ret_char)
{
- LWDEBUGF(3,
- "Geometry [%s] is valid. ",
- lwgeom_to_ewkt(GEOS2LWGEOM(gin, 0)));
+ LWDEBUGF(3, "Geometry [%s] is valid. ", lwgeom_to_ewkt(GEOS2LWGEOM(gin, 0)));
/* It's valid at this step, return what we have */
return GEOSGeom_clone(gin);
@@ -867,12 +796,10 @@
}
LWDEBUGF(3,
- "Geometry [%s] is still not valid: %s. "
- "Will try to clean up further.",
- lwgeom_to_ewkt(GEOS2LWGEOM(gin, 0)), lwgeom_geos_errmsg);
+ "Geometry [%s] is still not valid: %s. Will try to clean up further.",
+ lwgeom_to_ewkt(GEOS2LWGEOM(gin, 0)),
+ lwgeom_geos_errmsg);
-
-
/*
* Step 3 : make what we got valid
*/
@@ -888,7 +815,7 @@
case GEOS_LINESTRING:
gout = LWGEOM_GEOS_makeValidLine(gin);
- if ( ! gout ) /* an exception or something */
+ if (!gout) /* an exception or something */
{
/* cleanup and throw */
lwerror("%s", lwgeom_geos_errmsg);
@@ -898,7 +825,7 @@
case GEOS_MULTILINESTRING:
gout = LWGEOM_GEOS_makeValidMultiLine(gin);
- if ( ! gout ) /* an exception or something */
+ if (!gout) /* an exception or something */
{
/* cleanup and throw */
lwerror("%s", lwgeom_geos_errmsg);
@@ -910,7 +837,7 @@
case GEOS_MULTIPOLYGON:
{
gout = LWGEOM_GEOS_makeValidPolygon(gin);
- if ( ! gout ) /* an exception or something */
+ if (!gout) /* an exception or something */
{
/* cleanup and throw */
lwerror("%s", lwgeom_geos_errmsg);
@@ -922,7 +849,7 @@
case GEOS_GEOMETRYCOLLECTION:
{
gout = LWGEOM_GEOS_makeValidCollection(gin);
- if ( ! gout ) /* an exception or something */
+ if (!gout) /* an exception or something */
{
/* cleanup and throw */
lwerror("%s", lwgeom_geos_errmsg);
@@ -934,8 +861,7 @@
default:
{
char* typname = GEOSGeomType(gin);
- lwnotice("ST_MakeValid: doesn't support geometry type: %s",
- typname);
+ lwnotice("ST_MakeValid: doesn't support geometry type: %s", typname);
GEOSFree(typname);
return NULL;
break;
@@ -944,35 +870,33 @@
#if PARANOIA_LEVEL > 1
/*
- * Now check if every point of input is also found
- * in output, or abort by returning NULL
+ * Now check if every point of input is also found in output, or abort by returning NULL
*
* Input geometry was lwgeom_in
*/
{
- int loss;
- GEOSGeometry *pi, *po, *pd;
+ int loss;
+ GEOSGeometry *pi, *po, *pd;
- /* TODO: handle some errors here...
- * Lack of exceptions is annoying indeed,
- * I'm getting old --strk;
- */
- pi = GEOSGeom_extractUniquePoints(gin);
- po = GEOSGeom_extractUniquePoints(gout);
- pd = GEOSDifference(pi, po); /* input points - output points */
- GEOSGeom_destroy(pi);
- GEOSGeom_destroy(po);
- loss = !GEOSisEmpty(pd);
- GEOSGeom_destroy(pd);
- if ( loss )
- {
- lwnotice("%s [%d] Vertices lost in LWGEOM_GEOS_makeValid", __FILE__, __LINE__);
- /* return NULL */
- }
+ /* TODO: handle some errors here...
+ * Lack of exceptions is annoying indeed,
+ * I'm getting old --strk;
+ */
+ pi = GEOSGeom_extractUniquePoints(gin);
+ po = GEOSGeom_extractUniquePoints(gout);
+ pd = GEOSDifference(pi, po); /* input points - output points */
+ GEOSGeom_destroy(pi);
+ GEOSGeom_destroy(po);
+ loss = !GEOSisEmpty(pd);
+ GEOSGeom_destroy(pd);
+ if (loss)
+ {
+ lwnotice("%s [%d] Vertices lost in LWGEOM_GEOS_makeValid", __FILE__, __LINE__);
+ /* return NULL */
+ }
}
#endif /* PARANOIA_LEVEL > 1 */
-
return gout;
}
@@ -983,7 +907,7 @@
int is3d;
GEOSGeom geosgeom;
GEOSGeometry* geosout;
- LWGEOM *lwgeom_out;
+ LWGEOM* lwgeom_out;
is3d = FLAGS_GET_Z(lwgeom_in->flags);
@@ -996,30 +920,24 @@
lwgeom_out = lwgeom_in;
geosgeom = LWGEOM2GEOS(lwgeom_out, 0);
- if ( ! geosgeom )
+ if (!geosgeom)
{
LWDEBUGF(4,
- "Original geom can't be converted to GEOS (%s)"
- " - will try cleaning that up first",
- lwgeom_geos_errmsg);
+ "Original geom can't be converted to GEOS (%s)"
+ " - will try cleaning that up first",
+ lwgeom_geos_errmsg);
-
lwgeom_out = lwgeom_make_geos_friendly(lwgeom_out);
- if ( ! lwgeom_out )
- {
- lwerror("Could not make a valid geometry out of input");
- }
+ if (!lwgeom_out) lwerror("Could not make a valid geometry out of input");
/* try again as we did cleanup now */
/* TODO: invoke LWGEOM2GEOS directly with autoclean ? */
geosgeom = LWGEOM2GEOS(lwgeom_out, 0);
- if ( ! geosgeom )
+ if (!geosgeom)
{
- lwerror("Couldn't convert POSTGIS geom to GEOS: %s",
- lwgeom_geos_errmsg);
+ lwerror("Couldn't convert POSTGIS geom to GEOS: %s", lwgeom_geos_errmsg);
return NULL;
}
-
}
else
{
@@ -1029,30 +947,26 @@
geosout = LWGEOM_GEOS_makeValid(geosgeom);
GEOSGeom_destroy(geosgeom);
- if ( ! geosout )
- {
- return NULL;
- }
+ if (!geosout) return NULL;
lwgeom_out = GEOS2LWGEOM(geosout, is3d);
GEOSGeom_destroy(geosout);
- if ( lwgeom_is_collection(lwgeom_in) && ! lwgeom_is_collection(lwgeom_out) )
- {{
- LWGEOM **ogeoms = lwalloc(sizeof(LWGEOM*));
- LWGEOM *ogeom;
+ if (lwgeom_is_collection(lwgeom_in) && !lwgeom_is_collection(lwgeom_out))
+ {
+ LWGEOM** ogeoms = lwalloc(sizeof(LWGEOM*));
+ LWGEOM* ogeom;
LWDEBUG(3, "lwgeom_make_valid: forcing multi");
/* NOTE: this is safe because lwgeom_out is surely not lwgeom_in or
* otherwise we couldn't have a collection and a non-collection */
assert(lwgeom_in != lwgeom_out);
ogeoms[0] = lwgeom_out;
- ogeom = (LWGEOM *)lwcollection_construct(MULTITYPE[lwgeom_out->type],
- lwgeom_out->srid, lwgeom_out->bbox, 1, ogeoms);
+ ogeom = (LWGEOM*)lwcollection_construct(
+ MULTITYPE[lwgeom_out->type], lwgeom_out->srid, lwgeom_out->bbox, 1, ogeoms);
lwgeom_out->bbox = NULL;
lwgeom_out = ogeom;
- }}
+ }
lwgeom_out->srid = lwgeom_in->srid;
return lwgeom_out;
}
-
More information about the postgis-tickets
mailing list