Mercurial > gemma
diff pkg/imports/sr.go @ 4654:3eda5a7215ab stree-experiment
Generate STRTrees instaead of Octree during sounding result imports.
author | Sascha L. Teichmann <sascha.teichmann@intevation.de> |
---|---|
date | Mon, 14 Oct 2019 13:12:38 +0200 |
parents | 89a72e0e2f9b |
children | 6eab3ac0e849 |
line wrap: on
line diff
--- a/pkg/imports/sr.go Mon Oct 14 12:26:00 2019 +0200 +++ b/pkg/imports/sr.go Mon Oct 14 13:12:38 2019 +0200 @@ -24,7 +24,6 @@ "errors" "fmt" "io" - "log" "math" "os" "path" @@ -156,7 +155,7 @@ insertOctreeSQL = ` UPDATE waterway.sounding_results SET - octree_checksum = $2, octree_index = $3 + mesh_checksum = $2, mesh_index = $3 WHERE id = $1` repairBoundarySQL = ` @@ -498,12 +497,9 @@ start = time.Now() - var tree *octree.Tree - { - builder := octree.NewBuilder(tri.Tin()) - builder.Build(removed) - tree = builder.Tree() - } + tin := tri.Tin() + var virtual octree.STRTree + virtual.BuildWithout(tin, removed) feedback.Info("Building took %v", time.Since(start)) @@ -518,9 +514,13 @@ generated := make(octree.LineStringZ, 0, numPoints+clippingPolygon.NumVertices(0)) - tree.GenerateRandomVertices(numPoints, func(vertices []octree.Vertex) { - generated = append(generated, vertices...) - }) + octree.GenerateRandomVertices( + numPoints, + tin.Min, tin.Max, + virtual.Value, + func(vertices []octree.Vertex) { + generated = append(generated, vertices...) + }) feedback.Info("Generating %d points took %v.", len(generated), time.Since(start)) @@ -532,7 +532,7 @@ return } dupes[key] = struct{}{} - if z, ok := tree.Value(x, y); ok { + if z, ok := virtual.Value(x, y); ok { generated = append(generated, octree.Vertex{X: x, Y: y, Z: z}) } }) @@ -548,7 +548,6 @@ feedback.Info("Second triangulation took %v.", time.Since(start)) feedback.Info("Number triangles: %d.", len(tri.Triangles)/3) feedback.Info("Clipping triangles from new mesh.") - } start = time.Now() @@ -567,23 +566,9 @@ feedback.Info("Number of triangles to clip %d.", len(removed)) start = time.Now() - s := octree.STRTree{Entries: 16} - s.BuildWithout(tin, removed) - if _, err2 := s.Bytes(); err2 != nil { - log.Printf("serializing STRTree failed: %v\n", err2) - } - log.Printf("Building strtree took: %v.\n", time.Since(start)) - - // return nil, UnchangedError("nothing to do") + final := octree.STRTree{Entries: 16} + final.BuildWithout(tin, removed) - feedback.Info("Build final octree index") - - builder := octree.NewBuilder(tin) - builder.Build(removed) - octreeIndex, err := builder.Bytes() - if err != nil { - return nil, err - } feedback.Info("Building octree took %v.", time.Since(start)) feedback.Info("Store octree.") @@ -623,15 +608,20 @@ return nil, err } + index, err := final.Bytes() + if err != nil { + return nil, err + } + h := sha1.New() - h.Write(octreeIndex) + h.Write(index) checksum := hex.EncodeToString(h.Sum(nil)) - _, err = tx.ExecContext(ctx, insertOctreeSQL, id, checksum, octreeIndex) + _, err = tx.ExecContext(ctx, insertOctreeSQL, id, checksum, index) if err != nil { return nil, err } feedback.Info("Storing octree index took %s.", time.Since(start)) - err = generateIsos(ctx, tx, feedback, builder.Tree(), id) + err = generateIsos(ctx, tx, feedback, &final, id) if err != nil { return nil, err } @@ -838,7 +828,7 @@ ctx context.Context, tx *sql.Tx, feedback Feedback, - tree *octree.Tree, + tree *octree.STRTree, id int64, ) error { @@ -847,16 +837,18 @@ "morphology_classbreaks", ) + minZ, maxZ := tree.Min().Z, tree.Max().Z + if err != nil { feedback.Warn("Loading class breaks failed: %v", err) feedback.Info("Using default class breaks") heights = nil - h := contourStepWidth * math.Ceil(tree.Min.Z/contourStepWidth) - for ; h <= tree.Max.Z; h += contourStepWidth { + h := contourStepWidth * math.Ceil(minZ/contourStepWidth) + for ; h <= maxZ; h += contourStepWidth { heights = append(heights, h) } } else { - heights = octree.ExtrapolateClassBreaks(heights, tree.Min.Z, tree.Max.Z) + heights = octree.ExtrapolateClassBreaks(heights, minZ, maxZ) // We set steps for InBetweenClassBreaks to 1, so it // becomes a null operation. The extra class breaks // were considered unexpected and confusing by the @@ -881,7 +873,7 @@ ctx context.Context, tx *sql.Tx, feedback Feedback, - tree *octree.Tree, + tree *octree.STRTree, heights []float64, id int64, ) error { @@ -892,11 +884,11 @@ time.Since(total)) }() - areas := octree.TraceAreas(heights, isoCellSize, tree.Min, tree.Max, tree.Value) + areas := octree.TraceAreas(heights, isoCellSize, tree.Min(), tree.Max(), tree.Value) return storeAreas( ctx, tx, feedback, - areas, tree.EPSG, heights, id) + areas, tree.EPSG(), heights, id) } func storeAreas(