Mercurial > gemma
changeset 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 |
files | pkg/imports/sr.go |
diffstat | 1 files changed, 30 insertions(+), 5 deletions(-) [+] |
line wrap: on
line diff
--- a/pkg/imports/sr.go Thu Jun 13 13:14:40 2019 +0200 +++ b/pkg/imports/sr.go Thu Jun 13 16:04:46 2019 +0200 @@ -128,7 +128,7 @@ CASE WHEN $5::bytea IS NULL THEN ST_Transform(ST_ConcaveHull(ST_Force2D(ST_GeomFromWKB($4, $6::integer)), 0.7), 4326)::geography ELSE - ST_Transform(ST_MakeValid(ST_GeomFromWKB($5, $6::integer)), 4326)::geography + ST_Transform(ST_GeomFromWKB($5, $6::integer), 4326)::geography END) RETURNING id, @@ -146,6 +146,11 @@ octree_checksum = $2, octree_index = $3 WHERE id = $1` + repairBoundarySQL = ` +SELECT + ST_AsBinary(ST_Buffer(ST_MakeValid(ST_GeomFromWKB($1, $2::integer)), 0.0)), + ST_AsBinary(ST_Buffer(ST_MakeValid(ST_GeomFromWKB($1, $2::integer)), 0.1))` + insertContourSQL = ` INSERT INTO waterway.sounding_results_contour_lines ( sounding_result_id, @@ -381,6 +386,27 @@ polygon.Reverse() } + clippingPolygon.FromLineStringZ(polygon) + + var repaired, buffered []byte + + if err := tx.QueryRowContext( + ctx, + repairBoundarySQL, + clippingPolygon.AsWKB(), + epsg, + ).Scan(&repaired, &buffered); err != nil { + return nil, err + } + + if err := clippingPolygon.FromWKB(repaired); err != nil { + return nil, err + } + var clippingPolygonBuffered octree.Polygon + if err := clippingPolygonBuffered.FromWKB(buffered); err != nil { + return nil, err + } + firstTin := tri.Tin() builder := octree.NewBuilder(firstTin) builder.Build(removed) @@ -481,8 +507,7 @@ //polygon.Buffer(1.0) - clippingPolygon.FromLineStringZ(polygon) - clippingPolygon.Indexify() + clippingPolygonBuffered.Indexify() var str octree.STRTree str.Build(secondTin) @@ -490,7 +515,7 @@ start = time.Now() - removed = str.Clip(&clippingPolygon) + removed = str.Clip(&clippingPolygonBuffered) log.Printf("Clipping STR tree took %v.", time.Since(start)) log.Printf("Number of triangles to clip %d.", len(removed)) @@ -521,7 +546,7 @@ m.Date.Time, m.DepthReference, nil, - clippingPolygon.AsWKB(), + repaired, m.EPSG, ).Scan( &id,