]> git.openstreetmap.org Git - nominatim.git/blobdiff - lib/lib.php
narrow down search by house number when postcode is given
[nominatim.git] / lib / lib.php
index 76775d6c8f6febac91f8b9aca990b3f446a75242..3c70d1de7c822d0c6b15e7a6d7cec29be2fda1df 100644 (file)
@@ -14,7 +14,7 @@ function getProcessorCount()
 {
     $sCPU = file_get_contents('/proc/cpuinfo');
     preg_match_all('#processor\s+: [0-9]+#', $sCPU, $aMatches);
-    return sizeof($aMatches[0]);
+    return count($aMatches[0]);
 }
 
 
@@ -38,7 +38,7 @@ function getDatabaseDate(&$oDB)
     // Find the newest node in the DB
     $iLastOSMID = $oDB->getOne("select max(osm_id) from place where osm_type = 'N'");
     // Lookup the timestamp that node was created
-    $sLastNodeURL = 'https://www.openstreetmap.org/api/0.6/node/'.$iLastOSMID."/1";
+    $sLastNodeURL = 'https://www.openstreetmap.org/api/0.6/node/'.$iLastOSMID.'/1';
     $sLastNodeXML = file_get_contents($sLastNodeURL);
 
     if ($sLastNodeXML === false) {
@@ -413,11 +413,11 @@ function javascript_renderData($xVal, $iOptions = 0)
     $jsonout = json_encode($xVal, $iOptions);
 
     if (!isset($_GET['json_callback'])) {
-        header("Content-Type: application/json; charset=UTF-8");
+        header('Content-Type: application/json; charset=UTF-8');
         echo $jsonout;
     } else {
         if (preg_match('/^[$_\p{L}][$_\p{L}\p{Nd}.[\]]*$/u', $_GET['json_callback'])) {
-            header("Content-Type: application/javascript; charset=UTF-8");
+            header('Content-Type: application/javascript; charset=UTF-8');
             echo $_GET['json_callback'].'('.$jsonout.')';
         } else {
             header('HTTP/1.0 400 Bad Request');
@@ -439,16 +439,16 @@ function _debugDumpGroupedSearches($aData, $aTokens)
             }
         }
     }
-    echo "<table border=\"1\">";
-    echo "<tr><th>rank</th><th>Name Tokens</th><th>Name Not</th>";
-    echo "<th>Address Tokens</th><th>Address Not</th><th>country</th><th>operator</th>";
-    echo "<th>class</th><th>type</th><th>postcode</th><th>housenumber</th></tr>";
+    echo '<table border="1">';
+    echo '<tr><th>rank</th><th>Name Tokens</th><th>Name Not</th>';
+    echo '<th>Address Tokens</th><th>Address Not</th><th>country</th><th>operator</th>';
+    echo '<th>class</th><th>type</th><th>postcode</th><th>housenumber</th></tr>';
     foreach ($aData as $iRank => $aRankedSet) {
         foreach ($aRankedSet as $aRow) {
             $aRow->dumpAsHtmlTableRow($aWordsIDs);
         }
     }
-    echo "</table>";
+    echo '</table>';
 }
 
 
@@ -456,7 +456,7 @@ function getAddressDetails(&$oDB, $sLanguagePrefArraySQL, $iPlaceID, $sCountryCo
 {
     $sSQL = "select *,get_name_by_language(name,$sLanguagePrefArraySQL) as localname from get_addressdata($iPlaceID, $housenumber)";
     if (!$bRaw) $sSQL .= " WHERE isaddress OR type = 'country_code'";
-    $sSQL .= " order by rank_address desc,isaddress desc";
+    $sSQL .= ' order by rank_address desc,isaddress desc';
 
     $aAddressLines = chksql($oDB->getAll($sSQL));
     if ($bRaw) return $aAddressLines;
@@ -530,11 +530,12 @@ function parseLatLon($sQuery)
         $sFound    = $aData[0];
         $fQueryLat = ($aData[1]=='N'?1:-1) * ($aData[2] + $aData[3]/60 + $aData[4]/3600);
         $fQueryLon = ($aData[5]=='E'?1:-1) * ($aData[6] + $aData[7]/60 + $aData[8]/3600);
-    } elseif (preg_match('/\\s*([0-9]+)[° ]+([0-9]+)[′\' ]+([0-9]+)[″" ]+([NS])[, ]+([0-9]+)[° ]+([0-9]+)[′\' ]+([0-9]+)[″" ]+([EW])\\s*/', $sQuery, $aData)) {
-        /*                     1            2              3             4          5            6              7             8
+    } elseif (preg_match('/\\s*([0-9]+)[° ]+([0-9]+)[′\' ]+([0-9]+[0-9.]*)[″" ]+([NS])[, ]+([0-9]+)[° ]+([0-9]+)[′\' ]+([0-9]+[0-9.]*)[″" ]+([EW])\\s*/', $sQuery, $aData)) {
+        /*                     1            2              3                    4          5            6              7                     8
          * degrees decimal seconds
          * 40 26 46 N 79 58 56 W
          * 40° 26′ 46″ N, 79° 58′ 56″ W
+         * 40° 26′ 46.78″ N, 79° 58′ 56.89″ W
          */
         $sFound    = $aData[0];
         $fQueryLat = ($aData[4]=='N'?1:-1) * ($aData[1] + $aData[2]/60 + $aData[3]/3600);
@@ -615,3 +616,23 @@ function createPointsAroundCenter($fLon, $fLat, $fRadius)
     }
     return $aPolyPoints;
 }
+
+function closestHouseNumber($aRow)
+{
+    $fHouse = $aRow['startnumber']
+                + ($aRow['endnumber'] - $aRow['startnumber']) * $aRow['fraction'];
+
+    switch ($aRow['interpolationtype']) {
+        case 'odd':
+            $iHn = (int)($fHouse/2) * 2 + 1;
+            break;
+        case 'even':
+            $iHn = (int)(round($fHouse/2)) * 2;
+            break;
+        default:
+            $iHn = (int)(round($fHouse));
+            break;
+    }
+
+    return max(min($aRow['endnumber'], $iHn), $aRow['startnumber']);
+}