]> git.openstreetmap.org Git - nominatim.git/blobdiff - lib/lib.php
move looksLikeLatLonPair into lib.php, basic PHP test suite using phpunit
[nominatim.git] / lib / lib.php
index afcc02eff186f78d5579a4b5136e935edf8b37df..e200202bd6d869136e8fcda26eee8bbc6cb3a650 100644 (file)
@@ -45,7 +45,7 @@
                if (!$sUserError) $sUserError = $sError;
                error_log('ERROR: '.$sError);
                echo $sUserError."\n";
-               exit;
+               exit(-1);
        }
 
 
@@ -94,7 +94,8 @@
 
        function bySearchRank($a, $b)
        {
-               if ($a['iSearchRank'] == $b['iSearchRank']) return 0;
+               if ($a['iSearchRank'] == $b['iSearchRank'])
+            return strlen($a['sOperator']) + strlen($a['sHouseNumber']) - strlen($b['sOperator']) - strlen($b['sHouseNumber']);
                return ($a['iSearchRank'] < $b['iSearchRank']?-1:1);
        }
 
  'landuse:commercial' => array('label'=>'Commercial','frequency'=>657,'icon'=>'',),
 
  'place:airport' => array('label'=>'Airport','frequency'=>36,'icon'=>'transport_airport2', 'defdiameter' => 0.03,),
+ 'aeroway:aerodrome' => array('label'=>'Aerodrome','frequency'=>36,'icon'=>'transport_airport2', 'defdiameter' => 0.03,),
+ 'aeroway' => array('label'=>'Aeroway','frequency'=>36,'icon'=>'transport_airport2', 'defdiameter' => 0.03,),
  'railway:station' => array('label'=>'Station','frequency'=>3431,'icon'=>'transport_train_station2', 'defdiameter' => 0.01,),
  'amenity:place_of_worship' => array('label'=>'Place Of Worship','frequency'=>9049,'icon'=>'place_of_worship_unknown3',),
  'amenity:pub' => array('label'=>'Pub','frequency'=>18969,'icon'=>'food_pub',),
        {
                return "'".$s."'";
        }
+
+       // returns boolean
+       function validLatLon($fLat,$fLon)
+       {
+               return ($fLat <= 90.1 && $fLat >= -90.1 && $fLon <= 180.1 && $fLon >= -180.1);
+       }
+
+       // Do we have anything that looks like a lat/lon pair?
+       // returns array(lat,lon,query_with_lat_lon_removed)
+       // or null
+       function looksLikeLatLonPair($sQuery)
+       {
+               $sFound    = null;
+               $fQueryLat = null;
+               $fQueryLon = null;
+
+               // degrees decimal minutes
+               // N 40 26.767, W 79 58.933
+               // N 40°26.767′, W 79°58.933′
+               //                  1         2                   3                  4         5            6
+               if (preg_match('/\\b([NS])[ ]+([0-9]+[0-9.]*)[° ]+([0-9.]+)?[′\']*[, ]+([EW])[ ]+([0-9]+)[° ]+([0-9]+[0-9.]*)[′\']*?\\b/', $sQuery, $aData))
+               {
+                       $sFound    = $aData[0];
+                       $fQueryLat = ($aData[1]=='N'?1:-1) * ($aData[2] + $aData[3]/60);
+                       $fQueryLon = ($aData[4]=='E'?1:-1) * ($aData[5] + $aData[6]/60);
+               }
+               // degrees decimal minutes
+               // 40 26.767 N, 79 58.933 W
+               // 40° 26.767′ N 79° 58.933′ W
+               //                      1             2                      3          4            5                    6
+               elseif (preg_match('/\\b([0-9]+)[° ]+([0-9]+[0-9.]*)?[′\']*[ ]+([NS])[, ]+([0-9]+)[° ]+([0-9]+[0-9.]*)?[′\' ]+([EW])\\b/', $sQuery, $aData))
+               {
+                       $sFound    = $aData[0];
+                       $fQueryLat = ($aData[3]=='N'?1:-1) * ($aData[1] + $aData[2]/60);
+                       $fQueryLon = ($aData[6]=='E'?1:-1) * ($aData[4] + $aData[5]/60);
+               }
+               // degrees decimal seconds
+               // N 40 26 46 W 79 58 56
+               // N 40° 26′ 46″ W, 79° 58′ 56″
+               //                      1        2            3            4                5        6            7            8
+               elseif (preg_match('/\\b([NS])[ ]([0-9]+)[° ]+([0-9]+)[′\' ]+([0-9]+)[″"]*[, ]+([EW])[ ]([0-9]+)[° ]+([0-9]+)[′\' ]+([0-9]+)[″"]*\\b/', $sQuery, $aData))
+               {
+                       $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);
+               }
+               // degrees decimal seconds
+               // 40 26 46 N 79 58 56 W
+               // 40° 26′ 46″ N, 79° 58′ 56″ W
+               //                      1            2            3            4          5            6            7            8
+               elseif (preg_match('/\\b([0-9]+)[° ]+([0-9]+)[′\' ]+([0-9]+)[″" ]+([NS])[, ]+([0-9]+)[° ]+([0-9]+)[′\' ]+([0-9]+)[″" ]+([EW])\\b/', $sQuery, $aData))
+               {
+                       $sFound    = $aData[0];
+                       $fQueryLat = ($aData[4]=='N'?1:-1) * ($aData[1] + $aData[2]/60 + $aData[3]/3600);
+                       $fQueryLon = ($aData[8]=='E'?1:-1) * ($aData[5] + $aData[6]/60 + $aData[7]/3600);
+               }
+               // degrees decimal
+               // N 40.446° W 79.982°
+               //                      1        2                               3        4
+               elseif (preg_match('/\\b([NS])[ ]([0-9]+[0-9]*\\.[0-9]+)[°]*[, ]+([EW])[ ]([0-9]+[0-9]*\\.[0-9]+)[°]*\\b/', $sQuery, $aData))
+               {
+                       $sFound    = $aData[0];
+                       $fQueryLat = ($aData[1]=='N'?1:-1) * ($aData[2]);
+                       $fQueryLon = ($aData[3]=='E'?1:-1) * ($aData[4]);
+               }
+               // degrees decimal
+               // 40.446° N 79.982° W
+               //                      1                           2          3                           4
+               elseif (preg_match('/\\b([0-9]+[0-9]*\\.[0-9]+)[° ]+([NS])[, ]+([0-9]+[0-9]*\\.[0-9]+)[° ]+([EW])\\b/', $sQuery, $aData))
+               {
+                       $sFound    = $aData[0];
+                       $fQueryLat = ($aData[2]=='N'?1:-1) * ($aData[1]);
+                       $fQueryLon = ($aData[4]=='E'?1:-1) * ($aData[3]);
+               }
+               // degrees decimal
+               // 12.34, 56.78
+               // [12.456,-78.90]
+               //                   1          2                             3                        4
+               elseif (preg_match('/(\\[|^|\\b)(-?[0-9]+[0-9]*\\.[0-9]+)[, ]+(-?[0-9]+[0-9]*\\.[0-9]+)(\\]|$|\\b)/', $sQuery, $aData))
+               {
+                       $sFound    = $aData[0];
+                       $fQueryLat = $aData[2];
+                       $fQueryLon = $aData[3];
+               }
+
+               if (!validLatLon($fQueryLat, $fQueryLon)) return;
+               $sQuery = trim(str_replace($sFound, ' ', $sQuery));
+
+               return array('lat' => $fQueryLat, 'lon' => $fQueryLon, 'query' => $sQuery);
+       }
\ No newline at end of file