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