mirror of
https://github.com/osm-search/Nominatim.git
synced 2026-02-26 11:08:13 +00:00
getNearestNamed*Feature functions better return values
This commit is contained in:
@@ -12,7 +12,7 @@ DECLARE
|
|||||||
out_partition INTEGER;
|
out_partition INTEGER;
|
||||||
out_parent_place_id BIGINT;
|
out_parent_place_id BIGINT;
|
||||||
location RECORD;
|
location RECORD;
|
||||||
address_street_word_id INTEGER;
|
address_street_word_ids INTEGER[];
|
||||||
out_postcode TEXT;
|
out_postcode TEXT;
|
||||||
|
|
||||||
BEGIN
|
BEGIN
|
||||||
@@ -21,11 +21,10 @@ BEGIN
|
|||||||
out_partition := get_partition(in_countrycode);
|
out_partition := get_partition(in_countrycode);
|
||||||
out_parent_place_id := null;
|
out_parent_place_id := null;
|
||||||
|
|
||||||
address_street_word_id := get_name_id(make_standard_name(in_street));
|
address_street_word_ids := word_ids_from_name(in_street);
|
||||||
IF address_street_word_id IS NOT NULL THEN
|
IF address_street_word_ids IS NOT NULL THEN
|
||||||
FOR location IN SELECT * from getNearestNamedRoadFeature(out_partition, place_centroid, address_street_word_id) LOOP
|
out_parent_place_id := getNearestNamedRoadFeature(out_partition, place_centroid,
|
||||||
out_parent_place_id := location.place_id;
|
address_street_word_ids);
|
||||||
END LOOP;
|
|
||||||
END IF;
|
END IF;
|
||||||
|
|
||||||
IF out_parent_place_id IS NULL THEN
|
IF out_parent_place_id IS NULL THEN
|
||||||
|
|||||||
@@ -248,7 +248,6 @@ LANGUAGE plpgsql STABLE;
|
|||||||
-- \param centroid Location of the address.
|
-- \param centroid Location of the address.
|
||||||
--
|
--
|
||||||
-- \return Place ID of the parent if one was found, NULL otherwise.
|
-- \return Place ID of the parent if one was found, NULL otherwise.
|
||||||
-- The returned parent is always a street (rank 26/27 and a way).
|
|
||||||
CREATE OR REPLACE FUNCTION find_parent_for_address(street TEXT, place TEXT,
|
CREATE OR REPLACE FUNCTION find_parent_for_address(street TEXT, place TEXT,
|
||||||
partition SMALLINT,
|
partition SMALLINT,
|
||||||
centroid GEOMETRY)
|
centroid GEOMETRY)
|
||||||
@@ -263,9 +262,7 @@ BEGIN
|
|||||||
-- Note that addr:street links can only be indexed, once the street itself is indexed
|
-- Note that addr:street links can only be indexed, once the street itself is indexed
|
||||||
word_ids := word_ids_from_name(street);
|
word_ids := word_ids_from_name(street);
|
||||||
IF word_ids is not null THEN
|
IF word_ids is not null THEN
|
||||||
SELECT place_id
|
parent_place_id := getNearestNamedRoadFeature(partition, centroid, word_ids);
|
||||||
FROM getNearestNamedRoadFeature(partition, centroid, word_ids)
|
|
||||||
INTO parent_place_id;
|
|
||||||
IF parent_place_id is not null THEN
|
IF parent_place_id is not null THEN
|
||||||
--DEBUG: RAISE WARNING 'Get parent form addr:street: %', parent.place_id;
|
--DEBUG: RAISE WARNING 'Get parent form addr:street: %', parent.place_id;
|
||||||
RETURN parent_place_id;
|
RETURN parent_place_id;
|
||||||
@@ -277,9 +274,7 @@ BEGIN
|
|||||||
IF place is not null THEN
|
IF place is not null THEN
|
||||||
word_ids := word_ids_from_name(place);
|
word_ids := word_ids_from_name(place);
|
||||||
IF word_ids is not null THEN
|
IF word_ids is not null THEN
|
||||||
SELECT place_id
|
parent_place_id := getNearestNamedPlaceFeature(partition, centroid, word_ids);
|
||||||
FROM getNearestNamedPlaceFeature(partition, centroid, word_ids)
|
|
||||||
INTO parent_place_id;
|
|
||||||
IF parent_place_id is not null THEN
|
IF parent_place_id is not null THEN
|
||||||
--DEBUG: RAISE WARNING 'Get parent form addr:place: %', parent.place_id;
|
--DEBUG: RAISE WARNING 'Get parent form addr:place: %', parent.place_id;
|
||||||
RETURN parent_place_id;
|
RETURN parent_place_id;
|
||||||
|
|||||||
@@ -82,54 +82,51 @@ END
|
|||||||
$$
|
$$
|
||||||
LANGUAGE plpgsql;
|
LANGUAGE plpgsql;
|
||||||
|
|
||||||
create or replace function getNearestNamedRoadFeature(in_partition INTEGER, point GEOMETRY, isin_token INTEGER[])
|
CREATE OR REPLACE FUNCTION getNearestNamedRoadFeature(in_partition INTEGER,
|
||||||
RETURNS setof nearfeature AS $$
|
point GEOMETRY,
|
||||||
|
isin_token INTEGER[])
|
||||||
|
RETURNS BIGINT
|
||||||
|
AS $$
|
||||||
DECLARE
|
DECLARE
|
||||||
r nearfeature%rowtype;
|
parent BIGINT;
|
||||||
BEGIN
|
BEGIN
|
||||||
|
|
||||||
-- start
|
-- start
|
||||||
IF in_partition = -partition- THEN
|
IF in_partition = -partition- THEN
|
||||||
FOR r IN
|
SELECT place_id FROM search_name_-partition-
|
||||||
SELECT place_id, name_vector, address_rank, search_rank,
|
INTO parent
|
||||||
ST_Distance(centroid, point) as distance, null as isguess
|
WHERE name_vector && isin_token
|
||||||
FROM search_name_-partition-
|
AND centroid && ST_Expand(point, 0.015)
|
||||||
WHERE name_vector && isin_token
|
AND search_rank between 26 and 27
|
||||||
AND centroid && ST_Expand(point, 0.015)
|
ORDER BY ST_Distance(centroid, point) ASC limit 1;
|
||||||
AND search_rank between 26 and 27
|
RETURN parent;
|
||||||
ORDER BY distance ASC limit 1
|
|
||||||
LOOP
|
|
||||||
RETURN NEXT r;
|
|
||||||
END LOOP;
|
|
||||||
RETURN;
|
|
||||||
END IF;
|
END IF;
|
||||||
-- end
|
-- end
|
||||||
|
|
||||||
RAISE EXCEPTION 'Unknown partition %', in_partition;
|
RAISE EXCEPTION 'Unknown partition %', in_partition;
|
||||||
END
|
END
|
||||||
$$
|
$$
|
||||||
LANGUAGE plpgsql;
|
LANGUAGE plpgsql STABLE;
|
||||||
|
|
||||||
create or replace function getNearestNamedPlaceFeature(in_partition INTEGER, point GEOMETRY, isin_token INTEGER[])
|
CREATE OR REPLACE FUNCTION getNearestNamedPlaceFeature(in_partition INTEGER,
|
||||||
RETURNS setof nearfeature AS $$
|
point GEOMETRY,
|
||||||
|
isin_token INTEGER[])
|
||||||
|
RETURNS BIGINT
|
||||||
|
AS $$
|
||||||
DECLARE
|
DECLARE
|
||||||
r nearfeature%rowtype;
|
parent BIGINT;
|
||||||
BEGIN
|
BEGIN
|
||||||
|
|
||||||
-- start
|
-- start
|
||||||
IF in_partition = -partition- THEN
|
IF in_partition = -partition- THEN
|
||||||
FOR r IN
|
SELECT place_id
|
||||||
SELECT place_id, name_vector, address_rank, search_rank,
|
INTO parent
|
||||||
ST_Distance(centroid, point) as distance, null as isguess
|
FROM search_name_-partition-
|
||||||
FROM search_name_-partition-
|
WHERE name_vector && isin_token
|
||||||
WHERE name_vector && isin_token
|
AND centroid && ST_Expand(point, 0.04)
|
||||||
AND centroid && ST_Expand(point, 0.04)
|
AND search_rank between 16 and 22
|
||||||
AND search_rank between 16 and 22
|
ORDER BY ST_Distance(centroid, point) ASC limit 1;
|
||||||
ORDER BY distance ASC limit 1
|
RETURN parent;
|
||||||
LOOP
|
|
||||||
RETURN NEXT r;
|
|
||||||
END LOOP;
|
|
||||||
RETURN;
|
|
||||||
END IF;
|
END IF;
|
||||||
-- end
|
-- end
|
||||||
|
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ DECLARE
|
|||||||
out_partition INTEGER;
|
out_partition INTEGER;
|
||||||
out_parent_place_id BIGINT;
|
out_parent_place_id BIGINT;
|
||||||
location RECORD;
|
location RECORD;
|
||||||
address_street_word_id INTEGER;
|
address_street_word_ids INTEGER[];
|
||||||
|
|
||||||
BEGIN
|
BEGIN
|
||||||
|
|
||||||
@@ -56,11 +56,10 @@ BEGIN
|
|||||||
out_partition := get_partition('us');
|
out_partition := get_partition('us');
|
||||||
out_parent_place_id := null;
|
out_parent_place_id := null;
|
||||||
|
|
||||||
address_street_word_id := get_name_id(make_standard_name(in_street));
|
address_street_word_ids := word_ids_from_name(in_street);
|
||||||
IF address_street_word_id IS NOT NULL THEN
|
IF address_street_word_ids IS NOT NULL THEN
|
||||||
FOR location IN SELECT * from getNearestNamedRoadFeature(out_partition, place_centroid, ARRAY[address_street_word_id]) LOOP
|
out_parent_place_id := getNearestNamedRoadFeature(out_partition, place_centroid,
|
||||||
out_parent_place_id := location.place_id;
|
address_street_word_ids);
|
||||||
END LOOP;
|
|
||||||
END IF;
|
END IF;
|
||||||
|
|
||||||
IF out_parent_place_id IS NULL THEN
|
IF out_parent_place_id IS NULL THEN
|
||||||
|
|||||||
Reference in New Issue
Block a user