PostGIS  2.5.7dev-r@@SVN_REVISION@@

◆ test_lwgeom_split()

static void test_lwgeom_split ( void  )
static

Definition at line 93 of file cu_split.c.

94 {
95  LWGEOM *geom, *blade, *ret, *tmp1, *tmp2;
96  char *wkt, *in_wkt;
97 
98  geom = lwgeom_from_wkt("MULTILINESTRING((-5 -2,0 0),(0 0,10 10))", LW_PARSER_CHECK_NONE);
99  CU_ASSERT(geom != NULL);
100  blade = lwgeom_from_wkt("POINT(0 0)", LW_PARSER_CHECK_NONE);
101  CU_ASSERT(blade != NULL);
102  ret = lwgeom_split(geom, blade);
103  CU_ASSERT(ret != NULL);
104  wkt = lwgeom_to_ewkt(ret);
105  in_wkt = "GEOMETRYCOLLECTION(LINESTRING(-5 -2,0 0),LINESTRING(0 0,10 10))";
106  ASSERT_STRING_EQUAL(wkt, in_wkt);
107  lwfree(wkt);
108  lwgeom_free(ret);
109  lwgeom_free(geom);
110  lwgeom_free(blade);
111 
112  /* See #1311 */
113  geom = lwgeom_from_wkt("LINESTRING(0 0,10 0,20 4,0 3)", LW_PARSER_CHECK_NONE);
114  CU_ASSERT(geom != NULL);
115  blade = lwgeom_from_wkt("POINT(10 0)", LW_PARSER_CHECK_NONE);
116  ret = lwgeom_split(geom, blade);
117  CU_ASSERT(ret != NULL);
118  wkt = lwgeom_to_ewkt(ret);
119  in_wkt = "GEOMETRYCOLLECTION(LINESTRING(0 0,10 0),LINESTRING(10 0,20 4,0 3))";
120  ASSERT_STRING_EQUAL(wkt, in_wkt);
121  lwfree(wkt);
122  lwgeom_free(ret);
123  lwgeom_free(geom);
124  lwgeom_free(blade);
125 
126  /* See #2528 (1) -- memory leak test, needs valgrind to check */
127  geom = lwgeom_from_wkt("SRID=1;LINESTRING(0 1,10 1)", LW_PARSER_CHECK_NONE);
128  CU_ASSERT(geom != NULL);
129  blade = lwgeom_from_wkt("LINESTRING(7 0,7 3)", LW_PARSER_CHECK_NONE);
130  ret = lwgeom_split(geom, blade);
131  CU_ASSERT(ret != NULL);
132  wkt = lwgeom_to_ewkt(ret);
133  in_wkt = "SRID=1;GEOMETRYCOLLECTION(LINESTRING(0 1,7 1),LINESTRING(7 1,10 1))";
134  ASSERT_STRING_EQUAL(wkt, in_wkt);
135  lwfree(wkt);
136  lwgeom_free(ret);
137  lwgeom_free(geom);
138  lwgeom_free(blade);
139 
140  /* See #2528 (2) -- memory leak test, needs valgrind to check */
141  geom = lwgeom_from_wkt("SRID=1;POLYGON((0 1, 10 1, 10 10, 0 10, 0 1))", LW_PARSER_CHECK_NONE);
142  CU_ASSERT(geom != NULL);
143  blade = lwgeom_from_wkt("LINESTRING(7 0,7 20)", LW_PARSER_CHECK_NONE);
144  tmp1 = lwgeom_split(geom, blade);
145  ret = lwgeom_normalize(tmp1);
146  lwgeom_free(tmp1);
147  CU_ASSERT(ret != NULL);
148  wkt = lwgeom_to_ewkt(ret);
149  tmp1 = lwgeom_from_wkt(
150  "SRID=1;GEOMETRYCOLLECTION(POLYGON((7 1,0 1,0 10,7 10,7 1)),POLYGON((7 10,10 10,10 1,7 1,7 10)))",
152  tmp2 = lwgeom_normalize(tmp1);
153  in_wkt = lwgeom_to_ewkt(tmp2);
154  ASSERT_STRING_EQUAL(wkt, in_wkt);
155  lwfree(wkt);
156  lwfree(in_wkt);
157  lwgeom_free(tmp1);
158  lwgeom_free(tmp2);
159  lwgeom_free(ret);
160  lwgeom_free(geom);
161  lwgeom_free(blade);
162 
163  /* Split line by multiline */
164  geom = lwgeom_from_wkt("LINESTRING(0 0, 10 0)", LW_PARSER_CHECK_NONE);
165  CU_ASSERT_FATAL(geom != NULL);
166  blade = lwgeom_from_wkt("MULTILINESTRING((1 1,1 -1),(2 1,2 -1,3 -1,3 1))", LW_PARSER_CHECK_NONE);
167  ret = lwgeom_split(geom, blade);
168  if (!ret)
169  printf("%s", cu_error_msg);
170  CU_ASSERT_FATAL(ret != NULL);
171  wkt = lwgeom_to_ewkt(ret);
172  CU_ASSERT_FATAL(wkt != NULL);
173  in_wkt = "GEOMETRYCOLLECTION(LINESTRING(0 0,1 0),LINESTRING(1 0,2 0),LINESTRING(2 0,3 0),LINESTRING(3 0,10 0))";
174  ASSERT_STRING_EQUAL(wkt, in_wkt);
175  lwfree(wkt);
176  lwgeom_free(ret);
177  lwgeom_free(geom);
178  lwgeom_free(blade);
179 
180  /* Split line by polygon (boundary) */
181  geom = lwgeom_from_wkt("LINESTRING(0 0, 10 0)", LW_PARSER_CHECK_NONE);
182  CU_ASSERT_FATAL(geom != NULL);
183  blade = lwgeom_from_wkt("POLYGON((1 -2,1 1,2 1,2 -1,3 -1,3 1,11 1,11 -2,1 -2))", LW_PARSER_CHECK_NONE);
184  ret = lwgeom_split(geom, blade);
185  if (!ret)
186  printf("%s", cu_error_msg);
187  CU_ASSERT_FATAL(ret != NULL);
188  wkt = lwgeom_to_ewkt(ret);
189  CU_ASSERT_FATAL(wkt != NULL);
190  in_wkt = "GEOMETRYCOLLECTION(LINESTRING(0 0,1 0),LINESTRING(1 0,2 0),LINESTRING(2 0,3 0),LINESTRING(3 0,10 0))";
191  ASSERT_STRING_EQUAL(wkt, in_wkt);
192  lwfree(wkt);
193  lwgeom_free(ret);
194  lwgeom_free(geom);
195  lwgeom_free(blade);
196 
197  /* Split line by EMPTY polygon (boundary) */
198  geom = lwgeom_from_wkt("LINESTRING(0 0, 10 0)", LW_PARSER_CHECK_NONE);
199  CU_ASSERT_FATAL(geom != NULL);
200  blade = lwgeom_from_wkt("POLYGON EMPTY", LW_PARSER_CHECK_NONE);
201  ret = lwgeom_split(geom, blade);
202  if (!ret)
203  printf("%s", cu_error_msg);
204  CU_ASSERT_FATAL(ret != NULL);
205  wkt = lwgeom_to_ewkt(ret);
206  CU_ASSERT_FATAL(wkt != NULL);
207  in_wkt = "GEOMETRYCOLLECTION(LINESTRING(0 0,10 0))";
208  ASSERT_STRING_EQUAL(wkt, in_wkt);
209  lwfree(wkt);
210  lwgeom_free(ret);
211  lwgeom_free(geom);
212  lwgeom_free(blade);
213 
214  /* Split line by multipolygon (boundary) */
215  geom = lwgeom_from_wkt("LINESTRING(0 0, 10 0)", LW_PARSER_CHECK_NONE);
216  CU_ASSERT_FATAL(geom != NULL);
217  blade = lwgeom_from_wkt("MULTIPOLYGON(((1 -1,1 1,2 1,2 -1,1 -1)),((3 -1,3 1,11 1,11 -1,3 -1)))",
219  ret = lwgeom_split(geom, blade);
220  if (!ret)
221  printf("%s", cu_error_msg);
222  CU_ASSERT_FATAL(ret != NULL);
223  wkt = lwgeom_to_ewkt(ret);
224  CU_ASSERT_FATAL(wkt != NULL);
225  in_wkt = "GEOMETRYCOLLECTION(LINESTRING(0 0,1 0),LINESTRING(1 0,2 0),LINESTRING(2 0,3 0),LINESTRING(3 0,10 0))";
226  ASSERT_STRING_EQUAL(wkt, in_wkt);
227  lwfree(wkt);
228  lwgeom_free(ret);
229  lwgeom_free(geom);
230  lwgeom_free(blade);
231 
232  /* Split line by multipoint */
233  geom = lwgeom_from_wkt("LINESTRING(0 0, 10 0)", LW_PARSER_CHECK_NONE);
234  CU_ASSERT_FATAL(geom != NULL);
235  blade = lwgeom_from_wkt("MULTIPOINT(2 0,8 0,4 0)", LW_PARSER_CHECK_NONE);
236  ret = lwgeom_split(geom, blade);
237  if (!ret)
238  printf("%s", cu_error_msg);
239  CU_ASSERT_FATAL(ret != NULL);
240  wkt = lwgeom_to_ewkt(ret);
241  CU_ASSERT_FATAL(wkt != NULL);
242  in_wkt = "GEOMETRYCOLLECTION(LINESTRING(8 0,10 0),LINESTRING(0 0,2 0),LINESTRING(4 0,8 0),LINESTRING(2 0,4 0))";
243  ASSERT_STRING_EQUAL(wkt, in_wkt);
244  lwfree(wkt);
245  lwgeom_free(ret);
246  lwgeom_free(geom);
247  lwgeom_free(blade);
248 
249  /* See #3401 -- robustness issue */
250  geom = lwgeom_from_wkt("LINESTRING(-180 0,0 0)", LW_PARSER_CHECK_NONE);
251  CU_ASSERT(geom != NULL);
252  blade = lwgeom_from_wkt("POINT(-20 0)", LW_PARSER_CHECK_NONE);
253  ret = lwgeom_split(geom, blade);
254  CU_ASSERT(ret != NULL);
255  {
256  LWCOLLECTION *split = lwgeom_as_lwcollection(ret);
257  LWLINE *l1, *l2;
258  POINT2D pt;
259  CU_ASSERT(split != NULL);
260  l1 = lwgeom_as_lwline(split->geoms[0]);
261  CU_ASSERT(l1 != NULL);
262  getPoint2d_p(l1->points, 1, &pt);
263  ASSERT_DOUBLE_EQUAL(pt.x, -20);
264  ASSERT_DOUBLE_EQUAL(pt.y, 0);
265  l2 = lwgeom_as_lwline(split->geoms[1]);
266  CU_ASSERT(l2 != NULL);
267  getPoint2d_p(l2->points, 0, &pt);
268  ASSERT_DOUBLE_EQUAL(pt.x, -20);
269  ASSERT_DOUBLE_EQUAL(pt.y, 0);
270  }
271  lwgeom_free(ret);
272  lwgeom_free(geom);
273  lwgeom_free(blade);
274 }
char cu_error_msg[MAX_CUNIT_ERROR_LENGTH+1]
#define ASSERT_DOUBLE_EQUAL(o, e)
#define ASSERT_STRING_EQUAL(o, e)
LWLINE * lwgeom_as_lwline(const LWGEOM *lwgeom)
Definition: lwgeom.c:170
void lwgeom_free(LWGEOM *geom)
Definition: lwgeom.c:1144
#define LW_PARSER_CHECK_NONE
Definition: liblwgeom.h:2005
LWGEOM * lwgeom_split(const LWGEOM *lwgeom_in, const LWGEOM *blade_in)
int getPoint2d_p(const POINTARRAY *pa, uint32_t n, POINT2D *point)
Definition: lwgeom_api.c:348
char * lwgeom_to_ewkt(const LWGEOM *lwgeom)
Return an alloced string.
Definition: lwgeom.c:556
void lwfree(void *mem)
Definition: lwutil.c:244
LWGEOM * lwgeom_normalize(const LWGEOM *geom)
LWGEOM * lwgeom_from_wkt(const char *wkt, const char check)
Definition: lwin_wkt.c:904
LWCOLLECTION * lwgeom_as_lwcollection(const LWGEOM *lwgeom)
Definition: lwgeom.c:224
LWGEOM ** geoms
Definition: liblwgeom.h:512
POINTARRAY * points
Definition: liblwgeom.h:425
double y
Definition: liblwgeom.h:331
double x
Definition: liblwgeom.h:331

References ASSERT_DOUBLE_EQUAL, ASSERT_STRING_EQUAL, cu_error_msg, LWCOLLECTION::geoms, getPoint2d_p(), LW_PARSER_CHECK_NONE, lwfree(), lwgeom_as_lwcollection(), lwgeom_as_lwline(), lwgeom_free(), lwgeom_from_wkt(), lwgeom_normalize(), lwgeom_split(), lwgeom_to_ewkt(), LWLINE::points, POINT2D::x, and POINT2D::y.

Referenced by split_suite_setup().

Here is the call graph for this function:
Here is the caller graph for this function: