comparison 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
comparison
equal deleted inserted replaced
3646:810b28f59b8b 3650:01ce3ba9b0d0
70 contourTolerance = 0.1 70 contourTolerance = 0.1
71 ) 71 )
72 72
73 const ( 73 const (
74 tooLongEdge = 50.0 74 tooLongEdge = 50.0
75 pointsPerSquareMeter = 5 75 pointsPerSquareMeter = 2
76 ) 76 )
77 77
78 // SRJobKind is the unique name of a SoundingResult import job. 78 // SRJobKind is the unique name of a SoundingResult import job.
79 const SRJobKind JobKind = "sr" 79 const SRJobKind JobKind = "sr"
80 80
126 $3, 126 $3,
127 (SELECT 127 (SELECT
128 CASE WHEN $5::bytea IS NULL THEN 128 CASE WHEN $5::bytea IS NULL THEN
129 ST_Transform(ST_ConcaveHull(ST_Force2D(ST_GeomFromWKB($4, $6::integer)), 0.7), 4326)::geography 129 ST_Transform(ST_ConcaveHull(ST_Force2D(ST_GeomFromWKB($4, $6::integer)), 0.7), 4326)::geography
130 ELSE 130 ELSE
131 ST_Transform(ST_GeomFromWKB($5, $6::integer), 4326)::geography 131 ST_Transform(ST_MakeValid(ST_GeomFromWKB($5, $6::integer)), 4326)::geography
132 END) 132 END)
133 RETURNING 133 RETURNING
134 id, 134 id,
135 ST_X(ST_Centroid(area::geometry)), 135 ST_X(ST_Centroid(area::geometry)),
136 ST_Y(ST_Centroid(area::geometry)), 136 ST_Y(ST_Centroid(area::geometry)),
467 // Add the boundary to new point cloud. 467 // Add the boundary to new point cloud.
468 generated = append(generated, polygon[:len(polygon)-1]...) 468 generated = append(generated, polygon[:len(polygon)-1]...)
469 469
470 xyz = octree.MultiPointZ(generated) 470 xyz = octree.MultiPointZ(generated)
471 471
472 start = time.Now()
473 tri, err := octree.Triangulate(xyz)
474 if err != nil {
475 return nil, err
476 }
477 log.Printf("Second triangulation took %v.", time.Since(start))
478 log.Printf("Number triangles: %d.", len(tri.Triangles)/3)
479
480 secondTin := tri.Tin()
481
482 //polygon.Buffer(1.0)
483
484 clippingPolygon.FromLineStringZ(polygon)
485 clippingPolygon.Indexify()
486
487 var str octree.STRTree
488 str.Build(secondTin)
489 log.Printf("Building STR tree took %v", time.Since(start))
490
491 start = time.Now()
492
493 removed = str.Clip(&clippingPolygon)
494 log.Printf("Clipping STR tree took %v.", time.Since(start))
495 log.Printf("Number of triangles to clip %d.", len(removed))
496
497 start = time.Now()
498
499 secondTin.EPSG = uint32(epsg)
500
501 builder = octree.NewBuilder(secondTin)
502 builder.Build(removed)
503 octreeIndex, err := builder.Bytes()
504 if err != nil {
505 return nil, err
506 }
507 feedback.Info("Building octree took %v.", time.Since(start))
508
509 var (
510 id int64
511 epsg uint32
512 lat, lon float64
513 )
514
515 var hull []byte
516
517 if err := tx.QueryRowContext(
518 ctx,
519 insertHullSQL,
520 m.Bottleneck,
521 m.Date.Time,
522 m.DepthReference,
523 nil,
524 clippingPolygon.AsWKB(),
525 m.EPSG,
526 ).Scan(
527 &id,
528 &lat,
529 &lon,
530 &epsg,
531 &hull,
532 ); err != nil {
533 return nil, err
534 }
535
536 start = time.Now()
537 h := sha1.New()
538 h.Write(octreeIndex)
539 checksum := hex.EncodeToString(h.Sum(nil))
540 _, err = tx.ExecContext(ctx, insertOctreeSQL, id, checksum, octreeIndex)
541 if err != nil {
542 return nil, err
543 }
544 feedback.Info("Storing octree index took %s.", time.Since(start))
545
546 tree := builder.Tree()
547
548 start = time.Now()
549 err = generateContours(ctx, tx, tree, id)
550 if err != nil {
551 return nil, err
552 }
553 feedback.Info("Generating and storing contour lines took %s.",
554 time.Since(start))
555
556 // Store for potential later removal.
557 if err = track(ctx, tx, importID, "waterway.sounding_results", id); err != nil {
558 return nil, err
559 }
560
561 summary := struct {
562 Bottleneck string `json:"bottleneck"`
563 Date models.Date `json:"date"`
564 Lat float64 `json:"lat"`
565 Lon float64 `json:"lon"`
566 }{
567 Bottleneck: m.Bottleneck,
568 Date: m.Date,
569 Lat: lat,
570 Lon: lon,
571 }
572
573 return &summary, nil
574
472 } else { 575 } else {
473 var hull []byte 576 var hull []byte
474 if err = tx.QueryRowContext( 577 if err = tx.QueryRowContext(
475 ctx, 578 ctx,
476 reprojectPointsSQL, 579 reprojectPointsSQL,