mirror of
https://github.com/osm-search/Nominatim.git
synced 2026-02-14 18:37:58 +00:00
restrict number of results for reverse queries
When given a coordinate off the coast of a large town, the entire town may end up in the potential results during the reverse query. Postgres then needs to sort tens of thousands of results before it can determine the clostest one. Given that the results at such a large search radius are bound to be imprecise anyway, restrict the number of results postgres should consider to 1000.
This commit is contained in:
@@ -121,9 +121,17 @@ class ReverseGeocode
|
||||
|
||||
$sSQL = 'select place_id,parent_place_id,rank_search,country_code,';
|
||||
$sSQL .= ' ST_distance('.$sPointSQL.', geometry) as distance';
|
||||
$sSQL .= ' FROM placex';
|
||||
$sSQL .= ' WHERE ST_DWithin('.$sPointSQL.', geometry, '.$fSearchDiam.')';
|
||||
$sSQL .= ' and rank_search != 28 and rank_search >= '.$iMaxRank;
|
||||
$sSQL .= ' FROM ';
|
||||
if ($fSearchDiam < 0.01) {
|
||||
$sSQL .= ' placex';
|
||||
$sSQL .= ' WHERE ST_DWithin('.$sPointSQL.', geometry, '.$fSearchDiam.')';
|
||||
$sSQL .= ' AND';
|
||||
} else {
|
||||
$sSQL .= ' (SELECT * FROM placex ';
|
||||
$sSQL .= ' WHERE ST_DWithin('.$sPointSQL.', geometry, '.$fSearchDiam.')';
|
||||
$sSQL .= ' LIMIT 1000) as p WHERE';
|
||||
}
|
||||
$sSQL .= ' rank_search != 28 and rank_search >= '.$iMaxRank;
|
||||
$sSQL .= ' and (name is not null or housenumber is not null)';
|
||||
$sSQL .= ' and class not in (\'waterway\',\'railway\',\'tunnel\',\'bridge\',\'man_made\')';
|
||||
$sSQL .= ' and indexed_status = 0 ';
|
||||
|
||||
@@ -45,3 +45,9 @@ Feature: Reverse geocoding
|
||||
Then result addresses contain
|
||||
| house_number | road |
|
||||
| 5 | Clasingstraße |
|
||||
|
||||
Scenario: Location off the coast
|
||||
When sending jsonv2 reverse coordinates 54.046489113,8.5546870529
|
||||
Then results contain
|
||||
| display_name |
|
||||
| Freie und Hansestadt Hamburg, Deutschland |
|
||||
|
||||
Reference in New Issue
Block a user