diff --git a/sql/functions/placex_triggers.sql b/sql/functions/placex_triggers.sql index d9a65ecf..f9d5b60f 100644 --- a/sql/functions/placex_triggers.sql +++ b/sql/functions/placex_triggers.sql @@ -534,6 +534,7 @@ DECLARE centroid GEOMETRY; parent_address_level SMALLINT; + place_address_level SMALLINT; addr_street TEXT; addr_place TEXT; @@ -591,7 +592,11 @@ BEGIN IF NEW.class = 'boundary' and NEW.type = 'administrative' THEN parent_address_level := get_parent_address_level(NEW.geometry, NEW.admin_level); IF parent_address_level >= NEW.rank_address THEN - NEW.rank_address := parent_address_level + 2; + IF parent_address_level >= 24 THEN + NEW.rank_address := 25; + ELSE + NEW.rank_address := parent_address_level + 2; + END IF; END IF; ELSE parent_address_level := 3; @@ -828,6 +833,18 @@ BEGIN THEN NEW.importance = linked_importance; END IF; + ELSE + -- No linked place? As a last resort check if the boundary is tagged with + -- a place type and adapt the rank address. + IF NEW.rank_address > 0 and NEW.extratags ? 'place' THEN + SELECT address_rank INTO place_address_level + FROM compute_place_rank(NEW.country_code, 'A', 'place', + NEW.extratags->'place', 0::SMALLINT, False, null); + IF place_address_level > parent_address_level and + place_address_level < 26 THEN + NEW.rank_address := place_address_level; + END IF; + END IF; END IF; -- Initialise the name vector using our name @@ -844,7 +861,9 @@ BEGIN END IF; SELECT * FROM insert_addresslines(NEW.place_id, NEW.partition, - NEW.rank_search, NEW.address, + CASE WHEN NEW.rank_address = 0 + THEN NEW.rank_search ELSE NEW.rank_address END, + NEW.address, CASE WHEN NEW.rank_search >= 26 AND NEW.rank_search < 30 THEN NEW.geometry ELSE NEW.centroid END) diff --git a/test/bdd/db/import/placex.feature b/test/bdd/db/import/placex.feature index 531483b3..594f3538 100644 --- a/test/bdd/db/import/placex.feature +++ b/test/bdd/db/import/placex.feature @@ -125,73 +125,6 @@ Feature: Import into placex | N8 | ca | 25 | 0 | | N9 | ca | 25 | 0 | - Scenario: search and address ranks for places are correctly assigned - Given the named places - | osm | class | type | - | N1 | foo | bar | - | N11 | place | Continent | - | N12 | place | continent | - | N13 | place | sea | - | N14 | place | country | - | N15 | place | state | - | N16 | place | region | - | N17 | place | county | - | N18 | place | city | - | N19 | place | island | - | N20 | place | town | - | N21 | place | village | - | N22 | place | hamlet | - | N23 | place | municipality | - | N24 | place | district | - | N26 | place | borough | - | N27 | place | suburb | - | N28 | place | croft | - | N29 | place | subdivision | - | N30 | place | isolated_dwelling | - | N31 | place | farm | - | N32 | place | locality | - | N33 | place | islet | - | N34 | place | mountain_pass | - | N35 | place | neighbourhood | - | N36 | place | house | - | N37 | place | building | - | N38 | place | houses | - And the named places - | osm | class | type | extra+capital | - | N101 | place | city | yes | - When importing - Then placex contains - | object | rank_search | rank_address | - | N1 | 30 | 30 | - | N11 | 30 | 30 | - | N12 | 2 | 0 | - | N13 | 2 | 0 | - | N14 | 4 | 0 | - | N15 | 8 | 0 | - | N16 | 18 | 0 | - | N17 | 12 | 12 | - | N18 | 16 | 16 | - | N19 | 17 | 0 | - | N20 | 18 | 16 | - | N21 | 19 | 16 | - | N22 | 20 | 20 | - | N23 | 14 | 14 | - | N24 | 19 | 16 | - | N26 | 18 | 18 | - | N27 | 19 | 20 | - | N28 | 20 | 20 | - | N29 | 20 | 20 | - | N30 | 22 | 20 | - | N31 | 20 | 0 | - | N32 | 20 | 0 | - | N33 | 20 | 0 | - | N34 | 20 | 0 | - | N101 | 15 | 16 | - | N35 | 20 | 22 | - | N36 | 30 | 30 | - | N37 | 30 | 30 | - | N38 | 28 | 0 | - Scenario: search and address ranks for boundaries are correctly assigned Given the named places | osm | class | type | diff --git a/test/bdd/db/import/rank_computation.feature b/test/bdd/db/import/rank_computation.feature new file mode 100644 index 00000000..38d15e96 --- /dev/null +++ b/test/bdd/db/import/rank_computation.feature @@ -0,0 +1,115 @@ +@DB +Feature: Rank assignment + Tests for assignment of search and address ranks. + + Scenario: Ranks for place nodes are assinged according to thier type + Given the named places + | osm | class | type | + | N1 | foo | bar | + | N11 | place | Continent | + | N12 | place | continent | + | N13 | place | sea | + | N14 | place | country | + | N15 | place | state | + | N16 | place | region | + | N17 | place | county | + | N18 | place | city | + | N19 | place | island | + | N36 | place | house | + | N38 | place | houses | + And the named places + | osm | class | type | extra+capital | + | N101 | place | city | yes | + When importing + Then placex contains + | object | rank_search | rank_address | + | N1 | 30 | 30 | + | N11 | 30 | 30 | + | N12 | 2 | 0 | + | N13 | 2 | 0 | + | N14 | 4 | 0 | + | N15 | 8 | 0 | + | N16 | 18 | 0 | + | N17 | 12 | 12 | + | N18 | 16 | 16 | + | N19 | 17 | 0 | + | N101 | 15 | 16 | + | N36 | 30 | 30 | + | N38 | 28 | 0 | + + Scenario: Ranks for boundaries are assigned according to admin level + Given the named places + | osm | class | type | admin | geometry | + | R20 | boundary | administrative | 2 | (1 1, 2 2, 1 2, 1 1) | + | R21 | boundary | administrative | 32 | (3 3, 4 4, 3 4, 3 3) | + | R22 | boundary | administrative | 6 | (0 0, 1 0, 0 1, 0 0) | + | R23 | boundary | administrative | 10 | (0 0, 1 1, 1 0, 0 0) | + When importing + Then placex contains + | object | rank_search | rank_address | + | R20 | 4 | 4 | + | R21 | 30 | 30 | + | R22 | 12 | 12 | + | R23 | 20 | 20 | + + Scenario: Ranks for boundaries with place assignment go with place address ranks if available + Given the named places + | osm | class | type | admin | extra+place | geometry | + | R20 | boundary | administrative | 3 | state | (1 1, 2 2, 1 2, 1 1) | + | R21 | boundary | administrative | 32 | suburb | (3 3, 4 4, 3 4, 3 3) | + | R22 | boundary | administrative | 6 | town | (0 0, 1 0, 0 1, 0 0) | + | R23 | boundary | administrative | 10 | village | (0 0, 1 1, 1 0, 0 0) | + When importing + Then placex contains + | object | rank_search | rank_address | + | R20 | 6 | 6 | + | R21 | 30 | 20 | + | R22 | 12 | 16 | + | R23 | 20 | 16 | + + Scenario: Place address ranks cannot overtake a parent address rank + Given the named places + | osm | class | type | admin | extra+place | geometry | + | R20 | boundary | administrative | 8 | town | (0 0, 0 2, 2 2, 2 0, 0 0) | + | R21 | boundary | administrative | 9 | municipality | (0 0, 0 1, 1 1, 1 0, 0 0) | + | R22 | boundary | administrative | 9 | suburb | (0 0, 0 1, 1 1, 1 0, 0 0) | + When importing + Then place_addressline contains + | object | address | cached_rank_address | + | R21 | R20 | 16 | + | R22 | R20 | 16 | + Then placex contains + | object | rank_search | rank_address | + | R20 | 16 | 16 | + | R21 | 18 | 18 | + | R22 | 18 | 20 | + + Scenario: Admin levels cannot overtake each other due to place address ranks + Given the named places + | osm | class | type | admin | extra+place | geometry | + | R20 | boundary | administrative | 6 | town | (0 0, 0 2, 2 2, 2 0, 0 0) | + | R21 | boundary | administrative | 8 | | (0 0, 0 1, 1 1, 1 0, 0 0) | + | R22 | boundary | administrative | 8 | suburb | (0 0, 0 1, 1 1, 1 0, 0 0) | + When importing + Then placex contains + | object | rank_search | rank_address | + | R20 | 12 | 16 | + | R21 | 16 | 18 | + | R22 | 16 | 20 | + Then place_addressline contains + | object | address | cached_rank_address | + | R21 | R20 | 16 | + | R22 | R20 | 16 | + + Scenario: Admin levels must not be larger than 25 + Given the named places + | osm | class | type | admin | extra+place | geometry | + | R20 | boundary | administrative | 6 | neighbourhood | (0 0, 0 2, 2 2, 2 0, 0 0) | + | R21 | boundary | administrative | 7 | | (0 0, 0 1, 1 1, 1 0, 0 0) | + | R22 | boundary | administrative | 8 | | (0 0, 0 0.5, 0.5 0.5, 0.5 0, 0 0) | + When importing + Then placex contains + | object | rank_search | rank_address | + | R20 | 12 | 22 | + | R21 | 14 | 24 | + | R22 | 16 | 25 |