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,