mirror of
https://github.com/osm-search/Nominatim.git
synced 2024-12-27 23:15:12 +03:00
Merge pull request #1836 from lonvia/rework-large-location-II
Change processing of place nodes in addresses
This commit is contained in:
commit
0f17529486
@ -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,
|
||||
|
@ -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
|
||||
ELSEIF ST_GeometryType(geometry) = 'ST_Point' THEN
|
||||
radius := near_feature_rank_distance(rank_search);
|
||||
--DEBUG: RAISE WARNING 'adding % diameter %', place_id, diameter;
|
||||
|
||||
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;
|
||||
|
||||
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;
|
||||
|
||||
|
@ -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 |
|
||||
|
Loading…
Reference in New Issue
Block a user