comparison pkg/imports/sr.go @ 3945:3bdbaf1b282a

SR import: Negate the Z values in the XYZ files if the flag `negate-z` is set.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Sun, 14 Jul 2019 17:19:22 +0200
parents 4b5c4007fc5d
children d668742c8978
comparison
equal deleted inserted replaced
3944:0ed8af02d5a9 3945:3bdbaf1b282a
58 // DepthReference if given overides the DepthReference value 58 // DepthReference if given overides the DepthReference value
59 // from the meta.json. 59 // from the meta.json.
60 DepthReference *string `json:"depth-reference,omitempty"` 60 DepthReference *string `json:"depth-reference,omitempty"`
61 // SingleBeam indicates that the sounding is a single beam scan. 61 // SingleBeam indicates that the sounding is a single beam scan.
62 SingleBeam *bool `json:"single-beam,omitempty"` 62 SingleBeam *bool `json:"single-beam,omitempty"`
63 // NegateZ indicated that the Z values of thy XYZ input should be
64 // multiplied by -1.
65 NegateZ bool `json:"negate-z,omitempty"`
63 } 66 }
64 67
65 const ( 68 const (
66 contourStepWidth = 0.1 69 contourStepWidth = 0.1
67 contourTolerance = 0.1 70 contourTolerance = 0.1
247 feedback.Info("Bottleneck: %s", m.Bottleneck) 250 feedback.Info("Bottleneck: %s", m.Bottleneck)
248 feedback.Info("Survey date: %s", m.Date.Format(common.DateFormat)) 251 feedback.Info("Survey date: %s", m.Date.Format(common.DateFormat))
249 252
250 var xform vertexTransform 253 var xform vertexTransform
251 254
255 if m.NegateZ {
256 xform = negateZTransform
257 } else {
258 xform = identityTransform
259 }
260
252 if m.DepthReference == "ZPG" { 261 if m.DepthReference == "ZPG" {
253 feedback.Info("Found ZPG as reference system -> translating Z values to LDC") 262 feedback.Info("Found ZPG as reference system -> translating Z values to LDC")
254 var ldc float64 263 var ldc float64
255 var depthReference string 264 var depthReference string
256 err := conn.QueryRowContext(ctx, 265 err := conn.QueryRowContext(ctx,
268 return nil, err 277 return nil, err
269 } 278 }
270 279
271 // LDC is cm. The data is in m. 280 // LDC is cm. The data is in m.
272 ldc /= 100 281 ldc /= 100
273 xform = func(v octree.Vertex) octree.Vertex { 282 xform = chainTransforms(
274 return octree.Vertex{X: v.X, Y: v.Y, Z: v.Z + ldc} 283 xform,
275 } 284 func(v octree.Vertex) octree.Vertex {
285 return octree.Vertex{X: v.X, Y: v.Y, Z: v.Z + ldc}
286 })
276 m.DepthReference = depthReference 287 m.DepthReference = depthReference
277 } 288 }
278 289
279 if err := m.Validate(ctx, conn); err != nil { 290 if err := m.Validate(ctx, conn); err != nil {
280 return nil, common.ToError(err) 291 return nil, common.ToError(err)
703 return &m, nil 714 return &m, nil
704 } 715 }
705 716
706 type vertexTransform func(octree.Vertex) octree.Vertex 717 type vertexTransform func(octree.Vertex) octree.Vertex
707 718
719 func identityTransform(v octree.Vertex) octree.Vertex { return v }
720
721 func negateZTransform(v octree.Vertex) octree.Vertex {
722 return octree.Vertex{X: v.X, Y: v.Y, Z: -v.Z}
723 }
724
725 func chainTransforms(a, b vertexTransform) vertexTransform {
726 return func(v octree.Vertex) octree.Vertex { return b(a(v)) }
727 }
728
708 func loadXYZReader(r io.Reader, feedback Feedback, xform vertexTransform) (octree.MultiPointZ, error) { 729 func loadXYZReader(r io.Reader, feedback Feedback, xform vertexTransform) (octree.MultiPointZ, error) {
709 mpz := make(octree.MultiPointZ, 0, 250000) 730 mpz := make(octree.MultiPointZ, 0, 250000)
710 s := bufio.NewScanner(r) 731 s := bufio.NewScanner(r)
711
712 var hasNegZ bool
713 732
714 warnLimiter := misc.WarningLimiter{Log: feedback.Warn, MaxWarnings: 100} 733 warnLimiter := misc.WarningLimiter{Log: feedback.Warn, MaxWarnings: 100}
715 warn := warnLimiter.Warn 734 warn := warnLimiter.Warn
716 defer warnLimiter.Close() 735 defer warnLimiter.Close()
717 736
741 text = text[idx+1:] 760 text = text[idx+1:]
742 if p.Z, err = strconv.ParseFloat(text, 64); err != nil { 761 if p.Z, err = strconv.ParseFloat(text, 64); err != nil {
743 warn("format error in line %d: %v", line, err) 762 warn("format error in line %d: %v", line, err)
744 continue 763 continue
745 } 764 }
746 if p.Z < 0 { 765 p = xform(p)
747 p.Z = -p.Z
748 if !hasNegZ {
749 hasNegZ = true
750 warn("Negative Z value found: Using -Z")
751 }
752 }
753 if xform != nil {
754 p = xform(p)
755 }
756 mpz = append(mpz, p) 766 mpz = append(mpz, p)
757 } 767 }
758 768
759 if err := s.Err(); err != nil { 769 if err := s.Err(); err != nil {
760 return nil, err 770 return nil, err