将十进制转换为纬度和经度

5
我有一个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;

为什么你说它不起作用?预期输出与实际输出有何不同? - Deestan
@Destan 不是有效的纬度坐标! - opc0de
@opc0de 我的意思是这样描述能够大大改善你的问题:“当调用 GetDegree(324032,M,S) 时,我得到了 M=321S=12,但是正确的输出应该是 M=1S=33。” - Deestan
你的解释有些问题--纬度范围在[-90度,+90度]之间,经度范围在(-180度,+180度]之间。你似乎只考虑了这些范围的正半部分。或者你忘记告诉我们这些表示是带符号的了吗? - High Performance Mark
你的计算似乎是正确的。你能给出一个样本输入和你得到的错误输出吗? - Subir Kumar Sao
显示剩余3条评论
1个回答

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

+1 只是让你知道,英语 - 罗马尼亚语:number = numar;degrees = grade;minutes = minute;seconds = secunde;^_^ - user497849
对于数字40582974,我应该得到22°32.7658′,但运行函数后我得到了22°32.45.948′。 - opc0de
1
那是因为32.7658已经将秒转换成了分钟的小数。45.948/60 = .7658。你的问题需要更多的清晰度。你需要什么?度,分和秒?还是只需要度和分? - David Heffernan
2
我现在已经全面回答了。无论如何,我认为那里有足够的解释让你继续前进。 - David Heffernan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接