11
votes

Degrés décimaux à degrés minutes et secondes en JavaScript

Je suis en train d'essayer d'écrire une fonction qui prend mes diplômes décimaux (lat ou long) et les convertit aux minutes DMS degrés minutes. Je sais que je suis censé parfois le numéro de point décimal de 60 ans, alors c'est à nouveau décimal. Mais je suis un noob. Serais-je diviser le nombre? XXX

Suis-je sur la bonne voie?


3 commentaires

Devoir? Astuce: utilisez math.floor


La mise en œuvre JavaScript de la réponse acceptée ne fonctionne pas pour les valeurs négatives


Meilleure réponse: Stackoverflow.com/a/37893239/129164


10 Réponses :


12
votes

Ce n'est pas clair comment vous avez besoin de la sortie. Voici une version qui renvoie toutes les 3 valeurs sous forme de chaîne: xxx


1 commentaires

Remarque mineure, cela retournera 60 secondes dans des cas de bord tels que 46.99992 (qui devrait être 47 0 '0 "). Ajout d'une vérification similaire à La réponse d'Aleadam (comptabilisation des négatifs et limites de Lat / Lon) résout ceci.



33
votes
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"`

4 commentaires

Vous pouvez éventuellement passer un tableau de ['N', 'S'] ou ['E', 'W'] ou [''] ou ['', '-'] Pour le rendre un peu plus facile / plus générique au lieu d'un vrai / faux ???


@Nigeljohnson - Vous ne devriez pas avoir besoin de passer ceux-ci. C'est un très vieux code, mais je voudrais juste faire: convertlattodms = (d) => convertddtodms (d, false) et convertlngtodms = (d) => convertddtodms (d, true)


@Markkahn, votre édition du 9 juin 2019 est incorrect. Une valeur d'entrée négative entraînera une valeur négative min et sec ainsi qu'une valeur incorrecte Sec .


@Markkahn, Nick est correct en signalant cette erreur, est arrivé pour moi aussi.



6
votes

Mise à jour: je retire la partie qui n'a aucun sens ( merci cwolves! ).

Vous avez encore une autre mise en œuvre. Ce ne sera ni aussi court ni efficace que les précédents, mais espérons que beaucoup plus facile à comprendre.

Pour que ce soit bien, vous devez d'abord comprendre comment les calculs sont effectués et que seulement tenter de les implémenter . Pour cela, Pseudocode est une excellente option, puisque vous écrivez les étapes en anglais clair ou une syntaxe simplifiée facile à comprendre, puis la traduise sur le langage de programmation de choix.

J'espère que c'est utile ! xxx


6 commentaires

Les négatifs sont très autorisés ... et votre direction est complètement éteinte. Vous ne pouvez pas déterminer la longitude vs latitude en fonction du nombre. Vous semblez être déroutant des coordonnées polaires avec DMS (elles sont complètement différentes ...). En d'autres termes, vous ne pouvez pas dire la différence entre n & E avec juste un numéro.


@Cwolves merci pour le commentaire. La lecture d'un peu plus, cela n'a pas eu de sens ... Je devrais lire mes propres suggestions un peu de temps: "Comprenez comment les calculs sont effectués et que ne tentent ensuite de les mettre en œuvre": /


Il y a une erreur: Que se passe-t-il si l'arrondi et vos diplômes D ++ dépassent la limite de longitude de 180 degrés? Et si elle dépasse la limite de latitude de 90 degrés?


La mise en œuvre JavaScript ne fonctionne pas pour des valeurs négatives de DEG


Ce n'est pas seulement qu'il ne fonctionne pas pour des valeurs négatives, cela donne la mauvaise valeur.


Facile à surmonter une valeur négative. Stockez une valeur positive ou négative dans une autre variable (H, pour hémisphère), puis exécutez Math.abs (DEG) pour la normaliser à positif. Ensuite, dans la valeur de retour, incluez la variable H. De cette façon, votre récepteur peut regarder la valeur H et déterminer s'il est N / S pour Lat ou E / W pour LON. C'est une bonne fonction, qui peut être superbe avec juste un petit diape.



0
votes

Basé sur la réponse ci-dessus, je les ai écrites dans le style JavaScript et PHP.

JS - P>

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;
}


0 commentaires

1
votes
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);

}
INPUT : 22.4229541515 OUTPUT: 22:25:22.63

0 commentaires

-1
votes

Juste pour la remarque, la réponse xxx

}

ne fonctionne pas fonctionne pour les angles entre -1 ° et 0 °. Malchance! HC


0 commentaires

0
votes

ne pouvait pas obtenir le script ci-dessus en travaillant, après avoir eu lieu avec cela; Donnez simplement à la DMS au script

function ConvertDEGToDMS(deg, lat) {
    var absolute = Math.abs(deg);

    var degrees = Math.floor(absolute);
    var minutesNotTruncated = (absolute - degrees) * 60;
    var minutes = Math.floor(minutesNotTruncated);
    var seconds = ((minutesNotTruncated - minutes) * 60).toFixed(2);

    if (lat) {
        var direction = deg >= 0 ? "N" : "S";
    } else {
        var direction = deg >= 0 ? "E" : "W";
    }

    return degrees + "°" + minutes + "'" + seconds + "\"" + direction;
}


0 commentaires

0
votes

Essayez ce fonctionnement parfait !!! PRE> XXX


0 commentaires

0
votes

une solution avec l'option de spécification des décimales en secondes de sortie et correction de tout cas de bord en raison de l'arrondissement des secondes et des minutes.

p>

// @ input {deg}     Numeric; degrees number to convert
// @ input {dplaces} Decimal places to use for output seconds
//                   Default 0 places
// @ return {DMS} string degrees (°) minutes (') seconds (")
//
function degToDMS (deg, dplaces=0) {
  var d = Math.floor (deg);          // make degrees
  var m = Math.floor((deg-d)*60);    // make minutes
  var s = Math.round(((deg-d)*60-m)*60*Math.pow(10,dplaces))/Math.pow(10,dplaces); // Make sec rounded
  s == 60 && (m++, s=0 );            // if seconds rounds to 60 then increment minutes, reset seconds
  m == 60 && (d++, m=0 );            // if minutes rounds to 60 then increment degress, reset minutes
  return (d + "° " + m + "' " + s+'"');   // create output DMS string
}

// ----- tests ------
console.log(degToDMS(55.23456));         // 55° 14' 4"
console.log(degToDMS(55.23456   ,3));    // 55° 14' 4.416"
console.log(degToDMS(4 + 20/60  ,2));    // 4° 20' 0"
console.log(degToDMS(89.64789   ,2));    // 89° 38' 52.4"
console.log(degToDMS(-23.1234567,3));    // -24° 52' 35.556"


0 commentaires

0
votes

Celui-ci fonctionne% 100 dans TypeScript: xxx


0 commentaires