comparison pkg/imports/sr.go @ 3479:83b58f6356e7 zpg-ldc

Translate sounding results Z values import to LDC if ZPG was found as depth reference system.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Mon, 27 May 2019 15:17:38 +0200
parents 4acbee65275d
children fdb0439850d5
comparison
equal deleted inserted replaced
3478:afab8d87932c 3479:83b58f6356e7
158 4326 158 4326
159 ) 159 )
160 FROM waterway.sounding_results sr 160 FROM waterway.sounding_results sr
161 WHERE id = $1 161 WHERE id = $1
162 ` 162 `
163
164 selectGaugeLDCSQL = `
165 SELECT
166 grwl.value
167 FROM waterway.gauges_reference_water_levels grwl
168 JOIN waterway.bottlenecks bns
169 ON grwl.location = bns.gauge_location
170 AND grwl.validity = bns.gauge_validity
171 WHERE bns.objnam = $1 AND grwl.depth_reference like 'LDC%'
172 `
163 ) 173 )
164 174
165 // Do executes the actual sounding result import. 175 // Do executes the actual sounding result import.
166 func (sr *SoundingResult) Do( 176 func (sr *SoundingResult) Do(
167 ctx context.Context, 177 ctx context.Context,
190 } 200 }
191 201
192 feedback.Info("Bottleneck: %s", m.Bottleneck) 202 feedback.Info("Bottleneck: %s", m.Bottleneck)
193 feedback.Info("Survey date: %s", m.Date.Format(common.DateFormat)) 203 feedback.Info("Survey date: %s", m.Date.Format(common.DateFormat))
194 204
205 var heightDelta float64
206 if m.DepthReference == "ZPG" {
207 feedback.Info("Found ZPG as reference system -> translating Z values to LDC")
208 m.DepthReference = "LDC"
209 err := conn.QueryRowContext(ctx, selectGaugeLDCSQL, m.Bottleneck).Scan(&heightDelta)
210 switch {
211 case err == sql.ErrNoRows:
212 return nil, errors.New("Cannot load LDC value")
213 case err != nil:
214 return nil, err
215 }
216 }
217
195 if err := m.Validate(ctx, conn); err != nil { 218 if err := m.Validate(ctx, conn); err != nil {
196 return nil, common.ToError(err) 219 return nil, common.ToError(err)
197 } 220 }
198 221
199 var xyzf *zip.File 222 var xyzf *zip.File
205 } 228 }
206 if xyzf == nil { 229 if xyzf == nil {
207 return nil, errors.New("Cannot find any *.xyz or *.txt file") 230 return nil, errors.New("Cannot find any *.xyz or *.txt file")
208 } 231 }
209 232
210 xyz, err := loadXYZ(xyzf, feedback) 233 xyz, err := loadXYZ(xyzf, feedback, heightDelta)
211 if err != nil { 234 if err != nil {
212 return nil, err 235 return nil, err
213 } 236 }
214 237
215 if len(xyz) == 0 { 238 if len(xyz) == 0 {
422 } 445 }
423 446
424 return &m, nil 447 return &m, nil
425 } 448 }
426 449
427 func loadXYZReader(r io.Reader, feedback Feedback) (octree.MultiPointZ, error) { 450 func loadXYZReader(r io.Reader, feedback Feedback, heightDelta float64) (octree.MultiPointZ, error) {
428 mpz := make(octree.MultiPointZ, 0, 250000) 451 mpz := make(octree.MultiPointZ, 0, 250000)
429 s := bufio.NewScanner(r) 452 s := bufio.NewScanner(r)
430 453
431 var hasNegZ bool 454 var hasNegZ bool
432 455
477 if !hasNegZ { 500 if !hasNegZ {
478 hasNegZ = true 501 hasNegZ = true
479 warn("Negative Z value found: Using -Z") 502 warn("Negative Z value found: Using -Z")
480 } 503 }
481 } 504 }
505 p.Z += heightDelta
482 mpz = append(mpz, p) 506 mpz = append(mpz, p)
483 } 507 }
484 508
485 if err := s.Err(); err != nil { 509 if err := s.Err(); err != nil {
486 return nil, err 510 return nil, err
487 } 511 }
488 512
489 return mpz, nil 513 return mpz, nil
490 } 514 }
491 515
492 func loadXYZ(f *zip.File, feedback Feedback) (octree.MultiPointZ, error) { 516 func loadXYZ(f *zip.File, feedback Feedback, heightDelta float64) (octree.MultiPointZ, error) {
493 r, err := f.Open() 517 r, err := f.Open()
494 if err != nil { 518 if err != nil {
495 return nil, err 519 return nil, err
496 } 520 }
497 defer r.Close() 521 defer r.Close()
498 return loadXYZReader(r, feedback) 522 return loadXYZReader(r, feedback, heightDelta)
499 } 523 }
500 524
501 func loadBoundary(z *zip.ReadCloser) (polygonSlice, error) { 525 func loadBoundary(z *zip.ReadCloser) (polygonSlice, error) {
502 shpF := common.FindInZIP(z, ".shp") 526 shpF := common.FindInZIP(z, ".shp")
503 if shpF == nil { 527 if shpF == nil {