Спутниковое радиотепловидение: динамика геофизических полей

   
  1.  Виртуальная интеграция

  2.  Описание функции загрузки полей

  3.  Пример клиентской программы загрузки полей (C#)

  4.  Пример программы чтения файла ADV (фрагмент кода, С)

1. Виртуальная интеграция

В этом разделе описан программный интерфейс для получения данных с геопортала спутникового радиотепловидения (интерполированных полей) в клиентской программе. Интерфейс реализован как веб-служба (web service) с использованием стандарта SOAP. В настоящий момент интерфейс представлен одной функцией загрузки полей BuildFrame.

2. Описание функции загрузки полей

Функция загрузки полей определена следующим образом:

byte[] BuildFrame( int year,

int mon,

int day,

int hour,

int min,

int sec,

string mode,

string datasrc,

ref string errmes)

Параметры:

int year – год (разрешенный диапазон см. в Разделе «Поля»)
int mon – месяц (допустимые значения 1 – 12)
int day – день (допустимые значения 1 – 28/29/30/31)
int hour – час (допустимые значения 0 – 23)
int min – минута (допустимые значения 0 – 59)
int sec – секунда (допустимые значения 0 – 59)
string mode – тип интерполяции (допустимые значения “loc” / “ltw” / “utc”, см. Раздел «Поля»)
string datasrc – тип продукта (допустимые значения “tpw” / “clw” / "wnd", см. Раздел «Поля»)
ref string errmes – строка, в которую будет помещено сообщение об ошибке.

Возвращаемое значение:

byte[] – массив байтов, соответствующий содержанию файла загружаемого поля (см. «Формат файлов» в Разделе «Методика». Значение NULL соответствует ошибке исполнения, описание ошибки помещается в параметр errmes.

3. Пример клиентской программы загрузки полей (C#)

Для доступа к интерфейсу веб-сервиса используется прокси-класс, который может быть создан в ОС Windows с помощью консольной утилиты wsdl.exe. Следующая команда создает файл описания прокси-класса на языке C#:

Wsdl.exe http://fire.fryazino.net/tpw/GetFrameService.asmx

Включив созданный файл в свой проект, можно получать данные геопортала с помощью веб-службы следующим образом:

GetFrameService FrameService;

FrameService = new GetFrameService();

DateTime tm = GetDate();

String errmes="";

Byte[] bfh = FrameService.BuildFrame(tm.Year,

tm.Month,

tm.Day,

tm.Hour,

tm.Minute,

tm.Second,

"loc",

comboBox1.Text,

ref errmes);

if (bfh == null)

{

MessageBox.Show("Error! " + errmes);

this.UseWaitCursor = false;

this.Enabled = true;

return;

}

MemoryStream stream = new MemoryStream(bfh);

pictureBox1.Image = Image.FromStream(stream);

Исходный код демонстрационной программы для VS2010 можно скачать здесь, демонстрационную программу можно скачать здесь.

4.Пример программы чтения файла ADV (фрагмент кода, С)


bool CheckAdvFile(LPCTSTR advFile)
{
    FILE* file = fopen(advFile, "rb");
    if (!file)
    {
        cout << " (not found) ";
        return false;
    }
    fseek(file, 0, SEEK_END);
    size_t len = (size_t)ftell(file);
    fseek(file, 0, SEEK_SET);
    struct
    {
        int w, h;
        double startLat, endLat, startLon, endLon;
    }header;
    if (len < sizeof(header))
    {
        cout << " (wrong format) ";
        fclose(file);
        return false;
    }
    if (fread(&header, sizeof(header), 1, file) != 1)
    {
        cout << " (can not read header) ";
        fclose(file);
        return false;
    }
    size_t datasz = (size_t)(header.w * header.h * 2 * sizeof(double));
    if (len != sizeof(header) + datasz)
    {
        cout << " (file too short) ";
        fclose(file);
        return false;
    }
    double* Vecs = (double*)malloc(datasz);
    if (fread(Vecs, 1, datasz, file) != datasz)
    {
        cout << " (can not read data) ";
        free(Vecs);
        fclose(file);
        return false;
    }
    const int xTest = 185;
    const int yTest = 79;
    int offset = yTest * header.w * 2 + xTest * 2;
    if (offset < header.w * header.h * 2)
    {
        double latStep = (header.endLat - header.startLat) / (double)(header.h - 1);
        double lonStep = 360. / (double)header.w;
        double lat = header.startLat + latStep * (double)yTest;
        double lon = header.startLon + lonStep * (double)xTest;
        if (lon > 180.)
            lon -= 360.;
        double Vx = Vecs[offset];
        double Vy = Vecs[offset + 1];
        cout << " OK. Lat = " << lat << "; Lon = " << lon << "; Vx = " << Vx << "m/s; Vy = " << Vy << "m/s ";
    }
    free(Vecs);
    fclose(file);
    return true;
}

Рейтинг@Mail.ru