mirror of
https://github.com/osm-search/Nominatim.git
synced 2026-03-12 13:54:07 +00:00
be more strict what areas make up an address
Exclude boundaries that touch a line in only one point and that touch areas only along the boundary. Fixes #1900.
This commit is contained in:
@@ -10,6 +10,28 @@ CREATE TYPE nearfeaturecentr AS (
|
|||||||
centroid GEOMETRY
|
centroid GEOMETRY
|
||||||
);
|
);
|
||||||
|
|
||||||
|
-- feature intersects geoemtry
|
||||||
|
-- for areas and linestrings they must touch at least along a line
|
||||||
|
CREATE OR REPLACE FUNCTION is_relevant_geometry(de9im TEXT, geom_type TEXT)
|
||||||
|
RETURNS BOOLEAN
|
||||||
|
AS $$
|
||||||
|
BEGIN
|
||||||
|
IF substring(de9im from 1 for 2) != 'FF' THEN
|
||||||
|
RETURN TRUE;
|
||||||
|
END IF;
|
||||||
|
|
||||||
|
IF geom_type = 'ST_Point' THEN
|
||||||
|
RETURN substring(de9im from 4 for 1) = '0';
|
||||||
|
END IF;
|
||||||
|
|
||||||
|
IF geom_type in ('ST_LineString', 'ST_MultiLineString') THEN
|
||||||
|
RETURN substring(de9im from 4 for 1) = '1';
|
||||||
|
END IF;
|
||||||
|
|
||||||
|
RETURN substring(de9im from 4 for 1) = '2';
|
||||||
|
END
|
||||||
|
$$ LANGUAGE plpgsql IMMUTABLE;
|
||||||
|
|
||||||
create or replace function getNearFeatures(in_partition INTEGER, feature 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;
|
||||||
@@ -20,7 +42,8 @@ BEGIN
|
|||||||
FOR r IN
|
FOR r IN
|
||||||
SELECT place_id, keywords, rank_address, rank_search, min(ST_Distance(feature, centroid)) as distance, isguess, postcode, centroid
|
SELECT place_id, keywords, rank_address, rank_search, min(ST_Distance(feature, centroid)) as distance, isguess, postcode, centroid
|
||||||
FROM location_area_large_-partition-
|
FROM location_area_large_-partition-
|
||||||
WHERE ST_Intersects(geometry, feature)
|
WHERE geometry && feature
|
||||||
|
AND is_relevant_geometry(ST_Relate(geometry, feature), ST_GeometryType(feature))
|
||||||
AND rank_search < maxrank AND rank_address < maxrank
|
AND rank_search < maxrank AND rank_address < maxrank
|
||||||
GROUP BY place_id, keywords, rank_address, rank_search, isguess, postcode, centroid
|
GROUP BY place_id, keywords, rank_address, rank_search, isguess, postcode, centroid
|
||||||
ORDER BY rank_address, isin_tokens && keywords desc, isguess asc,
|
ORDER BY rank_address, isin_tokens && keywords desc, isguess asc,
|
||||||
|
|||||||
@@ -21,6 +21,99 @@ Feature: Address computation
|
|||||||
| W1 | W10 | 10 |
|
| W1 | W10 | 10 |
|
||||||
| W1 | W11 | 10 |
|
| W1 | W11 | 10 |
|
||||||
|
|
||||||
|
|
||||||
|
Scenario: Roads following a boundary should contain both states
|
||||||
|
Given the grid
|
||||||
|
| 1 | | | 2 | | 3 |
|
||||||
|
| | | 8 | 7 | | |
|
||||||
|
| 4 | | | 5 | | 6 |
|
||||||
|
And the named places
|
||||||
|
| osm | class | type | geometry |
|
||||||
|
| W1 | highway | road | 2, 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 |
|
||||||
|
|
||||||
|
Scenario: Roads should not contain boundaries they touch in a end point
|
||||||
|
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, 8, 5, 4, 1) |
|
||||||
|
| W11 | boundary | administrative | 5 | (2, 3, 6, 5, 8, 2) |
|
||||||
|
When importing
|
||||||
|
Then place_addressline contains
|
||||||
|
| object | address | cached_rank_address |
|
||||||
|
| W1 | W10 | 10 |
|
||||||
|
Then place_addressline doesn't contain
|
||||||
|
| object | address |
|
||||||
|
| W1 | W11 |
|
||||||
|
|
||||||
|
Scenario: Roads should not contain boundaries they touch in a end point
|
||||||
|
Given the grid
|
||||||
|
| 1 | | | 2 | | 3 |
|
||||||
|
| | 7 | | 8 | | |
|
||||||
|
| 4 | | 9 | 5 | | 6 |
|
||||||
|
And the named places
|
||||||
|
| osm | class | type | geometry |
|
||||||
|
| W1 | highway | road | 7, 8, 9 |
|
||||||
|
And the named places
|
||||||
|
| osm | class | type | admin | geometry |
|
||||||
|
| W10 | boundary | administrative | 5 | (1, 2, 8, 5, 4, 1) |
|
||||||
|
| W11 | boundary | administrative | 5 | (2, 3, 6, 5, 8, 2) |
|
||||||
|
When importing
|
||||||
|
Then place_addressline contains
|
||||||
|
| object | address | cached_rank_address |
|
||||||
|
| W1 | W10 | 10 |
|
||||||
|
Then place_addressline doesn't contain
|
||||||
|
| object | address |
|
||||||
|
| W1 | W11 |
|
||||||
|
|
||||||
|
Scenario: Locality points should contain all boundaries they touch
|
||||||
|
Given the grid
|
||||||
|
| 1 | | | 2 | | 3 |
|
||||||
|
| | | | 8 | | |
|
||||||
|
| 4 | | | 5 | | 6 |
|
||||||
|
And the named places
|
||||||
|
| osm | class | type | geometry |
|
||||||
|
| N1 | place | locality | 8 |
|
||||||
|
And the named places
|
||||||
|
| osm | class | type | admin | geometry |
|
||||||
|
| W10 | boundary | administrative | 5 | (1, 2, 8, 5, 4, 1) |
|
||||||
|
| W11 | boundary | administrative | 5 | (2, 3, 6, 5, 8, 2) |
|
||||||
|
When importing
|
||||||
|
Then place_addressline contains
|
||||||
|
| object | address | cached_rank_address |
|
||||||
|
| N1 | W10 | 10 |
|
||||||
|
| N1 | W11 | 10 |
|
||||||
|
|
||||||
|
Scenario: Areas should not contain boundaries they touch
|
||||||
|
Given the grid
|
||||||
|
| 1 | | | 2 | | 3 |
|
||||||
|
| | | | | | |
|
||||||
|
| 4 | | | 5 | | 6 |
|
||||||
|
And the named places
|
||||||
|
| osm | class | type | geometry |
|
||||||
|
| W1 | landuse | industrial | (1, 2, 5, 4, 1) |
|
||||||
|
And the named places
|
||||||
|
| osm | class | type | admin | geometry |
|
||||||
|
| W10 | boundary | administrative | 5 | (2, 3, 6, 5, 2) |
|
||||||
|
When importing
|
||||||
|
Then place_addressline doesn't contain
|
||||||
|
| object | address |
|
||||||
|
| W1 | W10 |
|
||||||
|
|
||||||
Scenario: buildings with only addr:postcodes do not appear in the address of a way
|
Scenario: buildings with only addr:postcodes do not appear in the address of a way
|
||||||
Given the scene admin-areas
|
Given the scene admin-areas
|
||||||
And the named places
|
And the named places
|
||||||
|
|||||||
Reference in New Issue
Block a user