From: Sarah Hoffmann Date: Fri, 26 Jun 2020 19:36:32 +0000 (+0200) Subject: Merge pull request #1836 from lonvia/rework-large-location-II X-Git-Tag: v3.6.0~123 X-Git-Url: https://git.openstreetmap.org/nominatim.git/commitdiff_plain/0f1752948651a4939e1a808f2a44face6abc305a?hp=dd10c867dbe74f134e995a56b59de0b72e4cd644 Merge pull request #1836 from lonvia/rework-large-location-II Change processing of place nodes in addresses --- diff --git a/settings/address-levels.json b/settings/address-levels.json index 8b25fb1a..766098dd 100644 --- a/settings/address-levels.json +++ b/settings/address-levels.json @@ -2,33 +2,33 @@ { "tags" : { "place" : { "sea" : [2, 0], + "island" : [17, 0], + "islet" : [20, 0], "continent" : [2, 0], "country" : [4, 0], "state" : [8, 0], "province" : [8, 0], "region" : [18, 0], "county" : 12, - "municipality" : [17, 14], + "municipality" : 14, "city" : 16, - "island" : [17, 0], "town" : [18, 16], + "borough" : 18, "village" : [19, 16], "district" : [19, 16], - "borough" : [19, 18], + "suburb" : [19, 20], "hamlet" : 20, - "suburb" : 20, "croft" : 20, "subdivision" : 20, - "isolated_dwelling" : 20, "allotments" : 20, - "farm" : [20, 0], - "locality" : [20, 0], - "islet" : [20, 0], - "mountain_pass" : [20, 0], - "neighbourhood" : 22, - "quarter" : 22, + "neighbourhood" : [20, 22], + "quarter" : [20, 22], + "isolated_dwelling" : [22, 20], "city_block" : 22, - "houses" : [28, 0] + "mountain_pass" : [20, 0], + "houses" : [28, 0], + "farm" : [20, 0], + "locality" : [20, 0] }, "boundary" : { "administrative2" : 4, diff --git a/sql/functions/utils.sql b/sql/functions/utils.sql index 61033fb4..2b3db04a 100644 --- a/sql/functions/utils.sql +++ b/sql/functions/utils.sql @@ -272,6 +272,25 @@ END; $$ LANGUAGE plpgsql; +CREATE OR REPLACE FUNCTION near_feature_rank_distance(rank_search INTEGER) + RETURNS FLOAT + AS $$ +BEGIN + IF rank_search <= 16 THEN -- city + RETURN 7500; + ELSIF rank_search <= 18 THEN -- town + RETURN 4000; + ELSIF rank_search <= 19 THEN -- village + RETURN 2000; + ELSIF rank_search <= 20 THEN -- hamlet + RETURN 1000; + END IF; + + RETURN 500; +END; +$$ +LANGUAGE plpgsql IMMUTABLE; + CREATE OR REPLACE FUNCTION add_location(place_id BIGINT, country_code varchar(2), partition INTEGER, keywords INTEGER[], @@ -282,18 +301,11 @@ CREATE OR REPLACE FUNCTION add_location(place_id BIGINT, country_code varchar(2) DECLARE locationid INTEGER; centroid GEOMETRY; - diameter FLOAT; - x BOOLEAN; - splitGeom RECORD; + radius FLOAT; secgeo GEOMETRY; postcode TEXT; BEGIN - - IF rank_search > 25 THEN - RAISE EXCEPTION 'Adding location with rank > 25 (% rank %)', place_id, rank_search; - END IF; - - x := deleteLocationArea(partition, place_id, rank_search); + PERFORM deleteLocationArea(partition, place_id, rank_search); -- add postcode only if it contains a single entry, i.e. ignore postcode lists postcode := NULL; @@ -305,32 +317,18 @@ BEGIN centroid := ST_Centroid(geometry); FOR secgeo IN select split_geometry(geometry) AS geom LOOP - x := insertLocationAreaLarge(partition, place_id, country_code, keywords, rank_search, rank_address, false, postcode, centroid, secgeo); + PERFORM insertLocationAreaLarge(partition, place_id, country_code, keywords, rank_search, rank_address, false, postcode, centroid, secgeo); END LOOP; - ELSE - - diameter := 0.02; - IF rank_address = 0 THEN - diameter := 0.02; - ELSEIF rank_search <= 14 THEN - diameter := 1.2; - ELSEIF rank_search <= 15 THEN - diameter := 1; - ELSEIF rank_search <= 16 THEN - diameter := 0.5; - ELSEIF rank_search <= 17 THEN - diameter := 0.2; - ELSEIF rank_search <= 21 THEN - diameter := 0.05; - ELSEIF rank_search = 25 THEN - diameter := 0.005; - END IF; - --- RAISE WARNING 'adding % diameter %', place_id, diameter; + ELSEIF ST_GeometryType(geometry) = 'ST_Point' THEN + radius := near_feature_rank_distance(rank_search); + --DEBUG: RAISE WARNING 'adding % diameter %', place_id, diameter; - secgeo := ST_Buffer(geometry, diameter); - x := insertLocationAreaLarge(partition, place_id, country_code, keywords, rank_search, rank_address, true, postcode, ST_Centroid(geometry), secgeo); + -- Create a bounding box with an extent computed from the radius (in meters). + secgeo := ST_Envelope(ST_Collect( + ST_Project(geometry, radius, 0.785398)::geometry, + ST_Project(geometry, radius, 3.9269908)::geometry)); + PERFORM insertLocationAreaLarge(partition, place_id, country_code, keywords, rank_search, rank_address, true, postcode, geometry, secgeo); END IF; diff --git a/test/bdd/db/import/placex.feature b/test/bdd/db/import/placex.feature index 07bb4295..531483b3 100644 --- a/test/bdd/db/import/placex.feature +++ b/test/bdd/db/import/placex.feature @@ -175,19 +175,19 @@ Feature: Import into placex | N20 | 18 | 16 | | N21 | 19 | 16 | | N22 | 20 | 20 | - | N23 | 17 | 14 | + | N23 | 14 | 14 | | N24 | 19 | 16 | - | N26 | 19 | 18 | - | N27 | 20 | 20 | + | N26 | 18 | 18 | + | N27 | 19 | 20 | | N28 | 20 | 20 | | N29 | 20 | 20 | - | N30 | 20 | 20 | + | N30 | 22 | 20 | | N31 | 20 | 0 | | N32 | 20 | 0 | | N33 | 20 | 0 | | N34 | 20 | 0 | | N101 | 15 | 16 | - | N35 | 22 | 22 | + | N35 | 20 | 22 | | N36 | 30 | 30 | | N37 | 30 | 30 | | N38 | 28 | 0 |