cu_libgeom.o \
cu_split.o \
cu_stringbuffer.o \
+ cu_triangulate.o \
cu_homogenize.o \
cu_out_wkt.o \
cu_out_wkb.o \
extern CU_SuiteInfo geodetic_suite;
extern CU_SuiteInfo geos_suite;
extern CU_SuiteInfo tree_suite;
+extern CU_SuiteInfo triangulate_suite;
extern CU_SuiteInfo homogenize_suite;
extern CU_SuiteInfo stringbuffer_suite;
extern CU_SuiteInfo surface_suite;
geodetic_suite,
geos_suite,
tree_suite,
+ triangulate_suite,
stringbuffer_suite,
surface_suite,
homogenize_suite,
--- /dev/null
+/**********************************************************************
+ *
+ * PostGIS - Spatial Types for PostgreSQL
+ * http://postgis.refractions.net
+ *
+ * Copyright (C) 2012 Sandro Santilli <strk@keybit.net>
+ *
+ * This is free software; you can redistribute and/or modify it under
+ * the terms of the GNU General Public Licence. See the COPYING file.
+ *
+ **********************************************************************/
+
+#include "CUnit/Basic.h"
+#include "cu_tester.h"
+
+#include "liblwgeom.h"
+#include "liblwgeom_internal.h"
+
+static void test_lwgeom_delaunay_triangulation(void)
+{
+#if POSTGIS_GEOS_VERSION >= 34
+ LWGEOM *in, *tmp, *out;
+ char *wkt, *exp_wkt;
+
+ /* Because i don't trust that much prior tests... ;) */
+ cu_error_msg_reset();
+
+ in = lwgeom_from_wkt("MULTIPOINT(10 0, 20 0, 5 5)", LW_PARSER_CHECK_NONE);
+
+ tmp = lwgeom_delaunay_triangulation(in, 0, 0);
+ lwgeom_free(in);
+ out = lwgeom_normalize(tmp);
+ lwgeom_free(tmp);
+
+ wkt = lwgeom_to_ewkt(out);
+ lwgeom_free(out);
+
+ exp_wkt = "GEOMETRYCOLLECTION(POLYGON((5 5,20 0,10 0,5 5)))";
+ if ( strcmp(wkt, exp_wkt) )
+ {
+ fprintf(stderr, "\nExp: %s\nObt: %s\n", exp_wkt, wkt);
+ }
+ CU_ASSERT_STRING_EQUAL(wkt, exp_wkt);
+ lwfree(wkt);
+
+#endif /* POSTGIS_GEOS_VERSION >= 33 */
+}
+
+
+/*
+** Used by test harness to register the tests in this file.
+*/
+CU_TestInfo triangulate_tests[] =
+{
+ PG_TEST(test_lwgeom_delaunay_triangulation),
+ CU_TEST_INFO_NULL
+};
+CU_SuiteInfo triangulate_suite = {"triangulate", NULL, NULL, triangulate_tests};
*/
LWGEOM* lwgeom_node(const LWGEOM* lwgeom_in);
+/**
+ * Take vertices of a geometry and build a delaunay
+ * triangulation on them.
+ *
+ * @param geom the input geometry
+ * @param tolerance an optional snapping tolerance for improved tolerance
+ * @param edgeOnly if non-zero the result will be a MULTILINESTRING,
+ * otherwise it'll be a COLLECTION of polygons.
+ */
+LWGEOM* lwgeom_delaunay_triangulation(const LWGEOM *geom, double tolerance, int edgeOnly);
+
#endif /* !defined _LIBLWGEOM_H */
* PostGIS - Spatial Types for PostgreSQL
* http://postgis.refractions.net
*
- * Copyright 2011 Sandro Santilli <strk@keybit.net>
+ * Copyright 2011-2012 Sandro Santilli <strk@keybit.net>
*
* This is free software; you can redistribute and/or modify it under
* the terms of the GNU General Public Licence. See the COPYING file.
#endif /* POSTGIS_GEOS_VERSION < 32 */
}
+
+LWGEOM*
+lwgeom_delaunay_triangulation(const LWGEOM *lwgeom_in, double tolerance, int edgeOnly)
+{
+#if POSTGIS_GEOS_VERSION < 34
+ lwerror("lwgeom_delaunay_triangulation: GEOS 3.4 or higher required");
+#else
+ GEOSGeometry *g1, *g3;
+ LWGEOM *lwgeom_result;
+
+ initGEOS(lwnotice, lwgeom_geos_error);
+
+ g1 = (GEOSGeometry *)LWGEOM2GEOS(lwgeom_in);
+ if ( ! g1 )
+ {
+ lwerror("lwgeom_delaunay_triangulation: Geometry could not be converted to GEOS: %s", lwgeom_geos_errmsg);
+ return NULL;
+ }
+
+ g3 = GEOSDelaunayTriangulation(g1, tolerance, edgeOnly);
+
+ /* Don't need input geometry anymore */
+ GEOSGeom_destroy(g1);
+
+ if (g3 == NULL)
+ {
+ lwerror("GEOSDelaunayTriangulation: %s", lwgeom_geos_errmsg);
+ return NULL;
+ }
+
+ /* LWDEBUGF(3, "result: %s", GEOSGeomToWKT(g3)); */
+
+ GEOSSetSRID(g3, lwgeom_get_srid(lwgeom_in));
+ lwgeom_result = GEOS2LWGEOM(g3, lwgeom_has_z(lwgeom_in));
+ GEOSGeom_destroy(g3);
+
+ if (lwgeom_result == NULL)
+ {
+ lwerror("lwgeom_delaunay_triangulation: GEOS2LWGEOM returned null");
+ return NULL;
+ }
+
+ return lwgeom_result;
+
+#endif /* POSTGIS_GEOS_VERSION < 34 */
+}