New upstream version 3.7.2
Bas Couwenberg
5 years ago
22 | 22 | ################################################################################# |
23 | 23 | # Set GEOS project |
24 | 24 | ################################################################################# |
25 | project(GEOS VERSION 3.7.0 LANGUAGES C CXX) | |
25 | project(GEOS VERSION 3.7.2 LANGUAGES C CXX) | |
26 | 26 | |
27 | 27 | # Add custom GEOS modules for CMake |
28 | 28 | list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake/modules") |
57 | 57 | |
58 | 58 | # GEOS C API version |
59 | 59 | set(CAPI_INTERFACE_CURRENT 12) |
60 | set(CAPI_INTERFACE_REVISION 0) | |
60 | set(CAPI_INTERFACE_REVISION 2) | |
61 | 61 | set(CAPI_INTERFACE_AGE 11) |
62 | 62 | |
63 | 63 | math(EXPR CAPI_VERSION_MAJOR "${CAPI_INTERFACE_CURRENT} - ${CAPI_INTERFACE_AGE}") |
0 | 2019-05-02 Paul Ramsey <pramsey@cleverelephant.ca> | |
1 | ||
2 | * NEWS: Set date for 3.7.2 release | |
3 | ||
4 | 2019-02-04 Regina Obe <lr@pcorp.us> | |
5 | ||
6 | * HOWTO_RELEASE, README.md: Update instructions to include updating | |
7 | the readme. Fix some old bot links | |
8 | ||
9 | 2019-02-04 Regina Obe <lr@pcorp.us> | |
10 | ||
11 | Merge branch '3.7' of https://git.osgeo.org/gitea/geos/geos into | |
12 | 3.7 | |
13 | ||
14 | 2019-02-04 Regina Obe <lr@pcorp.us> | |
15 | ||
16 | * .drone-1.0.yml, README.md: Update badges to 3.7 (was stuck at | |
17 | 3.6), update drone to dronie (1.0 server) | |
18 | ||
19 | 2019-01-28 Paul Ramsey <pramsey@cleverelephant.ca> | |
20 | ||
21 | * NEWS, src/noding/SingleInteriorIntersectionFinder.cpp, | |
22 | tests/xmltester/CMakeLists.txt, tests/xmltester/Makefile.am, | |
23 | tests/xmltester/tests/ticket/bug838.xml: Invalid union result from | |
24 | valid polygon inputs References #838 | |
25 | ||
26 | 2019-01-28 Paul Ramsey <pramsey@cleverelephant.ca> | |
27 | ||
28 | * NEWS, src/operation/overlay/PolygonBuilder.cpp, | |
29 | tests/xmltester/tests/general/TestFunctionAA.xml: Polygon build | |
30 | failure in Overlay difference References #789 | |
31 | ||
32 | 2019-01-28 Paul Ramsey <pramsey@cleverelephant.ca> | |
33 | ||
34 | * NEWS, capi/CMakeLists.txt, src/CMakeLists.txt: fail with cmake | |
35 | -DGEOS_ENABLE_MACOSX_FRAMEWORK=NO Closes #936 | |
36 | ||
37 | 2019-01-25 Paul Ramsey <pramsey@cleverelephant.ca> | |
38 | ||
39 | * src/geom/Envelope.cpp: Convert from nullptr to NULL | |
40 | ||
41 | 2019-01-25 Paul Ramsey <pramsey@cleverelephant.ca> | |
42 | ||
43 | * NEWS: Update news | |
44 | ||
45 | 2019-01-25 Paul Ramsey <pramsey@cleverelephant.ca> | |
46 | ||
47 | * src/geom/Envelope.cpp: Change Envelope constructor to use strtod | |
48 | References #875 | |
49 | ||
50 | 2018-12-21 Regina Obe <lr@pcorp.us> | |
51 | ||
52 | Merge branch '3.7' of https://git.osgeo.org/gitea/geos/geos into | |
53 | 3.7 | |
54 | ||
55 | 2018-12-20 Paul Ramsey <pramsey@cleverelephant.ca> | |
56 | ||
57 | * CMakeLists.txt: Remove 'dev' suffix from patch number | |
58 | ||
59 | 2018-12-20 Regina Obe <regina.obe@appsassociates.com> | |
60 | ||
61 | * configure.ac: Change version to 3.7.2dev from 3.7.2 | |
62 | ||
63 | 2018-12-08 Regina Obe <lr@pcorp.us> | |
64 | ||
65 | * CMakeLists.txt, include/geos/version.h.vc: More version number | |
66 | updates | |
67 | ||
68 | 2018-12-08 Regina Obe <lr@pcorp.us> | |
69 | ||
70 | * CMakeLists.txt, capi/geos_c.h.in: Increment to GEOS 3.7.2 | |
71 | ||
72 | 2018-11-29 Paul Ramsey <pramsey@cleverelephant.ca> | |
73 | ||
74 | * NEWS, configure.ac: Bump versions for next dev cycle | |
75 | ||
0 | 76 | 2018-11-29 Paul Ramsey <pramsey@cleverelephant.ca> |
1 | 77 | |
2 | 78 | * NEWS, configure.ac: News and version bump for 3.7.1 |
0 | Changes in 3.7.2 | |
1 | 2019-05-02 | |
2 | ||
3 | - Bug fixes / improvements | |
4 | - Envelope constructor using strtod (#875 Paul Ramsey) | |
5 | - Failure in CMake for OSX Framework (#936 Paul Ramsey) | |
6 | - Polygon build failure in Overlay difference (#789 Paul Ramsey) | |
7 | - Invalid union result from valid polygon inputs (#838) | |
8 | ||
9 | ||
0 | 10 | Changes in 3.7.1 |
1 | 11 | 2018-11-29 |
2 | 12 |
6 | 6 | |
7 | 7 | | branch / CI | Debbie | Winnie | Dronie | Travis CI | GitLab CI | AppVeyor | Bessie | Bessie32 | |
8 | 8 | |:--- |:--- |:--- |:--- |:--- |:--- |:--- |:--- |:--- | |
9 | | master | [![debbie](https://debbie.postgis.net/buildStatus/icon?job=GEOS_Master)](https://debbie.postgis.net/view/GEOS/job/GEOS_Master/) | [![winnie](https://winnie.postgis.net:444/view/GEOS/job/GEOS_Master/badge/icon)](https://winnie.postgis.net:444/view/GEOS/job/GEOS_Master/) | [![dronie](https://drone.osgeo.org/api/badges/geos/geos/status.svg?branch=master)](https://drone.osgeo.org/geos/geos?branch=master) | [![travis](https://travis-ci.com/libgeos/geos.svg?branch=master)](https://travis-ci.com/libgeos/geos?branch=master) | [![gitlab-ci](https://gitlab.com/geos/libgeos/badges/master/build.svg)](https://gitlab.com/geos/libgeos/commits/master) | [![appveyor](https://ci.appveyor.com/api/projects/status/ao909hwpsb1yu062/branch/master?svg=true)](https://ci.appveyor.com/project/OSGeo/geos/branch/master) | [![bessie](https://debbie.postgis.net/buildStatus/icon?job=GEOS_Worker_Run/label=bessie&BRANCH=master)](https://debbie.postgis.net/view/GEOS/job/GEOS_Worker_Run/label=bessie) | [![bessie32](https://debbie.postgis.net/buildStatus/icon?job=GEOS_Worker_Run/label=bessie32&BRANCH=master)](https://debbie.postgis.net/view/GEOS/job/GEOS_Worker_Run/label=bessie32) || | |
10 | | svn-3.6 | [![debbie](https://debbie.postgis.net/buildStatus/icon?job=GEOS_Branch_3.6)](https://debbie.postgis.net/view/GEOS/job/GEOS_Branch_3.6/) | [![winnie](https://winnie.postgis.net:444/view/GEOS/job/GEOS_Branch_3.6/badge/icon)](https://winnie.postgis.net:444/view/GEOS/job/GEOS_Branch_3.6/) | [![dronie](https://drone.osgeo.org/api/badges/geos/geos/status.svg?branch=svn-3.6)](https://drone.osgeo.org/geos/geos?branch=svn-3.6) | [![travis](https://travis-ci.com/libgeos/geos.svg?branch=svn-3.6)](https://travis-ci.com/libgeos/geos?branch=svn-3.6) | [![gitlab-ci](https://gitlab.com/geos/libgeos/badges/svn-3.6/build.svg)](https://gitlab.com/geos/libgeos/commits/svn-3.6) | [![appveyor](https://ci.appveyor.com/api/projects/status/ao909hwpsb1yu062/branch/svn-3.6?svg=true)](https://ci.appveyor.com/project/OSGeo/geos/branch/svn-3.6) | | |
9 | | 3.7 | [![debbie](https://debbie.postgis.net/buildStatus/icon?job=GEOS_3.7)](https://debbie.postgis.net/view/GEOS/job/GEOS_3.7/) | [![winnie](https://winnie.postgis.net:444/view/GEOS/job/GEOS_3.7/badge/icon)](https://winnie.postgis.net:444/view/GEOS/job/GEOS_3.7/) | [![dronie](https://dronie.osgeo.org/api/badges/geos/geos/status.svg?ref=refs/heads/3.7)](https://drone.osgeo.org/geos/geos?branch=3.7) | [![travis](https://travis-ci.com/libgeos/geos.svg?branch=3.7)](https://travis-ci.com/libgeos/geos?branch=3.7) | [![gitlab-ci](https://gitlab.com/geos/libgeos/badges/3.7/build.svg)](https://gitlab.com/geos/libgeos/commits/3.7) | [![appveyor](https://ci.appveyor.com/api/projects/status/ao909hwpsb1yu062/branch/3.7?svg=true)](https://ci.appveyor.com/project/OSGeo/geos/branch/3.7) | [![bessie](https://debbie.postgis.net/buildStatus/icon?job=GEOS_Worker_Run/label=bessie&BRANCH=3.7)](https://debbie.postgis.net/view/GEOS/job/GEOS_Worker_Run/label=bessie) | [![bessie32](https://debbie.postgis.net/buildStatus/icon?job=GEOS_Worker_Run/label=bessie32&BRANCH=3.7)](https://debbie.postgis.net/view/GEOS/job/GEOS_Worker_Run/label=bessie32) || | |
10 | | 3.7 | [![debbie](https://debbie.postgis.net/buildStatus/icon?job=GEOS_Branch_3.7)](https://debbie.postgis.net/view/GEOS/job/GEOS_Branch_3.7/) | [![winnie](https://winnie.postgis.net:444/view/GEOS/job/GEOS_Branch_3.7/badge/icon)](https://winnie.postgis.net:444/view/GEOS/job/GEOS_Branch_3.7/) | [![dronie](https://dronie.osgeo.org/api/badges/geos/geos/status.svg?ref=refs/heads/3.7)](https://dronie.osgeo.org/geos/geos?branch=3.7) | [![travis](https://travis-ci.com/libgeos/geos.svg?branch=3.7)](https://travis-ci.com/libgeos/geos?branch=3.7) | [![gitlab-ci](https://gitlab.com/geos/libgeos/badges/3.7/build.svg)](https://gitlab.com/geos/libgeos/commits/3.7) | [![appveyor](https://ci.appveyor.com/api/projects/status/ao909hwpsb1yu062/branch/3.7?svg=true)](https://ci.appveyor.com/project/OSGeo/geos/branch/3.7) | | |
11 | 11 | |
12 | 12 | More on: https://trac.osgeo.org/geos#BuildandInstall |
13 | 13 | |
104 | 104 | |
105 | 105 | ./configure ... --enable-ruby |
106 | 106 | |
107 | Since version 3.6.0 PHP bindings are not included in the core | |
107 | Since version 3.7.0 PHP bindings are not included in the core | |
108 | 108 | library anymore but available as a separate project: |
109 | 109 | |
110 | 110 | https://git.osgeo.org/gogs/geos/php-geos |
18 | 18 | You have another version of autoconf. It may work, but is not guaranteed to. |
19 | 19 | If you have problems, you may need to regenerate the build system entirely. |
20 | 20 | To do so, use the procedure documented by the package, typically 'autoreconf'.])]) |
21 | ||
22 | # =========================================================================== | |
23 | # https://www.gnu.org/software/autoconf-archive/ax_require_defined.html | |
24 | # =========================================================================== | |
25 | # | |
26 | # SYNOPSIS | |
27 | # | |
28 | # AX_REQUIRE_DEFINED(MACRO) | |
29 | # | |
30 | # DESCRIPTION | |
31 | # | |
32 | # AX_REQUIRE_DEFINED is a simple helper for making sure other macros have | |
33 | # been defined and thus are available for use. This avoids random issues | |
34 | # where a macro isn't expanded. Instead the configure script emits a | |
35 | # non-fatal: | |
36 | # | |
37 | # ./configure: line 1673: AX_CFLAGS_WARN_ALL: command not found | |
38 | # | |
39 | # It's like AC_REQUIRE except it doesn't expand the required macro. | |
40 | # | |
41 | # Here's an example: | |
42 | # | |
43 | # AX_REQUIRE_DEFINED([AX_CHECK_LINK_FLAG]) | |
44 | # | |
45 | # LICENSE | |
46 | # | |
47 | # Copyright (c) 2014 Mike Frysinger <vapier@gentoo.org> | |
48 | # | |
49 | # Copying and distribution of this file, with or without modification, are | |
50 | # permitted in any medium without royalty provided the copyright notice | |
51 | # and this notice are preserved. This file is offered as-is, without any | |
52 | # warranty. | |
53 | ||
54 | #serial 2 | |
55 | ||
56 | AC_DEFUN([AX_REQUIRE_DEFINED], [dnl | |
57 | m4_ifndef([$1], [m4_fatal([macro ]$1[ is not defined; is a m4 file missing?])]) | |
58 | ])dnl AX_REQUIRE_DEFINED | |
21 | 59 | |
22 | 60 | # Copyright (C) 2002-2018 Free Software Foundation, Inc. |
23 | 61 | # |
39 | 39 | CLEAN_DIRECT_OUTPUT 1) |
40 | 40 | endif() |
41 | 41 | |
42 | add_dependencies(geos_c geos_revision) | |
43 | ||
42 | 44 | endif() |
43 | 45 | |
44 | add_dependencies(geos_c geos_revision) | |
45 | 46 | |
46 | 47 | ################################################################################# |
47 | 48 | # Installation |
60 | 60 | #define GEOS_CAPI_VERSION_MAJOR 1 |
61 | 61 | #define GEOS_CAPI_VERSION_MINOR 11 |
62 | 62 | #define GEOS_CAPI_VERSION_PATCH 0 |
63 | #define GEOS_CAPI_VERSION "3.7.0-CAPI-1.11.0" | |
63 | #define GEOS_CAPI_VERSION "3.7.2-CAPI-1.11.0" | |
64 | 64 | #else |
65 | 65 | #ifndef GEOS_VERSION_MAJOR |
66 | 66 | #define GEOS_VERSION_MAJOR 3 |
69 | 69 | #define GEOS_VERSION_MINOR 7 |
70 | 70 | #endif |
71 | 71 | #ifndef GEOS_VERSION_PATCH |
72 | #define GEOS_VERSION_PATCH 1 | |
72 | #define GEOS_VERSION_PATCH 2 | |
73 | 73 | #endif |
74 | 74 | #ifndef GEOS_VERSION |
75 | #define GEOS_VERSION "3.7.1" | |
75 | #define GEOS_VERSION "3.7.2" | |
76 | 76 | #endif |
77 | 77 | #ifndef GEOS_JTS_PORT |
78 | 78 | #define GEOS_JTS_PORT "1.13.0" |
80 | 80 | |
81 | 81 | #define GEOS_CAPI_VERSION_MAJOR 1 |
82 | 82 | #define GEOS_CAPI_VERSION_MINOR 11 |
83 | #define GEOS_CAPI_VERSION_PATCH 1 | |
84 | #define GEOS_CAPI_VERSION "3.7.1-CAPI-1.11.1" | |
83 | #define GEOS_CAPI_VERSION_PATCH 2 | |
84 | #define GEOS_CAPI_VERSION "3.7.2-CAPI-1.11.2" | |
85 | 85 | #endif |
86 | 86 | |
87 | 87 | #define GEOS_CAPI_FIRST_INTERFACE GEOS_CAPI_VERSION_MAJOR |
60 | 60 | #define GEOS_CAPI_VERSION_MAJOR 1 |
61 | 61 | #define GEOS_CAPI_VERSION_MINOR 11 |
62 | 62 | #define GEOS_CAPI_VERSION_PATCH 0 |
63 | #define GEOS_CAPI_VERSION "3.7.0-CAPI-1.11.0" | |
63 | #define GEOS_CAPI_VERSION "3.7.2-CAPI-1.11.0" | |
64 | 64 | #else |
65 | 65 | #ifndef GEOS_VERSION_MAJOR |
66 | 66 | #define GEOS_VERSION_MAJOR @VERSION_MAJOR@ |
2614 | 2614 | JTS_PORT=1.13.0 |
2615 | 2615 | |
2616 | 2616 | CAPI_INTERFACE_CURRENT=12 |
2617 | CAPI_INTERFACE_REVISION=1 | |
2617 | CAPI_INTERFACE_REVISION=2 | |
2618 | 2618 | CAPI_INTERFACE_AGE=11 |
2619 | 2619 | |
2620 | 2620 | VERSION_MAJOR=3 |
2621 | 2621 | VERSION_MINOR=7 |
2622 | VERSION_PATCH=1 | |
2622 | VERSION_PATCH=2 | |
2623 | 2623 | VERSION="$VERSION_MAJOR.$VERSION_MINOR.$VERSION_PATCH" |
2624 | 2624 | VERSION_RELEASE=`echo "$VERSION" | sed -E 's/^([0-9]+\.[0-9]+\.[0-9]+).*$/\1/'` |
2625 | 2625 |
14 | 14 | |
15 | 15 | dnl -- Version info for the CAPI |
16 | 16 | CAPI_INTERFACE_CURRENT=12 |
17 | CAPI_INTERFACE_REVISION=1 | |
17 | CAPI_INTERFACE_REVISION=2 | |
18 | 18 | CAPI_INTERFACE_AGE=11 |
19 | 19 | |
20 | 20 | dnl |
23 | 23 | dnl |
24 | 24 | VERSION_MAJOR=3 |
25 | 25 | VERSION_MINOR=7 |
26 | VERSION_PATCH=1 | |
26 | VERSION_PATCH=2 | |
27 | 27 | VERSION="$VERSION_MAJOR.$VERSION_MINOR.$VERSION_PATCH" |
28 | 28 | VERSION_RELEASE=`echo "$VERSION" | sed -E 's/^([[0-9]+\.[0-9]+\.[0-9]+]).*$/\1/'` |
29 | 29 |
22 | 22 | # This could be handy for archiving the generated documentation or |
23 | 23 | # if some version control system is used. |
24 | 24 | |
25 | PROJECT_NUMBER = 3.7.1 | |
25 | PROJECT_NUMBER = 3.7.2 | |
26 | 26 | |
27 | 27 | # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) |
28 | 28 | # base path where the generated documentation will be put. |
307 | 307 | # directories like "/usr/src/myproject". Separate the files or directories |
308 | 308 | # with spaces. |
309 | 309 | |
310 | INPUT = ./../src ./../include ./../capi | |
310 | INPUT = ../../geos-git/doc/../src ../../geos-git/doc/../include ../../geos-git/doc/../capi | |
311 | 311 | |
312 | 312 | # If the value of the INPUT tag contains directories, you can use the |
313 | 313 | # FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp |
33 | 33 | #endif |
34 | 34 | |
35 | 35 | #ifndef GEOS_VERSION_PATCH |
36 | #define GEOS_VERSION_PATCH 0 | |
36 | #define GEOS_VERSION_PATCH 2 | |
37 | 37 | #endif |
38 | 38 | |
39 | 39 | #ifndef GEOS_VERSION |
40 | #define GEOS_VERSION "3.7.0" | |
40 | #define GEOS_VERSION "3.7.2" | |
41 | 41 | #endif |
42 | 42 | |
43 | 43 | #ifndef GEOS_JTS_PORT |
5 | 5 | # |
6 | 6 | # This is free software; you can redistribute and/or modify it under |
7 | 7 | # the terms of the GNU Lesser General Public Licence as published |
8 | # by the Free Software Foundation. | |
8 | # by the Free Software Foundation. | |
9 | 9 | # See the COPYING file for more information. |
10 | 10 | # |
11 | 11 | ################################################################################# |
25 | 25 | |
26 | 26 | add_library(GEOS SHARED ${geos_SOURCES} ${geos_c_SOURCES}) |
27 | 27 | |
28 | math(EXPR CVERSION "${VERSION_MAJOR} + 1") | |
29 | # VERSION = current version, SOVERSION = compatibility version | |
28 | math(EXPR CVERSION "${VERSION_MAJOR} + 1") | |
29 | # VERSION = current version, SOVERSION = compatibility version | |
30 | 30 | set_target_properties(GEOS |
31 | 31 | PROPERTIES |
32 | 32 | CLEAN_DIRECT_OUTPUT 1 |
33 | 33 | FRAMEWORK 1 |
34 | VERSION "${CVERSION}.${VERSION_MINOR}.${VERSION_PATCH}" | |
35 | SOVERSION ${CVERSION} | |
34 | VERSION "${CVERSION}.${VERSION_MINOR}.${VERSION_PATCH}" | |
35 | SOVERSION ${CVERSION} | |
36 | 36 | FRAMEWORK_VERSION ${VERSION_MAJOR} |
37 | BUILD_WITH_INSTALL_RPATH TRUE | |
38 | 37 | INSTALL_NAME_DIR "${CMAKE_INSTALL_PREFIX}" |
39 | 38 | MACOSX_FRAMEWORK_INFO_PLIST "${CMAKE_CURRENT_SOURCE_DIR}/Info.plist.in" |
40 | 39 | MACOSX_FRAMEWORK_BUNDLE_VERSION "GEOS ${VERSION}" |
139 | 139 | vector<string> values = split(coordString, ":,"); |
140 | 140 | |
141 | 141 | // create a new envelopet |
142 | init(::atof(values[0].c_str()), | |
143 | ::atof(values[1].c_str()), | |
144 | ::atof(values[2].c_str()), | |
145 | ::atof(values[3].c_str())); | |
142 | init(strtod(values[0].c_str(), NULL), | |
143 | strtod(values[1].c_str(), NULL), | |
144 | strtod(values[2].c_str(), NULL), | |
145 | strtod(values[3].c_str(), NULL)); | |
146 | 146 | } |
147 | 147 | |
148 | 148 | /*public*/ |
11 | 11 | * |
12 | 12 | ********************************************************************** |
13 | 13 | * |
14 | * Last port: noding/SingleInteriorIntersectionFinder.java rev. ??? (JTS-1.8) | |
14 | * Last port: noding/SingleInteriorIntersectionFinder.java rev. 2019-01-28 | |
15 | 15 | * |
16 | 16 | **********************************************************************/ |
17 | 17 | |
21 | 21 | #include <geos/geom/Coordinate.h> |
22 | 22 | |
23 | 23 | using namespace geos::geom; |
24 | ||
25 | ||
26 | namespace { // anonymous | |
27 | ||
28 | /* private in JTS */ | |
29 | bool isEndInteriorIntersection( | |
30 | const Coordinate& p0, bool isEnd0, | |
31 | const Coordinate& p1, bool isEnd1) | |
32 | { | |
33 | if (isEnd0 && isEnd1) return false; | |
34 | if (p0.equals2D(p1)) { | |
35 | return true; | |
36 | } | |
37 | return false; | |
38 | } | |
39 | ||
40 | /* public in JTS */ | |
41 | bool isEndInteriorIntersection( | |
42 | const Coordinate& p00, const Coordinate& p01, | |
43 | const Coordinate& p10, const Coordinate& p11, | |
44 | bool isEnd00, bool isEnd01, | |
45 | bool isEnd10, bool isEnd11) | |
46 | { | |
47 | if (isEndInteriorIntersection(p00, isEnd00, p10, isEnd10)) return true; | |
48 | if (isEndInteriorIntersection(p00, isEnd00, p11, isEnd11)) return true; | |
49 | if (isEndInteriorIntersection(p01, isEnd01, p10, isEnd10)) return true; | |
50 | if (isEndInteriorIntersection(p01, isEnd01, p11, isEnd11)) return true; | |
51 | return false; | |
52 | } | |
53 | ||
54 | } // anonymous namespace | |
55 | ||
24 | 56 | |
25 | 57 | namespace geos { |
26 | 58 | namespace noding { // geos.noding |
45 | 77 | const Coordinate& p10 = e1->getCoordinate(segIndex1); |
46 | 78 | const Coordinate& p11 = e1->getCoordinate(segIndex1 + 1); |
47 | 79 | |
80 | bool isEnd00 = segIndex0 == 0; | |
81 | bool isEnd01 = segIndex0 + 2 == static_cast<int>(e0->size()); | |
82 | bool isEnd10 = segIndex1 == 0; | |
83 | bool isEnd11 = segIndex1 + 2 == static_cast<int>(e1->size()); | |
84 | ||
48 | 85 | li.computeIntersection(p00, p01, p10, p11); |
49 | 86 | //if (li.hasIntersection() && li.isProper()) Debug.println(li); |
87 | bool isProperInteriorInt = li.hasIntersection() && | |
88 | li.isInteriorIntersection(); | |
89 | bool isEndInteriorInt = (e0 != e1) && isEndInteriorIntersection( | |
90 | p00, p01, p10, p11, isEnd00, isEnd01, isEnd10, isEnd11); | |
50 | 91 | |
51 | if (li.hasIntersection()) | |
52 | { | |
53 | if (li.isInteriorIntersection()) | |
54 | { | |
55 | intSegments.resize(4); | |
56 | intSegments[0] = p00; | |
57 | intSegments[1] = p01; | |
58 | intSegments[2] = p10; | |
59 | intSegments[3] = p11; | |
92 | if (isProperInteriorInt || isEndInteriorInt) { | |
93 | // found an intersection! | |
94 | intSegments.resize(4); | |
95 | intSegments[0] = p00; | |
96 | intSegments[1] = p01; | |
97 | intSegments[2] = p10; | |
98 | intSegments[3] = p11; | |
99 | interiorIntersection = li.getIntersection(0); | |
100 | } | |
60 | 101 | |
61 | interiorIntersection = li.getIntersection(0); | |
62 | } | |
63 | } | |
64 | 102 | } |
65 | 103 | |
66 | 104 |
20 | 20 | #include <geos/operation/overlay/OverlayOp.h> |
21 | 21 | #include <geos/operation/overlay/MaximalEdgeRing.h> |
22 | 22 | #include <geos/operation/overlay/MinimalEdgeRing.h> |
23 | #include <geos/operation/polygonize/EdgeRing.h> | |
23 | 24 | #include <geos/geomgraph/Node.h> |
24 | 25 | #include <geos/geomgraph/NodeMap.h> |
25 | 26 | #include <geos/geomgraph/DirectedEdgeStar.h> |
43 | 44 | using namespace geos::algorithm; |
44 | 45 | using namespace geos::geom; |
45 | 46 | |
46 | ||
47 | 47 | namespace geos { |
48 | 48 | namespace operation { // geos.operation |
49 | 49 | namespace overlay { // geos.operation.overlay |
145 | 145 | DirectedEdge *de=(*dirEdges)[i]; |
146 | 146 | #if GEOS_DEBUG |
147 | 147 | cerr << " dirEdge " << i << endl |
148 | << de->printEdge() << endl | |
149 | << " inResult:" << de->isInResult() << endl | |
150 | << " isArea:" << de->getLabel().isArea() << endl; | |
148 | << de->printEdge() << endl | |
149 | << " inResult:" << de->isInResult() << endl | |
150 | << " isArea:" << de->getLabel().isArea() << endl; | |
151 | 151 | #endif |
152 | 152 | if (de->isInResult() && de->getLabel().isArea()) |
153 | 153 | { |
304 | 304 | { |
305 | 305 | geom = (*rIt)->toPolygon(geometryFactory); |
306 | 306 | std::cerr << "INSERT INTO shells VALUES ('" |
307 | << *geom | |
308 | << "');" << std::endl; | |
307 | << *geom | |
308 | << "');" << std::endl; | |
309 | 309 | delete geom; |
310 | 310 | } |
311 | 311 | geom = hole->toPolygon(geometryFactory); |
312 | 312 | std::cerr << "INSERT INTO hole VALUES ('" |
313 | << *geom | |
314 | << "');" << std::endl; | |
313 | << *geom | |
314 | << "');" << std::endl; | |
315 | 315 | delete geom; |
316 | 316 | #endif |
317 | 317 | //assert(shell!=NULL); // unable to assign hole to a shell |
330 | 330 | { |
331 | 331 | LinearRing *testRing=testEr->getLinearRing(); |
332 | 332 | const Envelope *testEnv=testRing->getEnvelopeInternal(); |
333 | const Coordinate& testPt=testRing->getCoordinateN(0); | |
334 | 333 | EdgeRing *minShell=nullptr; |
335 | const Envelope *minEnv=nullptr; | |
336 | for(size_t i=0, n=newShellList.size(); i<n; i++) | |
337 | { | |
338 | LinearRing *lr=nullptr; | |
339 | EdgeRing *tryShell=newShellList[i]; | |
340 | LinearRing *tryRing=tryShell->getLinearRing(); | |
341 | const Envelope *tryEnv=tryRing->getEnvelopeInternal(); | |
342 | if (minShell!=nullptr) { | |
343 | lr=minShell->getLinearRing(); | |
344 | minEnv=lr->getEnvelopeInternal(); | |
345 | } | |
346 | bool isContained=false; | |
347 | const CoordinateSequence *rcl = tryRing->getCoordinatesRO(); | |
348 | if (tryEnv->contains(testEnv) | |
349 | && CGAlgorithms::isPointInRing(testPt,rcl)) | |
350 | isContained=true; | |
334 | const Envelope *minShellEnv=nullptr; | |
335 | ||
336 | for(auto const& tryShell: newShellList) | |
337 | { | |
338 | LinearRing *tryShellRing = tryShell->getLinearRing(); | |
339 | const Envelope *tryShellEnv=tryShellRing->getEnvelopeInternal(); | |
340 | // hole must be contained in shell | |
341 | // the hole envelope cannot equal the shell envelope | |
342 | // (also guards against testing rings against themselves) | |
343 | if (tryShellEnv->equals(testEnv)) continue; | |
344 | // hole must be contained in shell | |
345 | if (!tryShellEnv->contains(testEnv)) continue; | |
346 | const CoordinateSequence *tsrcs = tryShellRing->getCoordinatesRO(); | |
347 | Coordinate testPt = geos::operation::polygonize::EdgeRing::ptNotInList(testRing->getCoordinatesRO(), tsrcs); | |
348 | ||
349 | bool isContained = false; | |
350 | if (CGAlgorithms::locatePointInRing(testPt, *tsrcs) != Location::EXTERIOR) | |
351 | isContained = true; | |
352 | ||
351 | 353 | // check if this new containing ring is smaller than |
352 | 354 | // the current minimum ring |
353 | 355 | if (isContained) { |
354 | if (minShell==nullptr | |
355 | || minEnv->contains(tryEnv)) { | |
356 | minShell=tryShell; | |
356 | if (minShell==nullptr || | |
357 | minShellEnv->contains(tryShellEnv)) { | |
358 | minShell = tryShell; | |
359 | minShellEnv = minShell->getLinearRing()->getEnvelopeInternal(); | |
357 | 360 | } |
358 | 361 | } |
359 | 362 | } |
28 | 28 | the whole c api. */ |
29 | 29 | #define GEOS_VERSION_MAJOR 3 |
30 | 30 | #define GEOS_VERSION_MINOR 7 |
31 | #define GEOS_VERSION_PATCH 1 | |
32 | #define GEOS_VERSION "3.7.1" | |
31 | #define GEOS_VERSION_PATCH 2 | |
32 | #define GEOS_VERSION "3.7.2" | |
33 | 33 | #define GEOS_JTS_PORT "1.13.0" |
34 | 34 | |
35 | 35 | #define GEOS_CAPI_VERSION_MAJOR 1 |
36 | 36 | #define GEOS_CAPI_VERSION_MINOR 11 |
37 | #define GEOS_CAPI_VERSION_PATCH 1 | |
37 | #define GEOS_CAPI_VERSION_PATCH 2 | |
38 | 38 | #define GEOS_CAPI_FIRST_INTERFACE GEOS_CAPI_VERSION_MAJOR |
39 | 39 | #define GEOS_CAPI_LAST_INTERFACE (GEOS_CAPI_VERSION_MAJOR+GEOS_CAPI_VERSION_MINOR) |
40 | #define GEOS_CAPI_VERSION "3.7.1-CAPI-1.11.1" | |
40 | #define GEOS_CAPI_VERSION "3.7.2-CAPI-1.11.2" | |
41 | 41 | |
42 | 42 | /* Supported geometry types */ |
43 | 43 | enum GEOSGeomTypes { |
122 | 122 | |
123 | 123 | |
124 | 124 | #ifdef SWIGPYTHON |
125 | %include ../swig/python/python.i | |
125 | %include ../../geos-git/swig/python/python.i | |
126 | 126 | #endif |
127 | 127 | |
128 | 128 | #ifdef SWIGRUBY |
129 | %include ../swig/ruby/ruby.i | |
129 | %include ../../geos-git/swig/ruby/ruby.i | |
130 | 130 | #endif |
131 | 131 | |
132 | 132 |
61 | 61 | ${XMLTESTS_DIR}/ticket/bug188.xml |
62 | 62 | ${XMLTESTS_DIR}/ticket/bug244.xml |
63 | 63 | ${XMLTESTS_DIR}/ticket/bug275.xml |
64 | ${XMLTESTS_DIR}/ticket/bug838.xml | |
64 | 65 | ${XMLTESTS_DIR}/general/TestBoundary.xml |
65 | 66 | ${XMLTESTS_DIR}/general/TestBuffer.xml |
66 | 67 | ${XMLTESTS_DIR}/general/TestBufferMitredJoin.xml |
43 | 43 | $(srcdir)/tests/ticket/bug615.xml \ |
44 | 44 | $(srcdir)/tests/ticket/bug716.xml \ |
45 | 45 | $(srcdir)/tests/ticket/bug837.xml \ |
46 | $(srcdir)/tests/ticket/bug838.xml \ | |
46 | 47 | $(srcdir)/tests/general/TestBoundary.xml \ |
47 | 48 | $(srcdir)/tests/general/TestBuffer.xml \ |
48 | 49 | $(srcdir)/tests/general/TestBufferMitredJoin.xml \ |
635 | 635 | $(srcdir)/tests/ticket/bug615.xml \ |
636 | 636 | $(srcdir)/tests/ticket/bug716.xml \ |
637 | 637 | $(srcdir)/tests/ticket/bug837.xml \ |
638 | $(srcdir)/tests/ticket/bug838.xml \ | |
638 | 639 | $(srcdir)/tests/general/TestBoundary.xml \ |
639 | 640 | $(srcdir)/tests/general/TestBuffer.xml \ |
640 | 641 | $(srcdir)/tests/general/TestBufferMitredJoin.xml \ |
32 | 32 | <op name="symdifference" arg1="A" arg2="B"> |
33 | 33 | MULTIPOLYGON( |
34 | 34 | ( |
35 | (10 10, 10 100, 50 100, 50 50, 100 50, 100 10, 10 10)), | |
35 | (10 10, 10 100, 50 100, 50 50, 100 50, 100 10, 10 10)), | |
36 | 36 | ( |
37 | 37 | (50 100, 50 200, 200 200, 200 50, 100 50, 100 100, 50 100))) |
38 | 38 | </op> |
43 | 43 | <desc>AA - A with hole intersecting B</desc> |
44 | 44 | <a> |
45 | 45 | POLYGON( |
46 | (20 20, 20 160, 160 160, 160 20, 20 20), | |
46 | (20 20, 20 160, 160 160, 160 20, 20 20), | |
47 | 47 | (140 140, 40 140, 40 40, 140 40, 140 140)) |
48 | 48 | </a> |
49 | 49 | <b> |
59 | 59 | <test> |
60 | 60 | <op name="union" arg1="A" arg2="B"> |
61 | 61 | POLYGON( |
62 | (20 20, 20 160, 80 160, 80 240, 220 240, 220 100, 160 100, 160 20, 20 20), | |
62 | (20 20, 20 160, 80 160, 80 240, 220 240, 220 100, 160 100, 160 20, 20 20), | |
63 | 63 | (80 100, 80 140, 40 140, 40 40, 140 40, 140 100, 80 100)) |
64 | 64 | </op> |
65 | 65 | </test> |
66 | 66 | <test> |
67 | 67 | <op name="difference" arg1="A" arg2="B"> |
68 | 68 | POLYGON( |
69 | (20 20, 20 160, 80 160, 80 140, 40 140, 40 40, 140 40, 140 100, 160 100, | |
69 | (20 20, 20 160, 80 160, 80 140, 40 140, 40 40, 140 40, 140 100, 160 100, | |
70 | 70 | 160 20, 20 20)) |
71 | 71 | </op> |
72 | 72 | </test> |
74 | 74 | <op name="symdifference" arg1="A" arg2="B"> |
75 | 75 | MULTIPOLYGON( |
76 | 76 | ( |
77 | (20 20, 20 160, 80 160, 80 140, 40 140, 40 40, 140 40, 140 100, 160 100, | |
78 | 160 20, 20 20)), | |
79 | ( | |
80 | (80 100, 80 140, 140 140, 140 100, 80 100)), | |
77 | (20 20, 20 160, 80 160, 80 140, 40 140, 40 40, 140 40, 140 100, 160 100, | |
78 | 160 20, 20 20)), | |
79 | ( | |
80 | (80 100, 80 140, 140 140, 140 100, 80 100)), | |
81 | 81 | ( |
82 | 82 | (80 160, 80 240, 220 240, 220 100, 160 100, 160 160, 80 160))) |
83 | 83 | </op> |
116 | 116 | <op name="symdifference" arg1="A" arg2="B"> |
117 | 117 | MULTIPOLYGON( |
118 | 118 | ( |
119 | (20 340, 330 380, 50 40, 28 260, 140 220, 210 320, 140 270, 27 270, 20 340)), | |
119 | (20 340, 330 380, 50 40, 28 260, 140 220, 210 320, 140 270, 27 270, 20 340)), | |
120 | 120 | ( |
121 | 121 | (27 270, 28 260, 0 270, 27 270))) |
122 | 122 | </op> |
134 | 134 | <test> |
135 | 135 | <op name="intersection" arg1="A" arg2="B"> |
136 | 136 | GEOMETRYCOLLECTION( |
137 | POINT(110 260), | |
138 | LINESTRING(110 0, 110 60), | |
137 | POINT(110 260), | |
138 | LINESTRING(110 0, 110 60), | |
139 | 139 | POLYGON( |
140 | 140 | (110 100, 40 140, 110 180, 180 140, 110 100))) |
141 | 141 | </op> |
143 | 143 | <test> |
144 | 144 | <op name="union" arg1="A" arg2="B"> |
145 | 145 | POLYGON( |
146 | (110 0, 0 0, 0 260, 110 260, 220 260, 220 0, 110 0), | |
147 | (110 260, 40 220, 110 180, 180 220, 110 260), | |
146 | (110 0, 0 0, 0 260, 110 260, 220 260, 220 0, 110 0), | |
147 | (110 260, 40 220, 110 180, 180 220, 110 260), | |
148 | 148 | (110 100, 40 60, 110 60, 180 60, 110 100)) |
149 | 149 | </op> |
150 | 150 | </test> |
151 | 151 | <test> |
152 | 152 | <op name="difference" arg1="A" arg2="B"> |
153 | 153 | POLYGON( |
154 | (110 0, 0 0, 0 260, 110 260, 40 220, 110 180, 40 140, 110 100, 40 60, | |
154 | (110 0, 0 0, 0 260, 110 260, 40 220, 110 180, 40 140, 110 100, 40 60, | |
155 | 155 | 110 60, 110 0)) |
156 | 156 | </op> |
157 | 157 | </test> |
158 | 158 | <test> |
159 | 159 | <op name="symdifference" arg1="A" arg2="B"> |
160 | 160 | POLYGON( |
161 | (110 0, 0 0, 0 260, 110 260, 220 260, 220 0, 110 0), | |
162 | (110 260, 40 220, 110 180, 180 220, 110 260), | |
163 | (110 180, 40 140, 110 100, 180 140, 110 180), | |
161 | (110 0, 0 0, 0 260, 110 260, 220 260, 220 0, 110 0), | |
162 | (110 260, 40 220, 110 180, 180 220, 110 260), | |
163 | (110 180, 40 140, 110 100, 180 140, 110 180), | |
164 | 164 | (110 100, 40 60, 110 60, 180 60, 110 100)) |
165 | 165 | </op> |
166 | 166 | </test> |
170 | 170 | <desc>AA - simple polygons with two touching holes in their symDifference</desc> |
171 | 171 | <a> |
172 | 172 | POLYGON( |
173 | (0 0, 120 0, 120 50, 50 50, 120 100, 50 150, 120 150, 120 190, 0 190, | |
173 | (0 0, 120 0, 120 50, 50 50, 120 100, 50 150, 120 150, 120 190, 0 190, | |
174 | 174 | 0 0)) |
175 | 175 | </a> |
176 | 176 | <b> |
177 | 177 | POLYGON( |
178 | (230 0, 120 0, 120 50, 190 50, 120 100, 190 150, 120 150, 120 190, 230 190, | |
178 | (230 0, 120 0, 120 50, 190 50, 120 100, 190 150, 120 150, 120 190, 230 190, | |
179 | 179 | 230 0)) |
180 | 180 | </b> |
181 | 181 | <test> |
182 | 182 | <op name="symdifference" arg1="A" arg2="B"> |
183 | 183 | POLYGON( |
184 | (120 0, 0 0, 0 190, 120 190, 230 190, 230 0, 120 0), | |
185 | (120 100, 50 50, 120 50, 190 50, 120 100), | |
184 | (120 0, 0 0, 0 190, 120 190, 230 190, 230 0, 120 0), | |
185 | (120 100, 50 50, 120 50, 190 50, 120 100), | |
186 | 186 | (120 100, 190 150, 120 150, 50 150, 120 100)) |
187 | 187 | </op> |
188 | 188 | </test> |
197 | 197 | <b> |
198 | 198 | MULTIPOLYGON( |
199 | 199 | ( |
200 | (40 20, 0 0, 20 40, 60 60, 40 20)), | |
201 | ( | |
202 | (60 90, 60 60, 90 60, 90 90, 60 90)), | |
203 | ( | |
204 | (70 120, 90 90, 100 120, 70 120)), | |
200 | (40 20, 0 0, 20 40, 60 60, 40 20)), | |
201 | ( | |
202 | (60 90, 60 60, 90 60, 90 90, 60 90)), | |
203 | ( | |
204 | (70 120, 90 90, 100 120, 70 120)), | |
205 | 205 | ( |
206 | 206 | (120 70, 90 90, 120 100, 120 70))) |
207 | 207 | </b> |
208 | 208 | <test> |
209 | 209 | <op name="symdifference" arg1="A" arg2="B"> |
210 | 210 | POLYGON( |
211 | (0 0, 0 230, 210 230, 210 0, 0 0), | |
212 | (0 0, 40 20, 60 60, 20 40, 0 0), | |
213 | (60 60, 90 60, 90 90, 60 90, 60 60), | |
214 | (90 90, 120 70, 120 100, 90 90), | |
211 | (0 0, 0 230, 210 230, 210 0, 0 0), | |
212 | (0 0, 40 20, 60 60, 20 40, 0 0), | |
213 | (60 60, 90 60, 90 90, 60 90, 60 60), | |
214 | (90 90, 120 70, 120 100, 90 90), | |
215 | 215 | (90 90, 100 120, 70 120, 90 90)) |
216 | 216 | </op> |
217 | 217 | </test> |
226 | 226 | <b> |
227 | 227 | MULTIPOLYGON( |
228 | 228 | ( |
229 | (40 20, 0 0, 20 40, 60 60, 40 20)), | |
229 | (40 20, 0 0, 20 40, 60 60, 40 20)), | |
230 | 230 | ( |
231 | 231 | (60 100, 60 60, 100 60, 100 100, 60 100))) |
232 | 232 | </b> |
234 | 234 | <op name="intersection" arg1="A" arg2="B"> |
235 | 235 | MULTIPOLYGON( |
236 | 236 | ( |
237 | (40 20, 0 0, 20 40, 60 60, 40 20)), | |
237 | (40 20, 0 0, 20 40, 60 60, 40 20)), | |
238 | 238 | ( |
239 | 239 | (60 60, 60 100, 100 100, 100 60, 60 60))) |
240 | 240 | </op> |
242 | 242 | <test> |
243 | 243 | <op name="symdifference" arg1="A" arg2="B"> |
244 | 244 | POLYGON( |
245 | (0 0, 0 300, 340 300, 340 0, 0 0), | |
246 | (0 0, 40 20, 60 60, 20 40, 0 0), | |
245 | (0 0, 0 300, 340 300, 340 0, 0 0), | |
246 | (0 0, 40 20, 60 60, 20 40, 0 0), | |
247 | 247 | (60 60, 100 60, 100 100, 60 100, 60 60)) |
248 | 248 | </op> |
249 | 249 | </test> |
258 | 258 | <b> |
259 | 259 | MULTIPOLYGON( |
260 | 260 | ( |
261 | (60 20, 0 20, 60 60, 60 20)), | |
261 | (60 20, 0 20, 60 60, 60 20)), | |
262 | 262 | ( |
263 | 263 | (60 100, 60 60, 100 60, 100 100, 60 100))) |
264 | 264 | </b> |
266 | 266 | <op name="intersection" arg1="A" arg2="B"> |
267 | 267 | MULTIPOLYGON( |
268 | 268 | ( |
269 | (60 20, 0 20, 60 60, 60 20)), | |
269 | (60 20, 0 20, 60 60, 60 20)), | |
270 | 270 | ( |
271 | 271 | (60 60, 60 100, 100 100, 100 60, 60 60))) |
272 | 272 | </op> |
280 | 280 | <test> |
281 | 281 | <op name="difference" arg1="A" arg2="B"> |
282 | 282 | POLYGON( |
283 | (0 20, 0 120, 120 120, 120 0, 0 0, 0 20), | |
284 | (0 20, 60 20, 60 60, 0 20), | |
283 | (0 20, 0 120, 120 120, 120 0, 0 0, 0 20), | |
284 | (0 20, 60 20, 60 60, 0 20), | |
285 | 285 | (60 60, 100 60, 100 100, 60 100, 60 60)) |
286 | 286 | </op> |
287 | 287 | </test> |
288 | 288 | <test> |
289 | 289 | <op name="symdifference" arg1="A" arg2="B"> |
290 | 290 | POLYGON( |
291 | (0 20, 0 120, 120 120, 120 0, 0 0, 0 20), | |
292 | (0 20, 60 20, 60 60, 0 20), | |
291 | (0 20, 0 120, 120 120, 120 0, 0 0, 0 20), | |
292 | (0 20, 60 20, 60 60, 0 20), | |
293 | 293 | (60 60, 100 60, 100 100, 60 100, 60 60)) |
294 | 294 | </op> |
295 | 295 | </test> |
299 | 299 | <desc>AA - simple polygons with holes</desc> |
300 | 300 | <a> |
301 | 301 | POLYGON( |
302 | (160 330, 60 260, 20 150, 60 40, 190 20, 270 130, 260 250, 160 330), | |
302 | (160 330, 60 260, 20 150, 60 40, 190 20, 270 130, 260 250, 160 330), | |
303 | 303 | (140 240, 80 190, 90 100, 160 70, 210 130, 210 210, 140 240)) |
304 | 304 | </a> |
305 | 305 | <b> |
306 | 306 | POLYGON( |
307 | (300 330, 190 270, 150 170, 150 110, 250 30, 380 50, 380 250, 300 330), | |
307 | (300 330, 190 270, 150 170, 150 110, 250 30, 380 50, 380 250, 300 330), | |
308 | 308 | (290 240, 240 200, 240 110, 290 80, 330 170, 290 240)) |
309 | 309 | </b> |
310 | 310 | <test> |
311 | 311 | <op name="intersection" arg1="A" arg2="B"> |
312 | 312 | POLYGON( |
313 | (251 104, 217 57, 176 89, 210 130, 210 210, 172 226, 190 270, 217 285, 260 250, | |
313 | (251 104, 217 57, 176 89, 210 130, 210 210, 172 226, 190 270, 217 285, 260 250, | |
314 | 314 | 263 218, 240 200, 240 110, 251 104)) |
315 | 315 | </op> |
316 | 316 | </test> |
318 | 318 | <op name="symdifference" arg1="A" arg2="B"> |
319 | 319 | MULTIPOLYGON( |
320 | 320 | ( |
321 | (217 57, 190 20, 60 40, 20 150, 60 260, 160 330, 217 285, 190 270, 172 226, | |
322 | 140 240, 80 190, 90 100, 160 70, 176 89, 217 57)), | |
323 | ( | |
324 | (217 57, 251 104, 290 80, 330 170, 290 240, 263 218, 260 250, 217 285, 300 330, | |
325 | 380 250, 380 50, 250 30, 217 57)), | |
326 | ( | |
327 | (263 218, 270 130, 251 104, 240 110, 240 200, 263 218)), | |
321 | (217 57, 190 20, 60 40, 20 150, 60 260, 160 330, 217 285, 190 270, 172 226, | |
322 | 140 240, 80 190, 90 100, 160 70, 176 89, 217 57)), | |
323 | ( | |
324 | (217 57, 251 104, 290 80, 330 170, 290 240, 263 218, 260 250, 217 285, 300 330, | |
325 | 380 250, 380 50, 250 30, 217 57)), | |
326 | ( | |
327 | (263 218, 270 130, 251 104, 240 110, 240 200, 263 218)), | |
328 | 328 | ( |
329 | 329 | (172 226, 210 210, 210 130, 176 89, 150 110, 150 170, 172 226))) |
330 | 330 | </op> |
337 | 337 | POLYGON ((20 0, 20 160, 200 160, 200 0, 20 0)) |
338 | 338 | </a> |
339 | 339 | <b> |
340 | POLYGON ((220 80, 0 80, 0 240, 220 240, 220 80), | |
340 | POLYGON ((220 80, 0 80, 0 240, 220 240, 220 80), | |
341 | 341 | (100 80, 120 120, 80 120, 100 80)) |
342 | 342 | </b> |
343 | 343 | <test> |
344 | 344 | <op name="intersection" arg1="A" arg2="B"> |
345 | POLYGON ((20 80, 20 160, 200 160, 200 80, 100 80, 20 80), | |
345 | POLYGON ((20 80, 20 160, 200 160, 200 80, 100 80, 20 80), | |
346 | 346 | (100 80, 120 120, 80 120, 100 80)) |
347 | 347 | </op> |
348 | 348 | </test> |
353 | 353 | </test> |
354 | 354 | <test> |
355 | 355 | <op name="difference" arg1="A" arg2="B"> |
356 | MULTIPOLYGON (((20 0, 20 80, 100 80, 200 80, 200 0, 20 0)), | |
356 | MULTIPOLYGON (((20 0, 20 80, 100 80, 200 80, 200 0, 20 0)), | |
357 | 357 | ((100 80, 80 120, 120 120, 100 80))) |
358 | 358 | </op> |
359 | 359 | </test> |
360 | 360 | <test> |
361 | 361 | <op name="symdifference" arg1="A" arg2="B"> |
362 | MULTIPOLYGON (((20 0, 20 80, 100 80, 200 80, 200 0, 20 0)), | |
363 | ((200 80, 200 160, 20 160, 20 80, 0 80, 0 240, 220 240, 220 80, 200 80)), | |
362 | MULTIPOLYGON (((20 0, 20 80, 100 80, 200 80, 200 0, 20 0)), | |
363 | ((200 80, 200 160, 20 160, 20 80, 0 80, 0 240, 220 240, 220 80, 200 80)), | |
364 | 364 | ((100 80, 80 120, 120 120, 100 80))) |
365 | 365 | </op> |
366 | 366 | </test> |
371 | 371 | <a> |
372 | 372 | MULTIPOLYGON( |
373 | 373 | ( |
374 | (120 340, 120 200, 140 200, 140 280, 160 280, 160 200, 180 200, 180 280, 200 280, | |
375 | 200 200, 220 200, 220 340, 120 340)), | |
376 | ( | |
377 | (360 200, 220 200, 220 180, 300 180, 300 160, 220 160, 220 140, 300 140, 300 120, | |
374 | (120 340, 120 200, 140 200, 140 280, 160 280, 160 200, 180 200, 180 280, 200 280, | |
375 | 200 200, 220 200, 220 340, 120 340)), | |
376 | ( | |
377 | (360 200, 220 200, 220 180, 300 180, 300 160, 220 160, 220 140, 300 140, 300 120, | |
378 | 378 | 220 120, 220 100, 360 100, 360 200))) |
379 | 379 | </a> |
380 | 380 | <b> |
381 | 381 | MULTIPOLYGON( |
382 | 382 | ( |
383 | (100 220, 100 200, 300 200, 300 220, 100 220)), | |
384 | ( | |
385 | (280 180, 280 160, 300 160, 300 180, 280 180)), | |
386 | ( | |
387 | (220 140, 220 120, 240 120, 240 140, 220 140)), | |
383 | (100 220, 100 200, 300 200, 300 220, 100 220)), | |
384 | ( | |
385 | (280 180, 280 160, 300 160, 300 180, 280 180)), | |
386 | ( | |
387 | (220 140, 220 120, 240 120, 240 140, 220 140)), | |
388 | 388 | ( |
389 | 389 | (180 220, 160 240, 200 240, 180 220))) |
390 | 390 | </b> |
391 | 391 | <test> |
392 | 392 | <op name="getboundary" arg1="A"> |
393 | 393 | MULTILINESTRING( |
394 | (120 340, 120 200, 140 200, 140 280, 160 280, 160 200, 180 200, 180 280, 200 280, | |
395 | 200 200, 220 200, 220 340, 120 340), | |
396 | (360 200, 220 200, 220 180, 300 180, 300 160, 220 160, 220 140, 300 140, 300 120, | |
394 | (120 340, 120 200, 140 200, 140 280, 160 280, 160 200, 180 200, 180 280, 200 280, | |
395 | 200 200, 220 200, 220 340, 120 340), | |
396 | (360 200, 220 200, 220 180, 300 180, 300 160, 220 160, 220 140, 300 140, 300 120, | |
397 | 397 | 220 120, 220 100, 360 100, 360 200)) |
398 | 398 | </op> |
399 | 399 | </test> |
406 | 406 | <test> |
407 | 407 | <op name="intersection" arg1="A" arg2="B"> |
408 | 408 | GEOMETRYCOLLECTION( |
409 | POINT(200 240), | |
410 | LINESTRING(300 200, 220 200), | |
411 | LINESTRING(280 180, 300 180), | |
412 | LINESTRING(300 180, 300 160), | |
413 | LINESTRING(300 160, 280 160), | |
414 | LINESTRING(220 140, 240 140), | |
415 | LINESTRING(240 120, 220 120), | |
409 | POINT(200 240), | |
410 | LINESTRING(300 200, 220 200), | |
411 | LINESTRING(280 180, 300 180), | |
412 | LINESTRING(300 180, 300 160), | |
413 | LINESTRING(300 160, 280 160), | |
414 | LINESTRING(220 140, 240 140), | |
415 | LINESTRING(240 120, 220 120), | |
416 | 416 | POLYGON( |
417 | (120 200, 120 220, 140 220, 140 200, 120 200)), | |
417 | (120 200, 120 220, 140 220, 140 200, 120 200)), | |
418 | 418 | POLYGON( |
419 | (160 200, 160 220, 180 220, 180 200, 160 200)), | |
419 | (160 200, 160 220, 180 220, 180 200, 160 200)), | |
420 | 420 | POLYGON( |
421 | (180 240, 180 220, 160 240, 180 240)), | |
421 | (180 240, 180 220, 160 240, 180 240)), | |
422 | 422 | POLYGON( |
423 | 423 | (200 200, 200 220, 220 220, 220 200, 200 200))) |
424 | 424 | </op> |
426 | 426 | <test> |
427 | 427 | <op name="union" arg1="A" arg2="B"> |
428 | 428 | POLYGON( |
429 | (120 220, 120 340, 220 340, 220 220, 300 220, 300 200, 360 200, 360 100, 220 100, | |
430 | 220 120, 220 140, 220 160, 280 160, 280 180, 220 180, 220 200, 200 200, 180 200, 160 200, | |
431 | 140 200, 120 200, 100 200, 100 220, 120 220), | |
432 | (200 240, 200 280, 180 280, 180 240, 200 240), | |
433 | (200 240, 180 220, 200 220, 200 240), | |
434 | (160 240, 160 280, 140 280, 140 220, 160 220, 160 240), | |
429 | (120 220, 120 340, 220 340, 220 220, 300 220, 300 200, 360 200, 360 100, 220 100, | |
430 | 220 120, 220 140, 220 160, 280 160, 280 180, 220 180, 220 200, 200 200, 180 200, 160 200, | |
431 | 140 200, 120 200, 100 200, 100 220, 120 220), | |
432 | (200 240, 200 280, 180 280, 180 240, 200 240), | |
433 | (200 240, 180 220, 200 220, 200 240), | |
434 | (160 240, 160 280, 140 280, 140 220, 160 220, 160 240), | |
435 | 435 | (240 120, 300 120, 300 140, 240 140, 240 120)) |
436 | 436 | </op> |
437 | 437 | </test> |
439 | 439 | <op name="difference" arg1="A" arg2="B"> |
440 | 440 | MULTIPOLYGON( |
441 | 441 | ( |
442 | (120 220, 120 340, 220 340, 220 220, 200 220, 200 240, 200 280, 180 280, 180 240, | |
443 | 160 240, 160 280, 140 280, 140 220, 120 220)), | |
444 | ( | |
445 | (160 220, 160 240, 180 220, 160 220)), | |
446 | ( | |
447 | (300 200, 360 200, 360 100, 220 100, 220 120, 240 120, 300 120, 300 140, 240 140, | |
442 | (120 220, 120 340, 220 340, 220 220, 200 220, 200 240, 200 280, 180 280, 180 240, | |
443 | 160 240, 160 280, 140 280, 140 220, 120 220)), | |
444 | ( | |
445 | (160 220, 160 240, 180 220, 160 220)), | |
446 | ( | |
447 | (300 200, 360 200, 360 100, 220 100, 220 120, 240 120, 300 120, 300 140, 240 140, | |
448 | 448 | 220 140, 220 160, 280 160, 300 160, 300 180, 280 180, 220 180, 220 200, 300 200))) |
449 | 449 | </op> |
450 | 450 | </test> |
452 | 452 | <op name="symdifference" arg1="A" arg2="B"> |
453 | 453 | MULTIPOLYGON( |
454 | 454 | ( |
455 | (120 220, 120 340, 220 340, 220 220, 200 220, 200 240, 200 280, 180 280, 180 240, | |
456 | 160 240, 160 280, 140 280, 140 220, 120 220)), | |
457 | ( | |
458 | (120 220, 120 200, 100 200, 100 220, 120 220)), | |
459 | ( | |
460 | (140 200, 140 220, 160 220, 160 200, 140 200)), | |
461 | ( | |
462 | (160 220, 160 240, 180 220, 160 220)), | |
463 | ( | |
464 | (180 200, 180 220, 200 220, 200 200, 180 200)), | |
465 | ( | |
466 | (180 220, 180 240, 200 240, 180 220)), | |
467 | ( | |
468 | (220 200, 220 220, 300 220, 300 200, 360 200, 360 100, 220 100, 220 120, 220 140, | |
469 | 220 160, 280 160, 280 180, 220 180, 220 200), | |
455 | (120 220, 120 340, 220 340, 220 220, 200 220, 200 240, 200 280, 180 280, 180 240, | |
456 | 160 240, 160 280, 140 280, 140 220, 120 220)), | |
457 | ( | |
458 | (120 220, 120 200, 100 200, 100 220, 120 220)), | |
459 | ( | |
460 | (140 200, 140 220, 160 220, 160 200, 140 200)), | |
461 | ( | |
462 | (160 220, 160 240, 180 220, 160 220)), | |
463 | ( | |
464 | (180 200, 180 220, 200 220, 200 200, 180 200)), | |
465 | ( | |
466 | (180 220, 180 240, 200 240, 180 220)), | |
467 | ( | |
468 | (220 200, 220 220, 300 220, 300 200, 360 200, 360 100, 220 100, 220 120, 220 140, | |
469 | 220 160, 280 160, 280 180, 220 180, 220 200), | |
470 | 470 | (240 120, 300 120, 300 140, 240 140, 240 120))) |
471 | 471 | </op> |
472 | 472 | </test> |
477 | 477 | <a> |
478 | 478 | MULTIPOLYGON( |
479 | 479 | ( |
480 | (100 200, 100 180, 120 180, 120 200, 100 200)), | |
481 | ( | |
482 | (60 240, 60 140, 220 140, 220 160, 160 160, 160 180, 200 180, 200 200, 160 200, | |
483 | 160 220, 220 220, 220 240, 60 240), | |
484 | (80 220, 80 160, 140 160, 140 220, 80 220)), | |
480 | (100 200, 100 180, 120 180, 120 200, 100 200)), | |
481 | ( | |
482 | (60 240, 60 140, 220 140, 220 160, 160 160, 160 180, 200 180, 200 200, 160 200, | |
483 | 160 220, 220 220, 220 240, 60 240), | |
484 | (80 220, 80 160, 140 160, 140 220, 80 220)), | |
485 | 485 | ( |
486 | 486 | (280 220, 240 180, 260 160, 300 200, 280 220))) |
487 | 487 | </a> |
488 | 488 | <b> |
489 | 489 | MULTIPOLYGON( |
490 | 490 | ( |
491 | (80 220, 80 160, 140 160, 140 220, 80 220), | |
492 | (100 200, 100 180, 120 180, 120 200, 100 200)), | |
493 | ( | |
494 | (220 240, 220 220, 160 220, 160 200, 220 200, 220 180, 160 180, 160 160, 220 160, | |
495 | 220 140, 320 140, 320 240, 220 240), | |
491 | (80 220, 80 160, 140 160, 140 220, 80 220), | |
492 | (100 200, 100 180, 120 180, 120 200, 100 200)), | |
493 | ( | |
494 | (220 240, 220 220, 160 220, 160 200, 220 200, 220 180, 160 180, 160 160, 220 160, | |
495 | 220 140, 320 140, 320 240, 220 240), | |
496 | 496 | (240 220, 240 160, 300 160, 300 220, 240 220))) |
497 | 497 | </b> |
498 | 498 | <test> |
499 | 499 | <op name="getboundary" arg1="A"> |
500 | 500 | MULTILINESTRING( |
501 | (100 200, 100 180, 120 180, 120 200, 100 200), | |
502 | (60 240, 60 140, 220 140, 220 160, 160 160, 160 180, 200 180, 200 200, 160 200, | |
503 | 160 220, 220 220, 220 240, 60 240), | |
504 | (80 220, 80 160, 140 160, 140 220, 80 220), | |
501 | (100 200, 100 180, 120 180, 120 200, 100 200), | |
502 | (60 240, 60 140, 220 140, 220 160, 160 160, 160 180, 200 180, 200 200, 160 200, | |
503 | 160 220, 220 220, 220 240, 60 240), | |
504 | (80 220, 80 160, 140 160, 140 220, 80 220), | |
505 | 505 | (280 220, 240 180, 260 160, 300 200, 280 220)) |
506 | 506 | </op> |
507 | 507 | </test> |
514 | 514 | <test> |
515 | 515 | <op name="intersection" arg1="A" arg2="B"> |
516 | 516 | GEOMETRYCOLLECTION( |
517 | POINT(240 180), | |
518 | POINT(260 160), | |
519 | POINT(280 220), | |
520 | POINT(300 200), | |
521 | LINESTRING(100 200, 100 180), | |
522 | LINESTRING(100 180, 120 180), | |
523 | LINESTRING(120 180, 120 200), | |
524 | LINESTRING(120 200, 100 200), | |
525 | LINESTRING(220 140, 220 160), | |
526 | LINESTRING(220 160, 160 160), | |
527 | LINESTRING(160 160, 160 180), | |
528 | LINESTRING(160 180, 200 180), | |
529 | LINESTRING(200 200, 160 200), | |
530 | LINESTRING(160 200, 160 220), | |
531 | LINESTRING(160 220, 220 220), | |
532 | LINESTRING(220 220, 220 240), | |
533 | LINESTRING(80 220, 80 160), | |
534 | LINESTRING(80 160, 140 160), | |
535 | LINESTRING(140 160, 140 220), | |
517 | POINT(240 180), | |
518 | POINT(260 160), | |
519 | POINT(280 220), | |
520 | POINT(300 200), | |
521 | LINESTRING(100 200, 100 180), | |
522 | LINESTRING(100 180, 120 180), | |
523 | LINESTRING(120 180, 120 200), | |
524 | LINESTRING(120 200, 100 200), | |
525 | LINESTRING(220 140, 220 160), | |
526 | LINESTRING(220 160, 160 160), | |
527 | LINESTRING(160 160, 160 180), | |
528 | LINESTRING(160 180, 200 180), | |
529 | LINESTRING(200 200, 160 200), | |
530 | LINESTRING(160 200, 160 220), | |
531 | LINESTRING(160 220, 220 220), | |
532 | LINESTRING(220 220, 220 240), | |
533 | LINESTRING(80 220, 80 160), | |
534 | LINESTRING(80 160, 140 160), | |
535 | LINESTRING(140 160, 140 220), | |
536 | 536 | LINESTRING(140 220, 80 220)) |
537 | 537 | </op> |
538 | 538 | </test> |
540 | 540 | <op name="union" arg1="A" arg2="B"> |
541 | 541 | MULTIPOLYGON( |
542 | 542 | ( |
543 | (220 140, 60 140, 60 240, 220 240, 320 240, 320 140, 220 140), | |
544 | (200 200, 200 180, 220 180, 220 200, 200 200), | |
545 | (240 220, 240 180, 240 160, 260 160, 300 160, 300 200, 300 220, 280 220, 240 220)), | |
543 | (220 140, 60 140, 60 240, 220 240, 320 240, 320 140, 220 140), | |
544 | (200 200, 200 180, 220 180, 220 200, 200 200), | |
545 | (240 220, 240 180, 240 160, 260 160, 300 160, 300 200, 300 220, 280 220, 240 220)), | |
546 | 546 | ( |
547 | 547 | (240 180, 280 220, 300 200, 260 160, 240 180))) |
548 | 548 | </op> |
551 | 551 | <op name="difference" arg1="A" arg2="B"> |
552 | 552 | MULTIPOLYGON( |
553 | 553 | ( |
554 | (100 180, 100 200, 120 200, 120 180, 100 180)), | |
555 | ( | |
556 | (220 140, 60 140, 60 240, 220 240, 220 220, 160 220, 160 200, 200 200, 200 180, | |
557 | 160 180, 160 160, 220 160, 220 140), | |
558 | (80 220, 80 160, 140 160, 140 220, 80 220)), | |
554 | (100 180, 100 200, 120 200, 120 180, 100 180)), | |
555 | ( | |
556 | (220 140, 60 140, 60 240, 220 240, 220 220, 160 220, 160 200, 200 200, 200 180, | |
557 | 160 180, 160 160, 220 160, 220 140), | |
558 | (80 220, 80 160, 140 160, 140 220, 80 220)), | |
559 | 559 | ( |
560 | 560 | (240 180, 280 220, 300 200, 260 160, 240 180))) |
561 | 561 | </op> |
564 | 564 | <op name="symdifference" arg1="A" arg2="B"> |
565 | 565 | MULTIPOLYGON( |
566 | 566 | ( |
567 | (220 140, 60 140, 60 240, 220 240, 320 240, 320 140, 220 140), | |
568 | (200 200, 200 180, 220 180, 220 200, 200 200), | |
569 | (240 220, 240 180, 240 160, 260 160, 300 160, 300 200, 300 220, 280 220, 240 220)), | |
567 | (220 140, 60 140, 60 240, 220 240, 320 240, 320 140, 220 140), | |
568 | (200 200, 200 180, 220 180, 220 200, 200 200), | |
569 | (240 220, 240 180, 240 160, 260 160, 300 160, 300 200, 300 220, 280 220, 240 220)), | |
570 | 570 | ( |
571 | 571 | (240 180, 280 220, 300 200, 260 160, 240 180))) |
572 | 572 | </op> |
581 | 581 | </a> |
582 | 582 | <b> |
583 | 583 | POLYGON( |
584 | (160 160, 100 160, 100 100, 160 100, 160 160), | |
584 | (160 160, 100 160, 100 100, 160 100, 160 160), | |
585 | 585 | (140 140, 120 140, 120 120, 140 120, 140 140)) |
586 | 586 | </b> |
587 | 587 | <test> |
598 | 598 | <test> |
599 | 599 | <op name="intersection" arg1="A" arg2="B"> |
600 | 600 | GEOMETRYCOLLECTION( |
601 | LINESTRING(140 140, 140 120), | |
601 | LINESTRING(140 140, 140 120), | |
602 | 602 | POLYGON( |
603 | 603 | (100 160, 140 160, 140 140, 120 140, 120 120, 140 120, 140 100, 100 100, 100 160))) |
604 | 604 | </op> |
613 | 613 | <op name="difference" arg1="A" arg2="B"> |
614 | 614 | MULTIPOLYGON( |
615 | 615 | ( |
616 | (60 160, 100 160, 100 100, 140 100, 140 60, 60 60, 60 160)), | |
616 | (60 160, 100 160, 100 100, 140 100, 140 60, 60 60, 60 160)), | |
617 | 617 | ( |
618 | 618 | (140 140, 140 120, 120 120, 120 140, 140 140))) |
619 | 619 | </op> |
622 | 622 | <op name="symdifference" arg1="A" arg2="B"> |
623 | 623 | MULTIPOLYGON( |
624 | 624 | ( |
625 | (60 160, 100 160, 100 100, 140 100, 140 60, 60 60, 60 160)), | |
625 | (60 160, 100 160, 100 100, 140 100, 140 60, 60 60, 60 160)), | |
626 | 626 | ( |
627 | 627 | (140 140, 140 160, 160 160, 160 100, 140 100, 140 120, 120 120, 120 140, 140 140))) |
628 | 628 | </op> |
629 | 629 | </test> |
630 | 630 | </case> |
631 | 631 | |
632 | <case> | |
633 | <desc>AA - Polygons which stress hole assignment</desc> | |
634 | <a> | |
635 | POLYGON ((0 0, 4 0, 4 4, 0 4, 0 0), (1 1, 1 2, 2 1, 1 1), (1 2, 1 3, 2 3, 1 2), (2 3, 3 3, 3 2, 2 3)) | |
636 | </a> | |
637 | <b> | |
638 | POLYGON ((2 1, 3 1, 3 2, 2 1)) | |
639 | </b> | |
640 | <test> | |
641 | <op name="intersection" arg1="A" arg2="B"> | |
642 | POLYGON ((3 2, 3 1, 2 1, 3 2)) | |
643 | </op> | |
644 | </test> | |
645 | <test> | |
646 | <op name="union" arg1="A" arg2="B"> | |
647 | POLYGON ((0 0, 0 4, 4 4, 4 0, 0 0), (1 2, 1 1, 2 1, 1 2), (1 2, 2 3, 1 3, 1 2), (2 3, 3 2, 3 3, 2 3)) | |
648 | </op> | |
649 | </test> | |
650 | <test> | |
651 | <op name="difference" arg1="A" arg2="B"> | |
652 | MULTIPOLYGON (((0 0, 0 4, 4 4, 4 0, 0 0), (1 2, 1 1, 2 1, 3 1, 3 2, 3 3, 2 3, 1 3, 1 2)), ((2 1, 1 2, 2 3, 3 2, 2 1))) | |
653 | </op> | |
654 | </test> | |
655 | <test> | |
656 | <op name="symdifference" arg1="A" arg2="B"> | |
657 | MULTIPOLYGON (((0 0, 0 4, 4 4, 4 0, 0 0), (1 2, 1 1, 2 1, 3 1, 3 2, 3 3, 2 3, 1 3, 1 2)), ((2 1, 1 2, 2 3, 3 2, 2 1))) | |
658 | </op> | |
659 | </test> | |
660 | </case> | |
661 | ||
662 | ||
632 | 663 | </run> |
0 | <run> | |
1 | <precisionModel type="FLOATING" /> | |
2 | <case> | |
3 | <desc> | |
4 | Union of two valid polygons resulting in an invalid geometry | |
5 | See https://trac.osgeo.org/geos/ticket/838 | |
6 | </desc> | |
7 | <a> | |
8 | 00000000060000000200000000030000000100000005412CD75B00000000413D8F0966666667412CD75933333333413D8F6D80000000412CD82166666667413D8F6E4CCCCCCD412CD82500000000413D8EA61999999A412CD75B00000000413D8F096666666700000000030000000100000005412CD82500000001413D8EA61999999A412CD82333333334413D8F0A33333333412CD8EB66666666413D8F0B19999999412CD8ED33333333413D8EA700000001412CD82500000001413D8EA61999999A | |
9 | </a> | |
10 | <b> | |
11 | 00000000030000000100000007412CD9D4D50CE8F7413D8EA7FBC39C12412CD8ED33333333413D8EA700000000412CD8EB66666667413D8F0B1999999A412CD82333333333413D8F0A33333333412CD82166666667413D8F6E4CCCCCCD412CD9B1CCCCCCCD413D8F701999999A412CD9D4D50CE8F7413D8EA7FBC39C12 | |
12 | </b> | |
13 | <test> | |
14 | <op name="union" arg1="A" arg2="B"> | |
15 | 0103000000010000000A000000000000005BD72C4167666666098F3D413333333359D72C41000000806D8F3D416766666621D82C41CDCCCC4C6E8F3D41CDCCCCCCB1D92C419A999919708F3D41F7E80CD5D4D92C41129CC3FBA78E3D4133333333EDD82C4100000000A78E3D410100000025D82C419A999919A68E3D413333333323D82C41333333330A8F3D410000000025D82C419A999919A68E3D41000000005BD72C4167666666098F3D41 | |
16 | </op> | |
17 | </test> | |
18 | </case> | |
19 | </run> |