comparison pkg/imports/sr.go @ 5305:1a565f8a935a zpg-exception

Adjusted Go code to establish ZPG exception during SR import.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Wed, 19 May 2021 17:26:02 +0200
parents 56c589f7435d
children 0e8fd0e5bf36
comparison
equal deleted inserted replaced
5304:6cf4fdaa93f9 5305:1a565f8a935a
132 INSERT INTO waterway.sounding_results ( 132 INSERT INTO waterway.sounding_results (
133 bottleneck_id, 133 bottleneck_id,
134 date_info, 134 date_info,
135 depth_reference, 135 depth_reference,
136 area, 136 area,
137 surtyp 137 surtyp,
138 zpg_exception
138 ) SELECT 139 ) SELECT
139 bottleneck_id, 140 bottleneck_id,
140 $2::date, 141 $2::date,
141 $3, 142 $3,
142 (SELECT 143 (SELECT
143 CASE WHEN $5::bytea IS NULL THEN 144 CASE WHEN $5::bytea IS NULL THEN
144 ST_Transform(ST_ConcaveHull(ST_Force2D(ST_GeomFromWKB($4, $6::integer)), 0.7), 4326)::geography 145 ST_Transform(ST_ConcaveHull(ST_Force2D(ST_GeomFromWKB($4, $6::integer)), 0.7), 4326)::geography
145 ELSE 146 ELSE
146 ST_MakeValid(ST_Transform(ST_GeomFromWKB($5, $6::integer), 4326))::geography 147 ST_MakeValid(ST_Transform(ST_GeomFromWKB($5, $6::integer), 4326))::geography
147 END), 148 END),
148 $7 149 $7,
150 $8
149 FROM waterway.bottlenecks 151 FROM waterway.bottlenecks
150 WHERE objnam = $1 AND validity @> CAST($2 AS timestamptz) 152 WHERE objnam = $1 AND validity @> CAST($2 AS timestamptz)
151 RETURNING 153 RETURNING
152 id, 154 id,
153 ST_X(ST_Centroid(area::geometry)), 155 ST_X(ST_Centroid(area::geometry)),
205 WHERE bns.objnam = $1 207 WHERE bns.objnam = $1
206 AND bns.validity @> CAST($2 AS timestamptz) 208 AND bns.validity @> CAST($2 AS timestamptz)
207 AND grwl.depth_reference like 'LDC%' 209 AND grwl.depth_reference like 'LDC%'
208 ` 210 `
209 211
212 selectZPGExceptionAllowedSQL = `
213 SELECT country IN ('BG', 'RO') FROM users.list_users WHERE username = current_user`
214
210 reprojectPointsSingleBeamSQL = ` 215 reprojectPointsSingleBeamSQL = `
211 SELECT 216 SELECT
212 ST_AsBinary( 217 ST_AsBinary(
213 ST_Transform( 218 ST_Transform(
214 ST_GeomFromWKB($1, $2::integer), 219 ST_GeomFromWKB($1, $2::integer),
291 if sr.negateZ() { 296 if sr.negateZ() {
292 xform = negateZTransform 297 xform = negateZTransform
293 } else { 298 } else {
294 xform = identityTransform 299 xform = identityTransform
295 } 300 }
301
302 var zpgException bool
296 303
297 if m.DepthReference == "ZPG" { 304 if m.DepthReference == "ZPG" {
298 feedback.Info("Found ZPG as reference system -> translating Z values to LDC") 305 feedback.Info("Found ZPG as reference system -> translating Z values to LDC")
299 var ldc float64 306 var ldc float64
300 var depthReference string 307 var depthReference string
306 &ldc, 313 &ldc,
307 &depthReference, 314 &depthReference,
308 ) 315 )
309 switch { 316 switch {
310 case err == sql.ErrNoRows: 317 case err == sql.ErrNoRows:
311 return nil, errors.New("cannot load LDC value") 318 if err := conn.QueryRowContext(
319 ctx, selectZPGExceptionAllowedSQL).Scan(&zpgException); err != nil {
320 return nil, err
321 }
322 if !zpgException {
323 return nil, errors.New("cannot load LDC value")
324 }
325 feedback.Warn("Not LCD found, but ZPG exception granted")
326
312 case err != nil: 327 case err != nil:
313 return nil, err 328 return nil, err
314 } 329 }
315 330
316 // LDC is cm. The data is in m. 331 if !zpgException {
317 ldc /= 100 332 // LDC is cm. The data is in m.
318 xform = chainTransforms( 333 ldc /= 100
319 xform, 334 xform = chainTransforms(
320 func(v mesh.Vertex) mesh.Vertex { 335 xform,
321 return mesh.Vertex{X: v.X, Y: v.Y, Z: v.Z + ldc} 336 func(v mesh.Vertex) mesh.Vertex {
322 }) 337 return mesh.Vertex{X: v.X, Y: v.Y, Z: v.Z + ldc}
338 })
339 }
323 m.DepthReference = depthReference 340 m.DepthReference = depthReference
324 } 341 }
325 342
326 if err := m.Validate(ctx, conn); err != nil { 343 if err := m.Validate(ctx, conn); err != nil {
327 return nil, common.ToError(err) 344 return nil, common.ToError(err)
370 feedback, 387 feedback,
371 importID, 388 importID,
372 m, 389 m,
373 xyz, 390 xyz,
374 boundary, 391 boundary,
392 zpgException,
375 ) 393 )
376 if err != nil { 394 if err != nil {
377 return nil, err 395 return nil, err
378 } 396 }
379 397
395 feedback Feedback, 413 feedback Feedback,
396 importID int64, 414 importID int64,
397 m *models.SoundingResultMeta, 415 m *models.SoundingResultMeta,
398 xyz mesh.MultiPointZ, 416 xyz mesh.MultiPointZ,
399 boundary polygonSlice, 417 boundary polygonSlice,
418 zpgException bool,
400 ) (interface{}, error) { 419 ) (interface{}, error) {
401 420
402 if sr.singleBeam() { 421 if sr.singleBeam() {
403 feedback.Info("Processing as single beam scan.") 422 feedback.Info("Processing as single beam scan.")
404 } else { 423 } else {
624 m.DepthReference, 643 m.DepthReference,
625 nil, 644 nil,
626 clippingPolygonWKB, 645 clippingPolygonWKB,
627 epsg, 646 epsg,
628 sr.surtype(), 647 sr.surtype(),
648 zpgException,
629 ).Scan( 649 ).Scan(
630 &id, 650 &id,
631 &lat, 651 &lat,
632 &lon, 652 &lon,
633 &dummy, 653 &dummy,