1<run>
2<desc>Tests for OverlayNG operations with line inputs.
3Covers topological situations with no precision collapse.
4Uses a floating precision model.
5</desc>
6
7<case>
8  <desc>LL - same line</desc>
9  <a>
10LINESTRING (10 10, 20 20)
11  </a>
12  <b>
13LINESTRING (10 10, 20 20)
14  </b>
15<test>  <op name="intersectionNG" arg1="A" arg2="B">
16LINESTRING (10 10, 20 20)
17  </op></test>
18<test>  <op name="unionNG" arg1="A" arg2="B">
19LINESTRING (10 10, 20 20)
20  </op></test>
21<test>  <op name="differenceNG" arg1="A" arg2="B">
22LINESTRING EMPTY
23  </op></test>
24<test>  <op name="differenceNG" arg1="B" arg2="A">
25LINESTRING EMPTY
26  </op></test>
27<test>  <op name="symdifferenceNG" arg1="A" arg2="B">
28LINESTRING EMPTY
29  </op></test>
30</case>
31
32<case>
33  <desc>LL - crossing</desc>
34  <a>
35LINESTRING (10 10, 20 20)
36  </a>
37  <b>
38LINESTRING (10 20, 20 10)
39  </b>
40<test>  <op name="intersectionNG" arg1="A" arg2="B">
41POINT (15 15)
42  </op></test>
43<test>  <op name="unionNG" arg1="A" arg2="B">
44MULTILINESTRING ((10 10, 15 15), (15 15, 20 20), (10 20, 15 15), (15 15, 20 10))
45  </op></test>
46<test>  <op name="differenceNG" arg1="A" arg2="B">
47MULTILINESTRING ((10 10, 15 15), (15 15, 20 20))
48  </op></test>
49<test>  <op name="differenceNG" arg1="B" arg2="A">
50MULTILINESTRING ((10 20, 15 15), (15 15, 20 10))
51  </op></test>
52<test>  <op name="symdifferenceNG" arg1="A" arg2="B">
53MULTILINESTRING ((10 10, 15 15), (15 15, 20 20), (10 20, 15 15), (15 15, 20 10))
54  </op></test>
55</case>
56
57<case>
58  <desc>LL - touching</desc>
59  <a>
60LINESTRING (10 10, 20 20)
61  </a>
62  <b>
63LINESTRING (20 20, 30 30)
64  </b>
65<test>  <op name="intersectionNG" arg1="A" arg2="B">
66POINT (20 20)
67  </op></test>
68<test>  <op name="unionNG" arg1="A" arg2="B">
69MULTILINESTRING ((20 20, 30 30), (10 10, 20 20))
70  </op></test>
71<test>  <op name="differenceNG" arg1="A" arg2="B">
72LINESTRING (10 10, 20 20)
73  </op></test>
74<test>  <op name="differenceNG" arg1="B" arg2="A">
75LINESTRING (20 20, 30 30)
76  </op></test>
77<test>  <op name="symdifferenceNG" arg1="A" arg2="B">
78MULTILINESTRING ((20 20, 30 30), (10 10, 20 20))
79  </op></test>
80</case>
81
82<case>
83  <desc>LL - overlapping</desc>
84  <a>
85LINESTRING (10 10, 20 20)
86  </a>
87  <b>
88LINESTRING (15 15, 30 30)
89  </b>
90<test>  <op name="intersectionNG" arg1="A" arg2="B">
91LINESTRING (15 15, 20 20)
92  </op></test>
93<test>  <op name="unionNG" arg1="A" arg2="B">
94MULTILINESTRING ((10 10, 15 15), (15 15, 20 20), (20 20, 30 30))
95  </op></test>
96<test>  <op name="differenceNG" arg1="A" arg2="B">
97LINESTRING (10 10, 15 15)
98  </op></test>
99<test>  <op name="differenceNG" arg1="B" arg2="A">
100LINESTRING (20 20, 30 30)
101  </op></test>
102<test>  <op name="symdifferenceNG" arg1="A" arg2="B">
103MULTILINESTRING ((10 10, 15 15), (20 20, 30 30))
104  </op></test>
105</case>
106
107<case>
108  <desc>LL - loop overlapping at vertices</desc>
109  <a>
110LINESTRING (10 10, 20 20)
111  </a>
112  <b>
113LINESTRING (13 13, 10 10, 10 20, 20 20, 17 17)
114  </b>
115<test>  <op name="intersectionNG" arg1="A" arg2="B">
116MULTILINESTRING ((17 17, 20 20), (10 10, 13 13))
117  </op></test>
118<test>  <op name="unionNG" arg1="A" arg2="B">
119MULTILINESTRING ((17 17, 20 20), (10 10, 10 20, 20 20), (13 13, 17 17), (10 10, 13 13))
120  </op></test>
121<test>  <op name="differenceNG" arg1="A" arg2="B">
122LINESTRING (13 13, 17 17)
123  </op></test>
124<test>  <op name="differenceNG" arg1="B" arg2="A">
125LINESTRING (10 10, 10 20, 20 20)
126  </op></test>
127<test>  <op name="symdifferenceNG" arg1="A" arg2="B">
128MULTILINESTRING ((10 10, 10 20, 20 20), (13 13, 17 17))
129  </op></test>
130</case>
131
132<case>
133  <desc>LL - overlapping at vertex and interior</desc>
134  <a>
135LINESTRING (0 10, 10 10, 30 30, 40 30)
136  </a>
137  <b>
138LINESTRING (20 0, 20 20, 30 30, 30 40)
139  </b>
140<test>  <op name="intersectionNG" arg1="A" arg2="B">
141LINESTRING (20 20, 30 30)
142  </op></test>
143<test>  <op name="unionNG" arg1="A" arg2="B">
144MULTILINESTRING ((0 10, 10 10, 20 20), (20 20, 30 30), (20 0, 20 20), (30 30, 30 40), (30 30, 40 30))
145  </op></test>
146<test>  <op name="differenceNG" arg1="A" arg2="B">
147MULTILINESTRING ((0 10, 10 10, 20 20), (30 30, 40 30))
148  </op></test>
149<test>  <op name="differenceNG" arg1="B" arg2="A">
150MULTILINESTRING ((20 0, 20 20), (30 30, 30 40))
151  </op></test>
152<test>  <op name="symdifferenceNG" arg1="A" arg2="B">
153MULTILINESTRING ((0 10, 10 10, 20 20), (20 0, 20 20), (30 30, 30 40), (30 30, 40 30))
154  </op></test>
155</case>
156
157<case>
158  <desc>LL - overlapping and crossing</desc>
159  <a>
160LINESTRING (0 0, 10 10)
161  </a>
162  <b>
163LINESTRING (0 0, 3 3, 8 2, 1 9)
164  </b>
165<test>  <op name="intersectionNG" arg1="A" arg2="B">
166GEOMETRYCOLLECTION (LINESTRING (0 0, 3 3), POINT (5 5))
167  </op></test>
168<test>  <op name="unionNG" arg1="A" arg2="B">
169MULTILINESTRING ((5 5, 1 9), (0 0, 3 3), (5 5, 10 10), (3 3, 8 2, 5 5), (3 3, 5 5))
170  </op></test>
171<test>  <op name="differenceNG" arg1="A" arg2="B">
172MULTILINESTRING ((5 5, 10 10), (3 3, 5 5))
173  </op></test>
174<test>  <op name="differenceNG" arg1="B" arg2="A">
175MULTILINESTRING ((5 5, 1 9), (3 3, 8 2, 5 5))
176  </op></test>
177<test>  <op name="symdifferenceNG" arg1="A" arg2="B">
178MULTILINESTRING ((5 5, 1 9), (5 5, 10 10), (3 3, 8 2, 5 5), (3 3, 5 5))
179  </op></test>
180</case>
181
182<case>
183  <desc>LL - Line with repeated points</desc>
184  <a>
185    LINESTRING (100 100, 200 200, 200 200, 200 200, 200 200, 300 300, 400 200)
186  </a>
187  <b>
188    LINESTRING (190 110, 120 180)
189  </b>
190<test>  <op name="intersectionNG" arg1="A" arg2="B">
191POINT (150 150)
192  </op></test>
193<test>  <op name="unionNG" arg1="A" arg2="B">
194MULTILINESTRING ((150 150, 200 200, 300 300, 400 200), (100 100, 150 150), (190 110, 150 150), (150 150, 120 180))
195  </op></test>
196<test>  <op name="differenceNG" arg1="A" arg2="B">
197MULTILINESTRING ((150 150, 200 200, 300 300, 400 200), (100 100, 150 150))
198  </op></test>
199<test>  <op name="differenceNG" arg1="B" arg2="A">
200MULTILINESTRING ((190 110, 150 150), (150 150, 120 180))
201  </op></test>
202<test>  <op name="symdifferenceNG" arg1="A" arg2="B">
203MULTILINESTRING ((150 150, 200 200, 300 300, 400 200), (100 100, 150 150), (190 110, 150 150), (150 150, 120 180))
204  </op></test>
205</case>
206
207<case>
208  <desc>LA - vertical Line</desc>
209  <a>
210    LINESTRING (50 50, 50 20)
211  </a>
212  <b>
213    POLYGON ((10 60, 90 60, 90 10, 10 10, 10 60))
214  </b>
215<test>  <op name="intersectionNG" arg1="A" arg2="B">
216LINESTRING (50 50, 50 20)
217  </op></test>
218<test>  <op name="unionNG" arg1="A" arg2="B">
219POLYGON ((90 60, 90 10, 10 10, 10 60, 90 60))
220  </op></test>
221<test>  <op name="differenceNG" arg1="A" arg2="B">
222LINESTRING EMPTY
223  </op></test>
224<test>  <op name="differenceNG" arg1="B" arg2="A">
225POLYGON ((90 60, 90 10, 10 10, 10 60, 90 60))
226  </op></test>
227<test>  <op name="symdifferenceNG" arg1="A" arg2="B">
228POLYGON ((90 60, 90 10, 10 10, 10 60, 90 60))
229  </op></test>
230</case>
231
232<case>
233  <desc>mLmA - disjoint and overlaps in lines and points</desc>
234  <a>
235MULTILINESTRING ((50 150, 150 150), (100 350, 200 350), (320 350, 350 350), (300 150, 400 150), (150 300, 400 300))
236  </a>
237  <b>
238MULTIPOLYGON (((100 200, 200 200, 200 100, 100 100, 100 200)), ((100 400, 200 400, 200 300, 100 300, 100 400)), ((300 400, 400 400, 400 300, 300 300, 300 400)))
239  </b>
240<test>  <op name="intersectionNG" arg1="A" arg2="B">
241MULTILINESTRING ((320 350, 350 350), (150 300, 200 300), (300 300, 400 300), (100 150, 150 150), (100 350, 200 350))
242  </op></test>
243<test>  <op name="unionNG" arg1="A" arg2="B">
244GEOMETRYCOLLECTION (POLYGON ((300 300, 300 400, 400 400, 400 300, 300 300)), POLYGON ((100 100, 100 150, 100 200, 200 200, 200 100, 100 100)), POLYGON ((200 300, 150 300, 100 300, 100 350, 100 400, 200 400, 200 350, 200 300)), LINESTRING (300 150, 400 150), LINESTRING (200 300, 300 300), LINESTRING (50 150, 100 150))
245  </op></test>
246<test>  <op name="differenceNG" arg1="A" arg2="B">
247MULTILINESTRING ((300 150, 400 150), (200 300, 300 300), (50 150, 100 150))
248  </op></test>
249<test>  <op name="differenceNG" arg1="B" arg2="A">
250MULTIPOLYGON (((300 300, 300 400, 400 400, 400 300, 300 300)), ((100 100, 100 150, 100 200, 200 200, 200 100, 100 100)), ((200 300, 150 300, 100 300, 100 350, 100 400, 200 400, 200 350, 200 300)))
251  </op></test>
252<test>  <op name="symdifferenceNG" arg1="A" arg2="B">
253GEOMETRYCOLLECTION (POLYGON ((300 300, 300 400, 400 400, 400 300, 300 300)), POLYGON ((100 100, 100 150, 100 200, 200 200, 200 100, 100 100)), POLYGON ((200 300, 150 300, 100 300, 100 350, 100 400, 200 400, 200 350, 200 300)), LINESTRING (300 150, 400 150), LINESTRING (200 300, 300 300), LINESTRING (50 150, 100 150))
254  </op></test>
255</case>
256
257<case>
258  <desc>LmA - overlaps in lines</desc>
259  <a>
260LINESTRING (10 0, 90 0)
261  </a>
262  <b>
263MULTIPOLYGON (((20 10, 40 10, 40 -10, 20 -10, 20 10)), ((80 10, 80 -10, 60 -10, 60 10, 80 10)))
264  </b>
265<test>  <op name="intersectionNG" arg1="A" arg2="B">
266MULTILINESTRING ((60 0, 80 0), (20 0, 40 0))
267  </op></test>
268<test>  <op name="unionNG" arg1="A" arg2="B">
269GEOMETRYCOLLECTION (POLYGON ((40 -10, 20 -10, 20 0, 20 10, 40 10, 40 0, 40 -10)), POLYGON ((80 0, 80 -10, 60 -10, 60 0, 60 10, 80 10, 80 0)), LINESTRING (40 0, 60 0), LINESTRING (80 0, 90 0), LINESTRING (10 0, 20 0))
270  </op></test>
271<test>  <op name="differenceNG" arg1="A" arg2="B">
272MULTILINESTRING ((40 0, 60 0), (80 0, 90 0), (10 0, 20 0))
273  </op></test>
274<test>  <op name="differenceNG" arg1="B" arg2="A">
275MULTIPOLYGON (((40 -10, 20 -10, 20 0, 20 10, 40 10, 40 0, 40 -10)), ((80 0, 80 -10, 60 -10, 60 0, 60 10, 80 10, 80 0)))
276  </op></test>
277<test>  <op name="symdifferenceNG" arg1="A" arg2="B">
278GEOMETRYCOLLECTION (POLYGON ((40 -10, 20 -10, 20 0, 20 10, 40 10, 40 0, 40 -10)), POLYGON ((80 0, 80 -10, 60 -10, 60 0, 60 10, 80 10, 80 0)), LINESTRING (40 0, 60 0), LINESTRING (80 0, 90 0), LINESTRING (10 0, 20 0))
279  </op></test>
280</case>
281
282</run>