X-Git-Url: https://git.openstreetmap.org./nominatim.git/blobdiff_plain/d23bf6e659f49f909c6a64159b95105e5f42b875..7d520bf448191d12b96265fb066dd7039cde041c:/sql/functions/placex_triggers.sql?ds=inline

diff --git a/sql/functions/placex_triggers.sql b/sql/functions/placex_triggers.sql
index c9095fbe..e80f14cb 100644
--- a/sql/functions/placex_triggers.sql
+++ b/sql/functions/placex_triggers.sql
@@ -138,6 +138,7 @@ DECLARE
 BEGIN
   IF bnd.rank_search >= 26 or bnd.rank_address = 0
      or ST_GeometryType(bnd.geometry) NOT IN ('ST_Polygon','ST_MultiPolygon')
+     or bnd.type IN ('postcode', 'postal_code')
   THEN
     RETURN NULL;
   END IF;
@@ -507,7 +508,7 @@ DECLARE
   location RECORD;
   relation_members TEXT[];
 
-  centroid GEOMETRY;
+  geom GEOMETRY;
   parent_address_level SMALLINT;
   place_address_level SMALLINT;
 
@@ -813,8 +814,8 @@ BEGIN
 
       END IF;
 
-      IF array_length(name_vector, 1) is not NULL
-         OR inherited_address is not NULL OR NEW.address is not NULL
+      IF not %REVERSE-ONLY% AND (array_length(name_vector, 1) is not NULL
+         OR inherited_address is not NULL OR NEW.address is not NULL)
       THEN
         SELECT * INTO name_vector, nameaddress_vector
           FROM create_poi_search_terms(NEW.place_id,
@@ -823,7 +824,7 @@ BEGIN
                                        NEW.country_code, NEW.housenumber,
                                        name_vector, NEW.centroid);
 
-        IF not %REVERSE-ONLY% AND array_length(name_vector, 1) is not NULL THEN
+        IF array_length(name_vector, 1) is not NULL THEN
           INSERT INTO search_name (place_id, search_rank, address_rank,
                                    importance, country_code, name_vector,
                                    nameaddress_vector, centroid)
@@ -848,9 +849,9 @@ BEGIN
 
     -- Use the linked point as the centre point of the geometry,
     -- but only if it is within the area of the boundary.
-    centroid := coalesce(location.centroid, ST_Centroid(location.geometry));
-    IF centroid is not NULL AND ST_Within(centroid, NEW.geometry) THEN
-        NEW.centroid := centroid;
+    geom := coalesce(location.centroid, ST_Centroid(location.geometry));
+    IF geom is not NULL AND ST_Within(geom, NEW.geometry) THEN
+        NEW.centroid := geom;
     END IF;
 
     --DEBUG: RAISE WARNING 'parent address: % rank address: %', parent_address_level, location.rank_address;
@@ -917,8 +918,23 @@ BEGIN
     --DEBUG: RAISE WARNING 'Country names updated';
   END IF;
 
+  -- For linear features we need the full geometry for determining the address
+  -- because they may go through several administrative entities. Otherwise use
+  -- the centroid for performance reasons.
+  IF ST_GeometryType(NEW.geometry) in ('ST_LineString', 'ST_MultiLineString') THEN
+    geom := NEW.geometry;
+  ELSE
+    geom := NEW.centroid;
+  END IF;
+
   IF NEW.rank_address = 0 THEN
     max_rank := geometry_to_rank(NEW.rank_search, NEW.geometry, NEW.country_code);
+    -- Rank 0 features may also span multiple administrative areas (e.g. lakes)
+    -- so use the geometry here too. Just make sure the areas don't become too
+    -- large.
+    IF NEW.class = 'natural' or max_rank > 10 THEN
+      geom := NEW.geometry;
+    END IF;
   ELSEIF NEW.rank_address > 25 THEN
     max_rank := 25;
   ELSE
@@ -926,11 +942,7 @@ BEGIN
   END IF;
 
   SELECT * FROM insert_addresslines(NEW.place_id, NEW.partition, max_rank,
-                                    NEW.address,
-                                    CASE WHEN (NEW.rank_address = 0 or
-                                               NEW.rank_search between 26 and 29)
-                                         THEN NEW.geometry ELSE NEW.centroid END,
-                                    NEW.country_code)
+                                    NEW.address, geom, NEW.country_code)
     INTO NEW.parent_place_id, NEW.postcode, nameaddress_vector;
 
   --DEBUG: RAISE WARNING 'RETURN insert_addresslines: %, %, %', NEW.parent_place_id, NEW.postcode, nameaddress_vector;
