Mercurial > gemma
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(