2012-05-23 7 views
4

J'ai un appareil GPS qui envoie des données à mon serveur, j'ai besoin de convertir les valeurs décimales que l'appareil envoie en latitude et longitude. Je suis mauvais en maths si toutes mes tentatives ont échoué, voici les spécifications:Convertir des décimales en latitude et longitude

Latitude

Occuper 4 octets, ce qui représente la valeur de latitude.

La plage de numéros va de 0 à 162000000, ce qui représente la plage de 0 ° à 90 °. Unité: 1/500 seconde Méthode de conversion:

A) Convertir les données de latitude (degrés, minutes) du module GPS en une nouvelle forme qui représente la valeur seulement en minutes;

B Multiplier la valeur convertie par 30000, et transformer ensuite le résultat au nombre hexadécimal

Pour example22 ° 32,7658 ', (22 × 60 + 32,7658) x 30000 = 40582974, puis le convertir en nombre hexadécimal 0x02 0x6B 0x3F 0x3E

longitude

occupent 4 octets, ce qui représente la valeur de la longitude de données de localisation. Le nombre varie de 0 à 324000000, représentant la plage de 0 ° à 180 °. Unité: 1/500 secondes, la méthode de conversion est la même que la latitude.

je suis venu avec cette fonction, mais il ne semble pas fonctionner:

procedure GetDegree(const numar : DWORD; out min,sec : Extended); 
var 
    eu : Extended; 
begin 
    eu := numar/30000; 
    min := Trunc(eu/60); 
    sec := eu - min * 60; 
end; 
+2

Alors quel est le problème? –

+0

@subirkumarsao vérifier mon – opc0de

+0

modifier Pourquoi dites-vous que cela ne fonctionne pas? Qu'est-ce qui est attendu par rapport à la production réelle? – Deestan

Répondre

13

numar est spécifié dans 1/500e de seconde. Ainsi, les équations suivantes:

num/500 = seconds 
num/500/60 = minutes 
num/500/60/60 = degrees 

Je calculerait tout comme ceci:

var 
    degrees, minutes, seconds: Integer; 
.... 
    degrees := num div (500*60*60); 
    minutes := num div (500*60) - degrees*60; 
    seconds := num div 500 - minutes*60 - degrees*60*60; 

Si vous devez alors calculer la fraction de secondes fais comme ça. Notez qu'il n'y a tout simplement pas besoin de Extended ici.

var 
    degrees, minutes: Integer; 
    seconds: Double; 
.... 
    degrees := num div (500*60*60); 
    minutes := num div (500*60) - degrees*60; 
    seconds := num/500 - minutes*60 - degrees*60*60; 

Branchez votre valeur de 40.582.974 dans ces formules et les résultats sont les suivants:

degrees: 22 
minutes: 32 
seconds: 45 

A en juger par les commentaires que vous voulez vraiment est degrés comme un entier et minutes en virgule flottante. Que vous pouvez faire comme ceci:

var 
    degrees: Integer; 
    minutes: Double; 
.... 
    degrees := num div (500*60*60); 
    minutes := num/(500*60) - degrees*60; 

Branchez votre valeur de 40.582.974 dans ces formules et les résultats sont:

degrees: 22 
minutes: 32.7658 
+0

+1 juste pour que vous sachiez, anglais-roumain: nombre = numar; degrés = grade; minutes = minute; secondes = secunde;^_^ – ComputerSaysNo

+0

+1 pour une excellente réponse –

+0

pour le nombre 40582974 je devrais obtenir 22 ° 32.7658 'mais en cours d'exécution la fonction je reçois 22 ° 32.45.948' – opc0de

Questions connexes