restrict size of features that get a full address search

It would be nice to always compute addresses for rank 0 objects
over the complete geometry, so that they can be found via all
the admin boundaries that they intersect. However, there are a
couple of extramely large boundaries in OSM (like timezones)
where this results in thousands of possible address candidates
that need to be checked. Fall back to getting the address of the
centroid for them.
This commit is contained in:
Sarah Hoffmann 2020-11-26 11:53:58 +01:00
parent 1f07d63dc5
commit 2db751700e

View File

@ -508,7 +508,7 @@ DECLARE
location RECORD; location RECORD;
relation_members TEXT[]; relation_members TEXT[];
centroid GEOMETRY; geom GEOMETRY;
parent_address_level SMALLINT; parent_address_level SMALLINT;
place_address_level SMALLINT; place_address_level SMALLINT;
@ -849,9 +849,9 @@ BEGIN
-- Use the linked point as the centre point of the geometry, -- Use the linked point as the centre point of the geometry,
-- but only if it is within the area of the boundary. -- but only if it is within the area of the boundary.
centroid := coalesce(location.centroid, ST_Centroid(location.geometry)); geom := coalesce(location.centroid, ST_Centroid(location.geometry));
IF centroid is not NULL AND ST_Within(centroid, NEW.geometry) THEN IF geom is not NULL AND ST_Within(geom, NEW.geometry) THEN
NEW.centroid := centroid; NEW.centroid := geom;
END IF; END IF;
--DEBUG: RAISE WARNING 'parent address: % rank address: %', parent_address_level, location.rank_address; --DEBUG: RAISE WARNING 'parent address: % rank address: %', parent_address_level, location.rank_address;
@ -918,8 +918,23 @@ BEGIN
--DEBUG: RAISE WARNING 'Country names updated'; --DEBUG: RAISE WARNING 'Country names updated';
END IF; 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 IF NEW.rank_address = 0 THEN
max_rank := geometry_to_rank(NEW.rank_search, NEW.geometry, NEW.country_code); 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 ELSEIF NEW.rank_address > 25 THEN
max_rank := 25; max_rank := 25;
ELSE ELSE
@ -927,11 +942,7 @@ BEGIN
END IF; END IF;
SELECT * FROM insert_addresslines(NEW.place_id, NEW.partition, max_rank, SELECT * FROM insert_addresslines(NEW.place_id, NEW.partition, max_rank,
NEW.address, NEW.address, geom, NEW.country_code)
CASE WHEN (NEW.rank_address = 0 or
NEW.rank_search between 26 and 29)
THEN NEW.geometry ELSE NEW.centroid END,
NEW.country_code)
INTO NEW.parent_place_id, NEW.postcode, nameaddress_vector; INTO NEW.parent_place_id, NEW.postcode, nameaddress_vector;
--DEBUG: RAISE WARNING 'RETURN insert_addresslines: %, %, %', NEW.parent_place_id, NEW.postcode, nameaddress_vector; --DEBUG: RAISE WARNING 'RETURN insert_addresslines: %, %, %', NEW.parent_place_id, NEW.postcode, nameaddress_vector;