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

Я успешно использую код PHP ниже (здесь много ресурсов!), Чтобы изменить десятичные градусы на градусы минуты секунды. Навигационные приложения, которые я использую, экспортируют координаты в десятичном формате, поэтому 50.360503 и отображение 50 ° 21.638N. В морской навигации мы используем градусные минуты, а затем десятые вместо истинных секунд при работе с бумажными картами.

Кто-нибудь из вас может дать мне несколько советов о том, как изменить десятичное число вместо кода ниже?

function convertDecimalToDMSLongitude($dec)
{

// Converts decimal longitude / latitude to DMS
// ( Degrees / minutes / seconds )
// This is the piece of code which may appear to
// be inefficient, but to avoid issues with floating
// point math we extract the integer part and the float
// part by using a string function.

$vars = explode(".",$dec);
$deg = $vars[0];
$tempma = "0.".$vars[1];

$tempma = $tempma * 3600;
$min = floor($tempma / 60);
$sec = $tempma - ($min*60);
$sec = number_format($sec, 0);


if ($deg <= 0) {
  $hemisphere = 'W';
} else {
  $hemisphere = 'E';
}

$degrees = abs($deg);
if ($degrees <= 9) {
  $deg = '00'.$degrees;
} elseif ($degrees >= 10) {
  $deg = '0'.$degrees;
} elseif ($degrees >= 100) {
  $deg = $degrees;
}

return $deg.'.'.$min.'.'.$sec.''.$hemisphere;
}

У меня есть это (ниже), которое близко;он возвращает 50 ° 21630180.N при вводе 50.360503 в качестве десятичного числа. Мне просто нужно выделить 21 минуту из оставшейся цифры. Приложение GPS (Navionics или iSailor) экспортируется в десятичном виде и показывает 50 ° 21,638 Н. на экране.

$vars = explode(".",$dec);
$deg = $vars[0];
$tempma = "0.".$vars[1];

//$tempma = $tempma * 3600;
//$min = floor($tempma / 60);
//$sec = $tempma - ($min*60);
//$sec = number_format($sec, 0);

$min = $vars[1]*60;

$sec = '';

if ($deg >= 0) {
  $hemisphere = 'N';
} else {
  $hemisphere = 'S';
}

return abs($deg).'.'.$min.'.'.$sec.' '.$hemisphere;

1 Ответ

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

Понял!

$vars = explode(".",$dec);
$deg = $vars[0];
$min = "0.".$vars[1];

$min = $min * 3600;
$min = $min / 60;
$min = number_format((float)$min, 3, '.', '');


if ($deg <= 0) {
  $hemisphere = 'W';
} else {
  $hemisphere = 'E';
}

//add 00 if single degrees
$degrees = abs($deg);
if ($degrees <= 9) {
  $deg = '00'.$degrees;
} elseif ($degrees >= 10) {
  $deg = '0'.$degrees;
} elseif ($degrees >= 100) {
  $deg = $degrees;
}

//add a 0 if a single number
if ($min <= 9) {
  $min = '0'.$min;
}

return $deg.'° '.$min.' '.$hemisphere;
...