# HG changeset patch # User Sascha L. Teichmann # Date 1566576121 -7200 # Node ID 4ca884dfc470ee84c5b0a72530b77c7209c8db27 # Parent f1f1395f141b10bd024e341407dc556fc49f7b73 Prevent heights duplicates in iso line calculations. diff -r f1f1395f141b -r 4ca884dfc470 pkg/common/floats.go --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pkg/common/floats.go Fri Aug 23 18:02:01 2019 +0200 @@ -0,0 +1,31 @@ +// This is Free Software under GNU Affero General Public License v >= 3.0 +// without warranty, see README.md and license for details. +// +// SPDX-License-Identifier: AGPL-3.0-or-later +// License-Filename: LICENSES/AGPL-3.0.txt +// +// Copyright (C) 2019 by via donau +// – Österreichische Wasserstraßen-Gesellschaft mbH +// Software engineering by Intevation GmbH +// +// Author(s): +// * Sascha L. Teichmann + +package common + +import "sort" + +// DedupFloat64s sorts arr and removes duplicates in place. +// Returns a sub slice of arr only containing the unique elements. +func DedupFloat64s(arr []float64) []float64 { + sort.Float64s(arr) + for i := 1; i < len(arr); { + if arr[i-1] == arr[i] { + copy(arr[i:], arr[i+1:]) + arr = arr[:len(arr)-1] + } else { + i++ + } + } + return arr +} diff -r f1f1395f141b -r 4ca884dfc470 pkg/controllers/diff.go --- a/pkg/controllers/diff.go Fri Aug 23 16:33:02 2019 +0200 +++ b/pkg/controllers/diff.go Fri Aug 23 18:02:01 2019 +0200 @@ -289,6 +289,8 @@ return } + heights = common.DedupFloat64s(heights) + octree.DoContours(tree, heights, func(res *octree.ContourResult) { if err == nil && len(res.Lines) > 0 { _, err = stmt.ExecContext( diff -r f1f1395f141b -r 4ca884dfc470 pkg/imports/isr.go --- a/pkg/imports/isr.go Fri Aug 23 16:33:02 2019 +0200 +++ b/pkg/imports/isr.go Fri Aug 23 18:02:01 2019 +0200 @@ -18,6 +18,7 @@ "database/sql" "time" + "gemma.intevation.de/gemma/pkg/common" "gemma.intevation.de/gemma/pkg/octree" ) @@ -175,6 +176,7 @@ return err } hs := octree.ExtrapolateClassBreaks(heights, tree.Min.Z, tree.Max.Z) + hs = common.DedupFloat64s(hs) // Delete the old contour lines. if _, err := tx.ExecContext(ctx, deleteContourLinesSQL, sr); err != nil { diff -r f1f1395f141b -r 4ca884dfc470 pkg/imports/sr.go --- a/pkg/imports/sr.go Fri Aug 23 16:33:02 2019 +0200 +++ b/pkg/imports/sr.go Fri Aug 23 18:02:01 2019 +0200 @@ -869,6 +869,8 @@ log.Printf("%.2f - %.2f\n", tree.Min.Z, tree.Max.Z) */ + heights = common.DedupFloat64s(heights) + octree.DoContours(tree, heights, func(res *octree.ContourResult) { if err == nil && len(res.Lines) > 0 { _, err = stmt.ExecContext(