mirror of
https://github.com/osm-search/Nominatim.git
synced 2026-02-16 05:18:00 +00:00
for roads add all intersecting boundaries to address list
When roads cross boundaries, both administrative entities should be added to the address list, so that both entities can be used for searching. Also allows in a second step to better sort out addresses of POIs on such roads. Fixes #121.
This commit is contained in:
22
test/bdd/db/import/addressing.feature
Normal file
22
test/bdd/db/import/addressing.feature
Normal file
@@ -0,0 +1,22 @@
|
||||
@DB
|
||||
Feature: Address computation
|
||||
Tests for filling of place_addressline
|
||||
|
||||
# github #121
|
||||
Scenario: Roads crossing boundaries should contain both states
|
||||
Given the grid
|
||||
| 1 | | | 2 | | 3 |
|
||||
| | 7 | | 8 | | |
|
||||
| 4 | | | 5 | | 6 |
|
||||
And the named places
|
||||
| osm | class | type | geometry |
|
||||
| W1 | highway | road | 7, 8 |
|
||||
And the named places
|
||||
| osm | class | type | admin | geometry |
|
||||
| W10 | boundary | administrative | 5 | (1, 2, 5, 4, 1) |
|
||||
| W11 | boundary | administrative | 5 | (2, 3, 6, 5, 2) |
|
||||
When importing
|
||||
Then place_addressline contains
|
||||
| object | address | cached_rank_address |
|
||||
| W1 | W10 | 10 |
|
||||
| W1 | W11 | 10 |
|
||||
@@ -93,6 +93,12 @@ class NominatimID:
|
||||
self.oid = m.group('id')
|
||||
self.cls = m.group('cls')
|
||||
|
||||
def __str__(self):
|
||||
if self.cls is None:
|
||||
return self.typ + self.oid
|
||||
|
||||
return '%s%d:%s' % (self.typ, self.oid, self.cls)
|
||||
|
||||
def table_select(self):
|
||||
""" Return where clause and parameter list to select the object
|
||||
from a Nominatim table.
|
||||
@@ -109,7 +115,9 @@ class NominatimID:
|
||||
def get_place_id(self, cur):
|
||||
where, params = self.table_select()
|
||||
cur.execute("SELECT place_id FROM placex WHERE %s" % where, params)
|
||||
eq_(1, cur.rowcount, "Expected exactly 1 entry in placex found %s" % cur.rowcount)
|
||||
eq_(1, cur.rowcount,
|
||||
"Expected exactly 1 entry in placex for %s found %s"
|
||||
% (str(self), cur.rowcount))
|
||||
|
||||
return cur.fetchone()[0]
|
||||
|
||||
@@ -386,6 +394,27 @@ def check_search_name_contents(context):
|
||||
|
||||
context.db.commit()
|
||||
|
||||
@then("place_addressline contains")
|
||||
def check_place_addressline(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))
|
||||
assert_less(0, cur.rowcount,
|
||||
"No rows found for place %s and address %s"
|
||||
% (row['object'], row['address']))
|
||||
|
||||
for res in cur:
|
||||
for h in row.headings:
|
||||
if h not in ('address', 'object'):
|
||||
assert_db_column(res, h, row[h], context)
|
||||
|
||||
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)
|
||||
|
||||
Reference in New Issue
Block a user