mirror of
https://github.com/osm-search/Nominatim.git
synced 2026-02-14 18:37:58 +00:00
excluded place nodes outside parent boundaries from addresses
Changes slightly the logic which decides if a guessed places (i.e. a place node) is included in an address: it will be part of the address only if it is inside the next lower available boundary. This fixes problematic cases where neighbouring entities have additional admin levels.
This commit is contained in:
@@ -1213,6 +1213,8 @@ DECLARE
|
||||
|
||||
location_rank_search INTEGER;
|
||||
location_distance FLOAT;
|
||||
location_parent GEOMETRY;
|
||||
location_isaddress BOOLEAN;
|
||||
|
||||
tagpairid INTEGER;
|
||||
|
||||
@@ -1629,22 +1631,35 @@ BEGIN
|
||||
-- Process area matches
|
||||
location_rank_search := 100;
|
||||
location_distance := 0;
|
||||
-- RAISE WARNING ' getNearFeatures(%,''%'',%,''%'')',NEW.partition, place_centroid, search_maxrank, isin_tokens;
|
||||
location_parent := NULL;
|
||||
-- RAISE WARNING ' getNearFeatures(%,''%'',%,''%'')',NEW.partition, place_centroid, search_maxrank, isin_tokens;
|
||||
FOR location IN SELECT * from getNearFeatures(NEW.partition, place_centroid, search_maxrank, isin_tokens) LOOP
|
||||
|
||||
--RAISE WARNING ' AREA: %',location;
|
||||
|
||||
IF location.rank_search < location_rank_search THEN
|
||||
location_rank_search := location.rank_search;
|
||||
location_distance := location.distance * 1.5;
|
||||
location_distance := location.distance * 0.5;
|
||||
END IF;
|
||||
|
||||
IF location.distance < location_distance OR NOT location.isguess THEN
|
||||
|
||||
location_isaddress := NOT address_havelevel[location.rank_address];
|
||||
IF location_isaddress AND location.isguess AND location_parent IS NOT NULL THEN
|
||||
location_isaddress := ST_Contains(location_parent,location.centroid);
|
||||
END IF;
|
||||
|
||||
-- RAISE WARNING '% isaddress: %', location.place_id, location_isaddress;
|
||||
-- Add it to the list of search terms
|
||||
nameaddress_vector := array_merge(nameaddress_vector, location.keywords::integer[]);
|
||||
INSERT INTO place_addressline VALUES (NEW.place_id, location.place_id, true, NOT address_havelevel[location.rank_address], location.distance, location.rank_address);
|
||||
address_havelevel[location.rank_address] := true;
|
||||
INSERT INTO place_addressline VALUES (NEW.place_id, location.place_id, true, location_isaddress, location.distance, location.rank_address);
|
||||
|
||||
IF location_isaddress THEN
|
||||
address_havelevel[location.rank_address] := true;
|
||||
IF NOT location.isguess THEN
|
||||
SELECT geometry FROM placex WHERE place_id = location.place_id INTO location_parent;
|
||||
END IF;
|
||||
END IF;
|
||||
|
||||
--RAISE WARNING ' Terms: (%) %',location, nameaddress_vector;
|
||||
|
||||
@@ -1690,7 +1705,7 @@ BEGIN
|
||||
|
||||
IF location.rank_search < location_rank_search THEN
|
||||
location_rank_search := location.rank_search;
|
||||
location_distance := location.distance * 1.5;
|
||||
location_distance := location.distance * 0.5;
|
||||
END IF;
|
||||
|
||||
IF location.distance < location_distance THEN
|
||||
|
||||
Reference in New Issue
Block a user