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