]> git.openstreetmap.org Git - nominatim.git/commitdiff
Merge remote-tracking branch 'upstream/master'
authorSarah Hoffmann <lonvia@denofr.de>
Wed, 23 Sep 2020 17:11:11 +0000 (19:11 +0200)
committerSarah Hoffmann <lonvia@denofr.de>
Wed, 23 Sep 2020 17:11:11 +0000 (19:11 +0200)
sql/functions/place_triggers.sql
sql/functions/placex_triggers.sql
sql/functions/utils.sql

index b7b51150dcf6269fc05d631142789b02583c05e8..eaba12be226722b8e97584aca60c653c68f85b86 100644 (file)
@@ -162,14 +162,14 @@ BEGIN
       IF st_area(NEW.geometry) < 0.000000001 AND st_area(existinggeometry) < 1 THEN
 
         -- re-index points that have moved in / out of the polygon, could be done as a single query but postgres gets the index usage wrong
-        update placex set indexed_status = 2 where indexed_status = 0 and 
-            (st_covers(NEW.geometry, placex.geometry) OR ST_Intersects(NEW.geometry, placex.geometry))
-            AND NOT (st_covers(existinggeometry, placex.geometry) OR ST_Intersects(existinggeometry, placex.geometry))
+        update placex set indexed_status = 2 where indexed_status = 0
+            AND ST_Intersects(NEW.geometry, placex.geometry)
+            AND NOT ST_Intersects(existinggeometry, placex.geometry)
             AND rank_search > existingplacex.rank_search AND (rank_search < 28 or name is not null);
 
-        update placex set indexed_status = 2 where indexed_status = 0 and 
-            (st_covers(existinggeometry, placex.geometry) OR ST_Intersects(existinggeometry, placex.geometry))
-            AND NOT (st_covers(NEW.geometry, placex.geometry) OR ST_Intersects(NEW.geometry, placex.geometry))
+        update placex set indexed_status = 2 where indexed_status = 0
+            AND ST_Intersects(existinggeometry, placex.geometry)
+            AND NOT ST_Intersects(NEW.geometry, placex.geometry)
             AND rank_search > existingplacex.rank_search AND (rank_search < 28 or name is not null);
 
       END IF;
index d39699f795b18a7abadf1aaee0fa6f431a665b2b..9ef83b82d3ed9b9db332796a43dcab09c9186917 100644 (file)
@@ -93,13 +93,15 @@ BEGIN
 
     IF fallback THEN
       IF addr_street is null and addr_place is not null THEN
-        -- The address is attached to a place we don't know. Find the
-        -- nearest place instead.
+        -- The address is attached to a place we don't know.
+        -- Instead simply use the containing area with the largest rank.
         FOR location IN
-          SELECT place_id FROM getNearFeatures(poi_partition, bbox, 26, '{}'::INTEGER[])
-            ORDER BY rank_address DESC, isguess asc, distance LIMIT 1
+          SELECT place_id FROM placex
+            WHERE bbox @ geometry AND _ST_Covers(geometry, ST_Centroid(bbox))
+                  AND rank_address between 5 and 25
+            ORDER BY rank_address desc
         LOOP
-          parent_place_id := location.place_id;
+            RETURN location.place_id;
         END LOOP;
       ELSEIF ST_Area(bbox) < 0.005 THEN
         -- for smaller features get the nearest road
@@ -450,11 +452,16 @@ BEGIN
         -- mark items within the geometry for re-indexing
   --    RAISE WARNING 'placex poly insert: % % % %',NEW.osm_type,NEW.osm_id,NEW.class,NEW.type;
 
-        -- work around bug in postgis, this may have been fixed in 2.0.0 (see http://trac.osgeo.org/postgis/ticket/547)
-        update placex set indexed_status = 2 where (st_covers(NEW.geometry, placex.geometry) OR ST_Intersects(NEW.geometry, placex.geometry)) 
-         AND rank_search > NEW.rank_search and indexed_status = 0 and ST_geometrytype(placex.geometry) = 'ST_Point' and (rank_search < 28 or name is not null or (NEW.rank_search >= 16 and address ? 'place'));
-        update placex set indexed_status = 2 where (st_covers(NEW.geometry, placex.geometry) OR ST_Intersects(NEW.geometry, placex.geometry)) 
-         AND rank_search > NEW.rank_search and indexed_status = 0 and ST_geometrytype(placex.geometry) != 'ST_Point' and (rank_search < 28 or name is not null or (NEW.rank_search >= 16 and address ? 'place'));
+        UPDATE placex SET indexed_status = 2
+         WHERE ST_Intersects(NEW.geometry, placex.geometry)
+               and indexed_status = 0
+               and ((rank_address = 0 and rank_search > NEW.rank_address)
+                    or rank_address > NEW.rank_address
+                    or (class = 'place' and osm_type = 'N')
+                   )
+               and (rank_search < 28
+                    or name is not null
+                    or (NEW.rank_address >= 16 and address ? 'place'));
       END IF;
     ELSE
       -- mark nearby items for re-indexing, where 'nearby' depends on the features rank_search and is a complete guess :(
index 6697ff971953a32972521d825a79016e25681f45..9f8d39889e1412be3db33a721595c9ba721beda9 100644 (file)
@@ -470,14 +470,20 @@ DECLARE
   rank SMALLINT;
 BEGIN
   UPDATE placex SET indexed_status = 2 WHERE place_id = placeid;
-  SELECT geometry, rank_search FROM placex WHERE place_id = placeid INTO placegeom, rank;
+
+  SELECT geometry, rank_address INTO placegeom, rank
+    FROM placex WHERE place_id = placeid;
+
   IF placegeom IS NOT NULL AND ST_IsValid(placegeom) THEN
-    IF ST_GeometryType(placegeom) in ('ST_Polygon','ST_MultiPolygon') THEN
-      FOR geom IN select split_geometry(placegeom) FROM placex WHERE place_id = placeid LOOP
-        update placex set indexed_status = 2 where (st_covers(geom, placex.geometry) OR ST_Intersects(geom, placex.geometry)) 
-        AND rank_search > rank and indexed_status = 0 and ST_geometrytype(placex.geometry) = 'ST_Point' and (rank_search < 28 or name is not null or (rank >= 16 and address ? 'place'));
-        update placex set indexed_status = 2 where (st_covers(geom, placex.geometry) OR ST_Intersects(geom, placex.geometry)) 
-        AND rank_search > rank and indexed_status = 0 and ST_geometrytype(placex.geometry) != 'ST_Point' and (rank_search < 28 or name is not null or (rank >= 16 and address ? 'place'));
+    IF ST_GeometryType(placegeom) in ('ST_Polygon','ST_MultiPolygon')
+       AND rank > 0
+    THEN
+      FOR geom IN SELECT split_geometry(placegeom) LOOP
+        UPDATE placex SET indexed_status = 2
+         WHERE ST_Intersects(geom, placex.geometry)
+               and indexed_status = 0
+               and ((rank_address = 0 and rank_search > rank) or rank_address > rank)
+               and (rank_search < 28 or name is not null or (rank >= 16 and address ? 'place'));
       END LOOP;
     ELSE
         diameter := update_place_diameter(rank);