Do not have postcode node appear in addresses directly

Many of the postcode nodes are actually derived from
incomplete addresses and are as such not even centroids.
Better let them only take part in the address computation
via the postcode table.
This commit is contained in:
Sarah Hoffmann 2018-07-22 16:22:07 +02:00
parent 9bdbbec0c8
commit 48d4ea5542
5 changed files with 89 additions and 19 deletions

View File

@ -864,6 +864,10 @@ BEGIN
SELECT * FROM get_postcode_rank(NEW.country_code, NEW.address->'postcode')
INTO NEW.rank_search, NEW.rank_address;
IF NOT ST_GeometryType(NEW.geometry) IN ('ST_Polygon','ST_MultiPolygon') THEN
NEW.rank_address := 0;
END IF;
ELSEIF NEW.class = 'place' THEN
IF NEW.type in ('continent') THEN
NEW.rank_search := 2;

View File

@ -20,3 +20,41 @@ Feature: Address computation
| object | address | cached_rank_address |
| W1 | W10 | 10 |
| W1 | W11 | 10 |
Scenario: buildings with only addr:postcodes do not appear in the address of a way
Given the scene admin-areas
And the named places
| osm | class | type | admin | addr+postcode | geometry |
| R1 | boundary | administrative | 6 | 112 | :b0 |
| R34 | boundary | administrative | 8 | 112 DE | :b1:E |
| R4 | boundary | administrative | 10 | 112 DE 34 | :b2:N |
And the named places
| osm | class | type | geometry |
| W93 | highway | residential | :w2N |
And the places
| osm | class | type | addr+postcode | geometry |
| W22 | place | postcode | 445023 | :building:w2N |
When importing
Then place_addressline doesn't contain
| object | address |
| W93 | W22 |
Scenario: postcode boundaries do appear in the address of a way
Given the scene admin-areas
And the named places
| osm | class | type | admin | addr+postcode | geometry |
| R1 | boundary | administrative | 6 | 112 | :b0 |
| R34 | boundary | administrative | 8 | 112 DE | :b1:E |
And the places
| osm | class | type | addr+postcode | geometry |
| R4 | place | postcode | 112 DE 34 | :b2:N |
And the named places
| osm | class | type | geometry |
| W93 | highway | residential | :w2N |
And the places
| osm | class | type | addr+postcode | geometry |
| W22 | place | postcode | 445023 | :building:w2N |
When importing
Then place_addressline contains
| object | address |
| W93 | R4 |

View File

@ -70,9 +70,9 @@ Feature: Import into placex
When importing
Then placex contains
| object | postcode | country_code | rank_search | rank_address |
| N1 | E45 2CD | gb | 25 | 5 |
| N2 | E45 2 | gb | 23 | 5 |
| N3 | Y45 | gb | 21 | 5 |
| N1 | E45 2CD | gb | 25 | 0 |
| N2 | E45 2 | gb | 23 | 0 |
| N3 | Y45 | gb | 21 | 0 |
Scenario: wrongly formatted GB postcodes are down-ranked
Given the places
@ -82,8 +82,8 @@ Feature: Import into placex
When importing
Then placex contains
| object | country_code | rank_search | rank_address |
| N1 | gb | 30 | 30 |
| N2 | gb | 30 | 30 |
| N1 | gb | 30 | 0 |
| N2 | gb | 30 | 0 |
Scenario: search and address rank for DE postcodes correctly assigned
Given the places
@ -95,10 +95,10 @@ Feature: Import into placex
When importing
Then placex contains
| object | country_code | rank_search | rank_address |
| N1 | de | 21 | 11 |
| N2 | de | 30 | 30 |
| N3 | de | 30 | 30 |
| N4 | de | 30 | 30 |
| N1 | de | 21 | 0 |
| N2 | de | 30 | 0 |
| N3 | de | 30 | 0 |
| N4 | de | 30 | 0 |
Scenario: search and address rank for other postcodes are correctly assigned
Given the places
@ -115,15 +115,15 @@ Feature: Import into placex
When importing
Then placex contains
| object | country_code | rank_search | rank_address |
| N1 | ca | 21 | 11 |
| N2 | ca | 21 | 11 |
| N3 | ca | 21 | 11 |
| N4 | ca | 21 | 11 |
| N5 | ca | 21 | 11 |
| N6 | ca | 21 | 11 |
| N7 | ca | 25 | 11 |
| N8 | ca | 25 | 11 |
| N9 | ca | 25 | 11 |
| N1 | ca | 21 | 0 |
| N2 | ca | 21 | 0 |
| N3 | ca | 21 | 0 |
| N4 | ca | 21 | 0 |
| N5 | ca | 21 | 0 |
| N6 | ca | 21 | 0 |
| N7 | ca | 25 | 0 |
| N8 | ca | 25 | 0 |
| N9 | ca | 25 | 0 |
Scenario: search and address ranks for places are correctly assigned
Given the named places

View File

@ -82,7 +82,7 @@ Feature: Import of postcodes
| object | postcode |
| W22 | 112 DE 34 |
Scenario: Roads get postcodes from nearby buildings without other info
Scenario: Roads get postcodes from nearby named buildings without other info
Given the scene admin-areas
And the named places
| osm | class | type | geometry |
@ -95,6 +95,19 @@ Feature: Import of postcodes
| object | postcode |
| W93 | 445023 |
Scenario: Roads get postcodes from nearby unnamed buildings without other info
Given the scene admin-areas
And the named places
| osm | class | type | geometry |
| W93 | highway | residential | :w2N |
And the named places
| osm | class | type | addr+postcode | geometry |
| W22 | place | postcode | 445023 | :building:w2N |
When importing
Then placex contains
| object | postcode |
| W93 | 445023 |
Scenario: Postcodes from admin boundaries are preferred over estimated postcodes
Given the scene admin-areas
And the named places

View File

@ -498,6 +498,21 @@ def check_place_addressline(context):
context.db.commit()
@then("place_addressline doesn't contain")
def check_place_addressline_exclude(context):
cur = context.db.cursor(cursor_factory=psycopg2.extras.DictCursor)
for row in context.table:
pid = NominatimID(row['object']).get_place_id(cur)
apid = NominatimID(row['address']).get_place_id(cur)
cur.execute(""" SELECT * FROM place_addressline
WHERE place_id = %s AND address_place_id = %s""",
(pid, apid))
eq_(0, cur.rowcount,
"Row found for place %s and address %s" % (row['object'], row['address']))
context.db.commit()
@then("(?P<oid>\w+) expands to(?P<neg> no)? interpolation")
def check_location_property_osmline(context, oid, neg):
cur = context.db.cursor(cursor_factory=psycopg2.extras.DictCursor)