comparison pkg/imports/sr.go @ 2530:3f61b84ae7a6

SR import: Set missing EPSG code to TIN.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Wed, 06 Mar 2019 21:13:46 +0100
parents 45d51a49f191
children c7ce8b011bcb
comparison
equal deleted inserted replaced
2529:45d51a49f191 2530:3f61b84ae7a6
263 var clippingPolygon octree.Polygon 263 var clippingPolygon octree.Polygon
264 if err := clippingPolygon.FromWKB(hull); err != nil { 264 if err := clippingPolygon.FromWKB(hull); err != nil {
265 return nil, err 265 return nil, err
266 } 266 }
267 clippingPolygon.Indexify() 267 clippingPolygon.Indexify()
268
269 feedback.Info("Building clipping polygon took %v.", time.Since(start)) 268 feedback.Info("Building clipping polygon took %v.", time.Since(start))
270 269
271 start = time.Now() 270 start = time.Now()
272 271
273 var reproj []byte 272 var reproj []byte
274 273
275 err = tx.QueryRow(reprojectPointsSQL, 274 if err = tx.QueryRow(reprojectPointsSQL,
276 xyzWKB, 275 xyzWKB,
277 m.EPSG, 276 m.EPSG,
278 epsg, 277 epsg,
279 ).Scan(&reproj) 278 ).Scan(&reproj); err != nil {
280
281 if err != nil {
282 return nil, err 279 return nil, err
283 } 280 }
284 281
285 if err := xyz.FromWKB(reproj); err != nil { 282 if err := xyz.FromWKB(reproj); err != nil {
286 return nil, err 283 return nil, err
293 290
294 tri, err := octree.Triangulate(xyz) 291 tri, err := octree.Triangulate(xyz)
295 if err != nil { 292 if err != nil {
296 return nil, err 293 return nil, err
297 } 294 }
298
299 feedback.Info("Triangulation took %v.", time.Since(start)) 295 feedback.Info("Triangulation took %v.", time.Since(start))
300 296
301 start = time.Now() 297 start = time.Now()
302 298
303 tin := tri.Tin() 299 tin := tri.Tin()
304 300
305 var str octree.STRTree 301 var str octree.STRTree
306 str.Build(tin) 302 str.Build(tin)
307
308 feedback.Info("Building STR tree took %v", time.Since(start)) 303 feedback.Info("Building STR tree took %v", time.Since(start))
309 304
310 start = time.Now() 305 start = time.Now()
311 306
312 removed := str.Clip(&clippingPolygon) 307 removed := str.Clip(&clippingPolygon)
313 feedback.Info("Clipping STR tree took %v.", time.Since(start)) 308 feedback.Info("Clipping STR tree took %v.", time.Since(start))
314 feedback.Info("Number of triangles to clip %d.", len(removed)) 309 feedback.Info("Number of triangles to clip %d.", len(removed))
315 310
316 start = time.Now() 311 start = time.Now()
317 312
313 tin.EPSG = epsg
314
318 builder := octree.NewBuilder(tin) 315 builder := octree.NewBuilder(tin)
319 builder.Build(removed) 316 builder.Build(removed)
320 octreeIndex, err := builder.Bytes() 317 octreeIndex, err := builder.Bytes()
321 feedback.Info("Building octree took %v.", 318 if err != nil {
322 time.Since(start)) 319 return nil, err
323 if err != nil { 320 }
324 return nil, err 321 feedback.Info("Building octree took %v.", time.Since(start))
325 }
326 322
327 start = time.Now() 323 start = time.Now()
328 h := sha1.New() 324 h := sha1.New()
329 h.Write(octreeIndex) 325 h.Write(octreeIndex)
330 checksum := hex.EncodeToString(h.Sum(nil)) 326 checksum := hex.EncodeToString(h.Sum(nil))
331 _, err = tx.Exec(insertOctreeSQL, id, checksum, octreeIndex) 327 _, err = tx.Exec(insertOctreeSQL, id, checksum, octreeIndex)
332 feedback.Info("Storing octree index took %s.", 328 if err != nil {
333 time.Since(start)) 329 return nil, err
334 if err != nil { 330 }
335 return nil, err 331 feedback.Info("Storing octree index took %s.", time.Since(start))
336 }
337 332
338 tree := builder.Tree() 333 tree := builder.Tree()
339 tree.EPSG = epsg
340 builder = nil // not needed from now on
341 334
342 start = time.Now() 335 start = time.Now()
343 err = generateContours(tree, tx, id) 336 err = generateContours(tree, tx, id)
337 if err != nil {
338 return nil, err
339 }
344 feedback.Info("Generating and storing contour lines took %s.", 340 feedback.Info("Generating and storing contour lines took %s.",
345 time.Since(start)) 341 time.Since(start))
346 if err != nil {
347 return nil, err
348 }
349 342
350 // Store for potential later removal. 343 // Store for potential later removal.
351 if err = track(ctx, tx, importID, "waterway.sounding_results", id); err != nil { 344 if err = track(ctx, tx, importID, "waterway.sounding_results", id); err != nil {
352 return nil, err 345 return nil, err
353 } 346 }
354 347
355 if err = tx.Commit(); err != nil { 348 if err = tx.Commit(); err != nil {
356 feedback.Error( 349 feedback.Error(
357 "Storing sounding result failed after %v.", 350 "Storing sounding result failed after %v.", time.Since(begin))
358 time.Since(begin))
359 return nil, err 351 return nil, err
360 } 352 }
361 353
362 feedback.Info( 354 feedback.Info(
363 "Storing sounding result was successful after %v.", 355 "Storing sounding result was successful after %v.", time.Since(begin))
364 time.Since(begin))
365 356
366 summary := struct { 357 summary := struct {
367 Bottleneck string `json:"bottleneck"` 358 Bottleneck string `json:"bottleneck"`
368 Date models.Date `json:"date"` 359 Date models.Date `json:"date"`
369 Lat float64 `json:"lat"` 360 Lat float64 `json:"lat"`
372 Bottleneck: m.Bottleneck, 363 Bottleneck: m.Bottleneck,
373 Date: m.Date, 364 Date: m.Date,
374 Lat: lat, 365 Lat: lat,
375 Lon: lon, 366 Lon: lon,
376 } 367 }
377 return &summary, err 368
369 return &summary, nil
378 } 370 }
379 371
380 // CleanUp removes the folder containing the ZIP file with the 372 // CleanUp removes the folder containing the ZIP file with the
381 // the sounding result import. 373 // the sounding result import.
382 func (sr *SoundingResult) CleanUp() error { 374 func (sr *SoundingResult) CleanUp() error {
523 return err 515 return err
524 } 516 }
525 defer stmt.Close() 517 defer stmt.Close()
526 518
527 // Adjust contour lines heights to multiples of contourStepWidth 519 // Adjust contour lines heights to multiples of contourStepWidth
528 heights := make([]float64, 0) 520 var heights []float64
529 h := contourStepWidth * math.Ceil(tree.Min.Z/contourStepWidth) 521 h := contourStepWidth * math.Ceil(tree.Min.Z/contourStepWidth)
530 for ; h <= tree.Max.Z; h += contourStepWidth { 522 for ; h <= tree.Max.Z; h += contourStepWidth {
531 heights = append(heights, h) 523 heights = append(heights, h)
532 } 524 }
533 525