mirror of
https://github.com/osm-search/Nominatim.git
synced 2026-02-16 15:47:58 +00:00
change distance computation between place and address part
Instead of computing the distance to the centroid of the area compute the distance of the area to the centroid of the feature. This means we give preference to the area that covers the centroid. It's still a heuristics but one that is a bit less random.
This commit is contained in:
@@ -39,7 +39,10 @@ BEGIN
|
|||||||
END
|
END
|
||||||
$$ LANGUAGE plpgsql IMMUTABLE;
|
$$ 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
|
DECLARE
|
||||||
r nearfeaturecentr%rowtype;
|
r nearfeaturecentr%rowtype;
|
||||||
BEGIN
|
BEGIN
|
||||||
@@ -48,7 +51,7 @@ BEGIN
|
|||||||
IF in_partition = {{ partition }} THEN
|
IF in_partition = {{ partition }} THEN
|
||||||
FOR r IN
|
FOR r IN
|
||||||
SELECT place_id, keywords, rank_address, rank_search,
|
SELECT place_id, keywords, rank_address, rank_search,
|
||||||
min(ST_Distance(feature, centroid)) as distance,
|
min(ST_Distance(feature_centroid, geometry)) as distance,
|
||||||
isguess, postcode, centroid
|
isguess, postcode, centroid
|
||||||
FROM location_area_large_{{ partition }}
|
FROM location_area_large_{{ partition }}
|
||||||
WHERE geometry && feature
|
WHERE geometry && feature
|
||||||
|
|||||||
@@ -449,6 +449,7 @@ CREATE OR REPLACE FUNCTION insert_addresslines(obj_place_id BIGINT,
|
|||||||
maxrank SMALLINT,
|
maxrank SMALLINT,
|
||||||
token_info JSONB,
|
token_info JSONB,
|
||||||
geometry GEOMETRY,
|
geometry GEOMETRY,
|
||||||
|
centroid GEOMETRY,
|
||||||
country TEXT,
|
country TEXT,
|
||||||
OUT parent_place_id BIGINT,
|
OUT parent_place_id BIGINT,
|
||||||
OUT postcode TEXT,
|
OUT postcode TEXT,
|
||||||
@@ -511,7 +512,7 @@ BEGIN
|
|||||||
END LOOP;
|
END LOOP;
|
||||||
|
|
||||||
FOR location IN
|
FOR location IN
|
||||||
SELECT * FROM getNearFeatures(partition, geometry, maxrank)
|
SELECT * FROM getNearFeatures(partition, geometry, centroid, maxrank)
|
||||||
WHERE not addr_place_ids @> ARRAY[place_id]
|
WHERE not addr_place_ids @> ARRAY[place_id]
|
||||||
ORDER BY rank_address, isguess asc,
|
ORDER BY rank_address, isguess asc,
|
||||||
distance *
|
distance *
|
||||||
@@ -1106,7 +1107,8 @@ 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.token_info, geom, NEW.country_code)
|
NEW.token_info, geom, NEW.centroid,
|
||||||
|
NEW.country_code)
|
||||||
INTO NEW.parent_place_id, NEW.postcode, nameaddress_vector;
|
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 %}
|
{% if debug %}RAISE WARNING 'RETURN insert_addresslines: %, %, %', NEW.parent_place_id, NEW.postcode, nameaddress_vector;{% endif %}
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ BEGIN
|
|||||||
NEW.parent_place_id = 0;
|
NEW.parent_place_id = 0;
|
||||||
FOR location IN
|
FOR location IN
|
||||||
SELECT place_id
|
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
|
WHERE NOT isguess ORDER BY rank_address DESC, distance asc LIMIT 1
|
||||||
LOOP
|
LOOP
|
||||||
NEW.parent_place_id = location.place_id;
|
NEW.parent_place_id = location.place_id;
|
||||||
|
|||||||
Reference in New Issue
Block a user