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