]> git.openstreetmap.org Git - nominatim.git/blobdiff - sql/functions/placex_triggers.sql
demote admin boundaries for place areas
[nominatim.git] / sql / functions / placex_triggers.sql
index d847282486391566fc5393d2647813c4bc03dce7..e8e9bdb6de847b8a97d51b640f63e5aa75b5322f 100644 (file)
@@ -609,6 +609,7 @@ BEGIN
   IF NEW.class = 'boundary' and NEW.type = 'administrative'
      and NEW.osm_type = 'R' and NEW.rank_address > 0
   THEN
   IF NEW.class = 'boundary' and NEW.type = 'administrative'
      and NEW.osm_type = 'R' and NEW.rank_address > 0
   THEN
+    -- First, check that admin boundaries do not overtake each other rank-wise.
     parent_address_level := get_parent_address_level(NEW.centroid, NEW.admin_level);
     IF parent_address_level >= NEW.rank_address THEN
       IF parent_address_level >= 24 THEN
     parent_address_level := get_parent_address_level(NEW.centroid, NEW.admin_level);
     IF parent_address_level >= NEW.rank_address THEN
       IF parent_address_level >= 24 THEN
@@ -617,12 +618,24 @@ BEGIN
         NEW.rank_address := parent_address_level + 2;
       END IF;
     END IF;
         NEW.rank_address := parent_address_level + 2;
       END IF;
     END IF;
-  -- If a place node is contained in a admin boundary with the same address level
-  -- and has not been linked, then make the node a subpart by increasing the
-  -- address rank (city level and above).
+    -- Second check that the boundary is not completely contained in a
+    -- place area with a higher address rank
+    FOR location IN
+      SELECT rank_address FROM placex
+      WHERE class = 'place' and rank_address < 24
+            and rank_address > NEW.rank_address
+            and geometry && NEW.geometry
+            and ST_Relate(geometry, NEW.geometry, 'T*T***FF*') -- contains but not equal
+      ORDER BY rank_address desc LIMIT 1
+    LOOP
+        NEW.rank_address := location.rank_address + 2;
+    END LOOP;
   ELSEIF NEW.class = 'place' and NEW.osm_type = 'N'
      and NEW.rank_address between 16 and 23
   THEN
   ELSEIF NEW.class = 'place' and NEW.osm_type = 'N'
      and NEW.rank_address between 16 and 23
   THEN
+    -- If a place node is contained in a admin boundary with the same address level
+    -- and has not been linked, then make the node a subpart by increasing the
+    -- address rank (city level and above).
     FOR location IN
         SELECT rank_address FROM placex
         WHERE osm_type = 'R' and class = 'boundary' and type = 'administrative'
     FOR location IN
         SELECT rank_address FROM placex
         WHERE osm_type = 'R' and class = 'boundary' and type = 'administrative'