Получение неправильных значений, в то время как долгота имеет отрицательный в файле Grib2
Я работаю над приложением о погоде для мобильных устройств, где я читаю форму с информацией о погоде. Grib2
файлы, поступающие с сервера NOAA. Все работает нормально, я получаю всю информацию о погоде и прокладываю графики на карту.
Теперь у меня есть сценарий, где я получаю отрицательные значения долготы. как показано на рисунке ниже:
Замечания:
Я использую библиотеку GribCS для извлечения информации о погоде из файла Grib, который, кажется, работает идеально, если значение долготы равно 11 вместо -11; Я извлекаю значения следующим образом:
void GribTwo()
{
#region Grib 2 Code
Grib2Input input = new Grib2Input(RandomAccessFile);
if (!input.scan(false, false))
{
Console.WriteLine("Failed to successfully scan grib file");
return;
}
Grib2Data data = new Grib2Data(RandomAccessFile);
var records = input.Records;
foreach (Grib2Record record in records)
{
IGrib2IndicatorSection iis = record.Is;
IGrib2IdentificationSection id = record.ID;
IGrib2ProductDefinitionSection pdsv = record.PDS;
IGrib2GridDefinitionSection gdsv = record.GDS;
float[] values = data.getData(record.getGdsOffset(), record.getPdsOffset());
if ((iis.Discipline == 0) && (pdsv.ParameterCategory == 2) && (pdsv.ParameterNumber == 2))
{
// U-component_of_wind
int c = 0;
for (double lat = gdsv.La1; lat <= gdsv.La2; lat = lat - gdsv.Dy)
{
//THIS is gdsv.Lo1; always has wrong values. 349 value instead -11 whuile Lo2 has correct value 7.
for (double lon = gdsv.Lo1; lon <= gdsv.Lo2; lon = lon + gdsv.Dx)
{
Console.WriteLine("U-Wind " + lat + "\t" + lon + "\t" + values[c]);
c++;
}
}
}
#endregion
}
Как я уже упоминал мой комментарий во внутреннем цикле, что отправная точка gdsv.Lo1;
имеет неправильное значение в этом случае имеет 349 вместо -11, которые вызывают проблему.
Копаясь в глубине, я нашел следующий метод, который в основном читает значения из потока и преобразовывает их в читаемую форму.
public static int int4(System.IO.Stream raf)
{
int a = raf.ReadByte();
int b = raf.ReadByte();
int c = raf.ReadByte();
int d = raf.ReadByte();
// all bits set to ones
if (a == 0xff && b == 0xff && c == 0xff && d == 0xff)
return UNDEFINED;
int i2 = (1 - ((a & 128) >> 6)) * ((a & 127) << 24 | b << 16 | c << 8 | d);
return i2;
}
//This method is available under GribNumbers.cs in GribCS library.
Я не понимаю, я что-то неправильно пишу / читаю?
3 ответа
Я использую ту же библиотеку, что и GribApi.Net. Сейчас она немного глючит из-за того, что находится в стадии разработки, но да, вы можете использовать ее для проверки данных или найти лучшее решение для исправления вашей проблемы в существующей библиотеке.
В используемой вами библиотеке нет ошибок. Действительно, стандарт Grib2 ВМО гласит, что долгота должна кодироваться в интервале [0-360], а отрицательные долготы не допускаются. Это может показаться довольно странным, поскольку естественно представлять сетку по меридиану 180°, а не по Гринвичскому меридиану, но это скорее вопрос геополитики, а не географии, поэтому мы должны принять это правило.
При этом пользовательская программа должна, например, вычесть 360 из самой западной долготы, чтобы получить две правильно упорядоченные продольные границы сетки. Более того, то, лежит ли первая точка сетки к западу или к востоку от последней точки (в принципе возможны оба варианта), определяется одним из так называемых флагов режима сканирования, закодированных в сообщении.