Десятичные градусы в градусы минуты и секунды в JavaScript - PullRequest
8 голосов
/ 26 апреля 2011

Я пытаюсь написать функцию, которая принимает мои десятичные градусы (широта или долгота) и преобразует их в градусы DMS минуты-секунды. Я знаю, что я должен умножить десятичную точку на 60, тогда она снова будет десятичной. Но я нуб. Буду ли я делить номер?

function ConvertDDToDMS(DD) {
    eg. DD =-42.4
    D= 42;
    M= 4*60;
    S= .M * 60;
    var DMS =

    return DMS //append Direction (N, S, E, W);
}

Я на правильном пути?

Ответы [ 6 ]

29 голосов
/ 26 апреля 2011
function ConvertDDToDMS(D, lng){
    const M=0|(D%1)*60e7;

    return {
        dir : D<0?lng?'W':'S':lng?'E':'N',
        deg : 0|(D<0?D=-D:D),
        min : 0|M/1e7,
        sec : (0|M/1e6%1*6e4)/100
    };
}

Выше приведен объект {deg:, min:, sec:, dir:} с секундой усеченной до двух цифр (например, 3.14) и значением dir, равным N, E, S, W, в зависимости от того,Вы устанавливаете для параметра lng (долгота) значение true.Например:

ConvertDDToDMS(-18.213, true) == {
   deg : 18,
   min : 12,
   sec : 46.79,
   dir : 'W'
}

Или, если вам нужна базовая строка:

function ConvertDDToDMS(D){
    return [0|D, 'd ', 0|(D<0?D=-D:D)%1*60, "' ", 0|D*60%1*60, '"'].join('');
}

ConvertDDToDMS(-18.213) == `-18d 12' 46"`

[править июнь 2019] - исправление 8-летней ошибки, которая иногда приводила к тому, что результатОтключение на 1 минуту из-за математики с плавающей запятой при преобразовании точной минуты, например, ConvertDDToDMS(4 + 20/60).Обновленный код по-прежнему имеет небольшую проблему, но в этом случае округляется до 19 мин.

10 голосов
/ 26 апреля 2011

Не понятно, как вам нужен вывод. Вот версия, которая возвращает все 3 значения в виде строки:

function ConvertDDToDMS(dd)
{
    var deg = dd | 0; // truncate dd to get degrees
    var frac = Math.abs(dd - deg); // get fractional part
    var min = (frac * 60) | 0; // multiply fraction by 60 and truncate
    var sec = frac * 3600 - min * 60;
    return deg + "d " + min + "' " + sec + "\"";
}
6 голосов
/ 26 апреля 2011

Обновление: я удаляю часть, которая не имеет никакого смысла ( спасибо cwolves! ).

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

Чтобы все было правильно, сначала нужно понять, как выполняются расчеты, и только потом пытаться их реализовать .Для этого псевдокод является отличным вариантом, поскольку вы записываете шаги на простом английском языке или упрощенном синтаксисе, который легко понять, а затем переводите его на выбранный язык программирования.

Я надеюсь, что это полезно!

/* This is the pseudocode you need to follow:
 * It's a modified version from 
 * http://en.wikipedia.org/wiki/Geographic_coordinate_conversion#Conversion_from_Decimal_Degree_to_DMS

function deg_to_dms ( degfloat )
   Compute degrees, minutes and seconds:
   deg ← integerpart ( degfloat )
   minfloat ← 60 * ( degfloat - deg )
   min ← integerpart ( minfloat )
   secfloat ← 60 * ( minfloat - min )
   Round seconds to desired accuracy:
   secfloat ← round( secfloat, digits )
   After rounding, the seconds might become 60. These two
   if-tests are not necessary if no rounding is done.
   if secfloat = 60
      min ← min + 1
      secfloat ← 0
   end if
   if min = 60
      deg ← deg + 1
      min ← 0
   end if
   Return output:
   return ( deg, min, secfloat )
end function
*/

function deg_to_dms (deg) {
   var d = Math.floor (deg);
   var minfloat = (deg-d)*60;
   var m = Math.floor(minfloat);
   var secfloat = (minfloat-m)*60;
   var s = Math.round(secfloat);
   // After rounding, the seconds might become 60. These two
   // if-tests are not necessary if no rounding is done.
   if (s==60) {
     m++;
     s=0;
   }
   if (m==60) {
     d++;
     m=0;
   }
   return ("" + d + ":" + m + ":" + s);
}
0 голосов
/ 25 октября 2018

просто за замечание, ответ

function ConvertDDToDMS(D){
return [0|D, 'd ', 0|(D<0?D=-D:D)%1*60, "' ", 0|D*60%1*60, '"'].join('');

}

не не работает для углов от -1 ° до 0 °. Невезение! Нс

0 голосов
/ 07 июля 2018
private static DecimalFormat DecimalFormat = new DecimalFormat(".##");
public static void main(String[] args){
    double decimal_degrees = 22.4229541515;

    System.out.println(getDMS(decimal_degrees));
}
public static String getDMS(double decimal_degrees) {
    double degree =  Math.floor(decimal_degrees);
    double minutes = ((decimal_degrees - Math.floor(decimal_degrees)) * 60.0); 
    double seconds = (minutes - Math.floor(minutes)) * 60.0;
    return ((int)degree)+":"+((int)minutes)+":"+decimalFormat.format(seconds);

}

ВХОД: 22.4229541515 ВЫХОД: 22: 25: 22.63

0 голосов
/ 13 декабря 2016

Основываясь на ответе выше, я написал их в стиле javascript и php.

JS-

function convertDDToDMS(deg, lng){
    var d = parseInt(deg);
    var minfloat  = Math.abs((deg-d) * 60); 
    var m = Math.floor(minfloat);
    var secfloat = (minfloat-m)*60;
    var s = Math.round(secfloat); 
    d = Math.abs(d);

    if (s==60) {
        m++;
        s=0;
    }
    if (m==60) {
        d++;
        m=0;
    }

    return {
        dir : deg<0?lng?'W':'S':lng?'E':'N',
        deg : d,
        min : m,
        sec : s
    };
}

PHP-

function convertDDtoDMS($deg, $lng){
    $dd = intval($deg);
    $minfloat = abs(($deg - $dd) * 60);
    $mm = floor($minfloat);
    $secfloat = ($minfloat - $mm) * 60;
    $ss = round($secfloat);
    $dd = abs($dd);

    if($ss == 60){
        $mm++;
        $ss = 0;
    }

    if($mm == 60){
        $dd++;
        $mm = 0;
    }

    $dd = array(
        'dir' => $deg < 0 ? ($lng ? 'W' : 'S') : ($lng ? 'E' : 'N'),
        'deg' => abs($dd),
        'min' => $mm,
        'sec' => $ss,
    );

    return $dd;
}
...