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