mirror of
https://github.com/osm-search/Nominatim.git
synced 2024-12-24 13:31:37 +03:00
784dad866f
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.
48 lines
1.2 KiB
PL/PgSQL
48 lines
1.2 KiB
PL/PgSQL
-- SPDX-License-Identifier: GPL-2.0-only
|
|
--
|
|
-- This file is part of Nominatim. (https://nominatim.org)
|
|
--
|
|
-- Copyright (C) 2022 by the Nominatim developer community.
|
|
-- For a full list of authors see the git log.
|
|
|
|
-- Trigger functions for location_postcode table.
|
|
|
|
|
|
-- Trigger for updates of location_postcode
|
|
--
|
|
-- Computes the parent object the postcode most likely refers to.
|
|
-- This will be the place that determines the address displayed when
|
|
-- searching for this postcode.
|
|
CREATE OR REPLACE FUNCTION postcode_update()
|
|
RETURNS TRIGGER
|
|
AS $$
|
|
DECLARE
|
|
partition SMALLINT;
|
|
location RECORD;
|
|
BEGIN
|
|
IF NEW.indexed_status != 0 OR OLD.indexed_status = 0 THEN
|
|
RETURN NEW;
|
|
END IF;
|
|
|
|
NEW.indexed_date = now();
|
|
|
|
partition := get_partition(NEW.country_code);
|
|
|
|
SELECT * FROM get_postcode_rank(NEW.country_code, NEW.postcode)
|
|
INTO NEW.rank_search, NEW.rank_address;
|
|
|
|
NEW.parent_place_id = 0;
|
|
FOR location IN
|
|
SELECT place_id
|
|
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;
|
|
END LOOP;
|
|
|
|
RETURN NEW;
|
|
END;
|
|
$$
|
|
LANGUAGE plpgsql;
|
|
|