From 31f495660881de620b9f0c8c1e8892be6e2900bc Mon Sep 17 00:00:00 2001 From: henrythasler Date: Mon, 18 Mar 2019 21:28:46 +0100 Subject: [PATCH 1/5] added description for testing in docker-env --- planar/makevalid/development.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/planar/makevalid/development.md b/planar/makevalid/development.md index 32704242..1c958be1 100644 --- a/planar/makevalid/development.md +++ b/planar/makevalid/development.md @@ -235,3 +235,17 @@ This output should help identifiy where the code is failing. In our example abov the destructured line segments or the labeling. Taking the WKT output and putting it into qGIS can help visualize where the issues may lie. +## running tests in docker-environment + +In case you don't have go installed, you can also run these tests inside a docker-container. + +grab some go-image: `docker pull golang:1.11.0-alpine3.8` +cd into your `geom` folder and startup a container: `docker run --rm -ti -v $(pwd):/go/src/geom/vendor/github.com/go-spatial/geom golang:1.11.0-alpine3.8` + +``` +apk add git build-base +cd /go/src/geom/vendor/github.com +git clone --branch master --depth 1 https://github.com/mattn/go-sqlite3.git mattn/go-sqlite3 +cd /go/src/geom/vendor/github.com/go-spatial/geom/planar/makevalid +go test -v -run "TestMakeValid" +``` \ No newline at end of file From 478c859233e622de70e67d55a5e8b49dc159b47c Mon Sep 17 00:00:00 2001 From: henrythasler Date: Tue, 19 Mar 2019 21:18:53 +0100 Subject: [PATCH 2/5] added new test-case (9) --- .../_images/irregular_polygon_detail1.png | Bin 0 -> 38999 bytes planar/makevalid/cases_test.go | 65 ++++++++++++++++++ planar/makevalid/debug.go | 2 +- planar/makevalid/development.md | 2 + planar/makevalid/testcases.md | 1 + 5 files changed, 69 insertions(+), 1 deletion(-) create mode 100644 planar/makevalid/_images/irregular_polygon_detail1.png diff --git a/planar/makevalid/_images/irregular_polygon_detail1.png b/planar/makevalid/_images/irregular_polygon_detail1.png new file mode 100644 index 0000000000000000000000000000000000000000..95a2fe8d290af3d23f7cedeede2a77368b4329a3 GIT binary patch literal 38999 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 literal 0 HcmV?d00001 diff --git a/planar/makevalid/cases_test.go b/planar/makevalid/cases_test.go index be32a483..6a4496dd 100644 --- a/planar/makevalid/cases_test.go +++ b/planar/makevalid/cases_test.go @@ -347,4 +347,69 @@ var makevalidTestCases = [...]makevalidCase{ }, }, }, + { // (8) irregular detail 1 middle + Description: "irregular polygon detail 1 middle", + MultiPolygon: &geom.MultiPolygon{ + { // Polygon + { // Ring + {1285733.82161285122856498, 6138599.27377647440880537}, + {1286000.50211894721724093, 6138741.57482850179076195}, + {1286141.80611756001599133, 6138795.4894480612128973}, + {1286188.3289475291967392, 6138833.67217746842652559}, + {1286338.14253718149848282, 6138994.84492336492985487}, + {1286355.31101033766753972, 6139005.97246335539966822}, + {1286378.02191449701786041, 6139012.45303734578192234}, + {1286407.85213660122826695, 6139015.33640445396304131}, + {1286447.46092385076917708, 6139014.0906777661293745}, + {1286475.49032241315580904, 6139010.32550495583564043}, + {1286502.81991908047348261, 6139098.50656714290380478}, + {1286576.41108634602278471, 6139195.95469637773931026}, + {1286588.79291453957557678, 6139188.004275968298316}, + {1286609.48838924197480083, 6139174.42699059750884771}, + {1286659.51022868789732456, 6139245.65898859594017267}, + {1286840.97352537396363914, 6139262.73571997787803411}, + {1287383.30133250961080194, 6139312.66435879096388817}, + {1287393.22918872558511794, 6139313.91012894175946712}, + {1287415.46422759653069079, 6139056.13755289185792208}, + {1287421.97705056634731591, 6138965.68943751137703657}, + {1287442.80315495887771249, 6138703.88238476030528545}, + {1287409.34329369082115591, 6138702.07684669084846973}, + {1287413.98064757976680994, 6138643.04016063269227743}, + {1287088.60075854370370507, 6138637.45563034061342478}, + {1287009.04727913532406092, 6138643.29209441691637039}, + {1286958.56823578476905823, 6138655.16098329238593578}, + {1286890.50083814444951713, 6138655.13299060706049204}, + {1286770.43349436926655471, 6138667.09987043403089046}, + {1286233.20024502673186362, 6138660.12968576420098543}, + {1286139.74403464025817811, 6138613.11607844196259975}, + {1285975.57051010569557548, 6138567.18043652083724737}, + {1285753.22012137877754867, 6138551.35075232852250338}, + {1285733.82161285122856498, 6138599.27377647440880537}, + }, + }, + }, + ClipBox: geom.NewExtent( + [2]float64{1.2862775344896251e+06,6.138805837470278e+06}, + [2]float64{1.2865928372312575e+06,6.139121140211911e+06}, + ), + ExpectedMultiPolygon: &geom.MultiPolygon{ + { // Polygon + { // Ring + {1286277.53448962513357401, 6138929.6414563711732626}, + {1286338.14253718149848282, 6138994.84492336492985487}, + {1286355.31101033766753972, 6139005.97246335539966822}, + {1286378.02191449701786041, 6139012.45303734578192234}, + {1286407.85213660122826695, 6139015.33640445396304131}, + {1286447.46092385076917708, 6139014.0906777661293745}, + {1286475.49032241315580904, 6139010.32550495583564043}, + {1286502.81991908047348261, 6139098.50656714290380478}, + {1286519.91246206755749881, 6139121.14021191094070673}, + {1286592.8372312574647367, 6139121.14021191094070673}, + {1286592.8372312574647367, 6138805.83747027814388275}, + {1286277.53448962513357401, 6138805.83747027814388275}, + {1286277.53448962513357401, 6138929.6414563711732626}, + }, + }, + }, + }, } diff --git a/planar/makevalid/debug.go b/planar/makevalid/debug.go index 825ff1f1..571867e3 100644 --- a/planar/makevalid/debug.go +++ b/planar/makevalid/debug.go @@ -2,7 +2,7 @@ package makevalid import "github.com/go-spatial/geom/internal/debugger" -const debug = false +const debug = true const ( debuggerCategoryTriangle = debugger.CategoryJoiner("triangle:") diff --git a/planar/makevalid/development.md b/planar/makevalid/development.md index 1c958be1..d9c1842c 100644 --- a/planar/makevalid/development.md +++ b/planar/makevalid/development.md @@ -244,8 +244,10 @@ cd into your `geom` folder and startup a container: `docker run --rm -ti -v $(pw ``` apk add git build-base +apk add --repository http://dl-cdn.alpinelinux.org/alpine/edge/testing libspatialite-dev cd /go/src/geom/vendor/github.com git clone --branch master --depth 1 https://github.com/mattn/go-sqlite3.git mattn/go-sqlite3 +// git clone --branch master --depth 1 https://github.com/shaxbee/go-spatialite.git shaxbee/go-spatialite cd /go/src/geom/vendor/github.com/go-spatial/geom/planar/makevalid go test -v -run "TestMakeValid" ``` \ No newline at end of file diff --git a/planar/makevalid/testcases.md b/planar/makevalid/testcases.md index 91333402..7757d455 100644 --- a/planar/makevalid/testcases.md +++ b/planar/makevalid/testcases.md @@ -14,4 +14,5 @@ MakeValid tests: 6 | circle one right | `PASS` | ![6](_images/circle_one_right.png) 7 | irregular polygon middle | `FAIL:imgage good/Triangulation bad` | ![7](_images/irregular_polygon_middle.png) ![7](_images/irregular_polygon_middle_bad_triangulation.png) 8 | irregular polygon right | `PASS` | ![8](_images/irregular_polygon_right.png) +9 | irregular polygon detail 1 middle| `FAIL: vertex missing` | ![9](_images/irregular_polygon_detail1.png) From 157bcb5bbf03e3461b7ba526f67cb69b8a906d9c Mon Sep 17 00:00:00 2001 From: henrythasler Date: Wed, 20 Mar 2019 19:28:51 +0100 Subject: [PATCH 3/5] updated docker-info --- planar/makevalid/development.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/planar/makevalid/development.md b/planar/makevalid/development.md index d9c1842c..ff2fd236 100644 --- a/planar/makevalid/development.md +++ b/planar/makevalid/development.md @@ -247,7 +247,8 @@ apk add git build-base apk add --repository http://dl-cdn.alpinelinux.org/alpine/edge/testing libspatialite-dev cd /go/src/geom/vendor/github.com git clone --branch master --depth 1 https://github.com/mattn/go-sqlite3.git mattn/go-sqlite3 -// git clone --branch master --depth 1 https://github.com/shaxbee/go-spatialite.git shaxbee/go-spatialite +git clone --branch master --depth 1 https://github.com/pborman/uuid.git pborman/uuid +git clone --branch master --depth 1 https://github.com/google/uuid.git google/uuid cd /go/src/geom/vendor/github.com/go-spatial/geom/planar/makevalid go test -v -run "TestMakeValid" ``` \ No newline at end of file From 625f0f046c729d22c1b71531540ef4dabeeb1bf3 Mon Sep 17 00:00:00 2001 From: henrythasler Date: Wed, 20 Mar 2019 21:17:28 +0100 Subject: [PATCH 4/5] added QGIS styles --- planar/makevalid/_images/expected.qml | 316 ++++++++++++++++++++++++++ planar/makevalid/_images/feature.qml | 267 ++++++++++++++++++++++ planar/makevalid/_images/observed.qml | 315 +++++++++++++++++++++++++ 3 files changed, 898 insertions(+) create mode 100644 planar/makevalid/_images/expected.qml create mode 100644 planar/makevalid/_images/feature.qml create mode 100644 planar/makevalid/_images/observed.qml diff --git a/planar/makevalid/_images/expected.qml b/planar/makevalid/_images/expected.qml new file mode 100644 index 00000000..3d1733a1 --- /dev/null +++ b/planar/makevalid/_images/expected.qml @@ -0,0 +1,316 @@ + + + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + 0 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + 0 + generatedlayout + + + + + + + + + + + + + + + + + + + + id + + 2 + diff --git a/planar/makevalid/_images/feature.qml b/planar/makevalid/_images/feature.qml new file mode 100644 index 00000000..7d3a7d86 --- /dev/null +++ b/planar/makevalid/_images/feature.qml @@ -0,0 +1,267 @@ + + + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + 0 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + 0 + generatedlayout + + + + + + + + + + + + + + + + + + + + id + + 2 + diff --git a/planar/makevalid/_images/observed.qml b/planar/makevalid/_images/observed.qml new file mode 100644 index 00000000..347b60b4 --- /dev/null +++ b/planar/makevalid/_images/observed.qml @@ -0,0 +1,315 @@ + + + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + 0 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + 0 + generatedlayout + + + + + + + + + + + + + + + + + + + + id + + 2 + From 423af7982607a55a19b5511ca0f6fbbffbc4db78 Mon Sep 17 00:00:00 2001 From: henrythasler Date: Thu, 11 Apr 2019 19:43:58 +0200 Subject: [PATCH 5/5] turn off debugging --- planar/makevalid/debug.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/planar/makevalid/debug.go b/planar/makevalid/debug.go index 571867e3..825ff1f1 100644 --- a/planar/makevalid/debug.go +++ b/planar/makevalid/debug.go @@ -2,7 +2,7 @@ package makevalid import "github.com/go-spatial/geom/internal/debugger" -const debug = true +const debug = false const ( debuggerCategoryTriangle = debugger.CategoryJoiner("triangle:")