From 4b53cf146492b4a0773727af1fc4c0cb9acfa860 Mon Sep 17 00:00:00 2001 From: alfmarcua Date: Thu, 6 Jul 2023 08:52:12 +0200 Subject: [PATCH] Split lookupInCountry in two functions and document NOMINATIM_SEARCH_WITHIN_COUNTRIES parameter --- docs/customize/Settings.md | 17 +++++++++++++++++ lib-php/ReverseGeocode.php | 18 +++++++++++------- lib-php/admin/warm.php | 1 + 3 files changed, 29 insertions(+), 7 deletions(-) diff --git a/docs/customize/Settings.md b/docs/customize/Settings.md index bb552744..ebfa2421 100644 --- a/docs/customize/Settings.md +++ b/docs/customize/Settings.md @@ -627,6 +627,23 @@ with a single query. Setting this parameter to 0 disables polygon output completely. + +#### NOMINATIM_SEARCH_WITHIN_COUNTRIES + +| Summary | | +| -------------- | --------------------------------------------------- | +| **Description:** | Disable search for elements that are not in the country grid | +| **Format:** | boolean | +| **Default:** | no | +| **After Changes:** | run `nominatim refresh --website` | + +Enable to search elements just within countries. + +When enabled, if, despite not finding a point within the static grid of countries, it +finds a geometry of a region, do not return the geometry. +Return "Unable to geocode" instead. + + ### Logging Settings #### NOMINATIM_LOG_DB diff --git a/lib-php/ReverseGeocode.php b/lib-php/ReverseGeocode.php index 1777288a..f6ea590f 100644 --- a/lib-php/ReverseGeocode.php +++ b/lib-php/ReverseGeocode.php @@ -85,9 +85,9 @@ class ReverseGeocode protected function lookupLargeArea($sPointSQL, $iMaxRank) { - if(CONST_Search_WithinCountries - and $this->lookupInCountry($sPointSQL, $iMaxRank) == null){ - return null; + $sCountryCode = $this->getCountryCode($sPointSQL); + if (CONST_Search_WithinCountries and $sCountryCode == null) { + return null; } if ($iMaxRank > 4) { @@ -99,12 +99,12 @@ class ReverseGeocode // If no polygon which contains the searchpoint is found, // searches in the country_osm_grid table for a polygon. - return $this->lookupInCountry($sPointSQL, $iMaxRank); + return $this->lookupInCountry($sPointSQL, $iMaxRank, $sCountryCode); } - protected function lookupInCountry($sPointSQL, $iMaxRank) + protected function getCountryCode($sPointSQL) { - Debug::newFunction('lookupInCountry'); + Debug::newFunction('getCountryCode'); // searches for polygon in table country_osm_grid which contains the searchpoint // and searches for the nearest place node to the searchpoint in this polygon $sSQL = 'SELECT country_code FROM country_osm_grid'; @@ -116,8 +116,12 @@ class ReverseGeocode null, 'Could not determine country polygon containing the point.' ); - Debug::printVar('Country code', $sCountryCode); + return $sCountryCode; + } + protected function lookupInCountry($sPointSQL, $iMaxRank, $sCountryCode) + { + Debug::newFunction('lookupInCountry'); if ($sCountryCode) { if ($iMaxRank > 4) { // look for place nodes with the given country code diff --git a/lib-php/admin/warm.php b/lib-php/admin/warm.php index 5cbae898..32f78f46 100644 --- a/lib-php/admin/warm.php +++ b/lib-php/admin/warm.php @@ -41,6 +41,7 @@ loadSettings($aCMDResult['project-dir'] ?? getcwd()); @define('CONST_Use_US_Tiger_Data', getSettingBool('USE_US_TIGER_DATA')); @define('CONST_MapIcon_URL', getSetting('MAPICON_URL', false)); @define('CONST_TokenizerDir', CONST_InstallDir.'/tokenizer'); +@define('CONST_Search_WithinCountries', getSetting('SEARCH_WITHIN_COUNTRIES', false)); require_once(CONST_LibDir.'/Geocode.php'); -- 2.39.5