From: Sarah Hoffmann Date: Fri, 22 Apr 2022 18:32:10 +0000 (+0200) Subject: Merge pull request #2678 from lonvia/address-part-order X-Git-Tag: v4.1.0~58 X-Git-Url: https://git.openstreetmap.org/nominatim.git/commitdiff_plain/de828b723e98955c3484e596dcd1f84437eb652b?hp=403e6f7e5c9aaeee6de0aefe76bdcbdb997cf108 Merge pull request #2678 from lonvia/address-part-order Change selection of primary address part for ways that cross boundaries --- diff --git a/lib-sql/functions/partition-functions.sql b/lib-sql/functions/partition-functions.sql index cf83f840..e5d356e1 100644 --- a/lib-sql/functions/partition-functions.sql +++ b/lib-sql/functions/partition-functions.sql @@ -39,7 +39,10 @@ BEGIN END $$ LANGUAGE plpgsql IMMUTABLE; -create or replace function getNearFeatures(in_partition INTEGER, feature GEOMETRY, maxrank INTEGER) RETURNS setof nearfeaturecentr AS $$ +CREATE OR REPLACE function getNearFeatures(in_partition INTEGER, feature GEOMETRY, + feature_centroid GEOMETRY, + maxrank INTEGER) +RETURNS setof nearfeaturecentr AS $$ DECLARE r nearfeaturecentr%rowtype; BEGIN @@ -48,7 +51,11 @@ BEGIN IF in_partition = {{ partition }} THEN FOR r IN SELECT place_id, keywords, rank_address, rank_search, - min(ST_Distance(feature, centroid)) as distance, + CASE WHEN isguess THEN ST_Distance(feature, centroid) + ELSE min(ST_Distance(feature_centroid, geometry)) + -- tie breaker when distance is the same (i.e. way is on boundary) + + 0.00001 * ST_Distance(feature, centroid) + END as distance, isguess, postcode, centroid FROM location_area_large_{{ partition }} WHERE geometry && feature diff --git a/lib-sql/functions/placex_triggers.sql b/lib-sql/functions/placex_triggers.sql index 9463bb27..8a65c555 100644 --- a/lib-sql/functions/placex_triggers.sql +++ b/lib-sql/functions/placex_triggers.sql @@ -449,6 +449,7 @@ CREATE OR REPLACE FUNCTION insert_addresslines(obj_place_id BIGINT, maxrank SMALLINT, token_info JSONB, geometry GEOMETRY, + centroid GEOMETRY, country TEXT, OUT parent_place_id BIGINT, OUT postcode TEXT, @@ -511,7 +512,7 @@ BEGIN END LOOP; FOR location IN - SELECT * FROM getNearFeatures(partition, geometry, maxrank) + SELECT * FROM getNearFeatures(partition, geometry, centroid, maxrank) WHERE not addr_place_ids @> ARRAY[place_id] ORDER BY rank_address, isguess asc, distance * @@ -1106,7 +1107,8 @@ BEGIN END IF; SELECT * FROM insert_addresslines(NEW.place_id, NEW.partition, max_rank, - NEW.token_info, geom, NEW.country_code) + NEW.token_info, geom, NEW.centroid, + NEW.country_code) INTO NEW.parent_place_id, NEW.postcode, nameaddress_vector; {% if debug %}RAISE WARNING 'RETURN insert_addresslines: %, %, %', NEW.parent_place_id, NEW.postcode, nameaddress_vector;{% endif %} diff --git a/lib-sql/functions/postcode_triggers.sql b/lib-sql/functions/postcode_triggers.sql index f6d81a88..3465e775 100644 --- a/lib-sql/functions/postcode_triggers.sql +++ b/lib-sql/functions/postcode_triggers.sql @@ -34,7 +34,7 @@ BEGIN NEW.parent_place_id = 0; FOR location IN SELECT place_id - FROM getNearFeatures(partition, NEW.geometry, NEW.rank_search) + FROM getNearFeatures(partition, NEW.geometry, NEW.geometry, NEW.rank_search) WHERE NOT isguess ORDER BY rank_address DESC, distance asc LIMIT 1 LOOP NEW.parent_place_id = location.place_id;