PostGIS  2.1.10dev-r@@SVN_REVISION@@
cu_split.c
Go to the documentation of this file.
1 /**********************************************************************
2  *
3  * PostGIS - Spatial Types for PostgreSQL
4  * http://postgis.net
5  *
6  * Copyright (C) 2011 Sandro Santilli <strk@keybit.net>
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 
20 {
21 #if POSTGIS_GEOS_VERSION >= 33
22  LWLINE *line;
23  LWPOINT *point;
24  LWMLINE *coll;
25  int ret;
26 
27  /* Because i don't trust that much prior tests... ;) */
29 
31  CU_ASSERT_EQUAL(coll->ngeoms, 0);
32 
33  line = lwgeom_as_lwline(lwgeom_from_wkt("LINESTRING(0 0,5 5, 10 0)",
35  CU_ASSERT(line != NULL);
36 
38  "POINT(0 0)",
40  ret = lwline_split_by_point_to(line, point, coll);
41  CU_ASSERT_EQUAL(ret, 1);
42  CU_ASSERT_EQUAL(coll->ngeoms, 0);
43  lwpoint_free(point);
44 
46  "POINT(10 0)",
48  ret = lwline_split_by_point_to(line, point, coll);
49  CU_ASSERT_EQUAL(ret, 1);
50  CU_ASSERT_EQUAL(coll->ngeoms, 0);
51  lwpoint_free(point);
52 
54  "POINT(5 0)",
56  ret = lwline_split_by_point_to(line, point, coll);
57  CU_ASSERT_EQUAL(ret, 0);
58  CU_ASSERT_EQUAL(coll->ngeoms, 0);
59  lwpoint_free(point);
60 
62  "POINT(5 5)",
64  ret = lwline_split_by_point_to(line, point, coll);
65  CU_ASSERT_EQUAL(ret, 2);
66  CU_ASSERT_EQUAL(coll->ngeoms, 2);
67  lwpoint_free(point);
68 
70  "POINT(2 2)",
72  ret = lwline_split_by_point_to(line, point, coll);
73  CU_ASSERT_EQUAL(ret, 2);
74  CU_ASSERT_EQUAL(coll->ngeoms, 4);
75  lwpoint_free(point);
76 
78  lwline_free(line);
79 
80 #endif /* POSTGIS_GEOS_VERSION >= 33 */
81 }
82 
83 static void test_lwgeom_split(void)
84 {
85  LWGEOM *geom, *blade, *ret;
86  char *wkt, *in_wkt;
87 
88  geom = lwgeom_from_wkt(
89 "MULTILINESTRING((-5 -2,0 0),(0 0,10 10))",
91  CU_ASSERT(geom != NULL);
92  blade = lwgeom_from_wkt(
93  "POINT(0 0)",
95  CU_ASSERT(blade != NULL);
96  ret = lwgeom_split(geom, blade);
97  CU_ASSERT(ret != NULL);
98  wkt = lwgeom_to_ewkt(ret);
99  in_wkt = "GEOMETRYCOLLECTION(LINESTRING(-5 -2,0 0),LINESTRING(0 0,10 10))";
100  if (strcmp(in_wkt, wkt))
101  fprintf(stderr, "\nExp: %s\nObt: %s\n", in_wkt, wkt);
102  CU_ASSERT_STRING_EQUAL(wkt, in_wkt);
103  lwfree(wkt);
104  lwgeom_free(ret);
105  lwgeom_free(geom);
106  lwgeom_free(blade);
107 
108  /* See #1311 */
109  geom = lwgeom_from_wkt(
110  "LINESTRING(0 0,10 0,20 4,0 3)",
112  CU_ASSERT(geom != NULL);
113  blade = lwgeom_from_wkt("POINT(10 0)", LW_PARSER_CHECK_NONE);
114  ret = lwgeom_split(geom, blade);
115  CU_ASSERT(ret != NULL);
116  wkt = lwgeom_to_ewkt(ret);
117  in_wkt = "GEOMETRYCOLLECTION(LINESTRING(0 0,10 0),LINESTRING(10 0,20 4,0 3))";
118  if (strcmp(in_wkt, wkt))
119  fprintf(stderr, "\nExp: %s\nObt: %s\n", in_wkt, wkt);
120  CU_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  if (strcmp(in_wkt, wkt))
135  fprintf(stderr, "\nExp: %s\nObt: %s\n", in_wkt, wkt);
136  CU_ASSERT_STRING_EQUAL(wkt, in_wkt);
137  lwfree(wkt);
138  lwgeom_free(ret);
139  lwgeom_free(geom);
140  lwgeom_free(blade);
141 
142  /* See #2528 (2) -- memory leak test, needs valgrind to check */
143  geom = lwgeom_from_wkt("SRID=1;POLYGON((0 1, 10 1, 10 10, 0 10, 0 1))", LW_PARSER_CHECK_NONE);
144  CU_ASSERT(geom != NULL);
145  blade = lwgeom_from_wkt("LINESTRING(7 0,7 20)", LW_PARSER_CHECK_NONE);
146  ret = lwgeom_split(geom, blade);
147  CU_ASSERT(ret != NULL);
148  wkt = lwgeom_to_ewkt(ret);
149  in_wkt = "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)))";
150  if (strcmp(in_wkt, wkt))
151  fprintf(stderr, "\nExp: %s\nObt: %s\n", in_wkt, wkt);
152  CU_ASSERT_STRING_EQUAL(wkt, in_wkt);
153  lwfree(wkt);
154  lwgeom_free(ret);
155  lwgeom_free(geom);
156  lwgeom_free(blade);
157 }
158 
159 
160 /*
161 ** Used by test harness to register the tests in this file.
162 */
163 void split_suite_setup(void);
165 {
166  CU_pSuite suite = CU_add_suite("Split", NULL, NULL);
169 }
void lwfree(void *mem)
Definition: lwutil.c:190
char * lwgeom_to_ewkt(const LWGEOM *lwgeom)
Return an alloced string.
Definition: lwgeom.c:425
void lwpoint_free(LWPOINT *pt)
Definition: lwpoint.c:180
void lwgeom_free(LWGEOM *geom)
Definition: lwgeom.c:1006
void lwline_free(LWLINE *line)
Definition: lwline.c:63
LWGEOM * lwgeom_from_wkt(const char *wkt, const char check)
Definition: lwin_wkt.c:844
LWPOINT * lwgeom_as_lwpoint(const LWGEOM *lwgeom)
Definition: lwgeom.c:80
LWMLINE * lwmline_construct_empty(int srid, char hasz, char hasm)
Definition: lwmline.c:25
int ngeoms
Definition: liblwgeom.h:437
#define LW_PARSER_CHECK_NONE
Definition: liblwgeom.h:1706
void cu_error_msg_reset()
#define SRID_UNKNOWN
Unknown SRID value.
Definition: liblwgeom.h:154
#define PG_ADD_TEST(suite, testfunc)
void split_suite_setup(void)
Definition: cu_split.c:164
static void test_lwline_split_by_point_to(void)
Definition: cu_split.c:19
LWLINE * lwgeom_as_lwline(const LWGEOM *lwgeom)
Definition: lwgeom.c:89
void lwcollection_free(LWCOLLECTION *col)
Definition: lwcollection.c:316
static void test_lwgeom_split(void)
Definition: cu_split.c:83
This library is the generic geometry handling section of PostGIS.
int lwline_split_by_point_to(const LWLINE *ln, const LWPOINT *pt, LWMLINE *to)
Split a line by a point and push components to the provided multiline.
LWGEOM * lwgeom_split(const LWGEOM *lwgeom_in, const LWGEOM *blade_in)