5

サーバーにデータを送信するGPSデバイスがあります。デバイスが送信する10進値を緯度と経度に変換する必要があります。私は数学が苦手なので、すべての試みが失敗しました。仕様は次のとおりです。

緯度

緯度の値を表す4バイトを占有します。

数値の範囲は0〜162000000で、0°〜90°の範囲を表します。単位:1/500秒変換方法:

A)GPSモジュールからの緯度(度、分)データを、値を分単位でのみ表す新しい形式に変換します。

B変換した値に30000を掛けて、その結果を16進数に変換します。

たとえば、22°32.7658'、(22×60 + 32.7658)×30000 = 40582974の場合、16進数に変換します0x02 0x6B 0x3F 0x3E

経度

位置データの経度値を表す4バイトを占有します。数値の範囲は0〜324000000で、0°〜180°の範囲を表します。単位:1/500秒、変換方法は緯度と同じです。

私はこの関数を思いついたが、うまくいかないようだ:

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

1 に答える 1

14

numar1/500秒で指定されます。したがって、次の方程式が成り立ちます。

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

私はそれをすべて次のように計算します:

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;

秒の小数部分を計算する必要がある場合は、次のようにします。ここでは必要がないことに注意してExtendedください。

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;

40582974の値をこれらの数式に代入すると、結果は次のようになります。

degrees: 22
minutes: 32
seconds: 45

コメントから判断すると、実際に必要なのは、整数としての度と浮動小数点としての分です。あなたがこのようにできること:

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

40582974の値をこれらの数式に代入すると、結果は次のようになります。

degrees: 22
minutes: 32.7658
于 2012-05-23T11:31:17.800 に答える