-
-
-
-
В этом разделе описан программный интерфейс для получения данных с геопортала спутникового
радиотепловидения (интерполированных полей) в клиентской программе. Интерфейс реализован
как веб-служба (web service) с использованием стандарта SOAP. В настоящий момент
интерфейс представлен одной функцией загрузки полей BuildFrame.
Функция загрузки полей определена следующим образом:
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.
Для доступа к интерфейсу веб-сервиса используется прокси-класс, который может быть
создан в ОС 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 можно скачать
здесь, демонстрационную программу можно скачать
здесь.
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;
}