海拔高度的计算 20分 ( 积分: 20 )

  • 主题发起人 主题发起人 Xylitol
  • 开始时间 开始时间
X

Xylitol

Unregistered / Unconfirmed
GUEST, unregistred user!
我现在正分析Garmin eTrex Venture 手持机的数据格式,对于航点的数据格式已经有了初步的了解。但是目前遇到一个问题,就是海拔高度的计算。
数据是这样的,我在手持机里改变海拔高度,然后观察数据的变化,确定了海拔高度所在的位置,用了4个字节。下面是数据:
-1500米:00 80 BB C4
0 米:00 40 EA BD
1 米:00 28 8B 3F
2 米:00 1C 03 40
3 米:00 A0 40 40
4 米:00 28 7E 40
5 米:00 D6 9D 40
30000米:0A 5F EA 46
我初步分析过,数据基本是倒序读出来的,即是说0米的数据应该是:BD EA 40 00,其余类推。手持机的表示范围-1500到30000米,0米和海拔以下的高度(即负数)的第一位为1,1米以上的,第一位为0。现在的问题是,1米到2米之间的间隔不是线性增长的,想了很多办法,都没有办法求出来。请高手帮帮忙吧!
 
我现在正分析Garmin eTrex Venture 手持机的数据格式,对于航点的数据格式已经有了初步的了解。但是目前遇到一个问题,就是海拔高度的计算。
数据是这样的,我在手持机里改变海拔高度,然后观察数据的变化,确定了海拔高度所在的位置,用了4个字节。下面是数据:
-1500米:00 80 BB C4
0 米:00 40 EA BD
1 米:00 28 8B 3F
2 米:00 1C 03 40
3 米:00 A0 40 40
4 米:00 28 7E 40
5 米:00 D6 9D 40
30000米:0A 5F EA 46
我初步分析过,数据基本是倒序读出来的,即是说0米的数据应该是:BD EA 40 00,其余类推。手持机的表示范围-1500到30000米,0米和海拔以下的高度(即负数)的第一位为1,1米以上的,第一位为0。现在的问题是,1米到2米之间的间隔不是线性增长的,想了很多办法,都没有办法求出来。请高手帮帮忙吧!
 
请参考 Garmin协议 D108_Wpt_Type的定义:
D108_Wpt_Type
typedef struct
{
uint8 wpt_class;
/* class (see below) */
uint8 color;
/* color (see below) */
uint8 dspl;
/* display options (see below) */
uint8 attr;
/* attributes (see below) */
symbol_type smbl;
/* waypoint symbol */
uint8 subclass[18];
/* subclass */
position_type posn;
/* position */
[red]float32 alt;
/* altitude in meters */[/red]
float32 dpth;
/* depth in meters */
float32 dist;
/* proximity distance in meters */
char state[2];
/* state */
char cc[2];
/* country code */
/* char ident[];
variable length string */
/* char comment[];
waypoint user comment */
/* char facility[];
facility name */
/* char city[];
city name */
/* char addr[];
address number */
/* char cross_road[];
intersecting road label */
} D108_Wpt_Type;

高度是以米为单位的float32类型,对应Win32的32位单精度实型。

如果是Delphi中,用Move函数就可以求出。
procedure proc1;
var
dH : single;
buf : array[0..3] of byte;
begin

buf[0] := 0;
Buf[1] := 0x28;
Buf[2] := 0x8B;
Buf[3] := 0x3F;
Move(Buf, dh, 4);

ShowMessage(FloatToStr(dh));
等于1.00...
end;
 
to:吕雪松大侠。
如果具体到我的这个问题,怎么算出来呢?关于Garmin协议 D108_Wpt_Type的定义我也看过,但是仍然没有办法计算出海拔高度来(天生愚钝啊!呵呵……)!顺便问一句,您是合纵思壮公司的设计师吧?如果您有空,帮我再看看行吗?在此先谢了!
 
猛啊,顶先
 
你的问题我已经回答了啊,你可写一个函数:
function GetAltBy4Byte(B1, B2, B3, B4 : Byte) : Single;
var
buf : array[0..3] of byte;
begin

buf[0] := b1;
Buf[1] := b2;
Buf[2] := b3;
Buf[3] := b3;
Move(Buf, result, 4);
end;


返回值就是你要的高度值。
 
不得不说:万分感谢!20分虽小,但仍代表我的感谢之情!以后有问题还得请您多多指教啊!小弟我刚接触这方面的知识,知道得非常少。
另外,我看了您的三维GIS演示,非常佩服!用的是灰度扫描吗?
 
后退
顶部