naiad:Plugins
From
(6 intermediate revisions not shown) | |||
Line 1: | Line 1: | ||
Все исходные файлы плагинов продуктов находятся в директории [qdione_install_dir]/src/plugins/collections . | Все исходные файлы плагинов продуктов находятся в директории [qdione_install_dir]/src/plugins/collections . | ||
- | Каждый плагин представляет собой дерево директорий. Корневая директория имеет название, аналогичное названию плагина. В ней располагаются следующие директории: | + | Каждый плагин представляет собой дерево директорий. Корневая директория имеет название, аналогичное названию плагина. В ней располагаются следующие директории: main (обязательно), filtering, aggregation и virtual. |
- | + | ||
- | + | ||
- | + | ||
- | + | ||
Плагины написаны на языке С++ с использованием библиотек Qt4. (Для удобства используйте среду разработки QtCreator.) | Плагины написаны на языке С++ с использованием библиотек Qt4. (Для удобства используйте среду разработки QtCreator.) | ||
Line 13: | Line 9: | ||
Функция buildConstraintExpression создаёт строку (ограничений для каждой переменной) для отправления на OPeNDAP сервер. Строка имеет вид: | Функция buildConstraintExpression создаёт строку (ограничений для каждой переменной) для отправления на OPeNDAP сервер. Строка имеет вид: | ||
- | + | '''variable_name1[min:stride:max],variable_name2[min:stride:max],...''', | |
- | где [min:stride:max] - формат записи ограничений (для каждой переменной ограничения могут быть разными), variable_name[1,2] - имена переменных. Например, | + | где [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]); | Переменная nativeVariableStringList хранит список имён переменных, для которых необходимо создать ограничения ([min:stride:max]); | ||
Line 26: | Line 21: | ||
Функция buildGranule строит структуру гранул в QDione из OPeNDAP файла. Возвращает true, если гранула построена правильно, иначе false. | Функция buildGranule строит структуру гранул в QDione из OPeNDAP файла. Возвращает true, если гранула построена правильно, иначе false. | ||
- | Общий вид функции | + | Общий вид функции '''extern "C" bool buildGranule(DioneDapDataFile* dapfile, DioneGranule * granule);''' |
Переменная dapfile - указатель на OPeNDAP файл; | Переменная dapfile - указатель на OPeNDAP файл; | ||
Line 32: | Line 27: | ||
В этой функции необходимо обработать глобальные атрибуты и переменные. Для этого применяются функции buildGlobalAttributeList и buildVariableList. В случае ошибка хотя бы при одной переменной функция вернёт false. | В этой функции необходимо обработать глобальные атрибуты и переменные. Для этого применяются функции 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 | Плагины, которые могут быть использованы любой коллекцией, находятся в директории [qdione_install_dir]/src/plugins/generic | ||
+ | |||
+ | Все переменные продукта можно увидеть через сервер OPeNDAP, открыв необходимый файл. | ||
+ | |||
+ | Рассмотрим на примере продукта ASI-AMSRE. При открытии через OPeNDAP видим две группы "Global Attributes" и "Variables". Все атрибуты из группы "Global Attributes" обрабатываются в функции buildGlobalAttributeList, которая вызывается в функции buildGranule. Все переменные из группы "Variables" обрабатываются в функции buildVariableList. Среди них должны быть lat, lon и time (иначе необходимо создать виртуальные переменные). | ||
Для разработки плагина продукта необходимо.. | Для разработки плагина продукта необходимо.. | ||
- | --[[User:Denis.spiridonov|Denis.spiridonov]] | + | |
+ | '''Виртуальные переменные''' | ||
+ | |||
+ | Если среди переменных продукта отсутствуют 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] | ||
+ | |||
+ | --[[User:Denis.spiridonov|Denis.spiridonov]] 09:42, 14 January 2013 (UTC) |
Latest revision as of 09:52, 14 January 2013
Все исходные файлы плагинов продуктов находятся в директории [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)