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 {