Mercurial > gemma
comparison pkg/imports/sr.go @ 3487:fdb0439850d5 zpg-ldc
Generalized transformation of vertices during sounding result import a bit.
Calculate p.Z = LDC - p.Z if ZPG reference system is given.
author | Sascha L. Teichmann <sascha.teichmann@intevation.de> |
---|---|
date | Mon, 27 May 2019 16:37:19 +0200 |
parents | 83b58f6356e7 |
children | 6e748f31777a |
comparison
equal
deleted
inserted
replaced
3479:83b58f6356e7 | 3487:fdb0439850d5 |
---|---|
200 } | 200 } |
201 | 201 |
202 feedback.Info("Bottleneck: %s", m.Bottleneck) | 202 feedback.Info("Bottleneck: %s", m.Bottleneck) |
203 feedback.Info("Survey date: %s", m.Date.Format(common.DateFormat)) | 203 feedback.Info("Survey date: %s", m.Date.Format(common.DateFormat)) |
204 | 204 |
205 var heightDelta float64 | 205 var xform vertexTransform |
206 | |
206 if m.DepthReference == "ZPG" { | 207 if m.DepthReference == "ZPG" { |
207 feedback.Info("Found ZPG as reference system -> translating Z values to LDC") | 208 feedback.Info("Found ZPG as reference system -> translating Z values to LDC") |
208 m.DepthReference = "LDC" | 209 var ldc float64 |
209 err := conn.QueryRowContext(ctx, selectGaugeLDCSQL, m.Bottleneck).Scan(&heightDelta) | 210 err := conn.QueryRowContext(ctx, selectGaugeLDCSQL, m.Bottleneck).Scan(&ldc) |
210 switch { | 211 switch { |
211 case err == sql.ErrNoRows: | 212 case err == sql.ErrNoRows: |
212 return nil, errors.New("Cannot load LDC value") | 213 return nil, errors.New("Cannot load LDC value") |
213 case err != nil: | 214 case err != nil: |
214 return nil, err | 215 return nil, err |
215 } | 216 } |
217 xform = func(v octree.Vertex) octree.Vertex { | |
218 return octree.Vertex{X: v.X, Y: v.Y, Z: ldc - v.Z} | |
219 } | |
220 m.DepthReference = "LDC" | |
216 } | 221 } |
217 | 222 |
218 if err := m.Validate(ctx, conn); err != nil { | 223 if err := m.Validate(ctx, conn); err != nil { |
219 return nil, common.ToError(err) | 224 return nil, common.ToError(err) |
220 } | 225 } |
228 } | 233 } |
229 if xyzf == nil { | 234 if xyzf == nil { |
230 return nil, errors.New("Cannot find any *.xyz or *.txt file") | 235 return nil, errors.New("Cannot find any *.xyz or *.txt file") |
231 } | 236 } |
232 | 237 |
233 xyz, err := loadXYZ(xyzf, feedback, heightDelta) | 238 xyz, err := loadXYZ(xyzf, feedback, xform) |
234 if err != nil { | 239 if err != nil { |
235 return nil, err | 240 return nil, err |
236 } | 241 } |
237 | 242 |
238 if len(xyz) == 0 { | 243 if len(xyz) == 0 { |
445 } | 450 } |
446 | 451 |
447 return &m, nil | 452 return &m, nil |
448 } | 453 } |
449 | 454 |
450 func loadXYZReader(r io.Reader, feedback Feedback, heightDelta float64) (octree.MultiPointZ, error) { | 455 type vertexTransform func(octree.Vertex) octree.Vertex |
456 | |
457 func loadXYZReader(r io.Reader, feedback Feedback, xform vertexTransform) (octree.MultiPointZ, error) { | |
451 mpz := make(octree.MultiPointZ, 0, 250000) | 458 mpz := make(octree.MultiPointZ, 0, 250000) |
452 s := bufio.NewScanner(r) | 459 s := bufio.NewScanner(r) |
453 | 460 |
454 var hasNegZ bool | 461 var hasNegZ bool |
455 | 462 |
500 if !hasNegZ { | 507 if !hasNegZ { |
501 hasNegZ = true | 508 hasNegZ = true |
502 warn("Negative Z value found: Using -Z") | 509 warn("Negative Z value found: Using -Z") |
503 } | 510 } |
504 } | 511 } |
505 p.Z += heightDelta | 512 if xform != nil { |
513 p = xform(p) | |
514 } | |
506 mpz = append(mpz, p) | 515 mpz = append(mpz, p) |
507 } | 516 } |
508 | 517 |
509 if err := s.Err(); err != nil { | 518 if err := s.Err(); err != nil { |
510 return nil, err | 519 return nil, err |
511 } | 520 } |
512 | 521 |
513 return mpz, nil | 522 return mpz, nil |
514 } | 523 } |
515 | 524 |
516 func loadXYZ(f *zip.File, feedback Feedback, heightDelta float64) (octree.MultiPointZ, error) { | 525 func loadXYZ(f *zip.File, feedback Feedback, xform vertexTransform) (octree.MultiPointZ, error) { |
517 r, err := f.Open() | 526 r, err := f.Open() |
518 if err != nil { | 527 if err != nil { |
519 return nil, err | 528 return nil, err |
520 } | 529 } |
521 defer r.Close() | 530 defer r.Close() |
522 return loadXYZReader(r, feedback, heightDelta) | 531 return loadXYZReader(r, feedback, xform) |
523 } | 532 } |
524 | 533 |
525 func loadBoundary(z *zip.ReadCloser) (polygonSlice, error) { | 534 func loadBoundary(z *zip.ReadCloser) (polygonSlice, error) { |
526 shpF := common.FindInZIP(z, ".shp") | 535 shpF := common.FindInZIP(z, ".shp") |
527 if shpF == nil { | 536 if shpF == nil { |