]> git.openstreetmap.org Git - nominatim.git/commitdiff
Merge remote-tracking branch 'upstream/master'
authorSarah Hoffmann <lonvia@denofr.de>
Sun, 5 Oct 2014 20:16:43 +0000 (22:16 +0200)
committerSarah Hoffmann <lonvia@denofr.de>
Sun, 5 Oct 2014 20:16:43 +0000 (22:16 +0200)
AUTHORS
ChangeLog
configure.ac
sql/functions.sql
sql/postgis_15_aux.sql [new file with mode: 0644]
sql/postgis_20_aux.sql [new file with mode: 0644]
tests/features/db/import/interpolation.feature [new file with mode: 0644]
tests/steps/db_results.py
utils/setup.php

diff --git a/AUTHORS b/AUTHORS
index ff188b50a73c1da4b781e5fef23b6e9bc1953eba..ea48a49c67d7e7c758efd6ec14d926c09479d370 100644 (file)
--- a/AUTHORS
+++ b/AUTHORS
@@ -14,3 +14,4 @@ Nominatim was written by:
   Spin0us
   Kurt Roeckx
   Rodolphe QuiĆ©deville
+  Marc Tobias Metten
index 76abb741e71eda189c1e0aa43b2cf9b05d22590a..ae45f6ca5bef4bde8ef40e1b7776973d18559716 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -27,7 +27,7 @@
  * refactoring of front-end PHP code
  * lots of smaller bug fixes
 
- 2.2
+2.2
 
  * correct database rights for www-data
  * add timestamps for update output
  * properly detect changes of admin_level
  * remove landuses when name is removed
  * smaller fixes
+
+2.3
+
+ * further improve ordering of results
+ * support for more lat/lon formats in search-as-reverse
+ * fix handling of GB postcodes
+ * new functional test suite
+ * support for waterway relations
+ * inherit postcodes from street to poi
+ * fix housenumber normalisation to find non-latin house numbers
+ * take viewbox into account for ordering of results
+ * pois may now inherit address tags from surrounding buildings
+ * improve what objects may participate in an address
+ * clean up handled class/type combinations to current OSM usage
+ * lots of bug fixes
index a92bbeeb06459f923af0e027389cb0ab4d2d68d9..cc77d333ae4cb32b53f04b4cfe3f2f91e5ca0f00 100644 (file)
@@ -1,4 +1,4 @@
-AC_INIT(Nominatim,2.2)
+AC_INIT(Nominatim,2.4)
 if git rev-parse HEAD 2>/dev/null >/dev/null; then
     AC_SUBST([PACKAGE_VERSION], [$PACKAGE_VERSION-git-`git rev-parse --short HEAD`])
 fi
@@ -40,7 +40,7 @@ fi
 
 
 dnl Check for PostgresSQL client library
-AX_LIB_POSTGRESQL(8.4)
+AX_LIB_POSTGRESQL(9.0)
 if test "x$POSTGRESQL_VERSION" = "x"
 then
     AC_MSG_ERROR([postgresql client library not found])
index 54f46cfe933b64fbd5f33dfc9a6ac336ade93539..72e52130c9baf76a67a80ba6b3b192ae04bea7e8 100644 (file)
@@ -791,7 +791,7 @@ LANGUAGE plpgsql;
 CREATE OR REPLACE FUNCTION create_interpolation(wayid BIGINT, interpolationtype TEXT) RETURNS INTEGER
   AS $$
 DECLARE
-  
+
   newpoints INTEGER;
   waynodes BIGINT[];
   nodeid BIGINT;
@@ -804,117 +804,103 @@ DECLARE
   originalnumberrange INTEGER;
   housenum INTEGER;
   linegeo GEOMETRY;
+  splitline GEOMETRY;
+  sectiongeo GEOMETRY;
   search_place_id BIGINT;
   defpostalcode TEXT;
 
-  havefirstpoint BOOLEAN;
-  linestr TEXT;
 BEGIN
-  newpoints := 0;
-  IF interpolationtype = 'odd' OR interpolationtype = 'even' OR interpolationtype = 'all' THEN
-
-    select postcode from placex where osm_type = 'W' and osm_id = wayid INTO defpostalcode;
-    select nodes from planet_osm_ways where id = wayid INTO waynodes;
---RAISE WARNING 'interpolation % % %',wayid,interpolationtype,waynodes;
-    IF array_upper(waynodes, 1) IS NOT NULL THEN
-
-      havefirstpoint := false;
-
-      FOR nodeidpos in 1..array_upper(waynodes, 1) LOOP
-
-        -- If there is a place of a type other than place/house, use that because
-        -- it is guaranteed to be the original node. For place/house types use the
-        -- one with the smallest id because the original node was created first.
-        -- Ignore all nodes marked for deletion. (Might happen when the type changes.)
-        select place_id from placex where osm_type = 'N' and osm_id = waynodes[nodeidpos]::BIGINT and indexed_status < 100 order by (type = 'house'),place_id limit 1 INTO search_place_id;
-        IF search_place_id IS NULL THEN
-          -- if no such node exists, create a record of the right type
-          select * from placex where osm_type = 'N' and osm_id = waynodes[nodeidpos]::BIGINT and type = 'house' limit 1 INTO nextnode;
-          select ST_SetSRID(ST_Point(lon::float/10000000,lat::float/10000000),4326) from planet_osm_nodes where id = waynodes[nodeidpos] INTO nextnode.geometry;
-          IF nextnode.geometry IS NULL THEN
-            -- we don't have any information about this point, most likely
-            -- because an excerpt was updated and the node never imported
-            -- because the interpolation is outside the region of the excerpt.
-            -- Give up.
-            RETURN newpoints;
-          END IF;
-        ELSE
-          select * from placex where place_id = search_place_id INTO nextnode;
-        END IF;
+  IF interpolationtype = 'odd' OR interpolationtype = 'even' THEN
+    stepsize := 2;
+  ELSEIF interpolationtype = 'all' THEN
+    stepsize := 1;
+  ELSEIF interpolationtype ~ '^\d+$' THEN
+    stepsize := interpolationtype::INTEGER;
+  ELSE
+    RETURN 0;
+  END IF;
 
---RAISE WARNING 'interpolation node % % % ',nextnode.housenumber,ST_X(nextnode.geometry),ST_Y(nextnode.geometry);
-      
-        IF havefirstpoint THEN
+  select nodes from planet_osm_ways where id = wayid INTO waynodes;
 
-          -- add point to the line string
-          linestr := linestr||','||ST_X(nextnode.geometry)||' '||ST_Y(nextnode.geometry);
-          endnumber := ('0'||substring(nextnode.housenumber,'[0-9]+'))::integer;
+  IF array_upper(waynodes, 1) IS NULL THEN
+    RETURN 0;
+  END IF;
 
-          IF startnumber IS NOT NULL and startnumber > 0 AND endnumber IS NOT NULL and endnumber > 0 AND @(startnumber - endnumber) < 1000 THEN
+  select postcode, geometry from placex where osm_type = 'W' and osm_id = wayid 
+    INTO defpostalcode, linegeo;
 
---RAISE WARNING 'interpolation end % % ',nextnode.place_id,endnumber;
+  IF ST_GeometryType(linegeo) != 'ST_LineString' THEN
+    RETURN 0;
+  END IF;
 
-            IF startnumber != endnumber THEN
+  startnumber := NULL;
+  newpoints := 0;
 
-              linestr := linestr || ')';
---RAISE WARNING 'linestr %',linestr;
-              linegeo := ST_GeomFromText(linestr,4326);
-              linestr := 'LINESTRING('||ST_X(nextnode.geometry)||' '||ST_Y(nextnode.geometry);
-              IF (startnumber > endnumber) THEN
-                housenum := endnumber;
-                endnumber := startnumber;
-                startnumber := housenum;
-                linegeo := ST_Reverse(linegeo);
-              END IF;
-              orginalstartnumber := startnumber;
-              originalnumberrange := endnumber - startnumber;
-
--- Too much broken data worldwide for this test to be worth using
---              IF originalnumberrange > 500 THEN
---                RAISE WARNING 'Number block of % while processing % %', originalnumberrange, prevnode, nextnode;
---              END IF;
-
-              IF (interpolationtype = 'odd' AND startnumber%2 = 0) OR (interpolationtype = 'even' AND startnumber%2 = 1) THEN
-                startnumber := startnumber + 1;
-                stepsize := 2;
-              ELSE
-                IF (interpolationtype = 'odd' OR interpolationtype = 'even') THEN
-                  startnumber := startnumber + 2;
-                  stepsize := 2;
-                ELSE -- everything else assumed to be 'all'
-                  startnumber := startnumber + 1;
-                  stepsize := 1;
-                END IF;
-              END IF;
-              endnumber := endnumber - 1;
-              delete from placex where osm_type = 'N' and osm_id = prevnode.osm_id and type = 'house' and place_id != prevnode.place_id;
-              FOR housenum IN startnumber..endnumber BY stepsize LOOP
-                -- this should really copy postcodes but it puts a huge burdon on the system for no big benefit
-                -- ideally postcodes should move up to the way
-                insert into placex (osm_type, osm_id, class, type, admin_level, housenumber, street, addr_place, isin, postcode,
-                  country_code, parent_place_id, rank_address, rank_search, indexed_status, geometry)
-                  values ('N',prevnode.osm_id, 'place', 'house', prevnode.admin_level, housenum, prevnode.street, prevnode.addr_place, prevnode.isin, coalesce(prevnode.postcode, defpostalcode),
-                  prevnode.country_code, prevnode.parent_place_id, prevnode.rank_address, prevnode.rank_search, 1, ST_LineInterpolatePoint(linegeo, (housenum::float-orginalstartnumber::float)/originalnumberrange::float));
-                newpoints := newpoints + 1;
---RAISE WARNING 'interpolation number % % ',prevnode.place_id,housenum;
-              END LOOP;
-            END IF;
-            havefirstpoint := false;
+  FOR nodeidpos in 1..array_upper(waynodes, 1) LOOP
+
+    -- If there is a place of a type other than place/house, use that because
+    -- it is guaranteed to be the original node. For place/house types use the
+    -- one with the smallest id because the original node was created first.
+    -- Ignore all nodes marked for deletion. (Might happen when the type changes.)
+    select place_id from placex where osm_type = 'N' and osm_id = waynodes[nodeidpos]::BIGINT and indexed_status < 100 order by (type = 'house'),place_id limit 1 INTO search_place_id;
+    IF search_place_id IS NOT NULL THEN
+      select * from placex where place_id = search_place_id INTO nextnode;
+
+        IF nodeidpos < array_upper(waynodes, 1) THEN
+          -- Make sure that the point is actually on the line. That might
+          -- be a bit paranoid but ensures that the algorithm still works
+          -- should osm2pgsql attempt to repair geometries.
+          splitline := split_line_on_node(linegeo, nextnode.geometry);
+          sectiongeo := ST_GeometryN(splitline, 1);
+          IF ST_GeometryType(ST_GeometryN(splitline, 2)) = 'ST_LineString' THEN
+            linegeo := ST_GeometryN(splitline, 2);
           END IF;
+        ELSE
+          sectiongeo = linegeo;
         END IF;
+        endnumber := substring(nextnode.housenumber,'[0-9]+')::integer;
 
-        IF NOT havefirstpoint THEN
-          startnumber := ('0'||substring(nextnode.housenumber,'[0-9]+'))::integer;
-          IF startnumber IS NOT NULL AND startnumber > 0 THEN
-            havefirstpoint := true;
-            linestr := 'LINESTRING('||ST_X(nextnode.geometry)||' '||ST_Y(nextnode.geometry);
-            prevnode := nextnode;
+        IF startnumber IS NOT NULL AND endnumber IS NOT NULL
+           AND @(startnumber - endnumber) < 1000 AND startnumber != endnumber
+           AND ST_GeometryType(linegeo) = 'ST_LineString' THEN
+
+          IF (startnumber > endnumber) THEN
+            housenum := endnumber;
+            endnumber := startnumber;
+            startnumber := housenum;
+            sectiongeo := ST_Reverse(sectiongeo);
           END IF;
---RAISE WARNING 'interpolation start % % ',nextnode.place_id,startnumber;
+          orginalstartnumber := startnumber;
+          originalnumberrange := endnumber - startnumber;
+
+          startnumber := startnumber + stepsize;
+          -- correct for odd/even
+          IF (interpolationtype = 'odd' AND startnumber%2 = 0) OR (interpolationtype = 'even' AND startnumber%2 = 1) THEN
+            startnumber := startnumber - 1;
+          END IF;
+          endnumber := endnumber - 1;
+
+          delete from placex where osm_type = 'N' and osm_id = prevnode.osm_id and type = 'house' and place_id != prevnode.place_id;
+          FOR housenum IN startnumber..endnumber BY stepsize LOOP
+            -- this should really copy postcodes but it puts a huge burden on
+            -- the system for no big benefit ideally postcodes should move up to the way
+            insert into placex (osm_type, osm_id, class, type, admin_level,
+              housenumber, street, addr_place, isin, postcode,
+              country_code, parent_place_id, rank_address, rank_search,
+              indexed_status, geometry)
+              values ('N', prevnode.osm_id, 'place', 'house', prevnode.admin_level,
+              housenum, prevnode.street, prevnode.addr_place, prevnode.isin, coalesce(prevnode.postcode, defpostalcode),
+              prevnode.country_code, prevnode.parent_place_id, prevnode.rank_address, prevnode.rank_search,
+              1, ST_LineInterpolatePoint(sectiongeo, (housenum::float-orginalstartnumber::float)/originalnumberrange::float));
+            newpoints := newpoints + 1;
+--RAISE WARNING 'interpolation number % % ',prevnode.place_id,housenum;
+          END LOOP;
         END IF;
-      END LOOP;
+
+        startnumber := substring(nextnode.housenumber,'[0-9]+')::integer;
+        prevnode := nextnode;
     END IF;
-  END IF;
+  END LOOP;
 
 --RAISE WARNING 'interpolation points % ',newpoints;
 
diff --git a/sql/postgis_15_aux.sql b/sql/postgis_15_aux.sql
new file mode 100644 (file)
index 0000000..548e0fe
--- /dev/null
@@ -0,0 +1,14 @@
+-- Splits the line at the given point and returns the two parts
+-- in a multilinestring.
+CREATE OR REPLACE FUNCTION split_line_on_node(line GEOMETRY, point GEOMETRY)
+RETURNS GEOMETRY
+  AS $$
+DECLARE
+  frac FLOAT;
+BEGIN
+  frac := ST_Line_Locate_Point(line, point);
+  RETURN ST_Collect(ST_Line_Substring(line, 0, frac),
+         ST_Line_Substring(line, frac, 1));
+END
+$$
+LANGUAGE plpgsql;
diff --git a/sql/postgis_20_aux.sql b/sql/postgis_20_aux.sql
new file mode 100644 (file)
index 0000000..dc74e09
--- /dev/null
@@ -0,0 +1,10 @@
+-- Splits the line at the given point and returns the two parts
+-- in a multilinestring.
+CREATE OR REPLACE FUNCTION split_line_on_node(line GEOMETRY, point GEOMETRY)
+RETURNS GEOMETRY
+  AS $$
+BEGIN
+  RETURN ST_Split(line, ST_ClosestPoint(line, point));
+END;
+$$
+LANGUAGE plpgsql;
diff --git a/tests/features/db/import/interpolation.feature b/tests/features/db/import/interpolation.feature
new file mode 100644 (file)
index 0000000..9a4856f
--- /dev/null
@@ -0,0 +1,329 @@
+@DB
+Feature: Import of address interpolations
+    Tests that interpolated addresses are added correctly
+
+    Scenario: Simple even two point interpolation
+        Given the place nodes
+          | osm_id | class | type  | housenumber | geometry
+          | 1      | place | house | 2           | 1 1
+          | 2      | place | house | 6           | 1 1.001
+        And the place ways
+          | osm_id | class | type   | housenumber | geometry
+          | 1      | place | houses | even        | 1 1, 1 1.001
+        And the ways
+          | id | nodes
+          | 1  | 1,2
+        When importing
+        Then node 1 expands to housenumbers
+          | housenumber | centroid
+          | 2           | 1,1
+          | 4           | 1,1.0005
+        And node 2 expands to housenumbers
+          | housenumber | centroid
+          | 6           | 1,1.001
+
+    Scenario: Simple even two point interpolation with zero beginning
+        Given the place nodes
+          | osm_id | class | type  | housenumber | geometry
+          | 1      | place | house | 0           | 1 1
+          | 2      | place | house | 8           | 1 1.001
+        And the place ways
+          | osm_id | class | type   | housenumber | geometry
+          | 1      | place | houses | even        | 1 1, 1 1.001
+        And the ways
+          | id | nodes
+          | 1  | 1,2
+        When importing
+        Then node 1 expands to housenumbers
+          | housenumber | centroid
+          | 0           | 1,1
+          | 2           | 1,1.00025
+          | 4           | 1,1.0005
+          | 6           | 1,1.00075
+        And node 2 expands to housenumbers
+          | housenumber | centroid
+          | 8           | 1,1.001
+
+    Scenario: Backwards even two point interpolation
+        Given the place nodes
+          | osm_id | class | type  | housenumber | geometry
+          | 1      | place | house | 2           | 1 1
+          | 2      | place | house | 6           | 1 1.001
+        And the place ways
+          | osm_id | class | type   | housenumber | geometry
+          | 1      | place | houses | even        | 1 1.001, 1 1
+        And the ways
+          | id | nodes
+          | 1  | 2,1
+        When importing
+        Then node 1 expands to housenumbers
+          | housenumber | centroid
+          | 2           | 1,1
+        And node 2 expands to housenumbers
+          | housenumber | centroid
+          | 4           | 1,1.0005
+          | 6           | 1,1.001
+
+    Scenario: Even two point interpolation with odd beginning
+        Given the place nodes
+          | osm_id | class | type  | housenumber | geometry
+          | 1      | place | house | 11          | 1 1
+          | 2      | place | house | 16          | 1 1.001
+        And the place ways
+          | osm_id | class | type   | housenumber | geometry
+          | 1      | place | houses | even        | 1 1, 1 1.001
+        And the ways
+          | id | nodes
+          | 1  | 1,2
+        When importing
+        Then node 1 expands to housenumbers
+          | housenumber | centroid
+          | 11          | 1,1
+          | 12          | 1,1.0002
+          | 14          | 1,1.0006
+        And node 2 expands to housenumbers
+          | housenumber | centroid
+          | 16          | 1,1.001
+
+    Scenario: Even two point interpolation with odd end
+        Given the place nodes
+          | osm_id | class | type  | housenumber | geometry
+          | 1      | place | house | 10          | 1 1
+          | 2      | place | house | 15          | 1 1.001
+        And the place ways
+          | osm_id | class | type   | housenumber | geometry
+          | 1      | place | houses | even        | 1 1, 1 1.001
+        And the ways
+          | id | nodes
+          | 1  | 1,2
+        When importing
+        Then node 1 expands to housenumbers
+          | housenumber | centroid
+          | 10          | 1,1
+          | 12          | 1,1.0004
+          | 14          | 1,1.0008
+        And node 2 expands to housenumbers
+          | housenumber | centroid
+          | 15          | 1,1.001
+
+    Scenario: Reverse even two point interpolation with odd beginning
+        Given the place nodes
+          | osm_id | class | type  | housenumber | geometry
+          | 1      | place | house | 11          | 1 1
+          | 2      | place | house | 16          | 1 1.001
+        And the place ways
+          | osm_id | class | type   | housenumber | geometry
+          | 1      | place | houses | even        | 1 1.001, 1 1
+        And the ways
+          | id | nodes
+          | 1  | 2,1
+        When importing
+        Then node 1 expands to housenumbers
+          | housenumber | centroid
+          | 11          | 1,1
+        And node 2 expands to housenumbers
+          | housenumber | centroid
+          | 12          | 1,1.0002
+          | 14          | 1,1.0006
+          | 16          | 1,1.001
+
+    Scenario: Reverse even two point interpolation with odd end
+        Given the place nodes
+          | osm_id | class | type  | housenumber | geometry
+          | 1      | place | house | 10          | 1 1
+          | 2      | place | house | 15          | 1 1.001
+        And the place ways
+          | osm_id | class | type   | housenumber | geometry
+          | 1      | place | houses | even        | 1 1.001, 1 1
+        And the ways
+          | id | nodes
+          | 1  | 2,1
+        When importing
+        Then node 1 expands to housenumbers
+          | housenumber | centroid
+          | 10          | 1,1
+        And node 2 expands to housenumbers
+          | housenumber | centroid
+          | 12          | 1,1.0004
+          | 14          | 1,1.0008
+          | 15          | 1,1.001
+
+      Scenario: Simple odd two point interpolation
+        Given the place nodes
+          | osm_id | class | type  | housenumber | geometry
+          | 1      | place | house | 1           | 1 1
+          | 2      | place | house | 11          | 1 1.001
+        And the place ways
+          | osm_id | class | type   | housenumber | geometry
+          | 1      | place | houses | odd         | 1 1, 1 1.001
+        And the ways
+          | id | nodes
+          | 1  | 1,2
+        When importing
+        Then node 1 expands to housenumbers
+          | housenumber | centroid
+          | 1           | 1,1
+          | 3           | 1,1.0002
+          | 5           | 1,1.0004
+          | 7           | 1,1.0006
+          | 9           | 1,1.0008
+        And node 2 expands to housenumbers
+          | housenumber | centroid
+          | 11           | 1,1.001
+
+      Scenario: Odd two point interpolation with even beginning
+        Given the place nodes
+          | osm_id | class | type  | housenumber | geometry
+          | 1      | place | house | 2           | 1 1
+          | 2      | place | house | 7           | 1 1.001
+        And the place ways
+          | osm_id | class | type   | housenumber | geometry
+          | 1      | place | houses | odd         | 1 1, 1 1.001
+        And the ways
+          | id | nodes
+          | 1  | 1,2
+        When importing
+        Then node 1 expands to housenumbers
+          | housenumber | centroid
+          | 2           | 1,1
+          | 3           | 1,1.0002
+          | 5           | 1,1.0006
+        And node 2 expands to housenumbers
+          | housenumber | centroid
+          | 7           | 1,1.001
+
+     Scenario: Simple all two point interpolation
+        Given the place nodes
+          | osm_id | class | type  | housenumber | geometry
+          | 1      | place | house | 1           | 1 1
+          | 2      | place | house | 3           | 1 1.001
+        And the place ways
+          | osm_id | class | type   | housenumber | geometry
+          | 1      | place | houses | all         | 1 1, 1 1.001
+        And the ways
+          | id | nodes
+          | 1  | 1,2
+        When importing
+        Then node 1 expands to housenumbers
+          | housenumber | centroid
+          | 1           | 1,1
+          | 2           | 1,1.0005
+        And node 2 expands to housenumbers
+          | housenumber | centroid
+          | 3           | 1,1.001
+
+    Scenario: Simple numbered two point interpolation
+        Given the place nodes
+          | osm_id | class | type  | housenumber | geometry
+          | 1      | place | house | 3           | 1 1
+          | 2      | place | house | 9           | 1 1.001
+        And the place ways
+          | osm_id | class | type   | housenumber | geometry
+          | 1      | place | houses | 3           | 1 1, 1 1.001
+        And the ways
+          | id | nodes
+          | 1  | 1,2
+        When importing
+        Then node 1 expands to housenumbers
+          | housenumber | centroid
+          | 3           | 1,1
+          | 6           | 1,1.0005
+        And node 2 expands to housenumbers
+          | housenumber | centroid
+          | 9           | 1,1.001
+
+    Scenario: Even two point interpolation with intermediate empty node
+        Given the place nodes
+          | osm_id | class | type  | housenumber | geometry
+          | 1      | place | house | 2           | 1 1
+          | 2      | place | house | 10          | 1.001 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
+        And the ways
+          | id | nodes
+          | 1  | 1,3,2
+        When importing
+        Then node 1 expands to housenumbers
+          | housenumber | centroid
+          | 2           | 1,1
+          | 4           | 1,1.0005
+          | 6           | 1,1.001
+          | 8           | 1.0005,1.001
+        And node 2 expands to housenumbers
+          | housenumber | centroid
+          | 10          | 1.001,1.001
+
+
+    Scenario: Even two point interpolation with intermediate duplicated empty node
+        Given the place nodes
+          | osm_id | class | type  | housenumber | geometry
+          | 1      | place | house | 2           | 1 1
+          | 2      | place | house | 10          | 1.001 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
+        And the ways
+          | id | nodes
+          | 1  | 1,3,3,2
+        When importing
+        Then node 1 expands to housenumbers
+          | housenumber | centroid
+          | 2           | 1,1
+          | 4           | 1,1.0005
+          | 6           | 1,1.001
+          | 8           | 1.0005,1.001
+        And node 2 expands to housenumbers
+          | housenumber | centroid
+          | 10          | 1.001,1.001
+
+    Scenario: Simple even three point interpolation
+        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
+        And the place ways
+          | osm_id | class | type   | housenumber | geometry
+          | 1      | place | houses | even        | 1 1, 1 1.001, 1.001 1.001
+        And the ways
+          | id | nodes
+          | 1  | 1,3,2
+        When importing
+        Then node 1 expands to housenumbers
+          | housenumber | centroid
+          | 2           | 1,1
+        Then node 3 expands to housenumbers
+          | housenumber | centroid
+          | 4           | 1,1.001
+          | 6           | 1.0005,1.001
+        And node 2 expands to housenumbers
+          | housenumber | centroid
+          | 8           | 1.001,1.001
+
+    Scenario: Even three point interpolation with odd center point
+        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 | 7           | 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
+        And the ways
+          | id | nodes
+          | 1  | 1,3,2
+        When importing
+        Then node 1 expands to housenumbers
+          | housenumber | centroid
+          | 2           | 1,1
+          | 4           | 1,1.0004
+          | 6           | 1,1.0008
+        Then node 3 expands to housenumbers
+          | housenumber | centroid
+          | 7           | 1,1.001
+        And node 2 expands to housenumbers
+          | housenumber | centroid
+          | 8           | 1.001,1.001
+
+
index 9da1ad6b703c905c2775e9fe8f35520454ffd79f..2b44215e7e0aa328f421421559c2b60b186dbf44 100644 (file)
@@ -110,6 +110,27 @@ def check_search_name_content(step):
                 else:
                     raise Exception("Cannot handle field %s in search_name table" % (k, ))
 
+@step(u'node (\d+) expands to housenumbers')
+def check_interpolated_housenumbers(step, nodeid):
+    """Check that the exact set of housenumbers has been entered in
+       placex for the given source node. Expected are tow columns:
+       housenumber and centroid
+    """
+    numbers = {}
+    for line in step.hashes:
+        assert line["housenumber"] not in numbers
+        numbers[line["housenumber"]] = line["centroid"]
+    cur = world.conn.cursor(cursor_factory=psycopg2.extras.DictCursor)
+    cur.execute("""SELECT DISTINCT housenumber,
+                          ST_X(centroid) as clat, ST_Y(centroid) as clon
+                   FROM placex WHERE osm_type = 'N' and osm_id = %s""",
+                   (int(nodeid),))
+    assert_equals(len(numbers), cur.rowcount)
+    for r in cur:
+        assert_in(r["housenumber"], numbers)
+        world.match_geometry((r['clat'], r['clon']), numbers[r["housenumber"]])
+        del numbers[r["housenumber"]]
+
 
 @step(u'table search_name has no entry for (.*)')
 def check_placex_missing(step, osmid):
index e588bb084a5ff285e60e62ee38be4978eada8843..cece86867417969914b5137a4bdf1d156419b28a 100755 (executable)
@@ -89,6 +89,8 @@
        $aDSNInfo = DB::parseDSN(CONST_Database_DSN);
        if (!isset($aDSNInfo['port']) || !$aDSNInfo['port']) $aDSNInfo['port'] = 5432;
 
+       $fPostgisVersion = (float) CONST_Postgis_Version;
+
        if ($aCMDResult['create-db'] || $aCMDResult['all'])
        {
                echo "Create DB\n";
                        pgsqlRunScript('CREATE EXTENSION hstore');
                }
 
-               $fPostgisVersion = (float) CONST_Postgis_Version;
                if ($fPostgisVersion < 2.0) {
                        pgsqlRunScriptFile(CONST_Path_Postgresql_Postgis.'/postgis.sql');
                        pgsqlRunScriptFile(CONST_Path_Postgresql_Postgis.'/spatial_ref_sys.sql');
                if ($aCMDResult['enable-debug-statements']) $sTemplate = str_replace('--DEBUG:', '', $sTemplate);
                if (CONST_Limit_Reindexing) $sTemplate = str_replace('--LIMIT INDEXING:', '', $sTemplate);
                pgsqlRunScript($sTemplate);
+               if ($fPostgisVersion < 2.0) {
+                       echo "Helper functions for postgis < 2.0\n";
+                       $sTemplate = file_get_contents(CONST_BasePath.'/sql/postgis_15_aux.sql');
+               } else {
+                       echo "Helper functions for postgis >= 2.0\n";
+                       $sTemplate = file_get_contents(CONST_BasePath.'/sql/postgis_20_aux.sql');
+               }
+               pgsqlRunScript($sTemplate);
        }
 
        if ($aCMDResult['create-minimal-tables'])
        {
                showUsage($aCMDOptions, true);
        }
+       else
+       {
+               echo "Setup finished.\n";
+       }
 
        function pgsqlRunScriptFile($sFilename)
        {