forked from hans/Nominatim
improve address ordering with mixes of place and admin areas
Resolves a couple of situations where a mixed use of places areas and administrative boundaries would result in a hierarchy that did not properly respect the contains relation.
This commit is contained in:
@@ -864,11 +864,11 @@ BEGIN
|
||||
|
||||
IF NEW.rank_address > 9 THEN
|
||||
-- Second check that the boundary is not completely contained in a
|
||||
-- place area with a higher address rank
|
||||
-- place area with a equal or 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 rank_address >= 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
|
||||
@@ -877,15 +877,32 @@ BEGIN
|
||||
NEW.rank_address := location.rank_address + 2;
|
||||
END LOOP;
|
||||
END IF;
|
||||
ELSEIF NEW.class = 'place' and NEW.osm_type = 'N'
|
||||
and NEW.rank_address between 16 and 23
|
||||
ELSEIF NEW.class = 'place'
|
||||
and ST_GeometryType(NEW.geometry) in ('ST_Polygon', 'ST_MultiPolygon')
|
||||
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 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
|
||||
WHERE rank_address < 24
|
||||
and rank_address >= 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 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
|
||||
-- If a place node is contained in an admin or place 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'
|
||||
WHERE osm_type = 'R'
|
||||
and rank_address = NEW.rank_address
|
||||
and geometry && NEW.centroid and _ST_Covers(geometry, NEW.centroid)
|
||||
LIMIT 1
|
||||
|
||||
Reference in New Issue
Block a user