Mercurial > gemma
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 }) |