naiad:Plugins

From

Jump to: navigation, search

Все исходные файлы плагинов продуктов находятся в директории [qdione_install_dir]/src/plugins/collections .

Каждый плагин представляет собой дерево директорий. Корневая директория имеет название, аналогичное названию плагина. В ней располагаются следующие директории: main (обязательно), filtering, aggregation и virtual.

Плагины написаны на языке С++ с использованием библиотек Qt4. (Для удобства используйте среду разработки QtCreator.)

В папке main находится сам плагин продукта, состоящий из проектного файла plugin_name.pro и файла исходных текстов plugin_name.cpp. В файле plugin_name.cpp реализуются две основные функции buildConstraintExpression и buildGranule (которые вызываются из QDione при загрузке гранулы), а так же несколько вспомогательных функций.

Функция buildConstraintExpression создаёт строку (ограничений для каждой переменной) для отправления на OPeNDAP сервер. Строка имеет вид:

variable_name1[min:stride:max],variable_name2[min:stride:max],...,

где [min:stride:max] - формат записи ограничений (для каждой переменной ограничения могут быть разными), variable_name[1,2] - имена переменных. Например, "wvc_row_time[0:1:1623],wvc_lon[0:1:1623][0:1:75],wvc_lat[0:1:1623]"

Общий вид функции extern "C" QString buildConstraintExpression(QStringList & nativeVariableStringList, QString xOffset, QString yOffset, QString zOffset, DioneDapDataFile* dapfile);

Переменная nativeVariableStringList хранит список имён переменных, для которых необходимо создать ограничения ([min:stride:max]); Переменные xOffset, yOffset, zOffset содержать ограничения (строки), которые передаются в запросе (из XML или web-запроса); Переменная dapfile - указатель на файл, используемый OPeNDAP.

Функция buildGranule строит структуру гранул в QDione из OPeNDAP файла. Возвращает true, если гранула построена правильно, иначе false.

Общий вид функции extern "C" bool buildGranule(DioneDapDataFile* dapfile, DioneGranule * granule);

Переменная dapfile - указатель на OPeNDAP файл; Переменная granule - указатель на гранулу, которую необходимо построить.

В этой функции необходимо обработать глобальные атрибуты и переменные. Для этого применяются функции buildGlobalAttributeList и buildVariableList. В случае ошибка хотя бы при одной переменной функция вернёт false.

Переменные latitude и longitude должны называться lat и lon. Иначе, перед добавлением в гранулы их необходимо переименовать, например:

[code]

       if (name == "longitude" || name == "latitude")
       {
           name = (baseTypeVariable->name() == "longitude") ? "lon" : "lat";
       }
       var = granule->addVariable(name, dioneTypeFromDapType(arrayVariable->var()->type()), list,
                                  granule->getVariable(granule->indexOfVariable("time")));

[/code]

Для правильной обработки переменной time, к ней необходимо необходимо прибывить значение 347155200.


Для правильной работы плагина необходимо внести изменения в файл pluginMatching.xml и при необходимости добавить продукт.

Плагины, которые могут быть использованы любой коллекцией, находятся в директории [qdione_install_dir]/src/plugins/generic

Все переменные продукта можно увидеть через сервер OPeNDAP, открыв необходимый файл.

Рассмотрим на примере продукта ASI-AMSRE. При открытии через OPeNDAP видим две группы "Global Attributes" и "Variables". Все атрибуты из группы "Global Attributes" обрабатываются в функции buildGlobalAttributeList, которая вызывается в функции buildGranule. Все переменные из группы "Variables" обрабатываются в функции buildVariableList. Среди них должны быть lat, lon и time (иначе необходимо создать виртуальные переменные).

Для разработки плагина продукта необходимо..

Виртуальные переменные

Если среди переменных продукта отсутствуют longitude, latitude или time, то необходимо создать виртуальную переменную (виртуальные переменные). Для этого в директории с плагином [qdione_install_dir]/src/plugins/collections/[plugin_name] необходимо создать директорию virtual, а в ней директории с именами необходимых переменных, например "lat", "lon", "time".

Также можно создавать произвольные виртуальные переменные, при необходимости произведения определённых вычислений или получении данных, отсутствующих в продукте.

Разберём пример создания виртуальной переменной на переменной "time" продукта aquarius_l3_sss_smi_7day. Создадим директорию [qdione_install_dir]/src/plugins/collections/aquarius_l3_sss_smi_7day/virtual/time. В ней создадим файл проекта time.pro (в случае использования Qt Creator файл проекта создаётся автоматически при создании нового проекта) со следующим содержимым:

[code]

   include(../../../../../../qdione_config.pri)
   PRODUCT = aquarius_l3_sss_smi_7day
   PLUGIN_NAME = time
   TEMPLATE = lib
   TARGET = $${PLUGIN_NAME}_plugin
   DEPENDPATH += . ../../../../../libqdione
   INCLUDEPATH += . ../../../../../libqdione
   INCLUDEPATH += $${NETCDF_INCLUDEPATH} $${GDAL_INCLUDEPATH} $${DAP_INCLUDEPATH} $${HDF4_INCLUDEPATH} 
   DESTDIR = ../../../../../../lib/plugins/collections/$${PRODUCT}/virtual/
   CONFIG += plugin 
   LIBS += $${NETCDF_LIBS} $${GDAL_LIBS} $${DAP_LIBS} $${HDF4_LIBS} -ldapclient -L../../../../../../lib -lqdione -Wl,-rpath
   # Input
   SOURCES += $${PLUGIN_NAME}.cpp

[/code]

И файл исходных текстов time.cpp, описывающий структуру PluginConfig и содержащий реализации двух функции: init и compute.

Список PluginConfigList содержит конфигурации, связанные с каждым из экземпляров плагина (плагин может быть запущен несколько раз).

Функции инициализации init заполняет структуру PluginConfig входными данными сохраняет её в списке PluginConfigList.

unsigned int init(DioneGranule* granule, DioneVariableInfo * variableInfo, DioneType * type);

Функция compute производит все необходимые вычисления и возвращает значение виртуальной переменной (типа QVariant).

QVariant compute(unsigned int pluginConfigIndex, const Iterator& i);

Для вычислений используются значения, сохранённые в текущем pluginConfig, например:

[code]

   int Date = pluginConfigList.at(pluginConfigIndex)->Date->valueAsInt(i);

[/code]

--Denis.spiridonov 09:42, 14 January 2013 (UTC)

Personal tools
MediaWiki Appliance - Powered by TurnKey Linux