RegEx для соответствия функции широты и долготы - PullRequest
0 голосов
/ 21 апреля 2019

У меня есть данные широты и долготы в моем файле, которые я пытаюсь вызвать с помощью функции конвертера .

Я пытаюсь добавить функцию для строки $result60 иэто не работает.Я пытаюсь передать значения для функции, чтобы она вычисляла правильные градусы широты и долготы, используя метод DM.

Попытка

$re60 = '/([EW])([0-9][0-9][0-9])([0-9][0-9])/s';
$str60 = 'E16130';
//$subst60 = '\\3\\2\\1';
$subst60 = DMS2Decimal($degr = \\2, $mins = \\3, $secs = 0, $dir = \\1);
$result60 = preg_replace($re60, $subst60, $str60);
echo "The result of the substitution is ".$result60;

Как мне решить эту проблему?

1 Ответ

1 голос
/ 21 апреля 2019

Вы можете использовать этот RegEx , чтобы разделить вашу входную строку на 3 группы, где группа $1, $2 и $3 может быть вызвана вашим методом DMS для возврата $decimal.

RegEx

/([EWSN])([0-9]{3})([0-9]{2})/s

RegEx

Код

$str60 = 'E16130';
preg_match_all('/([EWSN])([0-9]{3})([0-9]{2})/s', $str60, $matches);
$result60 = DMS2Decimal($degrees = (int) $matches[2][0], $minutes = (int) $matches[3][0], $seconds = 10, $direction = strtolower($matches[1][0]));

echo "The result of the substitution:  y: " . $result60;

function DMS2Decimal($degrees = 0, $minutes = 0, $seconds = 0, $direction = 'n')
{
    //converts DMS coordinates to decimal
    //returns false on bad inputs, decimal on success

    //direction must be n, s, e or w, case-insensitive
    $d = strtolower($direction);
    $ok = array('n', 's', 'e', 'w');

    //degrees must be integer between 0 and 180
    if (!is_numeric($degrees) || $degrees < 0 || $degrees > 180) {
        $decimal = false;
    }
    //minutes must be integer or float between 0 and 59
    elseif (!is_numeric($minutes) || $minutes < 0 || $minutes > 59) {
        $decimal = false;
    }
    //seconds must be integer or float between 0 and 59
    elseif (!is_numeric($seconds) || $seconds < 0 || $seconds > 59) {
        $decimal = false;
    } elseif (!in_array($d, $ok)) {
        $decimal = false;
    } else {
        //inputs clean, calculate
        $decimal = $degrees + ($minutes / 60) + ($seconds / 3600);

        //reverse for south or west coordinates; north is assumed
        if ($d == 's' || $d == 'w') {
            $decimal *= -1;
        }
    }

    return $decimal;
}

Выход

The result of the substitution:  y: 161.5027777777
...