From: Sarah Hoffmann Date: Mon, 2 Oct 2017 21:10:21 +0000 (+0200) Subject: Merge remote-tracking branch 'upstream/master' X-Git-Tag: deploy~369 X-Git-Url: https://git.openstreetmap.org/nominatim.git/commitdiff_plain/b610118a88489c11249e9c0d30b252d3d98bd287?hp=8cab47785d6167228649e3fe92cf84fb582de059 Merge remote-tracking branch 'upstream/master' --- diff --git a/docs/Import-and-Update.md b/docs/Import-and-Update.md index 3eda0a02..fe95e865 100644 --- a/docs/Import-and-Update.md +++ b/docs/Import-and-Update.md @@ -128,7 +128,8 @@ For a list of other methods see the output of `./utils/update.php --help`. Installing the newest version of Pyosmium ----------------------------------------- -It is recommended to install Pyosmium via pip: +It is recommended to install Pyosmium via pip. Run (as the same user who +will later run the updates): pip install --user osmium diff --git a/lib/Geocode.php b/lib/Geocode.php index cff70efc..3c537777 100644 --- a/lib/Geocode.php +++ b/lib/Geocode.php @@ -313,12 +313,7 @@ class Geocode if (count($aViewbox) != 4) { userError("Bad parmater 'viewbox'. Expected 4 coordinates."); } - $this->setViewBox(array( - $aViewbox[0], - $aViewbox[3], - $aViewbox[2], - $aViewbox[1] - )); + $this->setViewBox($aViewbox); } else { $aRoute = $oParams->getStringList('route'); $fRouteWidth = $oParams->getFloat('routewidth'); @@ -915,6 +910,19 @@ class Geocode //if (CONST_Debug) _debugDumpGroupedSearches($aGroupedSearches, $aValidTokens); } + + // Revisit searches, giving penalty to unlikely combinations + $aGroupedSearches = array(); + foreach ($aSearches as $aSearch) { + if (!$aSearch['aName']) { + if ($aSearch['sHouseNumber']) { + continue; + } + } + $aGroupedSearches[$aSearch['iSearchRank']][] = $aSearch; + } + ksort($aGroupedSearches); + return $aGroupedSearches; } @@ -1116,14 +1124,10 @@ class Geocode if (CONST_Debug) var_Dump($sSQL); $aValidTokens = array(); - if (sizeof($aTokens)) { - $aDatabaseWords = chksql( - $this->oDB->getAll($sSQL), - "Could not get word tokens." - ); - } else { - $aDatabaseWords = array(); - } + $aDatabaseWords = chksql( + $this->oDB->getAll($sSQL), + "Could not get word tokens." + ); $aPossibleMainWordIDs = array(); $aWordFrequencyScores = array(); foreach ($aDatabaseWords as $aToken) { @@ -1569,7 +1573,8 @@ class Geocode } // Fallback to the road (if no housenumber was found) - if (!sizeof($aPlaceIDs) && preg_match('/[0-9]+/', $aSearch['sHouseNumber'])) { + if (!sizeof($aPlaceIDs) && preg_match('/[0-9]+/', $aSearch['sHouseNumber']) + && ($aSearch['aAddress'] || $aSearch['sCountryCode'])) { $aPlaceIDs = $aRoadPlaceIDs; //set to -1, if no housenumbers were found $searchedHousenumber = -1; @@ -1745,20 +1750,19 @@ class Geocode if ($this->aAddressRankList) { $sSQL .= " OR placex.rank_address in (".join(',', $this->aAddressRankList).")"; } - if (CONST_Use_US_Tiger_Data) { - $sSQL .= " ) "; + $sSQL .= " ) "; + if (CONST_Use_US_Tiger_Data && $this->iMaxAddressRank == 30) { $sSQL .= "UNION "; $sSQL .= " SELECT place_id "; $sSQL .= " FROM location_property_tiger "; $sSQL .= " WHERE place_id in (".join(',', array_keys($aResultPlaceIDs)).") "; - $sSQL .= " AND (30 between $this->iMinAddressRank and $this->iMaxAddressRank "; - if ($this->aAddressRankList) $sSQL .= " OR 30 in (".join(',', $this->aAddressRankList).")"; } - $sSQL .= ") UNION "; - $sSQL .= " SELECT place_id "; - $sSQL .= " FROM location_property_osmline "; - $sSQL .= " WHERE place_id in (".join(',', array_keys($aResultPlaceIDs)).")"; - $sSQL .= " AND startnumber is not NULL AND (30 between $this->iMinAddressRank and $this->iMaxAddressRank)"; + if ($this->iMaxAddressRank == 30) { + $sSQL .= "UNION "; + $sSQL .= " SELECT place_id "; + $sSQL .= " FROM location_property_osmline "; + $sSQL .= " WHERE place_id in (".join(',', array_keys($aResultPlaceIDs)).")"; + } if (CONST_Debug) var_dump($sSQL); $aFilteredPlaceIDs = chksql($this->oDB->getCol($sSQL)); $tempIDs = array(); diff --git a/lib/NearPoint.php b/lib/NearPoint.php index 4f0531d9..30845b76 100644 --- a/lib/NearPoint.php +++ b/lib/NearPoint.php @@ -81,8 +81,8 @@ class NearPoint $fQueryLat = null; $fQueryLon = null; - if (preg_match('/\\b([NS])[ ]+([0-9]+[0-9.]*)[° ]+([0-9.]+)?[′\']*[, ]+([EW])[ ]+([0-9]+)[° ]+([0-9]+[0-9.]*)[′\']*?\\b/', $sQuery, $aData)) { - /* 1 2 3 4 5 6 + if (preg_match('/\\s*([NS])[ ]+([0-9]+[0-9.]*)[° ]+([0-9.]+)?[′\']*[, ]+([EW])[ ]+([0-9]+)[° ]+([0-9]+[0-9.]*)[′\']*\\s*/', $sQuery, $aData)) { + /* 1 2 3 4 5 6 * degrees decimal minutes * N 40 26.767, W 79 58.933 * N 40°26.767′, W 79°58.933′ @@ -90,8 +90,8 @@ class NearPoint $sFound = $aData[0]; $fQueryLat = ($aData[1]=='N'?1:-1) * ($aData[2] + $aData[3]/60); $fQueryLon = ($aData[4]=='E'?1:-1) * ($aData[5] + $aData[6]/60); - } elseif (preg_match('/\\b([0-9]+)[° ]+([0-9]+[0-9.]*)?[′\']*[ ]+([NS])[, ]+([0-9]+)[° ]+([0-9]+[0-9.]*)?[′\' ]+([EW])\\b/', $sQuery, $aData)) { - /* 1 2 3 4 5 6 + } elseif (preg_match('/\\s*([0-9]+)[° ]+([0-9]+[0-9.]*)?[′\']*[ ]+([NS])[, ]+([0-9]+)[° ]+([0-9]+[0-9.]*)?[′\' ]+([EW])\\s*/', $sQuery, $aData)) { + /* 1 2 3 4 5 6 * degrees decimal minutes * 40 26.767 N, 79 58.933 W * 40° 26.767′ N 79° 58.933′ W @@ -99,8 +99,8 @@ class NearPoint $sFound = $aData[0]; $fQueryLat = ($aData[3]=='N'?1:-1) * ($aData[1] + $aData[2]/60); $fQueryLon = ($aData[6]=='E'?1:-1) * ($aData[4] + $aData[5]/60); - } elseif (preg_match('/\\b([NS])[ ]([0-9]+)[° ]+([0-9]+)[′\' ]+([0-9]+)[″"]*[, ]+([EW])[ ]([0-9]+)[° ]+([0-9]+)[′\' ]+([0-9]+)[″"]*\\b/', $sQuery, $aData)) { - /* 1 2 3 4 5 6 7 8 + } elseif (preg_match('/\\s*([NS])[ ]([0-9]+)[° ]+([0-9]+)[′\' ]+([0-9]+)[″"]*[, ]+([EW])[ ]([0-9]+)[° ]+([0-9]+)[′\' ]+([0-9]+)[″"]*\\s*/', $sQuery, $aData)) { + /* 1 2 3 4 5 6 7 8 * degrees decimal seconds * N 40 26 46 W 79 58 56 * N 40° 26′ 46″, W 79° 58′ 56″ @@ -108,8 +108,8 @@ class NearPoint $sFound = $aData[0]; $fQueryLat = ($aData[1]=='N'?1:-1) * ($aData[2] + $aData[3]/60 + $aData[4]/3600); $fQueryLon = ($aData[5]=='E'?1:-1) * ($aData[6] + $aData[7]/60 + $aData[8]/3600); - } elseif (preg_match('/\\b([0-9]+)[° ]+([0-9]+)[′\' ]+([0-9]+)[″" ]+([NS])[, ]+([0-9]+)[° ]+([0-9]+)[′\' ]+([0-9]+)[″" ]+([EW])\\b/', $sQuery, $aData)) { - /* 1 2 3 4 5 6 7 8 + } elseif (preg_match('/\\s*([0-9]+)[° ]+([0-9]+)[′\' ]+([0-9]+)[″" ]+([NS])[, ]+([0-9]+)[° ]+([0-9]+)[′\' ]+([0-9]+)[″" ]+([EW])\\s*/', $sQuery, $aData)) { + /* 1 2 3 4 5 6 7 8 * degrees decimal seconds * 40 26 46 N 79 58 56 W * 40° 26′ 46″ N, 79° 58′ 56″ W @@ -117,26 +117,27 @@ class NearPoint $sFound = $aData[0]; $fQueryLat = ($aData[4]=='N'?1:-1) * ($aData[1] + $aData[2]/60 + $aData[3]/3600); $fQueryLon = ($aData[8]=='E'?1:-1) * ($aData[5] + $aData[6]/60 + $aData[7]/3600); - } elseif (preg_match('/\\b([NS])[ ]([0-9]+[0-9]*\\.[0-9]+)[°]*[, ]+([EW])[ ]([0-9]+[0-9]*\\.[0-9]+)[°]*\\b/', $sQuery, $aData)) { - /* 1 2 3 4 + } elseif (preg_match('/\\s*([NS])[ ]([0-9]+[0-9]*\\.[0-9]+)[°]*[, ]+([EW])[ ]([0-9]+[0-9]*\\.[0-9]+)[°]*\\s*/', $sQuery, $aData)) { + /* 1 2 3 4 * degrees decimal * N 40.446° W 79.982° */ $sFound = $aData[0]; $fQueryLat = ($aData[1]=='N'?1:-1) * ($aData[2]); $fQueryLon = ($aData[3]=='E'?1:-1) * ($aData[4]); - } elseif (preg_match('/\\b([0-9]+[0-9]*\\.[0-9]+)[° ]+([NS])[, ]+([0-9]+[0-9]*\\.[0-9]+)[° ]+([EW])\\b/', $sQuery, $aData)) { - /* 1 2 3 4 + } elseif (preg_match('/\\s*([0-9]+[0-9]*\\.[0-9]+)[° ]+([NS])[, ]+([0-9]+[0-9]*\\.[0-9]+)[° ]+([EW])\\s*/', $sQuery, $aData)) { + /* 1 2 3 4 * degrees decimal * 40.446° N 79.982° W */ $sFound = $aData[0]; $fQueryLat = ($aData[2]=='N'?1:-1) * ($aData[1]); $fQueryLon = ($aData[4]=='E'?1:-1) * ($aData[3]); - } elseif (preg_match('/(\\[|^|\\b)?(-?[0-9]+[0-9]*\\.[0-9]+)[, ]+(-?[0-9]+[0-9]*\\.[0-9]+)(\\]|$|\\b)/', $sQuery, $aData)) { - /* 1 2 3 4 + } elseif (preg_match('/(\\s*\\[|^\\s*|\\s*)(-?[0-9]+[0-9]*\\.[0-9]+)[, ]+(-?[0-9]+[0-9]*\\.[0-9]+)(\\]\\s*|\\s*$|\\s*)/', $sQuery, $aData)) { + /* 1 2 3 4 * degrees decimal * 12.34, 56.78 + * 12.34 56.78 * [12.456,-78.90] */ $sFound = $aData[0]; diff --git a/test/bdd/api/search/postcode.feature b/test/bdd/api/search/postcode.feature index f92aff3c..6033f7cc 100644 --- a/test/bdd/api/search/postcode.feature +++ b/test/bdd/api/search/postcode.feature @@ -18,3 +18,10 @@ Feature: Searches with postcodes | country_code | | li | + Scenario: Postcode search with country code restriction + When sending json search query "9490" with address + | countrycodes | + | li | + Then result addresses contain + | country_code | + | li | diff --git a/test/bdd/api/search/queries.feature b/test/bdd/api/search/queries.feature index 49e1d9c0..2767f87c 100644 --- a/test/bdd/api/search/queries.feature +++ b/test/bdd/api/search/queries.feature @@ -96,6 +96,24 @@ Feature: Search queries | class | type | | man_made | mast | + Scenario: Arbitrary key/value search near a road + When sending json search query "[leisure=table_soccer_table] immenbusch" + Then results contain + | class | type | + | leisure | table_soccer_table | + + Scenario: Ignore other country codes in structured search with country + When sending json search query "" + | city | country | + | li | de | + Then exactly 0 results are returned + + Scenario: Ignore country searches when query is restricted to countries + When sending json search query "de" + | countrycodes | + | li | + Then exactly 0 results are returned + # https://trac.openstreetmap.org/ticket/5094 Scenario: housenumbers are ordered by complete match first When sending json search query "6395 geminis, montevideo" with address diff --git a/test/bdd/api/search/simple.feature b/test/bdd/api/search/simple.feature index aa8c8ce8..ea709b80 100644 --- a/test/bdd/api/search/simple.feature +++ b/test/bdd/api/search/simple.feature @@ -107,7 +107,7 @@ Feature: Simple Tests | attr | value | | querystring | xnznxvcx | | polygon | false | - | viewbox | 12,45.13,77,33 | + | viewbox | 12,33,77,45.13 | Scenario: Empty XML search with viewboxlbrt When sending xml search query "xnznxvcx" @@ -127,7 +127,7 @@ Feature: Simple Tests | attr | value | | querystring | pub | | polygon | false | - | viewbox | 12,45.13,77,33 | + | viewbox | 12,33,77,45.13 | Scenario Outline: Empty XML search with polygon values When sending xml search query "xnznxvcx" diff --git a/test/php/Nominatim/NearPointTest.php b/test/php/Nominatim/NearPointTest.php index 5ad73451..bee7d3eb 100644 --- a/test/php/Nominatim/NearPointTest.php +++ b/test/php/Nominatim/NearPointTest.php @@ -27,7 +27,7 @@ class NearPointTest extends \PHPUnit_Framework_TestCase $this->assertEquals($aRes['pt']->lat(), 12.456); $this->assertEquals($aRes['pt']->lon(), -78.90); $this->assertEquals($aRes['pt']->radius(), 0.1); - $this->assertEquals($aRes['query'], 'abc def'); + $this->assertEquals($aRes['query'], 'abc def'); $aRes = NearPoint::extractFromQuery(' [12.456,-78.90] '); $this->assertEquals($aRes['pt']->lat(), 12.456); @@ -69,6 +69,7 @@ class NearPointTest extends \PHPUnit_Framework_TestCase $aRes = NearPoint::extractFromQuery($sQuery); $this->assertEquals(40.446, $aRes['pt']->lat(), 'degrees decimal ' . $sQuery, 0.01); $this->assertEquals(-79.982, $aRes['pt']->lon(), 'degrees decimal ' . $sQuery, 0.01); + $this->assertEquals('', $aRes['query']); } }