расстояние между двумя точками земли, в GPS координатах стандарта WGS84

DevConf 2017 - видео с конференции, успей до 17 июля | Проверенные VDS на SSD в Европе и России

Тема в разделе "Вопросы по теории программирования", создана пользователем domino, 28 апр 2008.

  1. domino

    domino Новичок

    Сообщения:
    117
    Ваш город:
    Kharkov, Ukraine
    Adress:
    Kharkiv, Ukraine
    Country:
    Location on Map:
    расстояние между двумя точками земли, в 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_AXIS2)); //meters
    define('MINOR_AXIS_POW_2'pow(MINOR_AXIS2)); //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 
    sqrtpow($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 (
    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>=&& $lat<=90)
        {
            return 
    'north';
        }
        else
        if(
    $lat>=-90 && $lat<=0)
        {
            return 
    'south';
        }

        return 
    false;
    }

    function 
    check_lon($lon)
    {
        if(
    $lon>=&& $lon<=180)
        {
            return 
    'east';
        }
        else
        if(
    $lon>=-180 && $lon<=0)
        {
            return 
    'west';
        }

        return 
    false;

    }


     
    AmdY нравится это.
  2. Апокалипсис

    Апокалипсис тех дир matras.ru

    Сообщения:
    1.994
    Ваш город:
    Novosibirsk, Russia
    Adress:
    Novosibirsk, Russia
    Country:
    Location on Map:
  3. domino

    domino Новичок

    Сообщения:
    117
    Ваш город:
    Kharkov, Ukraine
    Adress:
    Kharkiv, Ukraine
    Country:
    Location on Map:
    что и? берите пользуйтесь кому надо. это не от фонаря. это из реальной морской навигационной задачи для PHP (слежение за кораблями с GPS и гуглмапс). если у кого-то есть желание считать всю математику с нуля - ради бога.
     
  4. leadaxe

    leadaxe Новичок

    Сообщения:
    26
    Adress:
    Saint Petersburg, Russia
    Country:
    Location on Map:
    Огромная благодарность. Проверил все четко работает. Сильно помогло и сэкономило время
     
  5. domino

    domino Новичок

    Сообщения:
    117
    Ваш город:
    Kharkov, Ukraine
    Adress:
    Kharkiv, Ukraine
    Country:
    Location on Map:
    пользуйтесь ^_^
     
  6. dr-sm

    dr-sm Новичок

    Сообщения:
    348
    Adress:
    Voronezh, Russia
    Country:
    Location on Map:
    с помощью гуглмапс нельзя следить за коробляме если что.
    это нарушение лицензионного соглашения.

    omg wtf warez!!! :D
     
    craz нравится это.
  7. domino

    domino Новичок

    Сообщения:
    117
    Ваш город:
    Kharkov, Ukraine
    Adress:
    Kharkiv, Ukraine
    Country:
    Location on Map:
    а указанные координаты, переданные с корабля, можно показывать?
     
  8. dr-sm

    dr-sm Новичок

    Сообщения:
    348
    Adress:
    Voronezh, Russia
    Country:
    Location on Map:
    хотят денег, причем много очень (
     
  9. domino

    domino Новичок

    Сообщения:
    117
    Ваш город:
    Kharkov, Ukraine
    Adress:
    Kharkiv, Ukraine
    Country:
    Location on Map:
    и что? задача не противоречит лицензии п. 10.9 С. а под пункты A и B не подпадает. и вообще, проект работает уже 3 года и приносит столько бабла, что клиенту хватит оплатить любую лицензию. да и гонорары давно пропиты, так что нечего тут грабить мои корованы.

    и, самое главное, стартпост никаким макаром не затрагивает гугл.
     
  10. dr-sm

    dr-sm Новичок

    Сообщения:
    348
    Adress:
    Voronezh, Russia
    Country:
    Location on Map:
    да это шутка была, по мотивам разразившейся недавно в очередной раз "трагедии CURL". [​IMG]

    кстати как твой алгоритм ведет себя на коротких дистанциях?
    загнал вот реальный трек 10к точек, получилось:
    Код:
    Distance One: 346154.59991846
    Distance Two: 347226.91607613
    Delta: 1072.3161576724
    первое - обычный haversine.
    интересно, что точнее.
     
  11. domino

    domino Новичок

    Сообщения:
    117
    Ваш город:
    Kharkov, Ukraine
    Adress:
    Kharkiv, Ukraine
    Country:
    Location on Map:
    мой \m/
     
  12. vanicx

    vanicx Новичок

    Сообщения:
    2
    Ваш город:
    Петропавловск-Камчатский
    Adress:
    Petropavlovsk-Kamchatskiy, Russia
    Country:
    Location on Map:
    алгоритм считает кратчайшее расстояние, не по поверхности земли, а сквозь землю. Еще и с ошибками при переходе через нулевой меридиан :-(
     
    Последнее редактирование: 21 апр 2017
  13. fixxxer

    fixxxer К.О.

    Сообщения:
    12.117
    Ваш город:
    Moscow, Russia
    Adress:
    Moscow, Russia
    Country:
    Location on Map:
    Этому посту скоро 10 лет будет, зачем вообще его поднимать?

    В 2017-м году на packagist есть всё. Вот за 5 секунд нашел https://packagist.org/packages/mjaschen/phpgeo
     
    vanicx нравится это.
  14. vanicx

    vanicx Новичок

    Сообщения:
    2
    Ваш город:
    Петропавловск-Камчатский
    Adress:
    Petropavlovsk-Kamchatskiy, Russia
    Country:
    Location on Map:
    спасибо!
    чет даже не пробовал библиотеки искать, искал формулы :-(
     
  15. fixxxer

    fixxxer К.О.

    Сообщения:
    12.117
    Ваш город:
    Moscow, Russia
    Adress:
    Moscow, Russia
    Country:
    Location on Map:
    Как ты сюда попал, если искал формулы? :)

    А вообще говоря, искать информацию, не специфичную для русскоговорящих, на русском языке - это вообще очень вредная привычка. ;)

    По запросу "geographic distance formula" всё находится моментально.
     
  16. domino

    domino Новичок

    Сообщения:
    117
    Ваш город:
    Kharkov, Ukraine
    Adress:
    Kharkiv, Ukraine
    Country:
    Location on Map:
    не надо ляля.
    а надо высоту точки над уровнем моря задавать.
     
  17. domino

    domino Новичок

    Сообщения:
    117
    Ваш город:
    Kharkov, Ukraine
    Adress:
    Kharkiv, Ukraine
    Country:
    Location on Map:
    а земле 3млрд лет. и все еще крутится.

    а по факту, в то время не было этих расчудесных библиотек. сами брали и считали. да и интересно было.