]> git.openstreetmap.org Git - nominatim.git/blobdiff - lib/Geocode.php
Allow for reverse geocode returning no results
[nominatim.git] / lib / Geocode.php
index 35c8541a0e80fbc6c38b9804b955a70073c100cf..e5f3a1572832a3ed148dfca4704ac4e7c6f55543 100644 (file)
                        $this->aViewBox = array($fLeft, $fBottom, $fRight, $fTop);
                }
 
+               function getViewBoxString()
+               {
+                       if (!$this->aViewBox) return null;
+                       return $this->aViewBox[0].','.$this->aViewBox[3].','.$this->aViewBox[2].','.$this->aViewBox[1];
+               }
+
                function setRoute($aRoutePoints)
                {
                        $this->aRoutePoints = $aRoutePoints;
 
                function getDetails($aPlaceIDs, $iMinAddressRank = 0, $iMaxAddressRank = 30, $aAddressRankList = false, $sAllowedTypesSQLList = false, $bDeDupe = false)
                {
+                       if (sizeof($aPlaceIDs) == 0)  return array();
+
                        $sLanguagePrefArraySQL = "ARRAY[".join(',',array_map("getDBQuoted",$this->aLangPrefOrder))."]";
 
                        // Get the details for display (is this a redundant extra step?)
                        $sCountryCodesSQL = false;
                        if ($this->aCountryCodes && sizeof($this->aCountryCodes))
                        {
-                               $sCountryCodesSQL = join(',', $this->aCountryCodes);
+                               $sCountryCodesSQL = join(',', array_map('addQuotes', $this->aCountryCodes));
                        }
 
                        // Hack to make it handle "new york, ny" (and variants) correctly
 
                                $sViewboxSmallSQL = "ST_SetSRID(ST_MakeBox2D(ST_Point(".(float)$this->aViewBox[0].",".(float)$this->aViewBox[1]."),ST_Point(".(float)$this->aViewBox[2].",".(float)$this->aViewBox[3].")),4326)";
                                $sViewboxLargeSQL = "ST_SetSRID(ST_MakeBox2D(ST_Point(".(float)$aBigViewBox[0].",".(float)$aBigViewBox[1]."),ST_Point(".(float)$aBigViewBox[2].",".(float)$aBigViewBox[3].")),4326)";
-                               $bBoundingBoxSearch = true;
+                               $bBoundingBoxSearch = $this->bBoundedSearch;
                        }
 
                        // Route SQL
                                        failInternalError("Could not get large viewbox.", $sSQL, $sViewboxLargeSQL);
                                }
                                $sViewboxLargeSQL = "'".$sViewboxLargeSQL."'::geometry";
-                               $bBoundingBoxSearch = true;
+                               $bBoundingBoxSearch = $this->bBoundedSearch;
                        }
 
                        // Do we have anything that looks like a lat/lon pair?
                        }
 
                        $aSearchResults = array();
-                       if ($sQuery || $aStructuredQuery)
+                       if ($sQuery || $this->aStructuredQuery)
                        {
                                // Start with a blank search
                                $aSearches = array(
                                                if (CONST_Debug) { echo "<hr><b>Search Loop, group $iGroupLoop, loop $iQueryLoop</b>"; }
                                                if (CONST_Debug) _debugDumpGroupedSearches(array($iGroupedRank => array($aSearch)), $aValidTokens);
 
-                                               // Must have a location term
+                                               // No location term?
                                                if (!sizeof($aSearch['aName']) && !sizeof($aSearch['aAddress']) && !$aSearch['fLon'])
                                                {
                                                        if ($aSearch['sCountryCode'] && !$aSearch['sClass'] && !$aSearch['sHouseNumber'])
                                                        {
+                                                               // Just looking for a country by code - look it up
                                                                if (4 >= $this->iMinAddressRank && 4 <= $this->iMaxAddressRank)
                                                                {
                                                                        $sSQL = "select place_id from placex where calculated_country_code='".$aSearch['sCountryCode']."' and rank_search = 4";
                        {
                                // Just interpret as a reverse geocode
                                $iPlaceID = geocodeReverse((float)$this->aNearPoint[0], (float)$this->aNearPoint[1]);
-                               $aSearchResults = $this->getDetails(array($iPlaceID));
+                               if ($iPlaceID)
+                                       $aSearchResults = $this->getDetails(array($iPlaceID));
+                               else
+                                       $aSearchResults = array();
                        }
 
                        // No results? Done