преобразование градусов, минут и десятых секунд в десятичную - PullRequest
0 голосов
/ 13 октября 2019

Из-за того, что какой-то код преобразует градусы, минуты и (десятые / десятичные) секунды в десятичный формат:

function convertDMSToDecimal($latlng) {
$valid = false;
$decimal_degrees = 0;
$degrees = 0; $minutes = 0; $seconds = 0; $direction = 1;
// Determine if there are extra periods in the input string
$num_periods = substr_count($latlng, '.');
if ($num_periods > 1) {
    $temp = preg_replace('/\./', ' ', $latlng, $num_periods - 1); // replace all but last period with delimiter
    $temp = trim(preg_replace('/[a-zA-Z]/','',$temp)); // when counting chunks we only want numbers
    $chunk_count = count(explode(" ",$temp));
    if ($chunk_count > 2) {
        $latlng = preg_replace('/\./', ' ', $latlng, $num_periods - 1); // remove last period
    } else {
        $latlng = str_replace("."," ",$latlng); // remove all periods, not enough chunks left by keeping last one
    }
}

// Remove unneeded characters
$latlng = trim($latlng);
$latlng = str_replace("º"," ",$latlng);
$latlng = str_replace("°"," ",$latlng);
$latlng = str_replace("'"," ",$latlng);
$latlng = str_replace("\""," ",$latlng);
$latlng = str_replace("  "," ",$latlng);
$latlng = substr($latlng,0,1) . str_replace('-', ' ', substr($latlng,1)); // remove all but first dash
if ($latlng != "") {
    // DMS with the direction at the start of the string
    if (preg_match("/^([nsewNSEW]?)\s*(\d{1,3})\s+(\d{1,3})\s+(\d+\.?\d*)$/",$latlng,$matches)) {
        $valid = true;
        $degrees = intval($matches[2]);
        $minutes = intval($matches[3]);
        $seconds = floatval($matches[4]);
        if (strtoupper($matches[1]) == "S" || strtoupper($matches[1]) == "W")
            $direction = -1;
    }
    // DMS with the direction at the end of the string
    elseif (preg_match("/^(-?\d{1,3})\s+(\d{1,3})\s+(\d+(?:\.\d+)?)\s*([nsewNSEW]?)$/",$latlng,$matches)) {
        $valid = true;
        $degrees = intval($matches[1]);
        $minutes = intval($matches[2]);
        $seconds = floatval($matches[3]);
        if (strtoupper($matches[4]) == "S" || strtoupper($matches[4]) == "W" || $degrees < 0) {
            $direction = -1;
            $degrees = abs($degrees);
        }
    }
    if ($valid) {
        // A match was found, do the calculation
        $decimal_degrees = ($degrees + ($minutes / 60) + ($seconds / 3600)) * $direction;


    } else {
        // Decimal degrees with a direction at the start of the string
        if (preg_match("/^([nsewNSEW]?)\s*(\d+(?:\.\d+)?)$/",$latlng,$matches)) {
            $valid = true;
            if (strtoupper($matches[1]) == "S" || strtoupper($matches[1]) == "W")
                $direction = -1;
            $decimal_degrees = $matches[2] * $direction;
        }
        // Decimal degrees with a direction at the end of the string
        elseif (preg_match("/^(-?\d+(?:\.\d+)?)\s*([nsewNSEW]?)$/",$latlng,$matches)) {
            $valid = true;
            if (strtoupper($matches[2]) == "S" || strtoupper($matches[2]) == "W" || $degrees < 0) {
                $direction = -1;
                $degrees = abs($degrees);
            }
            $decimal_degrees = $matches[1] * $direction;
        }
    }
}
if ($valid) {
    return $decimal_degrees;
} else {
    return false;
}
}

Моя проблема заключается в моих математических навыках и моей способности изменить код в соответствии с моим вариантом использования.

После некоторого исследования мы вводим градусы, минуты, секунды, но с секундами в десятых долях, поэтому 100 в 1 минуту, а не в 60 в 1 минуту широты.

Я пробовал такмного вариантов, это заставляет мою голову вращаться!

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

Я почти уверен, что это то, что янеобходимо изменить:

$decimal_degrees = ($degrees + ($minutes / 60) + ($seconds / 3600)) * $direction;

Поскольку секунды представлены в десятичных форматах, я думаю, что / 3600, вероятно, неправильно.

Любая помощь будет отличной!

1 Ответ

0 голосов
/ 13 октября 2019

Сортировка!

Мне пришлось объединить минуты и секунды и получить математическое право, чтобы изменить его на десятичное. Вот завершенный код для получения градусов, минут, десятичных секунд из устройства GPS или навигационной карты и вывода записи в виде десятичной дроби.

Они являются ключевой частью этого раздела ...

     //do the calculation
     $minsSecsCombined = $minutes.'.'.$seconds; //Combine the minutes and seconds together
     $math = (($minsSecsCombined / 3600) * 60) * 10000; //Math

     $degrees = $degrees.'.'.$math; //Combine the degrees and result together
     $degrees = number_format((float)$degrees, 6, '.', ''); //Ensure the result is classed as a number

     $decimal_degrees = $degrees * $direction; //Put them all together

И это законченный код все вместе ...

function convertDMSToDecimal($latlng) {
 $valid = false;
 $decimal_degrees = 0;
 $degrees = 0; $minutes = 0; $seconds = 0; $direction = 1;
 // Determine if there are extra periods in the input string
 $num_periods = substr_count($latlng, '.');
 if ($num_periods > 1) {
     $temp = preg_replace('/\./', ' ', $latlng, $num_periods - 1); // replace all but last period with delimiter
     $temp = trim(preg_replace('/[a-zA-Z]/','',$temp)); // when counting chunks we only want numbers
     $chunk_count = count(explode(" ",$temp));
     if ($chunk_count > 2) {
         $latlng = preg_replace('/\./', ' ', $latlng, $num_periods - 1); // remove last period
     } else {
         $latlng = str_replace("."," ",$latlng); // remove all periods, not enough chunks left by keeping last one
     }
 }

 // Remove unneeded characters
 $latlng = trim($latlng);
 $latlng = str_replace("º"," ",$latlng);
 $latlng = str_replace("°"," ",$latlng);
 $latlng = str_replace("'"," ",$latlng);
 $latlng = str_replace("\""," ",$latlng);
 $latlng = str_replace("  "," ",$latlng);
 $latlng = substr($latlng,0,1) . str_replace('-', ' ', substr($latlng,1)); // remove all but first dash
 if ($latlng != "") {
    // DMS with the direction at the start of the string
     if (preg_match("/^([nsewNSEW]?)\s*(\d{1,3})\s+(\d{1,3})\s+(\d+\.?\d*)$/",$latlng,$matches)) {
         $valid = true;
         $degrees = $matches[2];
         $minutes = $matches[3];
         $seconds = $matches[4];
         if (strtoupper($matches[1]) == "S" || strtoupper($matches[1]) == "W")
             $direction = -1;
     }
     // DMS with the direction at the end of the string
     elseif (preg_match("/^(-?\d{1,3})\s+(\d{1,3})\s+(\d+(?:\.\d+)?)\s*([nsewNSEW]?)$/",$latlng,$matches)) {
         $valid = true;
         $degrees = $matches[1];
         $minutes = $matches[2];
         $seconds = $matches[3];
         if (strtoupper($matches[4]) == "S" || strtoupper($matches[4]) == "W" || $degrees < 0) {
             $direction = -1;
             $degrees = abs($degrees);
         }
     }
     if ($valid) {
         // A match was found, do the calculation
         $minsSecsCombined = $minutes.'.'.$seconds; //Combine the minutes and seconds together
         $math = (($minsSecsCombined / 3600) * 60) * 10000; //Math

         $degrees = $degrees.'.'.$math; //Combine the degrees and result together
         $degrees = number_format((float)$degrees, 6, '.', ''); //Ensure the result is classed as a number

         $decimal_degrees = $degrees * $direction; //Put them all together


     } else {
         // Decimal degrees with a direction at the start of the string
         if (preg_match("/^([nsewNSEW]?)\s*(\d+(?:\.\d+)?)$/",$latlng,$matches)) {
             $valid = true;
             if (strtoupper($matches[1]) == "S" || strtoupper($matches[1]) == "W")
                 $direction = -1;
             $decimal_degrees = $matches[2] * $direction;
         }
         // Decimal degrees with a direction at the end of the string
         elseif (preg_match("/^(-?\d+(?:\.\d+)?)\s*([nsewNSEW]?)$/",$latlng,$matches)) {
             $valid = true;
             if (strtoupper($matches[2]) == "S" || strtoupper($matches[2]) == "W" || $degrees < 0) {
                 $direction = -1;
                 $degrees = abs($degrees);
             }
             $decimal_degrees = $matches[1] * $direction;
         }
     }
 }
 if ($valid) {
     return $decimal_degrees;
 } else {
     return false;
 }
 }
...