mirror of
https://github.com/osm-search/Nominatim.git
synced 2026-02-16 05:18:00 +00:00
Integrated OSM views into importance computation
This commit is contained in:
committed by
Sarah Hoffmann
parent
ac467c7a2d
commit
0ab0f0ea44
@@ -98,19 +98,74 @@ $$
|
||||
LANGUAGE plpgsql STABLE;
|
||||
|
||||
|
||||
CREATE OR REPLACE FUNCTION get_osm_views(centroid GEOMETRY)
|
||||
RETURNS BIGINT
|
||||
AS $$
|
||||
DECLARE
|
||||
result BIGINT;
|
||||
BEGIN
|
||||
SELECT ST_Value(osm_views.rast, centroid)
|
||||
FROM osm_views
|
||||
WHERE ST_Intersects(ST_ConvexHull(osm_views.rast), centroid) LIMIT 1 INTO result;
|
||||
|
||||
return COALESCE(result, 0);
|
||||
END;
|
||||
$$
|
||||
LANGUAGE plpgsql STABLE;
|
||||
|
||||
|
||||
CREATE OR REPLACE FUNCTION normalize_osm_views(views BIGINT)
|
||||
RETURNS FLOAT
|
||||
AS $$
|
||||
DECLARE
|
||||
normalized_osm_views FLOAT;
|
||||
max_views BIGINT;
|
||||
BEGIN
|
||||
IF views > 0 THEN
|
||||
-- Get the highest view count to use it in normalizing the data
|
||||
SELECT max_views_count FROM osm_views_stat INTO max_views;
|
||||
normalized_osm_views := (LOG(views))/(LOG(max_views));
|
||||
ELSE
|
||||
normalized_osm_views := 0.0;
|
||||
END IF;
|
||||
|
||||
RETURN normalized_osm_views;
|
||||
END;
|
||||
$$
|
||||
LANGUAGE plpgsql;
|
||||
|
||||
|
||||
CREATE OR REPLACE FUNCTION compute_importance(extratags HSTORE,
|
||||
country_code varchar(2),
|
||||
osm_type varchar(1), osm_id BIGINT)
|
||||
osm_type varchar(1), osm_id BIGINT,
|
||||
centroid GEOMETRY)
|
||||
RETURNS place_importance
|
||||
AS $$
|
||||
DECLARE
|
||||
match RECORD;
|
||||
result place_importance;
|
||||
osm_views_exists BIGINT;
|
||||
views BIGINT;
|
||||
BEGIN
|
||||
-- check if osm_views table exists
|
||||
SELECT COUNT(table_name)
|
||||
INTO osm_views_exists
|
||||
FROM information_schema.tables
|
||||
WHERE table_schema LIKE 'public' AND
|
||||
table_type LIKE 'BASE TABLE' AND
|
||||
table_name = 'osm_views';
|
||||
|
||||
-- add importance by OSM views if osm_views table exists
|
||||
IF osm_views_exists THEN
|
||||
views := get_osm_views(centroid);
|
||||
result.importance := normalize_osm_views(views) * 0.35;
|
||||
END IF;
|
||||
|
||||
-- add importance by wiki data 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.importance := COALESCE(result.importance, 0) + match.importance * 0.65;
|
||||
result.wikipedia := match.language || ':' || match.title;
|
||||
RETURN result;
|
||||
END LOOP;
|
||||
@@ -119,13 +174,13 @@ BEGIN
|
||||
FOR match IN SELECT * FROM wikipedia_article
|
||||
WHERE wd_page_title = extratags->'wikidata'
|
||||
ORDER BY language = 'en' DESC, langcount DESC LIMIT 1 LOOP
|
||||
result.importance := match.importance;
|
||||
result.importance := COALESCE(result.importance, 0) + match.importance * 0.65;
|
||||
result.wikipedia := match.language || ':' || match.title;
|
||||
RETURN result;
|
||||
END LOOP;
|
||||
END IF;
|
||||
|
||||
RETURN null;
|
||||
RETURN result;
|
||||
END;
|
||||
$$
|
||||
LANGUAGE plpgsql;
|
||||
|
||||
@@ -965,7 +965,7 @@ BEGIN
|
||||
|
||||
NEW.importance := null;
|
||||
SELECT wikipedia, importance
|
||||
FROM compute_importance(NEW.extratags, NEW.country_code, NEW.osm_type, NEW.osm_id)
|
||||
FROM compute_importance(NEW.extratags, NEW.country_code, NEW.osm_type, NEW.osm_id, NEW.centroid)
|
||||
INTO NEW.wikipedia,NEW.importance;
|
||||
|
||||
{% if debug %}RAISE WARNING 'Importance computed from wikipedia: %', NEW.importance;{% endif %}
|
||||
@@ -1088,7 +1088,7 @@ BEGIN
|
||||
|
||||
SELECT wikipedia, importance
|
||||
FROM compute_importance(location.extratags, NEW.country_code,
|
||||
'N', location.osm_id)
|
||||
'N', location.osm_id, NEW.centroid)
|
||||
INTO linked_wikipedia,linked_importance;
|
||||
|
||||
-- Use the maximum importance if one could be computed from the linked object.
|
||||
|
||||
Reference in New Issue
Block a user