PostGIS 3.7.0dev-r@@SVN_REVISION@@
Loading...
Searching...
No Matches

◆ 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 {
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
275 /* See #5698 -- robustness issue */
276 geom = lwgeom_from_wkt("LINESTRING(15.796760167740288 69.05714853429149,15.796760167739626 69.05714853429157,15.795906966300288 69.05725770093837)", LW_PARSER_CHECK_NONE);
277 CU_ASSERT_FATAL(geom != NULL);
279 CU_ASSERT(blade != NULL);
280 ret = lwgeom_split(geom, blade);
281 CU_ASSERT_FATAL(ret != NULL);
282 ASSERT_INT_EQUAL( lwgeom_as_lwcollection(ret)->ngeoms, 2 );
283 lwgeom_free(ret);
284 lwgeom_free(geom);
285 lwgeom_free(blade);
286}
char cu_error_msg[MAX_CUNIT_ERROR_LENGTH+1]
#define ASSERT_DOUBLE_EQUAL(o, e)
#define ASSERT_INT_EQUAL(o, e)
#define ASSERT_STRING_EQUAL(o, e)
LWGEOM * lwpoint_as_lwgeom(const LWPOINT *obj)
Definition lwgeom.c:372
LWGEOM * lwgeom_split(const LWGEOM *lwgeom_in, const LWGEOM *blade_in)
void lwgeom_free(LWGEOM *geom)
Definition lwgeom.c:1246
#define LW_PARSER_CHECK_NONE
Definition liblwgeom.h:2149
LWPOINT * lwline_get_lwpoint(const LWLINE *line, uint32_t where)
Returns freshly allocated LWPOINT that corresponds to the index where.
Definition lwline.c:319
LWCOLLECTION * lwgeom_as_lwcollection(const LWGEOM *lwgeom)
Definition lwgeom.c:261
int getPoint2d_p(const POINTARRAY *pa, uint32_t n, POINT2D *point)
Definition lwgeom_api.c:342
LWGEOM * lwgeom_normalize(const LWGEOM *geom)
char * lwgeom_to_ewkt(const LWGEOM *lwgeom)
Return an allocated string.
Definition lwgeom.c:593
void lwfree(void *mem)
Definition lwutil.c:248
LWLINE * lwgeom_as_lwline(const LWGEOM *lwgeom)
Definition lwgeom.c:207
LWGEOM * lwgeom_from_wkt(const char *wkt, const char check)
Definition lwin_wkt.c:940
LWGEOM ** geoms
Definition liblwgeom.h:575
POINTARRAY * points
Definition liblwgeom.h:483
double y
Definition liblwgeom.h:390
double x
Definition liblwgeom.h:390

References ASSERT_DOUBLE_EQUAL, ASSERT_INT_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_get_lwpoint(), lwpoint_as_lwgeom(), 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: