SailNet Community - View Single Post - Help reading Grib1 Data (win32)
View Single Post
post #1 of Old 01-12-2014 Thread Starter
theonecalledtom
Windseeker
 
Join Date: Jan 2008
Location: Oceanside CA
Posts: 168
Thanks: 2
Thanked 8 Times in 8 Posts
Rep Power: 8
 
Help reading Grib1 Data (win32)

Hi There,

I'm trying to read Grib1 wind data downloaded from Grib.us. 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!

-Tom

Code:
float GribPower(int s, float n)
**
	float divisor = 1.0;
	while (s < 0)
	**
		divisor /= n;
		s++;
	}
	while (s > 0)
	**
		divisor *= n;
		s--;
	}
	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);
			--iCount;
		}
	}

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

		delete[]mp_Values;
		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 Share with Facebook
 
 
For the best viewing experience please update your browser to Google Chrome