]> granicus.if.org Git - postgis/commitdiff
Add lwgeom_normalize in LIBLWGEOM, use in cu_buildarea tester
authorSandro Santilli <strk@keybit.net>
Thu, 17 May 2012 11:45:26 +0000 (11:45 +0000)
committerSandro Santilli <strk@keybit.net>
Thu, 17 May 2012 11:45:26 +0000 (11:45 +0000)
git-svn-id: http://svn.osgeo.org/postgis/trunk@9742 b70326c6-7e19-0410-871a-916f4a2858ee

NEWS
liblwgeom/cunit/cu_buildarea.c
liblwgeom/liblwgeom.h.in
liblwgeom/lwgeom_geos.c

diff --git a/NEWS b/NEWS
index ae36fc1486b66261407d12975b072fd9cc6b1dbc..446198a5ff90defaad1e2c3c7b1f7ec64fda3490 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -26,6 +26,7 @@ PostGIS 2.0.1
   - #1786, improved build dependencies 
   - #1802, improved function interruptibility.
   - #1806, speedup of ST_BuildArea, ST_MakeValid and ST_GetFaceGeometry.
+  - Add lwgeom_normalize in LIBLWGEOM 
 
 PostGIS 2.0.0
 2012/04/03
index a8a090b2d3654152c5a0554aea466b416b26e60e..01df54e91fbc1b106ac7ff819bdbf9e9fee6c098 100644 (file)
  */
 #define check_geom_equal(gobt, gexp) do { \
        char *obt, *exp; \
-       if ( ! lwgeom_same((gobt), (gexp)) ) { \
-               obt = lwgeom_to_wkt((gobt), WKT_ISO, 8, NULL); \
-               exp = lwgeom_to_wkt((gexp), WKT_ISO, 8, NULL); \
+       LWGEOM *ngobt, *ngexp; \
+       ngobt = lwgeom_normalize(gobt); \
+       ngexp = lwgeom_normalize(gexp); \
+       if ( ! lwgeom_same((ngobt), (ngexp)) ) { \
+               obt = lwgeom_to_wkt((ngobt), WKT_ISO, 8, NULL); \
+               exp = lwgeom_to_wkt((ngexp), WKT_ISO, 8, NULL); \
                printf(" Failure at %s:%d\n", __FILE__, __LINE__); \
                printf(" Exp: %s\n", exp); \
                printf(" Obt: %s\n", obt); \
                free(obt); free(exp); \
+    lwgeom_free(ngobt); lwgeom_free(ngexp); \
                CU_ASSERT(0); \
-       } else CU_ASSERT(1); \
+       } else { \
+    lwgeom_free(ngobt); lwgeom_free(ngexp); \
+    CU_ASSERT(1); \
+  } \
 } while (0)
 
 /*
index 70cd275e145dc2176fe5519480bd1cb74be62c29..9c2293815513b8a3ba69c43e44d986b6aba4530d 100644 (file)
@@ -1808,6 +1808,7 @@ const char* lwgeom_geos_version(void);
 /** Convert an LWGEOM to a GEOS Geometry and convert back -- for debug only */
 LWGEOM* lwgeom_geos_noop(const LWGEOM *geom) ;
 
+LWGEOM *lwgeom_normalize(const LWGEOM *geom);
 LWGEOM *lwgeom_intersection(const LWGEOM *geom1, const LWGEOM *geom2);
 LWGEOM *lwgeom_difference(const LWGEOM *geom1, const LWGEOM *geom2);
 LWGEOM *lwgeom_symdifference(const LWGEOM* geom1, const LWGEOM* geom2);
index 5edd3c43356745030617d4aa2246679c500cd83e..88cfbce3934eeeb0e1a34e040b2d225140bbac73 100644 (file)
@@ -416,6 +416,46 @@ lwgeom_geos_version()
        return ver;
 }
 
+LWGEOM *
+lwgeom_normalize(const LWGEOM *geom1)
+{
+       LWGEOM *result ;
+       GEOSGeometry *g1;
+       int is3d ;
+       int srid ;
+
+       srid = (int)(geom1->srid);
+       is3d = FLAGS_GET_Z(geom1->flags);
+
+       initGEOS(lwnotice, lwgeom_geos_error);
+
+       g1 = LWGEOM2GEOS(geom1);
+       if ( 0 == g1 )   /* exception thrown at construction */
+       {
+               lwerror("First argument geometry could not be converted to GEOS.");
+               return NULL ;
+       }
+
+       if ( -1 == GEOSNormalize(g1) )
+       {
+         lwerror("Error in GEOSNormalize: %s", lwgeom_geos_errmsg);
+               return NULL; /* never get here */
+       }
+
+       GEOSSetSRID(g1, srid); /* needed ? */
+       result = GEOS2LWGEOM(g1, is3d);
+       GEOSGeom_destroy(g1);
+
+       if (result == NULL)
+       {
+         lwerror("Error performing intersection: GEOS2LWGEOM: %s",
+                       lwgeom_geos_errmsg);
+               return NULL ; /* never get here */
+       }
+
+       return result ;
+}
+
 LWGEOM *
 lwgeom_intersection(const LWGEOM *geom1, const LWGEOM *geom2)
 {