X-Git-Url: https://git.openstreetmap.org./nominatim.git/blobdiff_plain/cffc7c0121a2d98bff9bafbc45f1fc1b7c1239e7..d3425c4fa916369116dec8a3f20d73b7ee9bd512:/sql/functions/placex_triggers.sql

diff --git a/sql/functions/placex_triggers.sql b/sql/functions/placex_triggers.sql
index 8d537855..f9d5b60f 100644
--- a/sql/functions/placex_triggers.sql
+++ b/sql/functions/placex_triggers.sql
@@ -31,7 +31,6 @@ BEGIN
     LOOP
       FOR i IN 1..array_upper(location.members, 1) BY 2 LOOP
         IF location.members[i+1] = 'street' THEN
-          --DEBUG: RAISE WARNING 'node in relation %',relation;
           FOR parent IN
             SELECT place_id from placex
              WHERE osm_type = 'W' and osm_id = substring(location.members[i],2)::bigint
@@ -535,6 +534,7 @@ DECLARE
 
   centroid GEOMETRY;
   parent_address_level SMALLINT;
+  place_address_level SMALLINT;
 
   addr_street TEXT;
   addr_place TEXT;
@@ -588,7 +588,19 @@ BEGIN
                             NEW.class, NEW.type, NEW.admin_level,
                             (NEW.extratags->'capital') = 'yes',
                             NEW.address->'postcode');
-
+  -- We must always increase the address level relative to the admin boundary.
+  IF NEW.class = 'boundary' and NEW.type = 'administrative' THEN
+    parent_address_level := get_parent_address_level(NEW.geometry, NEW.admin_level);
+    IF parent_address_level >= NEW.rank_address THEN
+      IF parent_address_level >= 24 THEN
+        NEW.rank_address := 25;
+      ELSE
+        NEW.rank_address := parent_address_level + 2;
+      END IF;
+    END IF;
+  ELSE
+    parent_address_level := 3;
+  END IF;
 
   --DEBUG: RAISE WARNING 'Copy over address tags';
   -- housenumber is a computed field, so start with an empty value
@@ -699,7 +711,6 @@ BEGIN
         NEW.housenumber := location.address->'housenumber';
         addr_street := location.address->'street';
         addr_place := location.address->'place';
-        --DEBUG: RAISE WARNING 'Found surrounding building % %', location.osm_type, location.osm_id;
       END LOOP;
     END IF;
 
@@ -785,8 +796,6 @@ BEGIN
         NEW.centroid := centroid;
     END IF;
 
-    -- Use the address rank of the linked place, if it has one
-    parent_address_level := get_parent_address_level(NEW.geometry, NEW.admin_level);
     --DEBUG: RAISE WARNING 'parent address: % rank address: %', parent_address_level, location.rank_address;
     IF location.rank_address > parent_address_level
        and location.rank_address < 26
@@ -824,6 +833,18 @@ BEGIN
     THEN
       NEW.importance = linked_importance;
     END IF;
+  ELSE
+    -- No linked place? As a last resort check if the boundary is tagged with
+    -- a place type and adapt the rank address.
+    IF NEW.rank_address > 0 and NEW.extratags ? 'place' THEN
+      SELECT address_rank INTO place_address_level
+        FROM compute_place_rank(NEW.country_code, 'A', 'place',
+                                NEW.extratags->'place', 0::SMALLINT, False, null);
+      IF place_address_level > parent_address_level and
+         place_address_level < 26 THEN
+        NEW.rank_address := place_address_level;
+      END IF;
+    END IF;
   END IF;
 
   -- Initialise the name vector using our name
@@ -840,7 +861,9 @@ BEGIN
   END IF;
 
   SELECT * FROM insert_addresslines(NEW.place_id, NEW.partition,
-                                    NEW.rank_search, NEW.address,
+                                    CASE WHEN NEW.rank_address = 0
+                                      THEN NEW.rank_search ELSE NEW.rank_address END,
+                                    NEW.address,
                                     CASE WHEN NEW.rank_search >= 26
                                              AND NEW.rank_search < 30
                                       THEN NEW.geometry ELSE NEW.centroid END)
