compute address parts for rank 30 objects on the fly

Rank 30 objects usually use the address parts of their parent.
When the parent has address parts that are areas but not marked
as isaddress, then the parent might go through multiple administrative
areas. In that case recheck if the right area has been choosen
for the object in question instead of relying on isaddress.
Note that we really only have to do the recomputation in the
case of 'isarea = True and isaddress = False' which hopefully
keeps the number of additional geometric operations we have to do
to a minimum.

There is one more special case to be taken into account here: a
street may go through two administrative areas and a house along
that street is placed in one of the area while the addr:* tags
says it belongs to the other. In that case we must not switch
the isaddress to the one it is situated. To avoid that recheck
the address names against the name of the ara. That is not perfect
but should cover most cases.

Fixes #328.
This commit is contained in:
Sarah Hoffmann
2020-12-01 11:58:25 +01:00
parent ff85da0a31
commit 7295cad715
2 changed files with 60 additions and 17 deletions

View File

@@ -397,3 +397,35 @@ Feature: Address computation
Then results contain
| osm_type | osm_id | name |
| N | 1 | Bolder, Wonderway, Left |
Scenario: POIs can correct address parts on the fly
Given the grid
| 1 | | | | 2 | | 5 |
| | | | 9 | | 8 | |
| 4 | | | | 3 | | 6 |
And the places
| osm | class | type | admin | name | geometry |
| R1 | boundary | administrative | 8 | Left | (1,2,3,4,1) |
| R2 | boundary | administrative | 8 | Right | (2,3,6,5,2) |
And the places
| osm | class | type | name | geometry |
| W1 | highway | primary | Wonderway | 2,3 |
| N1 | amenity | cafe | Bolder | 9 |
| N2 | amenity | cafe | Leftside | 8 |
When importing
Then place_addressline contains
| object | address | isaddress |
| W1 | R1 | False |
| W1 | R2 | True |
And place_addressline doesn't contain
| object | address |
| N1 | R1 |
| N2 | R2 |
When searching for "Bolder"
Then results contain
| osm_type | osm_id | name |
| N | 1 | Bolder, Wonderway, Left |
When searching for "Leftside"
Then results contain
| osm_type | osm_id | name |
| N | 2 | Leftside, Wonderway, Right |