]> git.openstreetmap.org Git - nominatim.git/commitdiff
Merge remote-tracking branch 'upstream/master'
authorSarah Hoffmann <lonvia@denofr.de>
Thu, 12 Sep 2013 17:35:24 +0000 (19:35 +0200)
committerSarah Hoffmann <lonvia@denofr.de>
Thu, 12 Sep 2013 17:35:24 +0000 (19:35 +0200)
1  2 
lib/Geocode.php
lib/lib.php
settings/settings.php

diff --combined lib/Geocode.php
index 979f1ed86fb4a046b015a85ffad22e65d7380889,4b5b4e3d8be3007a72cd497b7a0deb92e4aa1dd0..33d3e4b95b5160bfec1ee933b587713f28b25408
@@@ -15,7 -15,7 +15,7 @@@
  
                protected $aExcludePlaceIDs = array();
                protected $bDeDupe = true;
 -              protected $bReverseInPlan = false;
 +              protected $bReverseInPlan = true;
  
                protected $iLimit = 20;
                protected $iFinalLimit = 10;
@@@ -26,8 -26,6 +26,8 @@@
  
                protected $bBoundedSearch = false;
                protected $aViewBox = false;
 +              protected $sViewboxSmallSQL = false;
 +              protected $sViewboxLargeSQL = false;
                protected $aRoutePoints = false;
  
                protected $iMaxRank = 20;
                        return $this->sQuery;
                }
  
+               function loadStructuredAddressElement(&$aStructuredQuery, &$iMinAddressRank, &$iMaxAddressRank, &$aAddressRankList, $sValue, $sKey, $iNewMinAddressRank, $iNewMaxAddressRank, $aItemListValues)
+               {
+                       $sValue = trim($sValue);
+                       if (!$sValue) return false;
+                       $aStructuredQuery[$sKey] = $sValue;
+                       if ($iMinAddressRank == 0 && $iMaxAddressRank == 30)
+                       {
+                               $iMinAddressRank = $iNewMinAddressRank;
+                               $iMaxAddressRank = $iNewMaxAddressRank;
+                       }
+                       if ($aItemListValues) $aAddressRankList = array_merge($aAddressRankList, $aItemListValues);
+                       return true;
+               }
                function setStructuredQuery($sAmentiy = false, $sStreet = false, $sCity = false, $sCounty = false, $sState = false, $sCountry = false, $sPostalCode = false)
                {
                        $this->sQuery = false;
                        $this->aStructuredQuery = array();
                        $this->sAllowedTypesSQLList = '';
  
-                       loadStructuredAddressElement($this->aStructuredQuery, $this->iMinAddressRank, $this->iMaxAddressRank, $this->aAddressRankList, $sAmentiy, 'amenity', 26, 30, false);
-                       loadStructuredAddressElement($this->aStructuredQuery, $this->iMinAddressRank, $this->iMaxAddressRank, $this->aAddressRankList, $sStreet, 'street', 26, 30, false);
-                       loadStructuredAddressElement($this->aStructuredQuery, $this->iMinAddressRank, $this->iMaxAddressRank, $this->aAddressRankList, $sCity, 'city', 14, 24, false);
-                       loadStructuredAddressElement($this->aStructuredQuery, $this->iMinAddressRank, $this->iMaxAddressRank, $this->aAddressRankList, $sCounty, 'county', 9, 13, false);
-                       loadStructuredAddressElement($this->aStructuredQuery, $this->iMinAddressRank, $this->iMaxAddressRank, $this->aAddressRankList, $sState, 'state', 8, 8, false);
-                       loadStructuredAddressElement($this->aStructuredQuery, $this->iMinAddressRank, $this->iMaxAddressRank, $this->aAddressRankList, $sCountry, 'country', 4, 4, false);
-                       loadStructuredAddressElement($this->aStructuredQuery, $this->iMinAddressRank, $this->iMaxAddressRank, $this->aAddressRankList, $sPostalCode, 'postalcode' , 5, 11, array(5, 11));
+                       $this->loadStructuredAddressElement($this->aStructuredQuery, $this->iMinAddressRank, $this->iMaxAddressRank, $this->aAddressRankList, $sAmentiy, 'amenity', 26, 30, false);
+                       $this->loadStructuredAddressElement($this->aStructuredQuery, $this->iMinAddressRank, $this->iMaxAddressRank, $this->aAddressRankList, $sStreet, 'street', 26, 30, false);
+                       $this->loadStructuredAddressElement($this->aStructuredQuery, $this->iMinAddressRank, $this->iMaxAddressRank, $this->aAddressRankList, $sCity, 'city', 14, 24, false);
+                       $this->loadStructuredAddressElement($this->aStructuredQuery, $this->iMinAddressRank, $this->iMaxAddressRank, $this->aAddressRankList, $sCounty, 'county', 9, 13, false);
+                       $this->loadStructuredAddressElement($this->aStructuredQuery, $this->iMinAddressRank, $this->iMaxAddressRank, $this->aAddressRankList, $sState, 'state', 8, 8, false);
+                       $this->loadStructuredAddressElement($this->aStructuredQuery, $this->iMinAddressRank, $this->iMaxAddressRank, $this->aAddressRankList, $sCountry, 'country', 4, 4, false);
+                       $this->loadStructuredAddressElement($this->aStructuredQuery, $this->iMinAddressRank, $this->iMaxAddressRank, $this->aAddressRankList, $sPostalCode, 'postalcode' , 5, 11, array(5, 11));
  
                        if (sizeof($this->aStructuredQuery) > 0) 
                        {
                        // Get the details for display (is this a redundant extra step?)
                        $sPlaceIDs = join(',',$aPlaceIDs);
  
 +                      $sImportanceSQL = '';
 +                      if ($this->sViewboxSmallSQL) $sImportanceSQL .= " case when ST_Contains($this->sViewboxSmallSQL, ST_Collect(centroid)) THEN 1 ELSE 0.75 END * ";
 +                      if ($this->sViewboxLargeSQL) $sImportanceSQL .= " case when ST_Contains($this->sViewboxLargeSQL, ST_Collect(centroid)) THEN 1 ELSE 0.75 END * ";
 +
                        $sSQL = "select osm_type,osm_id,class,type,admin_level,rank_search,rank_address,min(place_id) as place_id,calculated_country_code as country_code,";
                        $sSQL .= "get_address_by_language(place_id, $sLanguagePrefArraySQL) as langaddress,";
                        $sSQL .= "get_name_by_language(name, $sLanguagePrefArraySQL) as placename,";
                        $sSQL .= "get_name_by_language(name, ARRAY['ref']) as ref,";
                        $sSQL .= "avg(ST_X(centroid)) as lon,avg(ST_Y(centroid)) as lat, ";
 -                      $sSQL .= "coalesce(importance,0.75-(rank_search::float/40)) as importance, ";
 +                      $sSQL .= $sImportanceSQL."coalesce(importance,0.75-(rank_search::float/40)) as importance, ";
                        $sSQL .= "(select max(p.importance*(p.rank_address+2)) from place_addressline s, placex p where s.place_id = min(placex.place_id) and p.place_id = s.address_place_id and s.isaddress and p.importance is not null) as addressimportance, ";
                        $sSQL .= "(extratags->'place') as extra_place ";
                        $sSQL .= "from placex where place_id in ($sPlaceIDs) ";
                                $sSQL .= "null as placename,";
                                $sSQL .= "null as ref,";
                                $sSQL .= "avg(ST_X(centroid)) as lon,avg(ST_Y(centroid)) as lat, ";
 -                              $sSQL .= "-0.15 as importance, ";
 +                              $sSQL .= $sImportanceSQL."-1.15 as importance, ";
                                $sSQL .= "(select max(p.importance*(p.rank_address+2)) from place_addressline s, placex p where s.place_id = min(location_property_tiger.place_id) and p.place_id = s.address_place_id and s.isaddress and p.importance is not null) as addressimportance, ";
                                $sSQL .= "null as extra_place ";
                                $sSQL .= "from location_property_tiger where place_id in ($sPlaceIDs) ";
                                $sSQL .= "and 30 between $this->iMinAddressRank and $this->iMaxAddressRank ";
                                $sSQL .= "group by place_id";
 -                              if (!$this->bDeDupe) $sSQL .= ",place_id";
 +                              if (!$this->bDeDupe) $sSQL .= ",place_id ";
 +                              /*
                                $sSQL .= " union ";
                                $sSQL .= "select 'L' as osm_type,place_id as osm_id,'place' as class,'house' as type,null as admin_level,30 as rank_search,30 as rank_address,min(place_id) as place_id,'us' as country_code,";
                                $sSQL .= "get_address_by_language(place_id, $sLanguagePrefArraySQL) as langaddress,";
                                $sSQL .= "null as placename,";
                                $sSQL .= "null as ref,";
                                $sSQL .= "avg(ST_X(centroid)) as lon,avg(ST_Y(centroid)) as lat, ";
 -                              $sSQL .= "-0.10 as importance, ";
 +                              $sSQL .= $sImportanceSQL."-1.10 as importance, ";
                                $sSQL .= "(select max(p.importance*(p.rank_address+2)) from place_addressline s, placex p where s.place_id = min(location_property_aux.place_id) and p.place_id = s.address_place_id and s.isaddress and p.importance is not null) as addressimportance, ";
                                $sSQL .= "null as extra_place ";
                                $sSQL .= "from location_property_aux where place_id in ($sPlaceIDs) ";
                                $sSQL .= "group by place_id";
                                if (!$this->bDeDupe) $sSQL .= ",place_id";
                                $sSQL .= ",get_address_by_language(place_id, $sLanguagePrefArraySQL) ";
 +                              */
                        }
  
 -                      $sSQL .= "order by importance desc";
 +                      $sSQL .= " order by importance desc";
                        if (CONST_Debug) { echo "<hr>"; var_dump($sSQL); }
                        $aSearchResults = $this->oDB->getAll($sSQL);
  
                        }
  
                        // View Box SQL
 -                      $sViewboxCentreSQL = $sViewboxSmallSQL = $sViewboxLargeSQL = false;
 +                      $sViewboxCentreSQL;
                        $bBoundingBoxSearch = false;
                        if ($this->aViewBox)
                        {
                                $aBigViewBox[1] = $this->aViewBox[1] + $fWidth;
                                $aBigViewBox[3] = $this->aViewBox[3] - $fWidth;
  
 -                              $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)";
 +                              $this->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)";
 +                              $this->sViewboxLargeSQL = "ST_SetSRID(ST_MakeBox2D(ST_Point(".(float)$aBigViewBox[0].",".(float)$aBigViewBox[1]."),ST_Point(".(float)$aBigViewBox[2].",".(float)$aBigViewBox[3].")),4326)";
                                $bBoundingBoxSearch = $this->bBoundedSearch;
                        }
  
                                $sViewboxCentreSQL .= ")'::geometry,4326)";
  
                                $sSQL = "select st_buffer(".$sViewboxCentreSQL.",".(float)($_GET['routewidth']/69).")";
 -                              $sViewboxSmallSQL = $this->oDB->getOne($sSQL);
 -                              if (PEAR::isError($sViewboxSmallSQL))
 +                              $this->sViewboxSmallSQL = $this->oDB->getOne($sSQL);
 +                              if (PEAR::isError($this->sViewboxSmallSQL))
                                {
 -                                      failInternalError("Could not get small viewbox.", $sSQL, $sViewboxSmallSQL);
 +                                      failInternalError("Could not get small viewbox.", $sSQL, $this->sViewboxSmallSQL);
                                }
 -                              $sViewboxSmallSQL = "'".$sViewboxSmallSQL."'::geometry";
 +                              $this->sViewboxSmallSQL = "'".$this->sViewboxSmallSQL."'::geometry";
  
                                $sSQL = "select st_buffer(".$sViewboxCentreSQL.",".(float)($_GET['routewidth']/30).")";
 -                              $sViewboxLargeSQL = $this->oDB->getOne($sSQL);
 -                              if (PEAR::isError($sViewboxLargeSQL))
 +                              $this->sViewboxLargeSQL = $this->oDB->getOne($sSQL);
 +                              if (PEAR::isError($this->sViewboxLargeSQL))
                                {
 -                                      failInternalError("Could not get large viewbox.", $sSQL, $sViewboxLargeSQL);
 +                                      failInternalError("Could not get large viewbox.", $sSQL, $this->sViewboxLargeSQL);
                                }
 -                              $sViewboxLargeSQL = "'".$sViewboxLargeSQL."'::geometry";
 +                              $this->sViewboxLargeSQL = "'".$this->sViewboxLargeSQL."'::geometry";
                                $bBoundingBoxSearch = $this->bBoundedSearch;
                        }
  
                                                                                                        $aSearch['sType'] = $aSearchTerm['type'];
                                                                                                        if (sizeof($aSearch['aName'])) $aSearch['sOperator'] = 'name';
                                                                                                        else $aSearch['sOperator'] = 'near'; // near = in for the moment
 +                                                                                                      if (strlen($aSearchTerm['operator']) == 0) $aSearch['iSearchRank'] += 1;
  
                                                                                                        // Do we have a shortcut id?
                                                                                                        if ($aSearch['sOperator'] == 'name')
                                                                {
                                                                        $sSQL = "select place_id from place_classtype_".$aSearch['sClass']."_".$aSearch['sType']." ct";
                                                                        if ($sCountryCodesSQL) $sSQL .= " join placex using (place_id)";
 -                                                                      $sSQL .= " where st_contains($sViewboxSmallSQL, ct.centroid)";
 +                                                                      $sSQL .= " where st_contains($this->sViewboxSmallSQL, ct.centroid)";
                                                                        if ($sCountryCodesSQL) $sSQL .= " and calculated_country_code in ($sCountryCodesSQL)";
                                                                        if (sizeof($this->aExcludePlaceIDs))
                                                                        {
                                                                        {
                                                                                $sSQL = "select place_id from place_classtype_".$aSearch['sClass']."_".$aSearch['sType']." ct";
                                                                                if ($sCountryCodesSQL) $sSQL .= " join placex using (place_id)";
 -                                                                              $sSQL .= " where st_contains($sViewboxLargeSQL, ct.centroid)";
 +                                                                              $sSQL .= " where st_contains($this->sViewboxLargeSQL, ct.centroid)";
                                                                                if ($sCountryCodesSQL) $sSQL .= " and calculated_country_code in ($sCountryCodesSQL)";
                                                                                if ($sViewboxCentreSQL) $sSQL .= " order by st_distance($sViewboxCentreSQL, ct.centroid) asc";
                                                                                $sSQL .= " limit $this->iLimit";
                                                                else
                                                                {
                                                                        $sSQL = "select place_id from placex where class='".$aSearch['sClass']."' and type='".$aSearch['sType']."'";
 -                                                                      $sSQL .= " and st_contains($sViewboxSmallSQL, geometry) and linked_place_id is null";
 +                                                                      $sSQL .= " and st_contains($this->sViewboxSmallSQL, geometry) and linked_place_id is null";
                                                                        if ($sCountryCodesSQL) $sSQL .= " and calculated_country_code in ($sCountryCodesSQL)";
                                                                        if ($sViewboxCentreSQL) $sSQL .= " order by st_distance($sViewboxCentreSQL, centroid) asc";
                                                                        $sSQL .= " limit $this->iLimit";
                                                                $aTerms[] = "country_code in ($sCountryCodesSQL)";
                                                        }
  
 -                                                      if ($bBoundingBoxSearch) $aTerms[] = "centroid && $sViewboxSmallSQL";
 +                                                      if ($bBoundingBoxSearch) $aTerms[] = "centroid && $this->sViewboxSmallSQL";
                                                        if ($sNearPointSQL) $aOrder[] = "ST_Distance($sNearPointSQL, centroid) asc";
  
                                                        $sImportanceSQL = '(case when importance = 0 OR importance IS NULL then 0.75-(search_rank::float/40) else importance end)';
 -                                                      if ($sViewboxSmallSQL) $sImportanceSQL .= " * case when ST_Contains($sViewboxSmallSQL, centroid) THEN 1 ELSE 0.5 END";
 -                                                      if ($sViewboxLargeSQL) $sImportanceSQL .= " * case when ST_Contains($sViewboxLargeSQL, centroid) THEN 1 ELSE 0.5 END";
 +                                                      if ($this->sViewboxSmallSQL) $sImportanceSQL .= " * case when ST_Contains($this->sViewboxSmallSQL, centroid) THEN 1 ELSE 0.5 END";
 +                                                      if ($this->sViewboxLargeSQL) $sImportanceSQL .= " * case when ST_Contains($this->sViewboxLargeSQL, centroid) THEN 1 ELSE 0.5 END";
                                                        $aOrder[] = "$sImportanceSQL DESC";
                                                        if (sizeof($aSearch['aFullNameAddress']))
                                                        {
                                                                $aPlaceIDs = $this->oDB->getCol($sSQL);
  
                                                                // If not try the aux fallback table
 +                                                              /*
                                                                if (!sizeof($aPlaceIDs))
                                                                {
                                                                        $sSQL = "select place_id from location_property_aux where parent_place_id in (".$sPlaceIDs.") and housenumber = '".pg_escape_string($aSearch['sHouseNumber'])."'";
                                                                        if (CONST_Debug) var_dump($sSQL);
                                                                        $aPlaceIDs = $this->oDB->getCol($sSQL);
                                                                }
 +                                                              */
  
                                                                if (!sizeof($aPlaceIDs))
                                                                {
diff --combined lib/lib.php
index 3ed66237e955cdff43da2122cbcfe6bad6f52d19,a75c3af7f23f5bbd4e62ac81dcf97f4da9d16bf2..54c8c7d0d7176c581b1e92d5b9d89c3e229f928a
        {
                $aResult = array(array(join(' ',$aWords)));
                $sFirstToken = '';
 -              if ($iDepth < 8) {
 +              if ($iDepth < 7) {
                        while(sizeof($aWords) > 1)
                        {
                                $sWord = array_shift($aWords);
                return $iPlaceID;
        }
  
-       function loadStructuredAddressElement(&$aStructuredQuery, &$iMinAddressRank, &$iMaxAddressRank, &$aAddressRankList, $aParams, $sKey, $iNewMinAddressRank, $iNewMaxAddressRank, $aItemListValues)
-       {
-               if (!isset($_GET[$sKey])) return false;
-               $sValue = trim($_GET[$sKey]);
-               if (!$sValue) return false;
-               $aStructuredQuery[$sKey] = $sValue;
-               if ($iMinAddressRank == 0 && $iMaxAddressRank == 30)
-               {
-                       $iMinAddressRank = $iNewMinAddressRank;
-                       $iMaxAddressRank = $iNewMaxAddressRank;
-               }
-               if ($aItemListValues) $aAddressRankList = array_merge($aAddressRankList, $aItemListValues);
-               return true;
-       }
        function addQuotes($s)
        {
                return "'".$s."'";
diff --combined settings/settings.php
index 4e9d71f031742d17bd530d8282c6313524a7d5fc,0ce34ad2e5601b7d972e9b68a0980ab63203f9b2..f31e16b6ab276ed4738e382c29b3b830551f57ba
  
        // Website settings
        @define('CONST_NoAccessControl', true);
 -      @define('CONST_ClosedForIndexing', false);
 -      @define('CONST_ClosedForIndexingExceptionIPs', '');
        @define('CONST_BlockedIPs', '');
 +      @define('CONST_IPBanFile', CONST_BasePath.'/settings/ip_blocks');
 +      @define('CONST_WhitelistedIPs', '');
 +      @define('CONST_BlockedUserAgents', '');
 +      @define('CONST_BlockReverseMaxLoad', 15);
        @define('CONST_BulkUserIPs', '');
  
 -      @define('CONST_Website_BaseURL', 'http://'.php_uname('n').'/');
 +      @define('CONST_Website_BaseURL', 'http://nominatim.openstreetmap.org/');
        @define('CONST_Tile_Default', 'Mapnik');
  
        @define('CONST_Default_Language', false);
@@@ -69,6 -67,8 +69,8 @@@
        @define('CONST_Search_AreaPolygons_Enabled', true);
        @define('CONST_Search_AreaPolygons', true);
  
+       @define('CONST_Search_BatchMode', false);
        @define('CONST_Search_TryDroppedAddressTerms', false);
        @define('CONST_Search_NameOnlySearchFrequencyThreshold', false);