Mercurial > gemma
diff pkg/imports/sr.go @ 5428:b8d5f1cd15fb marking-single-beam
Simplified classification. Needs testing.
author | Sascha L. Teichmann <sascha.teichmann@intevation.de> |
---|---|
date | Sun, 11 Jul 2021 13:08:49 +0200 |
parents | c9da747d4109 |
children | 02a5da2f03b4 |
line wrap: on
line diff
--- a/pkg/imports/sr.go Sat Jul 10 01:09:57 2021 +0200 +++ b/pkg/imports/sr.go Sun Jul 11 13:08:49 2021 +0200 @@ -24,7 +24,6 @@ "errors" "fmt" "io" - "log" "math" "os" "path" @@ -645,12 +644,10 @@ } else { start = time.Now() clippingPolygonBuffered.Indexify() - removed = make(map[int32]struct{}) - for i, v := range xyz { - if clippingPolygonBuffered.IntersectionBox2D(v.Box2D()) == mesh.IntersectionOutSide { - removed[int32(i)] = struct{}{} - } - } + xyz = xyz.Filter(func(v mesh.Vertex) bool { + return clippingPolygonBuffered.IntersectionBox2D(v.Box2D()) == + mesh.IntersectionOutSide + }) feedback.Info("Clipping took %v.", time.Since(start)) feedback.Info("Number of points to clip %d.", len(removed)) } @@ -707,17 +704,19 @@ return nil, err } feedback.Info("Storing mesh index took %s.", time.Since(start)) - if err := generateIsos(ctx, tx, feedback, &final, id); err != nil { - return nil, err - } - } else { // SurveyTypeMarking - if err := generateMarkingPoints( + err = generateIsoAreas( ctx, tx, feedback, - xyz, removed, epsg, - id, - ); err != nil { - return nil, err - } + &final, + loadClassBreaks(ctx, tx, feedback, final.Min().Z, final.Max().Z), + id) + } else { // SurveyTypeMarking + err = generateMarkingPoints( + ctx, tx, feedback, + xyz, epsg, + id) + } + if err != nil { + return nil, err } // Store for potential later removal. @@ -937,6 +936,50 @@ return heights } +func generateMarkingPoints( + ctx context.Context, + tx *sql.Tx, + feedback Feedback, + xyz mesh.MultiPointZ, + epsg uint32, + id int64, +) error { + heights, err := mesh.LoadClassBreaks( + ctx, tx, + "morphology_classbreaks") + + if err != nil { + feedback.Warn("Loading class breaks failed: %v", err) + feedback.Info("Using default class breaks") + min, max := xyz.MinMax() + heights = defaultClassBreaks(min.Z, max.Z) + } + + heights = heights.Dedup() + + classes := heights.Classify(xyz) + + stmt, err := tx.PrepareContext(ctx, insertMarkingPointsSQL) + if err != nil { + return err + } + defer stmt.Close() + + for i, class := range classes { + // Ignore empty classes + if len(class) == 0 { + continue + } + if _, err := stmt.ExecContext( + ctx, id, heights[i], epsg, class.AsWKB(), + ); err != nil { + return err + } + } + + return nil +} + func loadClassBreaks( ctx context.Context, tx *sql.Tx, @@ -959,68 +1002,6 @@ return heights.Dedup() } -func generateMarkingPoints( - ctx context.Context, - tx *sql.Tx, - feedback Feedback, - xyz mesh.MultiPointZ, - removed map[int32]struct{}, - epsg uint32, - id int64, -) error { - log.Printf("debug: generateMarkingPoints") - - min, max := mesh.MinMaxVertex(xyz.FilterRemoved(removed)) - - log.Printf("debug: min/max %.2f/%.2f\n", min.Z, max.Z) - - heights := loadClassBreaks(ctx, tx, feedback, min.Z, max.Z) - - classes := heights.Classify(xyz.FilterRemoved(removed)) - - // Should not happen ... Z values over the top. - if n := len(classes) - 1; n > 1 && len(classes[n]) > 0 { - // Place the over the top values to the class below. - classes[n-1] = append(classes[n-1], classes[n]...) - classes[n] = nil - classes = classes[:n] - } - - stmt, err := tx.PrepareContext(ctx, insertMarkingPointsSQL) - if err != nil { - return err - } - defer stmt.Close() - - for i, class := range classes { - // Ignore empty classes - if len(class) == 0 { - continue - } - log.Printf("debug: class %d: %d\n", i, len(class)) - if _, err := stmt.ExecContext( - ctx, id, heights[i], epsg, class.AsWKB(), - ); err != nil { - return err - } - } - - return nil -} - -func generateIsos( - ctx context.Context, - tx *sql.Tx, - feedback Feedback, - tree *mesh.STRTree, - id int64, -) error { - - heights := loadClassBreaks(ctx, tx, feedback, tree.Min().Z, tree.Max().Z) - - return generateIsoAreas(ctx, tx, feedback, tree, heights, id) -} - func generateIsoAreas( ctx context.Context, tx *sql.Tx,