comparison pkg/imports/sr.go @ 3591:062dc9b54b86

SR import: Using context.Context aware SQL statements.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Tue, 04 Jun 2019 13:19:28 +0200
parents a9d140c7db8d
children eeeb7bf14217
comparison
equal deleted inserted replaced
3590:309084558808 3591:062dc9b54b86
172 JOIN waterway.bottlenecks bns 172 JOIN waterway.bottlenecks bns
173 ON grwl.location = bns.gauge_location 173 ON grwl.location = bns.gauge_location
174 AND grwl.validity = bns.gauge_validity 174 AND grwl.validity = bns.gauge_validity
175 WHERE bns.objnam = $1 AND grwl.depth_reference like 'LDC%' 175 WHERE bns.objnam = $1 AND grwl.depth_reference like 'LDC%'
176 ` 176 `
177
178 reprojectPointsSingleBeamSQL = `
179 SELECT ST_AsBinary(
180 ST_Transform(
181 ST_GeomFromWKB($1, $2::integer),
182 best_utm(ST_GeomFromWKB($1, $2::integer)))),
183 best_utm(ST_GeomFromWKB($1, $2::integer)
184 `
177 ) 185 )
178 186
179 func (sr *SoundingResult) isSingleBeam() bool { 187 func (sr *SoundingResult) isSingleBeam() bool {
180 return sr.SingleBeam != nil && *sr.SingleBeam 188 return sr.SingleBeam != nil && *sr.SingleBeam
181 } 189 }
255 if len(xyz) == 0 { 263 if len(xyz) == 0 {
256 return nil, errors.New("XYZ does not contain any vertices") 264 return nil, errors.New("XYZ does not contain any vertices")
257 } 265 }
258 266
259 // Is there a boundary shapefile in the ZIP archive? 267 // Is there a boundary shapefile in the ZIP archive?
260 polygon, err := loadBoundary(z) 268 boundary, err := loadBoundary(z)
261 if err != nil { 269 if err != nil {
262 return nil, err 270 return nil, err
263 } 271 }
264 272
265 tx, err := conn.BeginTx(ctx, nil) 273 tx, err := conn.BeginTx(ctx, nil)
276 tx, 284 tx,
277 feedback, 285 feedback,
278 importID, 286 importID,
279 m, 287 m,
280 xyz, 288 xyz,
281 polygon, 289 boundary,
282 ) 290 )
283 } else { 291 } else {
284 summary, err = sr.multiBeamScan( 292 summary, err = sr.multiBeamScan(
285 ctx, 293 ctx,
286 tx, 294 tx,
287 feedback, 295 feedback,
288 importID, 296 importID,
289 m, 297 m,
290 xyz, 298 xyz,
291 polygon, 299 boundary,
292 ) 300 )
293 } 301 }
294 if err != nil { 302 if err != nil {
295 return nil, err 303 return nil, err
296 } 304 }
312 tx *sql.Tx, 320 tx *sql.Tx,
313 feedback Feedback, 321 feedback Feedback,
314 importID int64, 322 importID int64,
315 m *models.SoundingResultMeta, 323 m *models.SoundingResultMeta,
316 xyz octree.MultiPointZ, 324 xyz octree.MultiPointZ,
317 polygon polygonSlice, 325 boundary polygonSlice,
318 ) (interface{}, error) { 326 ) (interface{}, error) {
327
328 feedback.Info("Processing as single beam scan.")
329
330 start := time.Now()
331
332 xyzWKB := xyz.AsWKB()
333 var reproj []byte
334 var epsg uint
335
336 if err := tx.QueryRowContext(
337 ctx,
338 reprojectPointsSingleBeamSQL,
339 xyzWKB,
340 m.EPSG,
341 ).Scan(&reproj, &epsg); err != nil {
342 return nil, err
343 }
344
345 feedback.Info("Reprojecting points to EPSG %d took %v.",
346 epsg, time.Since(start))
347
319 // TODO: Implement me! 348 // TODO: Implement me!
320 return nil, errors.New("Not implemented, yet!") 349 return nil, errors.New("Not implemented, yet!")
321 } 350 }
322 351
323 func (sr *SoundingResult) multiBeamScan( 352 func (sr *SoundingResult) multiBeamScan(
325 tx *sql.Tx, 354 tx *sql.Tx,
326 feedback Feedback, 355 feedback Feedback,
327 importID int64, 356 importID int64,
328 m *models.SoundingResultMeta, 357 m *models.SoundingResultMeta,
329 xyz octree.MultiPointZ, 358 xyz octree.MultiPointZ,
330 polygon polygonSlice, 359 boundary polygonSlice,
331 ) (interface{}, error) { 360 ) (interface{}, error) {
361
332 feedback.Info("Processing as multi beam scan.") 362 feedback.Info("Processing as multi beam scan.")
333 var ( 363 var (
334 id int64 364 id int64
335 epsg uint32 365 epsg uint32
336 lat, lon float64 366 lat, lon float64
339 369
340 var hull []byte 370 var hull []byte
341 371
342 xyzWKB := xyz.AsWKB() 372 xyzWKB := xyz.AsWKB()
343 373
344 err := tx.QueryRow(insertHullSQL, 374 err := tx.QueryRowContext(
375 ctx,
376 insertHullSQL,
345 m.Bottleneck, 377 m.Bottleneck,
346 m.Date.Time, 378 m.Date.Time,
347 m.DepthReference, 379 m.DepthReference,
348 xyzWKB, 380 xyzWKB,
349 polygon.asWKB(), 381 boundary.asWKB(),
350 m.EPSG, 382 m.EPSG,
351 ).Scan( 383 ).Scan(
352 &id, 384 &id,
353 &lat, 385 &lat,
354 &lon, 386 &lon,
355 &epsg, 387 &epsg,
356 &hull, 388 &hull,
357 ) 389 )
358 xyz, polygon = nil, nil // not need from now on. 390 xyz, boundary = nil, nil // not need from now on.
359 feedback.Info("Calculating hull took %s.", time.Since(start)) 391 feedback.Info("Calculating hull took %s.", time.Since(start))
360 if err != nil { 392 if err != nil {
361 return nil, err 393 return nil, err
362 } 394 }
363 feedback.Info("Best suited UTM EPSG: %d", epsg) 395 feedback.Info("Best suited UTM EPSG: %d", epsg)
373 405
374 start = time.Now() 406 start = time.Now()
375 407
376 var reproj []byte 408 var reproj []byte
377 409
378 if err = tx.QueryRow(reprojectPointsSQL, 410 if err = tx.QueryRowContext(
411 ctx,
412 reprojectPointsSQL,
379 xyzWKB, 413 xyzWKB,
380 m.EPSG, 414 m.EPSG,
381 epsg, 415 epsg,
382 ).Scan(&reproj); err != nil { 416 ).Scan(&reproj); err != nil {
383 return nil, err 417 return nil, err
426 460
427 start = time.Now() 461 start = time.Now()
428 h := sha1.New() 462 h := sha1.New()
429 h.Write(octreeIndex) 463 h.Write(octreeIndex)
430 checksum := hex.EncodeToString(h.Sum(nil)) 464 checksum := hex.EncodeToString(h.Sum(nil))
431 _, err = tx.Exec(insertOctreeSQL, id, checksum, octreeIndex) 465 _, err = tx.ExecContext(ctx, insertOctreeSQL, id, checksum, octreeIndex)
432 if err != nil { 466 if err != nil {
433 return nil, err 467 return nil, err
434 } 468 }
435 feedback.Info("Storing octree index took %s.", time.Since(start)) 469 feedback.Info("Storing octree index took %s.", time.Since(start))
436 470
437 tree := builder.Tree() 471 tree := builder.Tree()
438 472
439 start = time.Now() 473 start = time.Now()
440 err = generateContours(tree, tx, id) 474 err = generateContours(ctx, tx, tree, id)
441 if err != nil { 475 if err != nil {
442 return nil, err 476 return nil, err
443 } 477 }
444 feedback.Info("Generating and storing contour lines took %s.", 478 feedback.Info("Generating and storing contour lines took %s.",
445 time.Since(start)) 479 time.Since(start))
626 } 660 }
627 661
628 return shapeToPolygon(s) 662 return shapeToPolygon(s)
629 } 663 }
630 664
631 func generateContours(tree *octree.Tree, tx *sql.Tx, id int64) error { 665 func generateContours(
632 stmt, err := tx.Prepare(insertContourSQL) 666 ctx context.Context,
667 tx *sql.Tx,
668 tree *octree.Tree,
669 id int64,
670 ) error {
671 stmt, err := tx.PrepareContext(ctx, insertContourSQL)
633 if err != nil { 672 if err != nil {
634 return err 673 return err
635 } 674 }
636 defer stmt.Close() 675 defer stmt.Close()
637 676
642 heights = append(heights, h) 681 heights = append(heights, h)
643 } 682 }
644 683
645 octree.DoContours(tree, heights, func(res *octree.ContourResult) { 684 octree.DoContours(tree, heights, func(res *octree.ContourResult) {
646 if err == nil && len(res.Lines) > 0 { 685 if err == nil && len(res.Lines) > 0 {
647 _, err = stmt.Exec( 686 _, err = stmt.ExecContext(
687 ctx,
648 id, res.Height, tree.EPSG, 688 id, res.Height, tree.EPSG,
649 res.Lines.AsWKB2D(), 689 res.Lines.AsWKB2D(),
650 contourTolerance) 690 contourTolerance)
651 } 691 }
652 }) 692 })