forked from hans/Nominatim
Merge pull request #669 from lonvia/address-part-on-intersect
Add all intersecting boundaries to address list for roads
This commit is contained in:
@@ -1679,7 +1679,12 @@ BEGIN
|
|||||||
-- added ourself as address already
|
-- added ourself as address already
|
||||||
address_havelevel[NEW.rank_address] := true;
|
address_havelevel[NEW.rank_address] := true;
|
||||||
-- RAISE WARNING ' getNearFeatures(%,''%'',%,''%'')',NEW.partition, place_centroid, search_maxrank, isin_tokens;
|
-- RAISE WARNING ' getNearFeatures(%,''%'',%,''%'')',NEW.partition, place_centroid, search_maxrank, isin_tokens;
|
||||||
FOR location IN SELECT * from getNearFeatures(NEW.partition, place_centroid, search_maxrank, isin_tokens) LOOP
|
FOR location IN
|
||||||
|
SELECT * from getNearFeatures(NEW.partition,
|
||||||
|
CASE WHEN NEW.rank_search >= 26 THEN NEW.geometry
|
||||||
|
ELSE place_centroid END,
|
||||||
|
search_maxrank, isin_tokens)
|
||||||
|
LOOP
|
||||||
|
|
||||||
--RAISE WARNING ' AREA: %',location;
|
--RAISE WARNING ' AREA: %',location;
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
create or replace function getNearFeatures(in_partition INTEGER, point GEOMETRY, maxrank INTEGER, isin_tokens INT[]) RETURNS setof nearfeaturecentr AS $$
|
create or replace function getNearFeatures(in_partition INTEGER, feature GEOMETRY, maxrank INTEGER, isin_tokens INT[]) RETURNS setof nearfeaturecentr AS $$
|
||||||
DECLARE
|
DECLARE
|
||||||
r nearfeaturecentr%rowtype;
|
r nearfeaturecentr%rowtype;
|
||||||
BEGIN
|
BEGIN
|
||||||
@@ -6,14 +6,14 @@ BEGIN
|
|||||||
-- start
|
-- start
|
||||||
IF in_partition = -partition- THEN
|
IF in_partition = -partition- THEN
|
||||||
FOR r IN
|
FOR r IN
|
||||||
SELECT place_id, keywords, rank_address, rank_search, min(ST_Distance(point, centroid)) as distance, isguess, centroid FROM (
|
SELECT place_id, keywords, rank_address, rank_search, min(ST_Distance(feature, centroid)) as distance, isguess, centroid FROM (
|
||||||
SELECT * FROM location_area_large_-partition- WHERE ST_Contains(geometry, point) and rank_search < maxrank
|
SELECT * FROM location_area_large_-partition- WHERE ST_Intersects(geometry, feature) and rank_search < maxrank
|
||||||
UNION ALL
|
UNION ALL
|
||||||
SELECT * FROM location_area_country WHERE ST_Contains(geometry, point) and rank_search < maxrank
|
SELECT * FROM location_area_country WHERE ST_Intersects(geometry, feature) and rank_search < maxrank
|
||||||
) as location_area
|
) as location_area
|
||||||
GROUP BY place_id, keywords, rank_address, rank_search, isguess, centroid
|
GROUP BY place_id, keywords, rank_address, rank_search, isguess, centroid
|
||||||
ORDER BY rank_address, isin_tokens && keywords desc, isguess asc,
|
ORDER BY rank_address, isin_tokens && keywords desc, isguess asc,
|
||||||
ST_Distance(point, centroid) *
|
ST_Distance(feature, centroid) *
|
||||||
CASE
|
CASE
|
||||||
WHEN rank_address = 16 AND rank_search = 15 THEN 0.2 -- capital city
|
WHEN rank_address = 16 AND rank_search = 15 THEN 0.2 -- capital city
|
||||||
WHEN rank_address = 16 AND rank_search = 16 THEN 0.25 -- city
|
WHEN rank_address = 16 AND rank_search = 16 THEN 0.25 -- city
|
||||||
|
|||||||
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.oid = m.group('id')
|
||||||
self.cls = m.group('cls')
|
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):
|
def table_select(self):
|
||||||
""" Return where clause and parameter list to select the object
|
""" Return where clause and parameter list to select the object
|
||||||
from a Nominatim table.
|
from a Nominatim table.
|
||||||
@@ -109,7 +115,9 @@ class NominatimID:
|
|||||||
def get_place_id(self, cur):
|
def get_place_id(self, cur):
|
||||||
where, params = self.table_select()
|
where, params = self.table_select()
|
||||||
cur.execute("SELECT place_id FROM placex WHERE %s" % where, params)
|
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]
|
return cur.fetchone()[0]
|
||||||
|
|
||||||
@@ -386,6 +394,27 @@ def check_search_name_contents(context):
|
|||||||
|
|
||||||
context.db.commit()
|
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")
|
@then("(?P<oid>\w+) expands to(?P<neg> no)? interpolation")
|
||||||
def check_location_property_osmline(context, oid, neg):
|
def check_location_property_osmline(context, oid, neg):
|
||||||
cur = context.db.cursor(cursor_factory=psycopg2.extras.DictCursor)
|
cur = context.db.cursor(cursor_factory=psycopg2.extras.DictCursor)
|
||||||
|
|||||||
Reference in New Issue
Block a user