changeset 969:a4e003ba0074

Throw out triangles out of triangulation result which are not covered by the the bounding polygon of the sounding result.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Wed, 17 Oct 2018 17:23:46 +0200
parents a4fe07a21ba7
children 166782ebab96
files cmd/tin2octree/main.go
diffstat 1 files changed, 28 insertions(+), 33 deletions(-) [+]
line wrap: on
line diff
--- a/cmd/tin2octree/main.go	Wed Oct 17 16:00:49 2018 +0200
+++ b/cmd/tin2octree/main.go	Wed Oct 17 17:23:46 2018 +0200
@@ -23,7 +23,6 @@
 	date       = flag.String("date", "", "date info")
 	file       = flag.String("file", "", "save to file")
 	insert     = flag.Bool("insert", false, "write as SQL insert statement")
-	utm        = flag.Bool("utm", true, "fetch in matchin UTM zone")
 
 	dbhost     = flag.String("dbhost", "localhost", "database host")
 	dbport     = flag.Uint("dbport", 5432, "database port")
@@ -55,18 +54,23 @@
 }
 
 const (
-	tinSQL = `
-SELECT ST_AsBinary(ST_DelaunayTriangles(point_cloud::geometry, 0, 2))
-FROM waterway.sounding_results
-WHERE bottleneck_id = $1 AND date_info = $2
-`
 	tinUTMSQL = `
-SELECT ST_AsBinary(
-  ST_DelaunayTriangles(
-	  ST_Transform(point_cloud::geometry, $3::int), 0, 2))
-FROM waterway.sounding_results
-WHERE bottleneck_id = $1 AND date_info = $2
-`
+WITH trans AS (
+  SELECT
+	ST_Buffer(ST_Transform(area::geometry, $3::int), 0.001) AS area,
+	ST_Transform(point_cloud::geometry, $3::int) AS point_cloud
+  FROM waterway.sounding_results
+  WHERE bottleneck_id = $1 AND date_info = $2
+),
+triangles AS (
+  SELECT t.geom AS geom, ST_MakePolygon(ST_ExteriorRing(t.geom)) AS poly FROM (
+    SELECT (st_dump(
+      ST_DelaunayTriangles(point_cloud, 0, 2))).geom
+    FROM trans) t
+)
+SELECT ST_AsBinary(ST_Collect(triangles.geom)) FROM triangles, trans
+WHERE st_covers(trans.area, triangles.poly)`
+
 	centroidSQL = `
 SELECT ST_X(ST_Centroid(point_cloud::geometry)), ST_Y(ST_Centroid(point_cloud::geometry))
 FROM waterway.sounding_results
@@ -102,27 +106,20 @@
 	if err := run(func(db *sql.DB) error {
 		var utmZ int
 
-		if *utm {
-			var cx, cy float64
-			err := db.QueryRow(centroidSQL, *bottleneck, dateInfo).Scan(&cx, &cy)
-			switch {
-			case err == sql.ErrNoRows:
-				return nil
-			case err != nil:
-				return err
-			}
-			log.Printf("lat/lon: [%f, %f]\n", cx, cy)
-			utmZ = utmZone(cx, cy)
-			log.Printf("UTM zone: %d\n", utmZ)
+		var cx, cy float64
+		err := db.QueryRow(centroidSQL, *bottleneck, dateInfo).Scan(&cx, &cy)
+		switch {
+		case err == sql.ErrNoRows:
+			return nil
+		case err != nil:
+			return err
 		}
+		log.Printf("lat/lon: [%f, %f]\n", cx, cy)
+		utmZ = utmZone(cx, cy)
+		log.Printf("UTM zone: %d\n", utmZ)
 
 		start := time.Now()
-		var err error
-		if *utm {
-			err = db.QueryRow(tinUTMSQL, *bottleneck, dateInfo, utmZ).Scan(&t)
-		} else {
-			err = db.QueryRow(tinSQL, *bottleneck, dateInfo).Scan(&t)
-		}
+		err = db.QueryRow(tinUTMSQL, *bottleneck, dateInfo, utmZ).Scan(&t)
 		switch {
 		case err == sql.ErrNoRows:
 			return nil
@@ -131,9 +128,7 @@
 		}
 		log.Printf("query took: %s\n", time.Since(start))
 
-		if *utm {
-			t.EPSG = uint32(utmZ)
-		}
+		t.EPSG = uint32(utmZ)
 
 		return nil
 	}); err != nil {