From: Sarah Hoffmann Date: Thu, 19 Dec 2024 17:08:56 +0000 (+0100) Subject: more efficient belongs-to-address determination X-Git-Url: https://git.openstreetmap.org./nominatim.git/commitdiff_plain/c8a0dc8af19ad5485aebadcb57f981e134306b5e more efficient belongs-to-address determination --- diff --git a/lib-sql/functions/partition-functions.sql b/lib-sql/functions/partition-functions.sql index 20ec3da6..94ed2639 100644 --- a/lib-sql/functions/partition-functions.sql +++ b/lib-sql/functions/partition-functions.sql @@ -17,28 +17,6 @@ CREATE TYPE nearfeaturecentr AS ( centroid GEOMETRY ); --- feature intersects geometry --- for areas and linestrings they must touch at least along a line -CREATE OR REPLACE FUNCTION is_relevant_geometry(de9im TEXT, geom_type TEXT) -RETURNS BOOLEAN -AS $$ -BEGIN - IF substring(de9im from 1 for 2) != 'FF' THEN - RETURN TRUE; - END IF; - - IF geom_type = 'ST_Point' THEN - RETURN substring(de9im from 4 for 1) = '0'; - END IF; - - IF geom_type in ('ST_LineString', 'ST_MultiLineString') THEN - RETURN substring(de9im from 4 for 1) = '1'; - END IF; - - RETURN substring(de9im from 4 for 1) = '2'; -END -$$ LANGUAGE plpgsql IMMUTABLE; - CREATE OR REPLACE function getNearFeatures(in_partition INTEGER, feature GEOMETRY, feature_centroid GEOMETRY, maxrank INTEGER) @@ -59,7 +37,12 @@ BEGIN isguess, postcode, centroid FROM location_area_large_{{ partition }} WHERE geometry && feature - AND is_relevant_geometry(ST_Relate(geometry, feature), ST_GeometryType(feature)) + AND CASE WHEN ST_Dimension(feature) = 0 + THEN _ST_Covers(geometry, feature) + WHEN ST_Dimension(feature) = 2 + THEN ST_Relate(geometry, feature, 'T********') + ELSE ST_NPoints(ST_Intersection(geometry, feature)) > 1 + END AND rank_address < maxrank -- Postcodes currently still use rank_search to define for which -- features they are relevant.