PostGIS 3.7.0dev-r@@SVN_REVISION@@
Loading...
Searching...
No Matches
cu_clean.c
Go to the documentation of this file.
1/**********************************************************************
2 *
3 * PostGIS - Spatial Types for PostgreSQL
4 * http://postgis.net
5 *
6 * Copyright (C) 2012 Sandro Santilli <strk@kbt.io>
7 *
8 * This is free software; you can redistribute and/or modify it under
9 * the terms of the GNU General Public Licence. See the COPYING file.
10 *
11 **********************************************************************/
12
13#include "CUnit/Basic.h"
14#include "cu_tester.h"
15
16#include "liblwgeom.h"
17#include "liblwgeom_internal.h"
18/*
19 * TODO: change lwgeom_same to lwgeom_equals
20 * (requires porting predicates to liblwgeom)
21 */
22#define check_geom_equal(gobt, gexp) do { \
23 char *obt, *exp; \
24 LWGEOM *ngobt, *ngexp; \
25 ngobt = lwgeom_normalize(gobt); \
26 ngexp = lwgeom_normalize(gexp); \
27 if ( ! lwgeom_same((ngobt), (ngexp)) ) { \
28 obt = lwgeom_to_wkt((ngobt), WKT_ISO, 8, NULL); \
29 exp = lwgeom_to_wkt((ngexp), WKT_ISO, 8, NULL); \
30 printf(" Failure at %s:%d\n", __FILE__, __LINE__); \
31 printf(" Exp: %s\n", exp); \
32 printf(" Obt: %s\n", obt); \
33 free(obt); free(exp); \
34 lwgeom_free(ngobt); lwgeom_free(ngexp); \
35 CU_ASSERT(0); \
36 } else { \
37 lwgeom_free(ngobt); lwgeom_free(ngexp); \
38 CU_ASSERT(1); \
39 } \
40} while (0)
41
42static void test_lwgeom_make_valid(void)
43{
44 LWGEOM *gin, *gout, *gexp;
45 char *ewkt;
46
47 /* Because i don't trust that much prior tests... ;) */
49
50 gin = lwgeom_from_wkt(
51"MULTIPOLYGON(((1725063 4819121, 1725104 4819067, 1725060 4819087, 1725064.14183882 4819094.70208557,1725064.13656044 4819094.70235069,1725064.14210359 4819094.70227252,1725064.14210362 4819094.70227252,1725064.13656043 4819094.70235069,1725055. 4819094, 1725055 4819094, 1725055 4819094, 1725063 4819121)))",
53 CU_ASSERT(gin != NULL);
54
55 gout = lwgeom_make_valid(gin);
56
57 /* We're really only interested in avoiding a crash in here.
58 * See http://trac.osgeo.org/postgis/ticket/1738
59 * TODO: enhance the test if we find a workaround
60 * to the exception:
61 * See http://trac.osgeo.org/postgis/ticket/1735
62 */
63
64 lwgeom_free(gout);
65 lwgeom_free(gin);
66
67 /* Test for http://trac.osgeo.org/postgis/ticket/2307 */
68
69 gin = lwgeom_from_hexwkb("0106000020E6100000010000000103000000010000000A0000004B7DA956B99844C0DB0790FE8B4D1DC010BA74A9AF9444C049AFFC5B8C4D1DC03FC6CC690D9844C0DD67E5628C4D1DC07117B56B0D9844C0C80ABA67C45E1DC0839166ABAF9444C0387D4568C45E1DC010BA74A9AF9444C049AFFC5B8C4D1DC040C3CD74169444C0362EC0608C4D1DC07C1A3B77169444C0DC3ADB40B2641DC03AAE5F68B99844C0242948DEB1641DC04B7DA956B99844C0DB0790FE8B4D1DC0", LW_PARSER_CHECK_NONE);
70 CU_ASSERT(gin != NULL);
71
72 gout = lwgeom_make_valid(gin);
73 CU_ASSERT(gout != NULL);
74 lwgeom_free(gin);
75
76 /* We're really only interested in avoiding memory problems.
77 * Conversion to ewkt ensures full scan of coordinates thus
78 * triggering the error, if any
79 */
80 ewkt = lwgeom_to_ewkt(gout);
81 lwgeom_free(gout);
82 lwfree(ewkt);
83
84
85 /* Test collection */
86
87 gin = lwgeom_from_wkt(
88"GEOMETRYCOLLECTION(LINESTRING(0 0, 0 0), POLYGON((0 0, 10 10, 10 0, 0 10, 0 0)), LINESTRING(10 0, 10 10))",
90 CU_ASSERT(gin != NULL);
91
92 gout = lwgeom_make_valid(gin);
93 CU_ASSERT(gout != NULL);
94
95 ewkt = lwgeom_to_ewkt(gout);
96 /* printf("c = %s\n", ewkt); */
97 /*
98 TODO: This doesn't work on windows returns in different order.
99 strk figure out why. For now will replace with normalized version
100 */
101/* ASSERT_STRING_EQUAL(ewkt,
102"GEOMETRYCOLLECTION(POINT(0 0),MULTIPOLYGON(((5 5,0 0,0 10,5 5)),((5 5,10 10,10 0,5 5))),LINESTRING(10 0,10 10))");*/
103 gexp = lwgeom_from_wkt(
104"GEOMETRYCOLLECTION(MULTIPOLYGON(((5 5,10 10,10 0,5 5)),((0 0,0 10,5 5,0 0))),LINESTRING(10 0,10 10),POINT(0 0))",
106 check_geom_equal(gout, gexp);
107 lwfree(ewkt);
108
109 lwgeom_free(gout);
110 lwgeom_free(gin);
111 lwgeom_free(gexp);
112
113 /* Test multipoint */
114
115 gin = lwgeom_from_wkt(
116"MULTIPOINT(0 0,1 1,2 2)",
118 CU_ASSERT(gin != NULL);
119
120 gout = lwgeom_make_valid(gin);
121 CU_ASSERT(gout != NULL);
122
123 ewkt = lwgeom_to_ewkt(gout);
124 /* printf("c = %s\n", ewkt); */
126"MULTIPOINT(0 0,1 1,2 2)");
127 lwfree(ewkt);
128
129 lwgeom_free(gout);
130 lwgeom_free(gin);
131
132 /* Test unclosed polygon */
133
134 gin = lwgeom_from_hexwkb(
135"0103000000010000000400000000000000000024400000000000003640000000000000244000000000000040400000000000003440000000000000404000000000000034400000000000003640",
137 CU_ASSERT(gin != NULL);
138
139 gout = lwgeom_make_valid(gin);
140 CU_ASSERT(gout != NULL);
141
142 ewkt = lwgeom_to_ewkt(gout);
143 /* printf("c = %s\n", ewkt); */
145"POLYGON((10 22,10 32,20 32,20 22,10 22))");
146 lwfree(ewkt);
147
148 lwgeom_free(gout);
149 lwgeom_free(gin);
150
151 /* Test collection with empty component */
152
153 gin = lwgeom_from_hexwkb( "0106000020110F000000000000",
155 CU_ASSERT(gin != NULL);
156
157 gout = lwgeom_make_valid(gin);
158 CU_ASSERT(gout != NULL);
159
160 ewkt = lwgeom_to_ewkt(gout);
161 /* printf("c = %s\n", ewkt); */
162 ASSERT_STRING_EQUAL(ewkt, "SRID=3857;MULTIPOLYGON EMPTY");
163 lwfree(ewkt);
164
165 lwgeom_free(gout);
166 lwgeom_free(gin);
167
168}
169
170/* TODO: add more tests ! */
171
172
173/*
174** Used by test harness to register the tests in this file.
175*/
176void clean_suite_setup(void);
178{
179 CU_pSuite suite = CU_add_suite("geometry_clean", NULL, NULL);
181}
static void test_lwgeom_make_valid(void)
Definition cu_clean.c:42
void clean_suite_setup(void)
Definition cu_clean.c:177
#define check_geom_equal(gobt, gexp)
Definition cu_clean.c:22
void cu_error_msg_reset()
#define PG_ADD_TEST(suite, testfunc)
#define ASSERT_STRING_EQUAL(o, e)
void lwgeom_free(LWGEOM *geom)
Definition lwgeom.c:1246
#define LW_PARSER_CHECK_NONE
Definition liblwgeom.h:2149
char * lwgeom_to_ewkt(const LWGEOM *lwgeom)
Return an allocated string.
Definition lwgeom.c:593
void lwfree(void *mem)
Definition lwutil.c:248
LWGEOM * lwgeom_from_hexwkb(const char *hexwkb, const char check)
Definition lwin_wkb.c:866
LWGEOM * lwgeom_from_wkt(const char *wkt, const char check)
Definition lwin_wkt.c:940
LWGEOM * lwgeom_make_valid(LWGEOM *geom)
Attempts to make an invalid geometries valid w/out losing points.
This library is the generic geometry handling section of PostGIS.