+ ELSEIF NEW.class = 'place'
+ and ST_GeometryType(NEW.geometry) in ('ST_Polygon', 'ST_MultiPolygon')
+ and NEW.rank_address between 16 and 23
+ THEN
+ -- For place areas make sure they are not completely contained in an area
+ -- with a equal or higher address rank.
+ FOR location IN
+ SELECT rank_address
+ FROM placex,
+ LATERAL compute_place_rank(country_code, 'A', class, type,
+ admin_level, False, null) prank
+ WHERE prank.address_rank < 24
+ and prank.address_rank >= NEW.rank_address
+ and geometry && NEW.geometry
+ and geometry ~ NEW.geometry -- needed because ST_Relate does not do bbox cover test
+ and ST_Relate(geometry, NEW.geometry, 'T*T***FF*') -- contains but not equal
+ ORDER BY prank.address_rank desc LIMIT 1
+ LOOP
+ NEW.rank_address := location.rank_address + 2;
+ END LOOP;