protected $aLangPrefOrder = array();
- protected $bIncludeAddressDetails = false;
-
protected $aExcludePlaceIDs = array();
protected $bReverseInPlan = false;
$aParams['exclude_place_ids'] = implode(',', $this->aExcludePlaceIDs);
}
- if ($this->bIncludeAddressDetails) $aParams['addressdetails'] = '1';
if ($this->bBoundedSearch) $aParams['bounded'] = '1';
if ($this->aCountryCodes) {
private function viewboxImportanceFactor($fX, $fY)
{
+ if (!$this->aViewBox) {
+ return 1;
+ }
+
$fWidth = ($this->aViewBox[2] - $this->aViewBox[0])/2;
$fHeight = ($this->aViewBox[3] - $this->aViewBox[1])/2;
public function loadParamArray($oParams, $sForceGeometryType = null)
{
- $this->bIncludeAddressDetails
- = $oParams->getBool('addressdetails', $this->bIncludeAddressDetails);
-
$this->bBoundedSearch = $oParams->getBool('bounded', $this->bBoundedSearch);
$this->setLimit($oParams->getInt('limit', $this->iFinalLimit));
}
$this->oPlaceLookup->loadParamArray($oParams, $sForceGeometryType);
- $this->oPlaceLookup->setIncludeAddressDetails(false);
$this->oPlaceLookup->setIncludePolygonAsPoints($oParams->getBool('polygon'));
-
- if ($this->bIncludeAddressDetails
- && $oParams->getString('format', '') == 'geocodejson'
- ) {
- $this->oPlaceLookup->setAddressAdminLevels(true);
- }
+ $this->oPlaceLookup->setIncludeAddressDetails($oParams->getBool('addressdetails', false));
}
public function setQueryFromParams($oParams)
// Do we have anything that looks like a lat/lon pair?
$sQuery = $oCtx->setNearPointFromQuery($sQuery);
- $aResults = array();
if ($sQuery || $this->aStructuredQuery) {
// Start with a single blank search
$aSearches = array(new SearchDescription($oCtx));
// Start the search process
$iGroupLoop = 0;
$iQueryLoop = 0;
+ $aNextResults = array();
foreach ($aGroupedSearches as $iGroupedRank => $aSearches) {
$iGroupLoop++;
+ $aResults = $aNextResults;
foreach ($aSearches as $oSearch) {
$iQueryLoop++;
$oValidTokens->debugTokenByWordIdList()
);
- $aResults += $oSearch->query(
+ $aNewResults = $oSearch->query(
$this->oDB,
$this->iMinAddressRank,
$this->iMaxAddressRank,
$this->iLimit
);
+ // The same result may appear in different rounds, only
+ // use the one with minimal rank.
+ foreach ($aNewResults as $iPlace => $oRes) {
+ if (!isset($aResults[$iPlace])
+ || $aResults[$iPlace]->iResultRank > $oRes->iResultRank) {
+ $aResults[$iPlace] = $oRes;
+ }
+ }
+
if ($iQueryLoop > 20) break;
}
+ if (!empty($aResults)) {
+ $aSplitResults = Result::splitResults($aResults);
+ Debug::printVar('Split results', $aSplitResults);
+ if ($iGroupLoop <= 4 && empty($aSplitResults['tail'])
+ && reset($aSplitResults['head'])->iResultRank > 0) {
+ // Haven't found an exact match for the query yet.
+ // Therefore add result from the next group level.
+ $aNextResults = $aSplitResults['head'];
+ foreach ($aNextResults as $oRes) {
+ $oRes->iResultRank--;
+ }
+ $aResults = array();
+ } else {
+ $aResults = $aSplitResults['head'];
+ }
+ }
+
if (!empty($aResults) && ($this->iMinAddressRank != 0 || $this->iMaxAddressRank != 30)) {
// Need to verify passes rank limits before dropping out of the loop (yuk!)
// reduces the number of place ids, like a filter
$aSearchResults = $this->oPlaceLookup->lookup($aResults);
- $aClassType = getClassTypesWithImportance();
+ $aClassType = ClassTypes\getListWithImportance();
$aRecheckWords = preg_split('/\b[\s,\\-]*/u', $sQuery);
foreach ($aRecheckWords as $i => $sWord) {
if (!preg_match('/[\pL\pN]/', $sWord)) unset($aRecheckWords[$i]);
foreach ($aSearchResults as $iIdx => $aResult) {
// Default
- $fDiameter = getResultDiameter($aResult);
+ $fDiameter = ClassTypes\getProperty($aResult, 'defdiameter', 0.0001);
$aOutlineResult = $this->oPlaceLookup->getOutlines($aResult['place_id'], $aResult['lon'], $aResult['lat'], $fDiameter/2);
if ($aOutlineResult) {
}
// Is there an icon set for this type of result?
- if (isset($aClassType[$aResult['class'].':'.$aResult['type']]['icon'])
- && $aClassType[$aResult['class'].':'.$aResult['type']]['icon']
- ) {
- $aResult['icon'] = CONST_Website_BaseURL.'images/mapicons/'.$aClassType[$aResult['class'].':'.$aResult['type']]['icon'].'.p.20.png';
- }
+ $aClassInfo = ClassTypes\getInfo($aResult);
- if (isset($aClassType[$aResult['class'].':'.$aResult['type'].':'.$aResult['admin_level']]['label'])
- && $aClassType[$aResult['class'].':'.$aResult['type'].':'.$aResult['admin_level']]['label']
- ) {
- $aResult['label'] = $aClassType[$aResult['class'].':'.$aResult['type'].':'.$aResult['admin_level']]['label'];
- } elseif (isset($aClassType[$aResult['class'].':'.$aResult['type']]['label'])
- && $aClassType[$aResult['class'].':'.$aResult['type']]['label']
- ) {
- $aResult['label'] = $aClassType[$aResult['class'].':'.$aResult['type']]['label'];
- }
- // if tag '&addressdetails=1' is set in query
- if ($this->bIncludeAddressDetails) {
- // getAddressDetails() is defined in lib.php and uses the SQL function get_addressdata in functions.sql
- $aResult['address'] = getAddressDetails($this->oDB, $sLanguagePrefArraySQL, $aResult['place_id'], $aResult['country_code'], $aResults[$aResult['place_id']]->iHouseNumber);
- if ($aResult['extra_place'] == 'city' && !isset($aResult['address']['city'])) {
- $aResult['address'] = array_merge(array('city' => array_values($aResult['address'])[0]), $aResult['address']);
+ if ($aClassInfo) {
+ if (isset($aClassInfo['icon'])) {
+ $aResult['icon'] = CONST_Website_BaseURL.'images/mapicons/'.$aClassInfo['icon'].'.p.20.png';
+ }
+
+ if (isset($aClassInfo['label'])) {
+ $aResult['label'] = $aClassInfo['label'];
}
}
'Query' => $this->sQuery,
'Structured query' => $this->aStructuredQuery,
'Name keys' => Debug::fmtArrayVals($this->aLangPrefOrder),
- 'Include address' => $this->bIncludeAddressDetails,
'Excluded place IDs' => Debug::fmtArrayVals($this->aExcludePlaceIDs),
'Try reversed query'=> $this->bReverseInPlan,
'Limit (for searches)' => $this->iLimit,