From a766240c063ea516c4f17497e4093d3d4758b7ff Mon Sep 17 00:00:00 2001 From: Sarah Hoffmann Date: Sun, 24 Jul 2016 23:58:39 +0200 Subject: [PATCH] remove duplicate reverse geocoding code 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 | 14 +++++-- lib/ReverseGeocode.php | 6 +-- lib/lib.php | 84 ------------------------------------------ 3 files changed, 14 insertions(+), 90 deletions(-) diff --git a/lib/Geocode.php b/lib/Geocode.php index a01abbc5..2d246d98 100644 --- a/lib/Geocode.php +++ b/lib/Geocode.php @@ -1,5 +1,6 @@ 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(); } diff --git a/lib/ReverseGeocode.php b/lib/ReverseGeocode.php index d2902a59..0c684a4e 100644 --- a/lib/ReverseGeocode.php +++ b/lib/ReverseGeocode.php @@ -108,7 +108,7 @@ // 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; @@ -155,7 +155,7 @@ $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'; @@ -220,7 +220,7 @@ } // 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'; diff --git a/lib/lib.php b/lib/lib.php index 1f772331..94bed6d8 100644 --- a/lib/lib.php +++ b/lib/lib.php @@ -680,90 +680,6 @@ } - 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."'"; -- 2.39.5