# HG changeset patch # User Sascha L. Teichmann # Date 1560434686 -7200 # Node ID c368a9a20478360a7be7de46fbdc6ba283876f58 # Parent 01ce3ba9b0d07ca62ea9aaf903c1afdc5a5a0827 Tried to fix invalid new boundary polygon with ST_MakeValid() ... and failed. diff -r 01ce3ba9b0d0 -r c368a9a20478 pkg/imports/sr.go --- 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,