Mercurial > gemma
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 +}