diff pkg/imports/sr.go @ 3650:01ce3ba9b0d0 single-beam

Fixed generating of random points.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Thu, 13 Jun 2019 13:14:40 +0200
parents 810b28f59b8b
children c368a9a20478
line wrap: on
line diff
--- a/pkg/imports/sr.go	Wed Jun 12 17:30:20 2019 +0200
+++ b/pkg/imports/sr.go	Thu Jun 13 13:14:40 2019 +0200
@@ -72,7 +72,7 @@
 
 const (
 	tooLongEdge          = 50.0
-	pointsPerSquareMeter = 5
+	pointsPerSquareMeter = 2
 )
 
 // SRJobKind is the unique name of a SoundingResult import job.
@@ -128,7 +128,7 @@
     CASE WHEN $5::bytea IS NULL THEN
       ST_Transform(ST_ConcaveHull(ST_Force2D(ST_GeomFromWKB($4, $6::integer)), 0.7), 4326)::geography
     ELSE
-      ST_Transform(ST_GeomFromWKB($5, $6::integer), 4326)::geography
+      ST_Transform(ST_MakeValid(ST_GeomFromWKB($5, $6::integer)), 4326)::geography
     END)
 RETURNING
   id,
@@ -469,6 +469,109 @@
 
 		xyz = octree.MultiPointZ(generated)
 
+		start = time.Now()
+		tri, err := octree.Triangulate(xyz)
+		if err != nil {
+			return nil, err
+		}
+		log.Printf("Second triangulation took %v.", time.Since(start))
+		log.Printf("Number triangles: %d.", len(tri.Triangles)/3)
+
+		secondTin := tri.Tin()
+
+		//polygon.Buffer(1.0)
+
+		clippingPolygon.FromLineStringZ(polygon)
+		clippingPolygon.Indexify()
+
+		var str octree.STRTree
+		str.Build(secondTin)
+		log.Printf("Building STR tree took %v", time.Since(start))
+
+		start = time.Now()
+
+		removed = str.Clip(&clippingPolygon)
+		log.Printf("Clipping STR tree took %v.", time.Since(start))
+		log.Printf("Number of triangles to clip %d.", len(removed))
+
+		start = time.Now()
+
+		secondTin.EPSG = uint32(epsg)
+
+		builder = octree.NewBuilder(secondTin)
+		builder.Build(removed)
+		octreeIndex, err := builder.Bytes()
+		if err != nil {
+			return nil, err
+		}
+		feedback.Info("Building octree took %v.", time.Since(start))
+
+		var (
+			id       int64
+			epsg     uint32
+			lat, lon float64
+		)
+
+		var hull []byte
+
+		if err := tx.QueryRowContext(
+			ctx,
+			insertHullSQL,
+			m.Bottleneck,
+			m.Date.Time,
+			m.DepthReference,
+			nil,
+			clippingPolygon.AsWKB(),
+			m.EPSG,
+		).Scan(
+			&id,
+			&lat,
+			&lon,
+			&epsg,
+			&hull,
+		); err != nil {
+			return nil, err
+		}
+
+		start = time.Now()
+		h := sha1.New()
+		h.Write(octreeIndex)
+		checksum := hex.EncodeToString(h.Sum(nil))
+		_, err = tx.ExecContext(ctx, insertOctreeSQL, id, checksum, octreeIndex)
+		if err != nil {
+			return nil, err
+		}
+		feedback.Info("Storing octree index took %s.", time.Since(start))
+
+		tree := builder.Tree()
+
+		start = time.Now()
+		err = generateContours(ctx, tx, tree, id)
+		if err != nil {
+			return nil, err
+		}
+		feedback.Info("Generating and storing contour lines took %s.",
+			time.Since(start))
+
+		// Store for potential later removal.
+		if err = track(ctx, tx, importID, "waterway.sounding_results", id); err != nil {
+			return nil, err
+		}
+
+		summary := struct {
+			Bottleneck string      `json:"bottleneck"`
+			Date       models.Date `json:"date"`
+			Lat        float64     `json:"lat"`
+			Lon        float64     `json:"lon"`
+		}{
+			Bottleneck: m.Bottleneck,
+			Date:       m.Date,
+			Lat:        lat,
+			Lon:        lon,
+		}
+
+		return &summary, nil
+
 	} else {
 		var hull []byte
 		if err = tx.QueryRowContext(