From 6f98fa0fb34f0f116002bf7154bc60698e0b2892 Mon Sep 17 00:00:00 2001 From: Sarah Hoffmann Date: Sun, 8 Mar 2015 18:25:51 +0100 Subject: [PATCH] interpolations: snap lines to points, not vice versa Avoids the occasional rounding problem which might occur when splitting a line anywhere but on a support point, see postgis doc for ST_Split. Fixes #253 --- sql/postgis_20_aux.sql | 2 +- .../features/db/import/interpolation.feature | 68 ++++++++++++++++++- 2 files changed, 66 insertions(+), 4 deletions(-) diff --git a/sql/postgis_20_aux.sql b/sql/postgis_20_aux.sql index dc74e093..749e2a43 100644 --- a/sql/postgis_20_aux.sql +++ b/sql/postgis_20_aux.sql @@ -4,7 +4,7 @@ CREATE OR REPLACE FUNCTION split_line_on_node(line GEOMETRY, point GEOMETRY) RETURNS GEOMETRY AS $$ BEGIN - RETURN ST_Split(line, ST_ClosestPoint(line, point)); + RETURN ST_Split(ST_Snap(line, point, 0.0005), point); END; $$ LANGUAGE plpgsql; diff --git a/tests/features/db/import/interpolation.feature b/tests/features/db/import/interpolation.feature index d70bf18a..8fb3e606 100644 --- a/tests/features/db/import/interpolation.feature +++ b/tests/features/db/import/interpolation.feature @@ -229,8 +229,8 @@ Feature: Import of address interpolations Given the place nodes | osm_id | class | type | housenumber | geometry | 1 | place | house | 2 | 1 1 - | 2 | place | house | 8 | 1.001 1.001 - | 3 | place | house | 4 | 1 1.001 + | 2 | place | house | 14 | 1.001 1.001 + | 3 | place | house | 10 | 1 1.001 And the place ways | osm_id | class | type | housenumber | geometry | 1 | place | houses | even | 1 1, 1 1.001, 1.001 1.001 @@ -240,7 +240,52 @@ Feature: Import of address interpolations When importing Then way 1 expands to housenumbers | housenumber | centroid - | 6 | 1.0005,1.001 + | 4 | 1,1.00025 + | 6 | 1,1.0005 + | 8 | 1,1.00075 + | 12 | 1.0005,1.001 + + Scenario: Simple even four point interpolation + Given the place nodes + | osm_id | class | type | housenumber | geometry + | 1 | place | house | 2 | 1 1 + | 2 | place | house | 14 | 1.001 1.001 + | 3 | place | house | 10 | 1 1.001 + | 4 | place | house | 18 | 1.001 1.002 + And the place ways + | osm_id | class | type | housenumber | geometry + | 1 | place | houses | even | 1 1, 1 1.001, 1.001 1.001, 1.001 1.002 + And the ways + | id | nodes + | 1 | 1,3,2,4 + When importing + Then way 1 expands to housenumbers + | housenumber | centroid + | 4 | 1,1.00025 + | 6 | 1,1.0005 + | 8 | 1,1.00075 + | 12 | 1.0005,1.001 + | 16 | 1.001,1.0015 + + Scenario: Reverse simple even three point interpolation + Given the place nodes + | osm_id | class | type | housenumber | geometry + | 1 | place | house | 2 | 1 1 + | 2 | place | house | 14 | 1.001 1.001 + | 3 | place | house | 10 | 1 1.001 + And the place ways + | osm_id | class | type | housenumber | geometry + | 1 | place | houses | even | 1.001 1.001, 1 1.001, 1 1 + And the ways + | id | nodes + | 1 | 2,3,1 + When importing + Then way 1 expands to housenumbers + | housenumber | centroid + | 4 | 1,1.00025 + | 6 | 1,1.0005 + | 8 | 1,1.00075 + | 12 | 1.0005,1.001 Scenario: Even three point interpolation with odd center point Given the place nodes @@ -359,4 +404,21 @@ Feature: Import of address interpolations And way 10 expands exactly to housenumbers 4 And way 11 expands exactly to housenumbers 14 + Scenario: Geometry of points and way don't match (github #253) + Given the place nodes + | osm_id | class | type | housenumber | geometry + | 1 | place | house | 10 | 144.9632341 -37.76163 + | 2 | place | house | 6 | 144.9630541 -37.7628174 + | 3 | shop | supermarket | 2 | 144.9629794 -37.7630755 + And the place ways + | osm_id | class | type | housenumber | geometry + | 1 | place | houses | even | 144.9632341 -37.76163,144.9630541 -37.7628172,144.9629794 -37.7630755 + And the ways + | id | nodes + | 1 | 1,2,3 + When importing + Then way 1 expands to housenumbers + | housenumber | centroid + | 4 | 144.963016723312,-37.7629464422819+-0.000005 + | 8 | 144.9631440856,-37.762223694978+-0.000005