我有一个GPS设备将数据发送到我的服务器,我需要将设备发送的十进制值转换为纬度和经度。我的数学很差,所以我的所有尝试都失败了,这是规格:
纬度
占据4个字节,表示纬度值。
数字范围为0到162000000,表示0°到90°的范围。 单位:1/500秒转换方法:
A)将GPS模块的纬度(度,分)数据转换为新形式,仅以分钟为单位表示该值;
B将转换后的值乘以30000,然后将结果转换为十六进制数
例如22°32.7658',(22×60 + 32.7658)×30000 = 40582974,然后将其转换为十六进制数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;
答案 0 :(得分:14)
numar
在1/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