]> git.openstreetmap.org Git - nominatim.git/blobdiff - sql/functions/placex_triggers.sql
Merge pull request #1909 from lonvia/minor-fixes
[nominatim.git] / sql / functions / placex_triggers.sql
index d74ac1c963aaec6e40352975892c9fe33278f3b3..d9a65ecf6d1276981255691607466457f203d366 100644 (file)
@@ -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
@@ -99,12 +98,12 @@ BEGIN
         --DEBUG: RAISE WARNING 'Checked for nearest way (%)', parent_place_id;
       ELSE
         -- for larger features simply find the area with the largest rank that
-        -- contains the bbox
+        -- contains the bbox, only use addressable features
         FOR location IN
           SELECT place_id FROM placex
             WHERE bbox @ geometry AND _ST_Covers(geometry, ST_Centroid(bbox))
-                  AND rank_search between 5 and 25
-            ORDER BY rank_search desc
+                  AND rank_address between 5 and 25
+            ORDER BY rank_address desc
         LOOP
             RETURN location.place_id;
         END LOOP;
@@ -588,7 +587,15 @@ 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
+      NEW.rank_address := parent_address_level + 2;
+    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
@@ -661,7 +668,7 @@ BEGIN
                   UPDATE placex SET linked_place_id = NEW.place_id WHERE place_id = linked_node_id;
                   IF NOT %REVERSE-ONLY% THEN
                     DELETE FROM search_name WHERE place_id = linked_node_id;
-                 END IF;
+                  END IF;
                 END LOOP;
               END IF;
           END LOOP;
@@ -699,7 +706,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 +791,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
@@ -811,6 +815,7 @@ BEGIN
     IF NOT %REVERSE-ONLY% THEN
       DELETE FROM search_name WHERE place_id = location.place_id;
     END IF;
+    PERFORM deleteLocationArea(NEW.partition, location.place_id, NEW.rank_search);
 
     SELECT wikipedia, importance
       FROM compute_importance(location.extratags, NEW.country_code,