]> git.openstreetmap.org Git - nominatim.git/blobdiff - lib/ReverseGeocode.php
Merge remote-tracking branch 'upstream/master'
[nominatim.git] / lib / ReverseGeocode.php
index 6d3cc8293b4a8a11c95b0470fbed7725b7494a73..9b43a3e38cdd8d2aabd8c5391b0aeee90898631b 100644 (file)
@@ -57,7 +57,7 @@ class ReverseGeocode
         $sSQL .= ' , ST_Distance(linegeo,'.$sPointSQL.') as distance';
         $sSQL .= ' FROM location_property_osmline';
         $sSQL .= ' WHERE ST_DWithin('.$sPointSQL.', linegeo, '.$fSearchDiam.')';
         $sSQL .= ' , ST_Distance(linegeo,'.$sPointSQL.') as distance';
         $sSQL .= ' FROM location_property_osmline';
         $sSQL .= ' WHERE ST_DWithin('.$sPointSQL.', linegeo, '.$fSearchDiam.')';
-        $sSQL .= ' and indexed_status = 0 ';
+        $sSQL .= ' and indexed_status = 0 and startnumber is not NULL ';
         $sSQL .= ' ORDER BY ST_distance('.$sPointSQL.', linegeo) ASC limit 1';
 
         return chksql(
         $sSQL .= ' ORDER BY ST_distance('.$sPointSQL.', linegeo) ASC limit 1';
 
         return chksql(
@@ -66,15 +66,22 @@ class ReverseGeocode
         );
     }
 
         );
     }
 
+    public function lookup($fLat, $fLon, $bDoInterpolation = true)
+    {
+        return $this->lookupPoint(
+            'ST_SetSRID(ST_Point('.$fLon.','.$fLat.'),4326)',
+            $bDoInterpolation
+        );
+    }
+
     /* lookup()
      * returns { place_id =>, type => '(osm|tiger)' }
      * fails if no place was found
      */
 
 
     /* lookup()
      * returns { place_id =>, type => '(osm|tiger)' }
      * fails if no place was found
      */
 
 
-    public function lookup($fLat, $fLon, $bDoInterpolation = true)
+    public function lookupPoint($sPointSQL, $bDoInterpolation = true)
     {
     {
-        $sPointSQL = 'ST_SetSRID(ST_Point('.$fLon.','.$fLat.'),4326)';
         $iMaxRank = $this->iMaxRank;
 
         // Find the nearest point
         $iMaxRank = $this->iMaxRank;
 
         // Find the nearest point
@@ -118,7 +125,7 @@ class ReverseGeocode
                 $iMaxRank = 26;
             }
 
                 $iMaxRank = 26;
             }
 
-            $sSQL = 'select place_id,parent_place_id,rank_search,calculated_country_code';
+            $sSQL = 'select place_id,parent_place_id,rank_search,country_code';
             $sSQL .= ' FROM placex';
             $sSQL .= ' WHERE ST_DWithin('.$sPointSQL.', geometry, '.$fSearchDiam.')';
             $sSQL .= ' and rank_search != 28 and rank_search >= '.$iMaxRank;
             $sSQL .= ' FROM placex';
             $sSQL .= ' WHERE ST_DWithin('.$sPointSQL.', geometry, '.$fSearchDiam.')';
             $sSQL .= ' and rank_search != 28 and rank_search >= '.$iMaxRank;
@@ -135,7 +142,7 @@ class ReverseGeocode
             );
             $iPlaceID = $aPlace['place_id'];
             $iParentPlaceID = $aPlace['parent_place_id'];
             );
             $iPlaceID = $aPlace['place_id'];
             $iParentPlaceID = $aPlace['parent_place_id'];
-            $bIsInUnitedStates = ($aPlace['calculated_country_code'] == 'us');
+            $bIsInUnitedStates = ($aPlace['country_code'] == 'us');
         }
 
         // If a house was found make sure there isn't an interpolation line
         }
 
         // If a house was found make sure there isn't an interpolation line
@@ -153,7 +160,7 @@ class ReverseGeocode
             // look for an interpolation that is closer
             $aPlaceLine = $this->lookupInterpolation($sPointSQL, $fDistancePlacex);
 
             // look for an interpolation that is closer
             $aPlaceLine = $this->lookupInterpolation($sPointSQL, $fDistancePlacex);
 
-            if ($aPlaceLine) {
+            if ($aPlaceLine && (float) $aPlaceLine['distance'] < (float) $fDistancePlacex) {
                 // interpolation is closer to point than placex house
                 $bPlaceIsLine = true;
                 $aPlace = $aPlaceLine;
                 // interpolation is closer to point than placex house
                 $bPlaceIsLine = true;
                 $aPlace = $aPlaceLine;
@@ -201,6 +208,8 @@ class ReverseGeocode
         if ($iPlaceID && $iMaxRank < 28) {
             if (($aPlace['rank_search'] > 28 || $bPlaceIsTiger || $bPlaceIsLine) && $iParentPlaceID) {
                 $iPlaceID = $iParentPlaceID;
         if ($iPlaceID && $iMaxRank < 28) {
             if (($aPlace['rank_search'] > 28 || $bPlaceIsTiger || $bPlaceIsLine) && $iParentPlaceID) {
                 $iPlaceID = $iParentPlaceID;
+                $bPlaceIsLine = false;
+                $bPlaceIsTiger = false;
             }
             $sSQL  = 'select address_place_id';
             $sSQL .= ' FROM place_addressline';
             }
             $sSQL  = 'select address_place_id';
             $sSQL .= ' FROM place_addressline';