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
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');
//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;
}
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) {
}
// 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;
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();
$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′
$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
$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″
$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
$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];
| 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 |
| 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
| 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"
| 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"
$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);
$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']);
}
}