PostGIS  2.1.10dev-r@@SVN_REVISION@@
cu_homogenize.c
Go to the documentation of this file.
1 /**********************************************************************
2  * $Id: cu_homogenize.c 13242 2015-02-19 00:22:22Z pramsey $
3  *
4  * PostGIS - Spatial Types for PostgreSQL
5  * http://postgis.net
6  * Copyright 2009 Olivier Courtin <olivier.courtin@oslandia.com>
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 <stdio.h>
14 #include <stdlib.h>
15 #include <string.h>
16 #include "CUnit/Basic.h"
17 
18 #include "liblwgeom_internal.h"
19 #include "cu_tester.h"
20 
21 static void do_geom_test(char * in, char * out)
22 {
23  LWGEOM *g, *h;
24  char *tmp;
25 
27  h = lwgeom_homogenize(g);
28  tmp = lwgeom_to_ewkt(h);
29  if (strcmp(tmp, out))
30  fprintf(stderr, "\nIn: %s\nOut: %s\nExp: %s\n",
31  in, tmp, out);
32  CU_ASSERT_STRING_EQUAL(tmp, out);
33  lwfree(tmp);
34  lwgeom_free(g);
35  /* See http://trac.osgeo.org/postgis/ticket/1104 */
36  lwgeom_free(h);
37 }
38 
39 
40 static void test_coll_point(void)
41 {
42  do_geom_test("GEOMETRYCOLLECTION(POINT(1 2))",
43  "POINT(1 2)");
44 
45  do_geom_test("GEOMETRYCOLLECTION(POINT(1 2),POINT(3 4))",
46  "MULTIPOINT(1 2,3 4)");
47 
48  do_geom_test("GEOMETRYCOLLECTION(POINT(1 2),POINT(3 4),POINT(5 6))",
49  "MULTIPOINT(1 2,3 4,5 6)");
50 
51  do_geom_test("GEOMETRYCOLLECTION(MULTIPOINT(1 2,3 4),POINT(5 6))",
52  "MULTIPOINT(1 2,3 4,5 6)");
53 
54  do_geom_test("GEOMETRYCOLLECTION(POINT(1 2),MULTIPOINT(3 4,5 6))",
55  "MULTIPOINT(1 2,3 4,5 6)");
56 
57  do_geom_test("GEOMETRYCOLLECTION(MULTIPOINT(1 2,3 4),MULTIPOINT(5 6,7 8))",
58  "MULTIPOINT(1 2,3 4,5 6,7 8)");
59 }
60 
61 
62 static void test_coll_line(void)
63 {
64  do_geom_test("GEOMETRYCOLLECTION(LINESTRING(1 2,3 4))",
65  "LINESTRING(1 2,3 4)");
66 
67  do_geom_test("GEOMETRYCOLLECTION(LINESTRING(1 2,3 4),LINESTRING(5 6,7 8))",
68  "MULTILINESTRING((1 2,3 4),(5 6,7 8))");
69 
70  do_geom_test("GEOMETRYCOLLECTION(LINESTRING(1 2,3 4),LINESTRING(5 6,7 8),LINESTRING(9 10,11 12))",
71  "MULTILINESTRING((1 2,3 4),(5 6,7 8),(9 10,11 12))");
72 
73  do_geom_test("GEOMETRYCOLLECTION(MULTILINESTRING((1 2,3 4),(5 6,7 8)),LINESTRING(9 10,11 12))",
74  "MULTILINESTRING((1 2,3 4),(5 6,7 8),(9 10,11 12))");
75 
76  do_geom_test("GEOMETRYCOLLECTION(LINESTRING(1 2,3 4),MULTILINESTRING((5 6,7 8),(9 10,11 12)))",
77  "MULTILINESTRING((1 2,3 4),(5 6,7 8),(9 10,11 12))");
78 
79  do_geom_test("GEOMETRYCOLLECTION(MULTILINESTRING((1 2,3 4),(5 6,7 8)),MULTILINESTRING((9 10,11 12),(13 14,15 16)))",
80  "MULTILINESTRING((1 2,3 4),(5 6,7 8),(9 10,11 12),(13 14,15 16))");
81 }
82 
83 
84 static void test_coll_poly(void)
85 {
86  do_geom_test("GEOMETRYCOLLECTION(POLYGON((1 2,3 4,5 6,1 2)))",
87  "POLYGON((1 2,3 4,5 6,1 2))");
88 
89  do_geom_test("GEOMETRYCOLLECTION(POLYGON((1 2,3 4,5 6,1 2)),POLYGON((7 8,9 10,11 12,7 8)))",
90  "MULTIPOLYGON(((1 2,3 4,5 6,1 2)),((7 8,9 10,11 12,7 8)))");
91 
92  do_geom_test("GEOMETRYCOLLECTION(POLYGON((1 2,3 4,5 6,1 2)),POLYGON((7 8,9 10,11 12,7 8)),POLYGON((13 14,15 16,17 18,13 14)))",
93  "MULTIPOLYGON(((1 2,3 4,5 6,1 2)),((7 8,9 10,11 12,7 8)),((13 14,15 16,17 18,13 14)))");
94 
95  do_geom_test("GEOMETRYCOLLECTION(MULTIPOLYGON(((1 2,3 4,5 6,1 2)),((7 8,9 10,11 12,7 8))),POLYGON((13 14,15 16,17 18,13 14)))",
96  "MULTIPOLYGON(((1 2,3 4,5 6,1 2)),((7 8,9 10,11 12,7 8)),((13 14,15 16,17 18,13 14)))");
97 
98  do_geom_test("GEOMETRYCOLLECTION(POLYGON((1 2,3 4,5 6,1 2)),MULTIPOLYGON(((7 8,9 10,11 12,7 8)),((13 14,15 16,17 18,13 14))))",
99  "MULTIPOLYGON(((1 2,3 4,5 6,1 2)),((7 8,9 10,11 12,7 8)),((13 14,15 16,17 18,13 14)))");
100 
101  do_geom_test("GEOMETRYCOLLECTION(MULTIPOLYGON(((1 2,3 4,5 6,1 2)),((7 8,9 10,11 12,7 8))),MULTIPOLYGON(((13 14,15 16,17 18,13 14)),((19 20,21 22,23 24,19 20))))",
102  "MULTIPOLYGON(((1 2,3 4,5 6,1 2)),((7 8,9 10,11 12,7 8)),((13 14,15 16,17 18,13 14)),((19 20,21 22,23 24,19 20)))");
103 }
104 
105 
106 static void test_coll_coll(void)
107 {
108  /* Two different types together must produce a Collection as output */
109  do_geom_test("GEOMETRYCOLLECTION(POINT(1 2),LINESTRING(3 4,5 6))",
110  "GEOMETRYCOLLECTION(POINT(1 2),LINESTRING(3 4,5 6))");
111 
112  do_geom_test("GEOMETRYCOLLECTION(LINESTRING(1 2,3 4),POLYGON((5 6,7 8,9 10,5 6)))",
113  "GEOMETRYCOLLECTION(LINESTRING(1 2,3 4),POLYGON((5 6,7 8,9 10,5 6)))");
114 
115 
116  /* Ability to produce a single MULTI with same type */
117  do_geom_test("GEOMETRYCOLLECTION(POINT(1 2),LINESTRING(3 4,5 6),POINT(7 8))",
118  "GEOMETRYCOLLECTION(MULTIPOINT(1 2,7 8),LINESTRING(3 4,5 6))");
119 
120  do_geom_test("GEOMETRYCOLLECTION(POINT(1 2),LINESTRING(3 4,5 6),MULTIPOINT(7 8,9 10))",
121  "GEOMETRYCOLLECTION(MULTIPOINT(1 2,7 8,9 10),LINESTRING(3 4,5 6))");
122 
123 
124  /* Recursive Collection handle */
125  do_geom_test("GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(POINT(1 2))))",
126  "POINT(1 2)");
127 
128  do_geom_test("GEOMETRYCOLLECTION(POINT(1 2),GEOMETRYCOLLECTION(LINESTRING(3 4,5 6)))",
129  "GEOMETRYCOLLECTION(POINT(1 2),LINESTRING(3 4,5 6))");
130 
131 
132  /* EMPTY Collection */
133  do_geom_test("GEOMETRYCOLLECTION EMPTY",
134  "GEOMETRYCOLLECTION EMPTY");
135 
136 
137  /* Recursive EMPTY Collection */
138  do_geom_test("GEOMETRYCOLLECTION(GEOMETRYCOLLECTION EMPTY)",
139  "GEOMETRYCOLLECTION EMPTY");
140 
141  do_geom_test("GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(GEOMETRYCOLLECTION EMPTY))",
142  "GEOMETRYCOLLECTION EMPTY");
143 }
144 
145 static void test_coll_curve(void)
146 {
147  /* Two different types together must produce a Collection as output */
148  do_geom_test("GEOMETRYCOLLECTION(CIRCULARSTRING(0 0,1 1,2 2))",
149  "CIRCULARSTRING(0 0,1 1,2 2)");
150 
151  do_geom_test("GEOMETRYCOLLECTION(CIRCULARSTRING(0 0,1 1,2 2),CIRCULARSTRING(0 0,1 1,2 2))",
152  "MULTICURVE(CIRCULARSTRING(0 0,1 1,2 2),CIRCULARSTRING(0 0,1 1,2 2))");
153 }
154 
155 static void test_geom(void)
156 {
157  /* Already simple geometry */
158  do_geom_test("POINT(1 2)",
159  "POINT(1 2)");
160 
161  do_geom_test("LINESTRING(1 2,3 4)",
162  "LINESTRING(1 2,3 4)");
163 
164  do_geom_test("POLYGON((1 2,3 4,5 6,1 2))",
165  "POLYGON((1 2,3 4,5 6,1 2))");
166 
167  do_geom_test("POLYGON((1 2,3 4,5 6,1 2),(7 8,9 10,11 12,7 8))",
168  "POLYGON((1 2,3 4,5 6,1 2),(7 8,9 10,11 12,7 8))");
169 
170 
171  /* Empty geometry */
172  do_geom_test("GEOMETRYCOLLECTION EMPTY",
173  "GEOMETRYCOLLECTION EMPTY");
174 
175 
176  /* A MULTI with a single geometry inside */
177  do_geom_test("MULTIPOINT(1 2)",
178  "POINT(1 2)");
179 
180  do_geom_test("MULTILINESTRING((1 2,3 4))",
181  "LINESTRING(1 2,3 4)");
182 
183  do_geom_test("MULTIPOLYGON(((1 2,3 4,5 6,1 2)))",
184  "POLYGON((1 2,3 4,5 6,1 2))");
185 
186  do_geom_test("MULTIPOLYGON(((1 2,3 4,5 6,1 2),(7 8,9 10,11 12,7 8)))",
187  "POLYGON((1 2,3 4,5 6,1 2),(7 8,9 10,11 12,7 8))");
188 
189 
190  /* A real MULTI */
191  do_geom_test("MULTIPOINT(1 2,3 4)",
192  "MULTIPOINT(1 2,3 4)");
193 
194  do_geom_test("MULTILINESTRING((1 2,3 4),(5 6,7 8))",
195  "MULTILINESTRING((1 2,3 4),(5 6,7 8))");
196 
197  do_geom_test("MULTIPOLYGON(((1 2,3 4,5 6,1 2)),((7 8,9 10,11 12,7 8)))",
198  "MULTIPOLYGON(((1 2,3 4,5 6,1 2)),((7 8,9 10,11 12,7 8)))");
199 
200  do_geom_test("MULTIPOLYGON(((1 2,3 4,5 6,1 2),(7 8,9 10,11 12,7 8)),((13 14,15 16,17 18,13 14)))",
201  "MULTIPOLYGON(((1 2,3 4,5 6,1 2),(7 8,9 10,11 12,7 8)),((13 14,15 16,17 18,13 14)))");
202 
203 
204  /* A Collection */
205  do_geom_test("GEOMETRYCOLLECTION(POINT(1 2),LINESTRING(3 4,5 6))",
206  "GEOMETRYCOLLECTION(POINT(1 2),LINESTRING(3 4,5 6))");
207 
208 
209  /* SRID */
210  do_geom_test("SRID=4326;GEOMETRYCOLLECTION EMPTY",
211  "SRID=4326;GEOMETRYCOLLECTION EMPTY");
212 
213  /* See http://trac.osgeo.org/postgis/ticket/2129 */
214  do_geom_test("SRID=4326;GEOMETRYCOLLECTION(MULTIPOINT(0 0))",
215  "SRID=4326;POINT(0 0)");
216 
217  /* See http://trac.osgeo.org/postgis/ticket/2129 */
218  do_geom_test("SRID=4326;GEOMETRYCOLLECTION(MULTIPOINT(0 0, 1 2))",
219  "SRID=4326;MULTIPOINT(0 0,1 2)");
220 
221  /* See http://trac.osgeo.org/postgis/ticket/2129 */
222  do_geom_test("SRID=4326;GEOMETRYCOLLECTION(POINT(0 0),LINESTRING(0 0,10 0))",
223  "SRID=4326;GEOMETRYCOLLECTION(POINT(0 0),LINESTRING(0 0,10 0))");
224 
225  do_geom_test("SRID=4326;POINT(1 2)",
226  "SRID=4326;POINT(1 2)");
227 
228  do_geom_test("SRID=4326;MULTIPOINT(1 2)",
229  "SRID=4326;POINT(1 2)");
230 
231  do_geom_test("SRID=4326;MULTIPOINT(1 2,3 4)",
232  "SRID=4326;MULTIPOINT(1 2,3 4)");
233 
234  do_geom_test("SRID=4326;MULTILINESTRING((1 2,3 4))",
235  "SRID=4326;LINESTRING(1 2,3 4)");
236 
237  do_geom_test("SRID=4326;MULTILINESTRING((1 2,3 4),(5 6,7 8))",
238  "SRID=4326;MULTILINESTRING((1 2,3 4),(5 6,7 8))");
239 
240  /* 3D and 4D */
241  do_geom_test("POINT(1 2 3)",
242  "POINT(1 2 3)");
243 
244  do_geom_test("POINTM(1 2 3)",
245  "POINTM(1 2 3)");
246 
247  do_geom_test("POINT(1 2 3 4)",
248  "POINT(1 2 3 4)");
249 }
250 
251 /*
252 ** Used by test harness to register the tests in this file.
253 */
254 void homogenize_suite_setup(void);
256 {
257  CU_pSuite suite = CU_add_suite("Homogenize", NULL, NULL);
259  PG_ADD_TEST(suite, test_coll_line);
260  PG_ADD_TEST(suite, test_coll_poly);
261  PG_ADD_TEST(suite, test_coll_coll);
262  PG_ADD_TEST(suite, test_geom);
264 }
static void test_coll_point(void)
Definition: cu_homogenize.c:40
static void test_coll_line(void)
Definition: cu_homogenize.c:62
static void test_coll_curve(void)
static void test_coll_coll(void)
void lwfree(void *mem)
Definition: lwutil.c:190
char * lwgeom_to_ewkt(const LWGEOM *lwgeom)
Return an alloced string.
Definition: lwgeom.c:425
void lwgeom_free(LWGEOM *geom)
Definition: lwgeom.c:1006
static void test_coll_poly(void)
Definition: cu_homogenize.c:84
LWGEOM * lwgeom_from_wkt(const char *wkt, const char check)
Definition: lwin_wkt.c:844
void homogenize_suite_setup(void)
#define LW_PARSER_CHECK_NONE
Definition: liblwgeom.h:1706
LWGEOM * lwgeom_homogenize(const LWGEOM *geom)
Definition: lwhomogenize.c:196
static void do_geom_test(char *in, char *out)
Definition: cu_homogenize.c:21
#define PG_ADD_TEST(suite, testfunc)
static void test_geom(void)