Оптимизировать расстояние для траектории полета PHP - PullRequest
1 голос
/ 22 марта 2020

Я стараюсь оптимизировать расстояние от траектории полета планера. У меня GPS фиксирует каждые 3 секунды (широта, долгота, высота). Итак, теперь у меня есть все исправления в массиве:

//This is an example of a fix
$fixes[0]['lat'] = '4710789N'; 
$fixes[0]['lon'] = '00724859E';
$fixes[0]['altitude'] = '00386'; //meters 

//and another fix
$fixes[1]['lat'] = '4710899N'; 
$fixes[1]['lon'] = '00724965E';
$fixes[1]['altitude'] = '00392'; //meters
    .
    .
    .
    .
//and the rest of ~3000 fixes

Долгота и широта исправлений фактически в формате DM. Поэтому для лучшего расчета с ними я конвертирую их с помощью этой функции в десятичный формат:

function DMStoDecimal($DMS){

    $isLat = false;

    if(substr($DMS, 7, 1) == "N" || substr($DMS, 7, 1) == "S"){
        $isLat = true;
    }



    if($isLat){
        $deg = substr($DMS, 0, 2);
        $minutes = substr($DMS, 2, 2);
        $minutes .= "." . substr($DMS, 4, 3);

        $sign = "";

        if(substr($DMS, 7, 1) == "N"){
            $sign = "-";
        }

    }else{
        $deg = substr($DMS, 0, 3);
        $minutes = substr($DMS, 3, 2);
        $minutes .= "." . substr($DMS, 5, 3);

        $sign = "";

        if(substr($DMS, 8, 1) == "E"){
            $sign = "-";
        }

    }

    $minutesDecimal = (float)$minutes / 60;

    $result = $deg + $minutesDecimal;

    return $sign . $result;

}

И с помощью этой функции я могу вычислить расстояние между двумя исправлениями:

function distance($lat1, $lon1, $lat2, $lon2, $unit) {

    if (($lat1 == $lat2) && ($lon1 == $lon2)) {
        return 0;
    }else{

        $theta = $lon1 - $lon2;
        $dist = sin(deg2rad($lat1)) * sin(deg2rad($lat2)) +  cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * cos(deg2rad($theta));
        $dist = acos($dist);
        $dist = rad2deg($dist);
        $miles = $dist * 60 * 1.1515;
        $unit = strtoupper($unit);

        if ($unit == "K") {
            return ($miles * 1.609344);
        } else if ($unit == "N") {
            return ($miles * 0.8684);
        } else {
            return $miles;
        }
    }
}

Я не могу Рассчитайте расстояние между каждым исправлением и суммируйте их, потому что есть некоторые правила, как рассчитывается расстояние для полета. Для полета я могу использовать только 6 этапов (1 начальная точка, 5 точек поворота, 1 конечная точка sh). Теперь я должен сделать оптимизацию для расчета расстояния. Мне нужно знать, какие 7 исправлений (включая исправление start и fini sh fix) для получения максимально возможного расстояния.

Я подумал, что могу начать с создания матрицы N * N, подобной этой:

/// N*N matrix half-filled with the distances in kilometers between all points.

/// - N: Number of points
/// - X: Distance to every point (calculated with function above)
/// 
///  +-----------------------> column
/// Fix 1 | - - - - - - - - - - -
/// Fix 2 | X - - - - - - - - - -
/// Fix 3 | X X - - - - - - - - -
/// Fix 4 | X X X - - - - - - - -
/// Fix 5 | X X X X - - - - - - -
/// Fix 6 | X X X X X - - - - - -
/// Fix 7 | X X X X X X - - - - -
/// Fix 8 | X X X X X X X - - - -
/// Fix 9 | X X X X X X X X - - -
/// Fix 10| X X X X X X X X X - -
/// Fix 11| X X X X X X X X X X -
///  v
/// row

Но теперь я не знаю, как я могу оценить необходимые исправления.

На втором шаге я также должен учесть, что конечная точка sh должна быть максимально на 1000 м ниже. чем первая (начальная) точка. Я что-то слышал о Графе, чтобы найти решение, но я не знаю, как продолжить свою работу.

Спасибо за помощь!

...