00001 <?php
00002
00003
00004
00005
00006
00007
00008 class GeoCalculator {
00009 const R = 6371;
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 public static function distance($lat1, $lon1, $lat2, $lon2) {
00021
00022 $lat1 = deg2rad($lat1);
00023 $lat2 = deg2rad($lat2);
00024 $lon1 = deg2rad($lon1);
00025 $lon2 = deg2rad($lon2);
00026
00027 $dLat = $lat2 - $lat1;
00028 $dLon = $lon2 - $lon1;
00029 $a =
00030 sin($dLat/2) * sin($dLat/2) +
00031 cos($lat1) * cos($lat2) *
00032 sin($dLon/2) * sin($dLon/2);
00033 $c = 2 * atan2(sqrt($a), sqrt(1-$a));
00034 $d = self::R * $c;
00035 return $d;
00036 }
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049 public static function bounding_box($lat, $lon, $ns_radius, $we_radius) {
00050
00051 $d_lat = rad2deg($ns_radius/self::R);
00052 $d_lon = rad2deg($we_radius/self::R/cos(deg2rad($lat)));
00053
00054 return array(
00055 'lat' => array('min' => $lat - $d_lat, 'max' => $lat + $d_lat),
00056 'lon' => array('min' => $lon - $d_lon, 'max' => $lon + $d_lon)
00057 );
00058 }
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075 public static function bounding_box_of($arr_coordinates) {
00076 $first = array_shift($arr_coordinates);
00077 if ($first == false) {
00078 return false;
00079 }
00080 $lat_min = Arr::get_item($first, 'lat', 0.0);
00081 $lat_max = $lat_min;
00082 $lon_min = Arr::get_item($first, 'lon', 0.0);
00083 $lon_max = $lon_min;
00084
00085 foreach($arr_coordinates as $c) {
00086 $lat = Arr::get_item($c, 'lat', 0.0);
00087 $lon = Arr::get_item($c, 'lon', 0.0);
00088 $lat_min = min($lat_min, $lat);
00089 $lat_max = max($lat_max, $lat);
00090 $lon_min = min($lon_min, $lon);
00091 $lon_max = max($lon_max, $lon);
00092 }
00093
00094 return array(
00095 'lat' => array('min' => $lat_min, 'max' => $lat_max),
00096 'lon' => array('min' => $lon_min, 'max' => $lon_max)
00097 );
00098 }
00099 }