changeset 2726:dff749c07ae0

Warn if imported axis linestrings cross each other
author Tom Gottfried <tom@intevation.de>
date Tue, 19 Mar 2019 12:57:11 +0100
parents 9465749410ba
children 0fe0b3f1720f
files pkg/imports/wx.go
diffstat 1 files changed, 64 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/pkg/imports/wx.go	Tue Mar 19 12:53:25 2019 +0100
+++ b/pkg/imports/wx.go	Tue Mar 19 12:57:11 2019 +0100
@@ -91,6 +91,13 @@
     ST_Transform(wtwaxs::geometry, (SELECT t FROM resp)))
 `
 
+	checkCrossingAxisSQL = `
+SELECT ST_AsText(ST_Intersection(new_line.wtwaxs, axis.wtwaxs))
+  FROM waterway.waterway_axis AS axis, waterway.waterway_axis AS new_line
+  WHERE new_line.id = $1 AND axis.id <> $1
+    AND ST_Crosses(new_line.wtwaxs::geometry, axis.wtwaxs::geometry)
+`
+
 	insertWaterwayAxisSQL = `
 WITH resp AS (
   SELECT best_utm(area::geometry) AS t,
@@ -110,6 +117,7 @@
         END
       )).geom AS geom
     ) AS clipped
+RETURNING id
 `
 )
 
@@ -167,6 +175,12 @@
 	}
 	defer insertStmt.Close()
 
+	checkCrossingStmt, err := tx.PrepareContext(ctx, checkCrossingAxisSQL)
+	if err != nil {
+		return nil, err
+	}
+	defer checkCrossingStmt.Close()
+
 	// Delete the old features.
 	if _, err := tx.ExecContext(ctx, deleteWaterwayAxisSQL); err != nil {
 		return nil, err
@@ -227,13 +241,16 @@
 				if err := json.Unmarshal(*feature.Geometry.Coordinates, &l); err != nil {
 					return err
 				}
-				if _, err := insertStmt.ExecContext(
+				if err := storeLinestring(
 					ctx,
-					l.asWKB(),
+					tx,
+					feedback,
+					l,
 					epsg,
-					props.ObjNam,
+					props,
 					nobjnam,
-				); err != nil {
+					checkCrossingStmt,
+					insertStmt); err != nil {
 					return err
 				}
 				features++
@@ -243,13 +260,16 @@
 					return err
 				}
 				for _, l := range ls {
-					if _, err := insertStmt.ExecContext(
+					if err := storeLinestring(
 						ctx,
-						l.asWKB(),
+						tx,
+						feedback,
+						l,
 						epsg,
-						props.ObjNam,
+						props,
 						nobjnam,
-					); err != nil {
+						checkCrossingStmt,
+						insertStmt); err != nil {
 						return err
 					}
 					features++
@@ -288,3 +308,39 @@
 
 	return nil, err
 }
+
+func storeLinestring(
+	ctx context.Context,
+	tx *sql.Tx,
+	feedback Feedback,
+	l lineSlice,
+	epsg int,
+	props waterwayAxisProperties,
+	nobjnam sql.NullString,
+	checkCrossingStmt, insertStmt *sql.Stmt,
+) error {
+	var id int
+	if err := insertStmt.QueryRowContext(
+		ctx,
+		l.asWKB(),
+		epsg,
+		props.ObjNam,
+		nobjnam,
+	).Scan(&id); err != nil {
+		return err
+	}
+
+	var crossing string
+	switch err := checkCrossingStmt.QueryRowContext(
+		ctx,
+		id,
+	).Scan(&crossing); {
+	case err != nil && err != sql.ErrNoRows:
+		return err
+	case err == nil:
+		feedback.Warn(
+			"Linestring %d crosses previously imported linestring near %s. Finding a contiguous axis may not work here",
+			id, crossing)
+	}
+	return nil
+}