]> git.openstreetmap.org Git - nominatim.git/commitdiff
use bbox of geometry when searching for attached streets
authorSarah Hoffmann <lonvia@denofr.de>
Sun, 28 Jul 2019 11:28:27 +0000 (13:28 +0200)
committerSarah Hoffmann <lonvia@denofr.de>
Sun, 28 Jul 2019 11:28:27 +0000 (13:28 +0200)
As we are doing a distance search, this improves results for
large places like airports.

Fixes #1442.

sql/functions.sql
sql/partition-functions.src.sql
test/bdd/db/import/parenting.feature
test/bdd/db/update/parenting.feature [new file with mode: 0644]

index bad4b17c4a61e00938a97a4b6c8385bc203c7666..f696e23132804314cc848f330a445eb40c6e2039 100644 (file)
@@ -1286,7 +1286,7 @@ BEGIN
   -- cheaper but less acurate
   place_centroid := ST_PointOnSurface(NEW.geometry);
   -- For searching near features rather use the centroid
-  near_centroid := ST_Centroid(NEW.geometry);
+  near_centroid := ST_Envelope(NEW.geometry);
   NEW.centroid := null;
   NEW.postcode := null;
   --DEBUG: RAISE WARNING 'Computing preliminary centroid at %',ST_AsText(place_centroid);
@@ -1521,7 +1521,7 @@ BEGIN
              NEW.postcode := location.postcode;
           END IF;
           IF NEW.postcode is null THEN
-            NEW.postcode := get_nearest_postcode(NEW.country_code, near_centroid);
+            NEW.postcode := get_nearest_postcode(NEW.country_code, NEW.geometry);
           END IF;
       END IF;
 
@@ -1791,7 +1791,7 @@ BEGIN
                                   CASE WHEN NEW.rank_search >= 26
                                              AND NEW.rank_search < 30
                                        THEN NEW.geometry
-                                       ELSE near_centroid END,
+                                       ELSE place_centroid END,
                                   search_maxrank, isin_tokens)
   LOOP
     IF location.rank_address != location_rank_search THEN
index 20f71584c281c8ef28aa163dc00b97d260adab3b..f770e83e3d52143bacb0316ecff00bb359376b50 100644 (file)
@@ -95,7 +95,7 @@ BEGIN
           ST_Distance(centroid, point) as distance, null as isguess
           FROM search_name_-partition-
           WHERE name_vector && isin_token
-          AND ST_DWithin(centroid, point, 0.015)
+          AND centroid && ST_Expand(point, 0.015)
           AND search_rank between 26 and 27
       ORDER BY distance ASC limit 1
     LOOP
@@ -123,7 +123,7 @@ BEGIN
           ST_Distance(centroid, point) as distance, null as isguess
           FROM search_name_-partition-
           WHERE name_vector && isin_token
-          AND ST_DWithin(centroid, point, 0.04)
+          AND centroid && ST_Expand(point, 0.04)
           AND search_rank between 16 and 22
       ORDER BY distance ASC limit 1
     LOOP
index a36485390e8e3c18188aa8461caf9183a86b24c7..9d8286c2a0896bf2cd11c5bb3290f156971cc087 100644 (file)
@@ -224,7 +224,7 @@ Feature: Parenting of objects
         When importing
         Then placex contains
          | object | parent_place_id |
-         | W1     | W3 |
+         | W1     | W2 |
 
     Scenario: Building with addr:street tags
         Given the scene building-on-street-corner
diff --git a/test/bdd/db/update/parenting.feature b/test/bdd/db/update/parenting.feature
new file mode 100644 (file)
index 0000000..50a647a
--- /dev/null
@@ -0,0 +1,38 @@
+@DB
+Feature: Update parenting of objects
+
+Scenario: POI inside building inherits addr:street change
+        Given the scene building-on-street-corner
+        And the named places
+         | osm | class   | type       | geometry |
+         | N1  | amenity | bank       | :n-inner |
+         | N2  | shop    | bakery     | :n-edge-NS |
+         | N3  | shop    | supermarket| :n-edge-WE |
+        And the places
+         | osm | class    | type | addr_place | housenr | geometry |
+         | W1  | building | yes  | nowhere    | 3       | :w-building |
+        And the places
+         | osm | class    | type        | name | geometry |
+         | W2  | highway  | primary     | bar  | :w-WE |
+         | W3  | highway  | residential | foo  | :w-NS |
+        When importing
+        Then placex contains
+         | object | parent_place_id | housenumber |
+         | W1     | W2              | 3 |
+         | N1     | W3              | 3 |
+         | N2     | W3              | 3 |
+         | N3     | W2              | 3 |
+        When updating places
+         | osm | class    | type | street | addr_place | housenr | geometry    |
+         | W1  | building | yes  | foo    | nowhere    | 3       | :w-building |
+        And updating places
+         | osm | class   | type       | name | geometry |
+         | N3  | shop    | supermarket| well | :n-edge-WE |
+        Then placex contains
+         | object | parent_place_id | housenumber |
+         | W1     | W3              | 3 |
+         | N1     | W3              | 3 |
+         | N2     | W3              | 3 |
+         | N3     | W3              | 3 |
+
+