domino
Новичок
расстояние между двумя точками земли, в GPS координатах стандарта WGS84
PHP:
define('COORDINATES_FORMAT', 'WGS84');
define('MAJOR_AXIS', 6378137.0); //meters
define('MINOR_AXIS', 6356752.3142); //meters
define('MAJOR_AXIS_POW_2', pow(MAJOR_AXIS, 2)); //meters
define('MINOR_AXIS_POW_2', pow(MINOR_AXIS, 2)); //meters
/*
$gps_1['lat'] - latitude (широта)
$gps_1['lon'] - longitude (долгота)
$gps_1['point_elevation'] (высота точки) // == 0 if this is sea. but must be defined!
*/
//get arrays with gps coordinates, returns earth terrestrial distance between 2 points
function get_distance_between_2_points($gps_1, $gps_2, $decart=false)
{
if(!$decart)
{
$true_angle_1 = get_true_angle($gps_1);
$true_angle_2 = get_true_angle($gps_2);
$point_radius_1 = get_point_radius($gps_1, $true_angle_1);
$point_radius_2 = get_point_radius($gps_2, $true_angle_2);
$earth_point_1_x = $point_radius_1 * cos(deg2rad($true_angle_1));
$earth_point_1_y = $point_radius_1 * sin(deg2rad($true_angle_1));
$earth_point_2_x = $point_radius_2 * cos(deg2rad($true_angle_2));
$earth_point_2_y = $point_radius_2 * sin(deg2rad($true_angle_2));
$x = get_distance_between_2_points(array('lat'=>$earth_point_1_x, 'lon'=>$earth_point_1_y), array('lat'=>$earth_point_2_x, 'lon'=>$earth_point_2_y), true);
$y = pi() * ( ($earth_point_1_x + $earth_point_2_x) / 360 ) * ( $gps_1['lon'] - $gps_2['lon'] );
return sqrt( pow($x,2) + pow($y,2) );
}
else
{
return sqrt(pow(($gps_1['lat'] - $gps_2['lat']), 2) + pow(($gps_1['lon'] - $gps_2['lon']), 2));
}
}
//returns degree's decimal measure, getting degree, minute and second
function get_decimal_degree($deg=0, $min=0, $sec=0)
{
return ($deg<0) ? (-1*(abs($deg) + (abs($min)/60) + (abs($sec)/3600))) : (abs($deg) + (abs($min)/60) + (abs($sec)/3600));
}
// get point, returns true angle
function get_true_angle($gps)
{
return atan( ( (MINOR_AXIS_POW_2 / MAJOR_AXIS_POW_2) * tan(deg2rad( $gps['lat'])) ) ) * 180/pi();
}
//get point and true angle, returns radius of small circle (radius between meridians)
function get_point_radius($gps, $true_angle)
{
return (1 / sqrt((pow(cos(deg2rad($true_angle)), 2) / MAJOR_AXIS_POW_2) + (pow(sin(deg2rad($true_angle)), 2) / MINOR_AXIS_POW_2))) + $gps['point_elevation'];
}
function check_lat($lat)
{
if($lat>=0 && $lat<=90)
{
return 'north';
}
else
if($lat>=-90 && $lat<=0)
{
return 'south';
}
return false;
}
function check_lon($lon)
{
if($lon>=0 && $lon<=180)
{
return 'east';
}
else
if($lon>=-180 && $lon<=0)
{
return 'west';
}
return false;
}