comparison pkg/imports/sr.go @ 3651:c368a9a20478 single-beam

Tried to fix invalid new boundary polygon with ST_MakeValid() ... and failed.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Thu, 13 Jun 2019 16:04:46 +0200
parents 01ce3ba9b0d0
children f415c5ed60f6
comparison
equal deleted inserted replaced
3650:01ce3ba9b0d0 3651:c368a9a20478
126 $3, 126 $3,
127 (SELECT 127 (SELECT
128 CASE WHEN $5::bytea IS NULL THEN 128 CASE WHEN $5::bytea IS NULL THEN
129 ST_Transform(ST_ConcaveHull(ST_Force2D(ST_GeomFromWKB($4, $6::integer)), 0.7), 4326)::geography 129 ST_Transform(ST_ConcaveHull(ST_Force2D(ST_GeomFromWKB($4, $6::integer)), 0.7), 4326)::geography
130 ELSE 130 ELSE
131 ST_Transform(ST_MakeValid(ST_GeomFromWKB($5, $6::integer)), 4326)::geography 131 ST_Transform(ST_GeomFromWKB($5, $6::integer), 4326)::geography
132 END) 132 END)
133 RETURNING 133 RETURNING
134 id, 134 id,
135 ST_X(ST_Centroid(area::geometry)), 135 ST_X(ST_Centroid(area::geometry)),
136 ST_Y(ST_Centroid(area::geometry)), 136 ST_Y(ST_Centroid(area::geometry)),
143 ` 143 `
144 insertOctreeSQL = ` 144 insertOctreeSQL = `
145 UPDATE waterway.sounding_results SET 145 UPDATE waterway.sounding_results SET
146 octree_checksum = $2, octree_index = $3 146 octree_checksum = $2, octree_index = $3
147 WHERE id = $1` 147 WHERE id = $1`
148
149 repairBoundarySQL = `
150 SELECT
151 ST_AsBinary(ST_Buffer(ST_MakeValid(ST_GeomFromWKB($1, $2::integer)), 0.0)),
152 ST_AsBinary(ST_Buffer(ST_MakeValid(ST_GeomFromWKB($1, $2::integer)), 0.1))`
148 153
149 insertContourSQL = ` 154 insertContourSQL = `
150 INSERT INTO waterway.sounding_results_contour_lines ( 155 INSERT INTO waterway.sounding_results_contour_lines (
151 sounding_result_id, 156 sounding_result_id,
152 height, 157 height,
379 if polygonArea < 0.0 { // counter clockwise 384 if polygonArea < 0.0 { // counter clockwise
380 polygonArea = -polygonArea 385 polygonArea = -polygonArea
381 polygon.Reverse() 386 polygon.Reverse()
382 } 387 }
383 388
389 clippingPolygon.FromLineStringZ(polygon)
390
391 var repaired, buffered []byte
392
393 if err := tx.QueryRowContext(
394 ctx,
395 repairBoundarySQL,
396 clippingPolygon.AsWKB(),
397 epsg,
398 ).Scan(&repaired, &buffered); err != nil {
399 return nil, err
400 }
401
402 if err := clippingPolygon.FromWKB(repaired); err != nil {
403 return nil, err
404 }
405 var clippingPolygonBuffered octree.Polygon
406 if err := clippingPolygonBuffered.FromWKB(buffered); err != nil {
407 return nil, err
408 }
409
384 firstTin := tri.Tin() 410 firstTin := tri.Tin()
385 builder := octree.NewBuilder(firstTin) 411 builder := octree.NewBuilder(firstTin)
386 builder.Build(removed) 412 builder.Build(removed)
387 413
388 firstTree := builder.Tree() 414 firstTree := builder.Tree()
479 505
480 secondTin := tri.Tin() 506 secondTin := tri.Tin()
481 507
482 //polygon.Buffer(1.0) 508 //polygon.Buffer(1.0)
483 509
484 clippingPolygon.FromLineStringZ(polygon) 510 clippingPolygonBuffered.Indexify()
485 clippingPolygon.Indexify()
486 511
487 var str octree.STRTree 512 var str octree.STRTree
488 str.Build(secondTin) 513 str.Build(secondTin)
489 log.Printf("Building STR tree took %v", time.Since(start)) 514 log.Printf("Building STR tree took %v", time.Since(start))
490 515
491 start = time.Now() 516 start = time.Now()
492 517
493 removed = str.Clip(&clippingPolygon) 518 removed = str.Clip(&clippingPolygonBuffered)
494 log.Printf("Clipping STR tree took %v.", time.Since(start)) 519 log.Printf("Clipping STR tree took %v.", time.Since(start))
495 log.Printf("Number of triangles to clip %d.", len(removed)) 520 log.Printf("Number of triangles to clip %d.", len(removed))
496 521
497 start = time.Now() 522 start = time.Now()
498 523
519 insertHullSQL, 544 insertHullSQL,
520 m.Bottleneck, 545 m.Bottleneck,
521 m.Date.Time, 546 m.Date.Time,
522 m.DepthReference, 547 m.DepthReference,
523 nil, 548 nil,
524 clippingPolygon.AsWKB(), 549 repaired,
525 m.EPSG, 550 m.EPSG,
526 ).Scan( 551 ).Scan(
527 &id, 552 &id,
528 &lat, 553 &lat,
529 &lon, 554 &lon,