From: Paul Ramsey Date: Wed, 5 Jun 2013 18:11:58 +0000 (+0000) Subject: #2307, ST_MakeValid outputs invalid geometries X-Git-Tag: 2.1.0beta3~17 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=88eec792123ba7fb448b39325c206f52841c5702;p=postgis #2307, ST_MakeValid outputs invalid geometries git-svn-id: http://svn.osgeo.org/postgis/trunk@11525 b70326c6-7e19-0410-871a-916f4a2858ee --- diff --git a/NEWS b/NEWS index e33b75328..fb29634a3 100644 --- a/NEWS +++ b/NEWS @@ -200,6 +200,7 @@ PostGIS 2.1.0 - #2257, GBOX variables not initialized when testing with empty geometries - #2271, Prevent parallel make of raster - #2282, Fix call to undefined function nd_stats_to_grid() in debug mode + - #2307, ST_MakeValid outputs invalid geometries - #2309, Remove confusing INFO message when trying to get SRS info - #2348, Provide raster upgrade path for 2.0 to 2.1 diff --git a/liblwgeom/lwgeom_geos_clean.c b/liblwgeom/lwgeom_geos_clean.c index f9ddf564e..5c13204b1 100644 --- a/liblwgeom/lwgeom_geos_clean.c +++ b/liblwgeom/lwgeom_geos_clean.c @@ -317,6 +317,7 @@ lwcollection_make_geos_friendly(LWCOLLECTION *g) ret = lwalloc(sizeof(LWCOLLECTION)); memcpy(ret, g, sizeof(LWCOLLECTION)); + ret->maxgeoms = g->ngeoms; for (i=0; ingeoms; i++) { @@ -324,7 +325,7 @@ lwcollection_make_geos_friendly(LWCOLLECTION *g) if ( newg ) new_geoms[new_ngeoms++] = newg; } - ret->bbox = 0; /* recompute later... */ + ret->bbox = NULL; /* recompute later... */ ret->ngeoms = new_ngeoms; if ( new_ngeoms ) @@ -334,7 +335,8 @@ lwcollection_make_geos_friendly(LWCOLLECTION *g) else { free(new_geoms); - ret->geoms = 0; + ret->geoms = NULL; + ret->maxgeoms = 0; } return (LWGEOM*)ret; @@ -1045,16 +1047,16 @@ lwgeom_make_valid(LWGEOM* lwgeom_in) } lwgeom_out = GEOS2LWGEOM(geosout, is3d); + GEOSGeom_destroy(geosout); + if ( lwgeom_is_collection(lwgeom_in) && ! lwgeom_is_collection(lwgeom_out) ) { LWDEBUG(3, "lwgeom_make_valid: forcing multi"); lwgeom_tmp = lwgeom_as_multi(lwgeom_out); - lwgeom_free(lwgeom_out); + // lwgeom_free(lwgeom_out); lwgeom_out = lwgeom_tmp; } - GEOSGeom_destroy(geosout); - lwgeom_out->srid = lwgeom_in->srid; return lwgeom_out; }