X-Git-Url: https://git.openstreetmap.org./nominatim.git/blobdiff_plain/6a7e0d652b1d40a397e1c1386d500101796676c4..b8385fc52de32231e64789cfbf56a246b18b38d8:/lib-sql/functions/importance.sql?ds=inline diff --git a/lib-sql/functions/importance.sql b/lib-sql/functions/importance.sql index 0837f80f..44e8bc8b 100644 --- a/lib-sql/functions/importance.sql +++ b/lib-sql/functions/importance.sql @@ -1,3 +1,10 @@ +-- 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. + -- Functions for interpreting wkipedia/wikidata tags and computing importance. DROP TYPE IF EXISTS wikipedia_article_match CASCADE; @@ -93,32 +100,55 @@ LANGUAGE plpgsql STABLE; CREATE OR REPLACE FUNCTION compute_importance(extratags HSTORE, country_code varchar(2), - osm_type varchar(1), osm_id BIGINT) + rank_search SMALLINT, + centroid GEOMETRY) RETURNS place_importance AS $$ DECLARE match RECORD; result place_importance; + osm_views_exists BIGINT; + views BIGINT; BEGIN - FOR match IN SELECT * FROM get_wikipedia_match(extratags, country_code) - WHERE language is not NULL + -- add importance by wikipedia article if the place has one + FOR match IN + SELECT * FROM get_wikipedia_match(extratags, country_code) + WHERE language is not NULL LOOP result.importance := match.importance; result.wikipedia := match.language || ':' || match.title; RETURN result; END LOOP; - IF extratags ? 'wikidata' THEN + -- Nothing? Then try with the wikidata tag. + IF result.importance is null AND extratags ? 'wikidata' THEN FOR match IN SELECT * FROM wikipedia_article WHERE wd_page_title = extratags->'wikidata' - ORDER BY language = 'en' DESC, langcount DESC LIMIT 1 LOOP + ORDER BY language = 'en' DESC, langcount DESC LIMIT 1 + LOOP result.importance := match.importance; result.wikipedia := match.language || ':' || match.title; RETURN result; END LOOP; END IF; - RETURN null; + -- Still nothing? Fall back to a default. + IF result.importance is null THEN + result.importance := 0.75001 - (rank_search::float / 40); + END IF; + +{% if 'secondary_importance' in db.tables %} + FOR match IN + SELECT ST_Value(rast, centroid) as importance + FROM secondary_importance + WHERE ST_Intersects(ST_ConvexHull(rast), centroid) LIMIT 1 + LOOP + -- Secondary importance as tie breaker with 0.0001 weight. + result.importance := result.importance + match.importance::float / 655350000; + END LOOP; +{% endif %} + + RETURN result; END; $$ LANGUAGE plpgsql;