]> git.openstreetmap.org Git - nominatim.git/commitdiff
remove duplicate reverse geocoding code
authorSarah Hoffmann <lonvia@denofr.de>
Sun, 24 Jul 2016 21:58:39 +0000 (23:58 +0200)
committerSarah Hoffmann <lonvia@denofr.de>
Sun, 24 Jul 2016 21:58:39 +0000 (23:58 +0200)
Geocode now uses ReverseGeocode directly. Note that it currently
cannot support any interpolations, neither OSM nor Tiger. But
neither did the previous version.

lib/Geocode.php
lib/ReverseGeocode.php
lib/lib.php

index a01abbc564dd26a869eb57cdf212c1f64f62c16a..2d246d98ae16b8209596de6ed470e88a95890c99 100644 (file)
@@ -1,5 +1,6 @@
 <?php
        require_once(CONST_BasePath.'/lib/PlaceLookup.php');
 <?php
        require_once(CONST_BasePath.'/lib/PlaceLookup.php');
+       require_once(CONST_BasePath.'/lib/ReverseGeocode.php');
 
        class Geocode
        {
 
        class Geocode
        {
                        else
                        {
                                // Just interpret as a reverse geocode
                        else
                        {
                                // Just interpret as a reverse geocode
-                               $iPlaceID = geocodeReverse((float)$this->aNearPoint[0], (float)$this->aNearPoint[1]);
-                               if ($iPlaceID)
-                                       $aSearchResults = $this->getDetails(array($iPlaceID));
+                               $oReverse = new ReverseGeocode($this->oDB);
+                               $oReverse->setLatLon((float)$this->aNearPoint[0], (float)$this->aNearPoint[1]);
+                               $oReverse->setZoom(18);
+
+                               $aLookup = $oReverse->lookup(false);
+
+                               if (CONST_Debug) var_dump("Reverse search", $aLookup);
+
+                               if ($aLookup['place_id'])
+                                       $aSearchResults = $this->getDetails(array($aLookup['place_id'] => -1));
                                else
                                        $aSearchResults = array();
                        }
                                else
                                        $aSearchResults = array();
                        }
index d2902a59485a68a4f5d84afc2329ed30562d4d58..0c684a4eed1b0f0016e2623785b11e9ebb8651bf 100644 (file)
 
                // returns { place_id =>, type => '(osm|tiger)' }
                // fails if no place was found
 
                // returns { place_id =>, type => '(osm|tiger)' }
                // fails if no place was found
-               function lookup()
+               function lookup($bDoInterpolation = true)
                {
                        $sPointSQL = 'ST_SetSRID(ST_Point('.$this->fLon.','.$this->fLat.'),4326)';
                        $iMaxRank = $this->iMaxRank;
                {
                        $sPointSQL = 'ST_SetSRID(ST_Point('.$this->fLon.','.$this->fLat.'),4326)';
                        $iMaxRank = $this->iMaxRank;
                                $bIsInUnitedStates = ($aPlace['calculated_country_code'] == 'us');
                        }
                        // if a street or house was found, look in interpolation lines table
                                $bIsInUnitedStates = ($aPlace['calculated_country_code'] == 'us');
                        }
                        // if a street or house was found, look in interpolation lines table
-                       if ($iMaxRank_orig >= 28 && $aPlace && $aPlace['rank_search'] >= 26)
+                       if ($bDoInterpolation && $iMaxRank_orig >= 28 && $aPlace && $aPlace['rank_search'] >= 26)
                        {
                                // if a house was found, search the interpolation line that is at least as close as the house
                                $sSQL = 'SELECT place_id, parent_place_id, 30 as rank_search, ST_line_locate_point(linegeo,'.$sPointSQL.') as fraction';
                        {
                                // if a house was found, search the interpolation line that is at least as close as the house
                                $sSQL = 'SELECT place_id, parent_place_id, 30 as rank_search, ST_line_locate_point(linegeo,'.$sPointSQL.') as fraction';
                        }
                        
                        // Only street found? If it's in the US we can check TIGER data for nearest housenumber
                        }
                        
                        // Only street found? If it's in the US we can check TIGER data for nearest housenumber
-                       if (CONST_Use_US_Tiger_Data && $bIsInUnitedStates && $iMaxRank_orig >= 28 && $iPlaceID && ($aPlace['rank_search'] == 26 || $aPlace['rank_search'] == 27 ))
+                       if (CONST_Use_US_Tiger_Data && $bDoInterpolation && $bIsInUnitedStates && $iMaxRank_orig >= 28 && $iPlaceID && ($aPlace['rank_search'] == 26 || $aPlace['rank_search'] == 27 ))
                        {
                                $fSearchDiam = 0.001;
                                $sSQL = 'SELECT place_id,parent_place_id,30 as rank_search, ST_line_locate_point(linegeo,'.$sPointSQL.') as fraction';
                        {
                                $fSearchDiam = 0.001;
                                $sSQL = 'SELECT place_id,parent_place_id,30 as rank_search, ST_line_locate_point(linegeo,'.$sPointSQL.') as fraction';
index 1f772331ce95b75b24337bec7af8bd8aea3f874b..94bed6d81a2529335b56a2140e0639dc8e94ed10 100644 (file)
        }
 
 
        }
 
 
-       function geocodeReverse($fLat, $fLon, $iZoom=18)
-       {
-               $oDB =& getDB();
-
-               $sPointSQL = "ST_SetSRID(ST_Point($fLon,$fLat),4326)";
-
-               // Zoom to rank, this could probably be calculated but a lookup gives fine control
-               $aZoomRank = array(
-                               0 => 2, // Continent / Sea
-                               1 => 2,
-                               2 => 2,
-                               3 => 4, // Country
-                               4 => 4,
-                               5 => 8, // State
-                               6 => 10, // Region
-                               7 => 10,
-                               8 => 12, // County
-                               9 => 12,
-                               10 => 17, // City
-                               11 => 17,
-                               12 => 18, // Town / Village
-                               13 => 18,
-                               14 => 22, // Suburb
-                               15 => 22,
-                               16 => 26, // Street, TODO: major street?
-                               17 => 26,
-                               18 => 30, // or >, Building
-                               19 => 30, // or >, Building
-                               );
-               $iMaxRank = isset($aZoomRank[$iZoom])?$aZoomRank[$iZoom]:28;
-
-               // Find the nearest point
-               $fSearchDiam = 0.0001;
-               $iPlaceID = null;
-               $aArea = false;
-               $fMaxAreaDistance = 1;
-               while(!$iPlaceID && $fSearchDiam < $fMaxAreaDistance)
-               {
-                       $fSearchDiam = $fSearchDiam * 2;
-
-                       // If we have to expand the search area by a large amount then we need a larger feature
-                       // then there is a limit to how small the feature should be
-                       if ($fSearchDiam > 2 && $iMaxRank > 4) $iMaxRank = 4;
-                       if ($fSearchDiam > 1 && $iMaxRank > 9) $iMaxRank = 8;
-                       if ($fSearchDiam > 0.8 && $iMaxRank > 10) $iMaxRank = 10;
-                       if ($fSearchDiam > 0.6 && $iMaxRank > 12) $iMaxRank = 12;
-                       if ($fSearchDiam > 0.2 && $iMaxRank > 17) $iMaxRank = 17;
-                       if ($fSearchDiam > 0.1 && $iMaxRank > 18) $iMaxRank = 18;
-                       if ($fSearchDiam > 0.008 && $iMaxRank > 22) $iMaxRank = 22;
-                       if ($fSearchDiam > 0.001 && $iMaxRank > 26) $iMaxRank = 26;
-
-                       $sSQL = 'select place_id,parent_place_id from placex';
-                       $sSQL .= ' WHERE ST_DWithin('.$sPointSQL.', geometry, '.$fSearchDiam.')';
-                       $sSQL .= ' and rank_search != 28 and rank_search >= '.$iMaxRank;
-                       $sSQL .= ' and (name is not null or housenumber is not null)';
-                       $sSQL .= ' and class not in (\'waterway\')';
-                       $sSQL .= ' and (ST_GeometryType(geometry) not in (\'ST_Polygon\',\'ST_MultiPolygon\') ';
-                       $sSQL .= ' OR ST_DWithin('.$sPointSQL.', ST_Centroid(geometry), '.$fSearchDiam.'))';
-                       $sSQL .= ' ORDER BY ST_distance('.$sPointSQL.', geometry) ASC limit 1';
-                       //var_dump($sSQL);
-                       $aPlace = chksql($oDB->getRow($sSQL));
-                       $iPlaceID = $aPlace['place_id'];
-               }
-
-               // The point we found might be too small - use the address to find what it is a child of
-               if ($iPlaceID)
-               {
-                       $sSQL = "select address_place_id from place_addressline where cached_rank_address <= $iMaxRank and place_id = $iPlaceID order by cached_rank_address desc,isaddress desc,distance desc limit 1";
-                       $iPlaceID = chksql($oDB->getOne($sSQL));
-
-                       if ($iPlaceID && $aPlace['place_id'] && $iMaxRank < 28)
-                       {
-                               $sSQL = "select address_place_id from place_addressline where cached_rank_address <= $iMaxRank and place_id = ".$aPlace['place_id']." order by cached_rank_address desc,isaddress desc,distance desc";
-                               $iPlaceID = chksql($oDB->getOne($sSQL));
-                       }
-                       if (!$iPlaceID)
-                       {
-                               $iPlaceID = $aPlace['place_id'];
-                       }
-               }
-
-               return $iPlaceID;
-       }
-
        function addQuotes($s)
        {
                return "'".$s."'";
        function addQuotes($s)
        {
                return "'".$s."'";