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
This commit is contained in:
Sarah Hoffmann 2015-03-08 18:25:51 +01:00
parent 555362eabe
commit 6f98fa0fb3
2 changed files with 66 additions and 4 deletions

View File

@ -4,7 +4,7 @@ CREATE OR REPLACE FUNCTION split_line_on_node(line GEOMETRY, point GEOMETRY)
RETURNS GEOMETRY RETURNS GEOMETRY
AS $$ AS $$
BEGIN BEGIN
RETURN ST_Split(line, ST_ClosestPoint(line, point)); RETURN ST_Split(ST_Snap(line, point, 0.0005), point);
END; END;
$$ $$
LANGUAGE plpgsql; LANGUAGE plpgsql;

View File

@ -229,8 +229,8 @@ Feature: Import of address interpolations
Given the place nodes Given the place nodes
| osm_id | class | type | housenumber | geometry | osm_id | class | type | housenumber | geometry
| 1 | place | house | 2 | 1 1 | 1 | place | house | 2 | 1 1
| 2 | place | house | 8 | 1.001 1.001 | 2 | place | house | 14 | 1.001 1.001
| 3 | place | house | 4 | 1 1.001 | 3 | place | house | 10 | 1 1.001
And the place ways And the place ways
| osm_id | class | type | housenumber | geometry | osm_id | class | type | housenumber | geometry
| 1 | place | houses | even | 1 1, 1 1.001, 1.001 1.001 | 1 | place | houses | even | 1 1, 1 1.001, 1.001 1.001
@ -240,7 +240,52 @@ Feature: Import of address interpolations
When importing When importing
Then way 1 expands to housenumbers Then way 1 expands to housenumbers
| housenumber | centroid | 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 Scenario: Even three point interpolation with odd center point
Given the place nodes Given the place nodes
@ -359,4 +404,21 @@ Feature: Import of address interpolations
And way 10 expands exactly to housenumbers 4 And way 10 expands exactly to housenumbers 4
And way 11 expands exactly to housenumbers 14 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