Help reading Grib1 Data (win32) - SailNet Community
Seamanship & Navigation Forum devoted to seamanship and navigation topics, including paper and electronic charting tools.

LinkBack Thread Tools
post #1 of 1 Old 01-12-2014 Thread Starter
Join Date: Jan 2008
Location: Oceanside CA
Posts: 177
Thanks: 3
Thanked 8 Times in 8 Posts
Rep Power: 10
Help reading Grib1 Data (win32)

Hi There,

I'm trying to read Grib1 wind data downloaded from What I've looked at so far comes through as a simple long/lat grid with 16bit values and a float reference offset.

Only problem is I'm getting the wrong values. They bear some resemblance to the original data with wind patterns recognizable but it looks like I've got the powers or the references wrong I just don't understand how. Final results have the wrong magnitudes / directions.

I didn't intend on writing a decoder but didn't find code / libs I could easily include in a win32 program. So here I am.

Basic decoding of the binary data section is below - any hints or tips or pointers towards someone who can help appreciated!


float GribPower(int s, float n)
	float divisor = 1.0;
	while (s < 0)
		divisor /= n;
	while (s > 0)
		divisor *= n;
	return divisor;

bool Read(HANDLE hFile, int decimalScaleFactor)
	ReadItem(hFile, m_DataSize, 3);									//3
	ReadItem(hFile, m_Byte4.m_AsU8);								//4
	u16 bsf;
	ReadItem(hFile, bsf);											//6
	m_BinaryScaleFactor = bsf & 0x8000 ? -(bsf & ~0x8000) : bsf;
	ReadItem(hFile, m_RefValue);									//10
	ReadItem(hFile, m_NumBitsPerDatumPoint);						//11

	if (m_Byte4.m_Flags & 0x1)
		//Spherical harmonics
		return false;

	m_iNumValues = (m_DataSize - 12) / 2;

	if (m_Byte4.m_NumUnusedBits)
		int iCount = m_Byte4.m_NumUnusedBits / 8;
		while (iCount)
			u8 throwIt;
			ReadItem(hFile, throwIt);

	if (m_iNumValues)
		if (m_NumBitsPerDatumPoint != 16)
			return false;

		mp_Values = new float[m_iNumValues];

		//Y * 10^D = R + (X * 2^E)
		float fScale = GribPower(m_BinaryScaleFactor, 2.0f);
		float fDecimalScale = GribPower(-decimalScaleFactor, 10.0f);
		for (int i = 0; i < m_iNumValues; i++)
			u16 iDatum;
			ReadItem(hFile, iDatum);
			mp_Values[i] = (m_RefValue + (float(iDatum) * fScale)) * fDecimalScale;;
	return true;

To view links or images in signatures your post count must be 10 or greater. You currently have 0 posts.

Last edited by theonecalledtom; 01-12-2014 at 01:31 AM.
theonecalledtom is offline  
Quote Quick Reply Share with Facebook

grib1 , programming , win32

Quick Reply

By choosing to post the reply above you agree to the rules you agreed to when joining Sailnet.
Click Here to view those rules.

Register Now

In order to be able to post messages on the SailNet Community forums, you must first register.
Please enter your desired user name, your email address and other required details in the form below.
Please note: After entering 3 characters a list of Usernames already in use will appear and the list will disappear once a valid Username is entered.

User Name:
Please enter a password for your user account. Note that passwords are case-sensitive.


Confirm Password:
Email Address
Please enter a valid email address for yourself.

Email Address:


Human Verification

In order to verify that you are a human and not a spam bot, please enter the answer into the following box below based on the instructions contained in the graphic.

Currently Active Users Viewing This Thread: 1 (0 members and 1 guests)
Thread Tools
Show Printable Version Show Printable Version
Email this Page Email this Page

Similar Threads
Thread Thread Starter Forum Replies Last Post
Reading the tides ltgoshen General Discussion (sailing related) 4 08-13-2012 06:13 PM
How to cruise reading deniseO30 General Discussion (sailing related) 24 07-30-2012 11:20 AM
Reading Charts stevemac00 Seamanship & Navigation 5 06-12-2010 09:14 AM
Reading chart GreatWhite Seamanship & Navigation 11 04-29-2008 01:18 AM

Posting Rules  
You may post new threads
You may post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is On
Trackbacks are On
Pingbacks are On
Refbacks are On

For the best viewing experience please update your browser to Google Chrome