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>