Настоящий документ описывает модель данных, применяемую библиотекой GDAL: разновидности информации, которая может содержаться в источниках данных GDAL, а также их семантика.
Набор данных (представляемый классом GDALDataset) состоит из связанных растровых каналов, а также некоторой дополнительной информации, общей для всего набора. В частности, набор данных имеет понятие размера (ширины и высоты), общем для всех каналов. Набор данных также отвечает за географическую привязку и указание координатной системы, также общими для всех каналов. Сам набор данных может иметь ассоциированный комплект метаданных: список пар ключ/значение в форме ASCIIZ строк
Заметим, что набор данных GDAL и модель растровых каналов изначально базируется на спецификации регулярных покрытий консорциума OpenGIS.
Географические координатные системы представляются в виде строк OpenGIS WKT (Well Known Text). Такая строка может содержать:
-
Общее название координатной системы.
-
Название географической координатной системы.
-
Идентификатор системы координат.
-
Название эллипсоида, большая полуось, сжатие.
-
Название начального меридиана и его смещение относительно Гринвичского.
-
Название проекции (например, Transverse Mercator).
-
Список параметров проекции (например, положение осевого меридиана).
-
Название единиц измерения и множитель для перехода к метрам или радианам.
-
Названия и порядок следования координатных осей.
-
Коды для вышеперечисленных параметров по предопределённым таблицам, таким, как таблицы EPSG.
Дополнительные сведения об определениях координатных систем с помощью строк OpenGIS WKT и способах работы с ними можно найти в разделе osr_tutorial, а также в документации на класс OGRSpatialReference.
Координатная система, возвращаемая методом GDALDataset::GetProjectionRef() описывает геодезические координаты, определяемые с помощью матрицы аффинного преобразования, возвращаемой функцией GDALDataset::GetGeoTransform(). Координатная система, возвращаемая методом GDALDataset::GetGCPProjection() описывает геодезические координаты наземных контрольных точек, список которых даёт метод GDALDataset::GetGCPs().
Заметим, что пустая строка (""), возвращаемая в качестве определения координатной системы, означает отсутствие информации о координатной системе.
Существует два способа задать связь между точками растра (в терминах строка/столбец) и геодезическими координатами. Первый и наиболее часто используемый --- это аффинное преобразование. Второй предполагает использование наземных контрольных точек.
Матрица аффинного преобразования состоит из шести коэффициентов, возвращаемых методом GDALDataset::GetGeoTransform(), которая отображает строку/столбец в пространство геодезических координат по следующему соотношению:
Xgeo = GT(0) + Xpixel*GT(1) + Yline*GT(2)
Ygeo = GT(3) + Xpixel*GT(4) + Yline*GT(5)
В случае изображений, верхняя рамка которых ориентирована на север, коэффициенты GT(2) и GT(4) равны нулю, GT(1) равен ширине пиксела, а GT(5) --- его высоте. Координаты (GT(0),GT(3)) задают положение верхнего левого угла верхнего левого пиксела растра.
Заметим, что координаты строка/столбец могут принимать значения от (0.0,0.0) в верхнем левом углу верхнего левого пиксела до (ширина_в пикселах,высота_в_пикселах) в правом нижнем углу правого нижнего пиксела. Положение центра верхнего левого пиксела в терминах строка/столбец будет, таким образом, (0.5,0.5).
Набор данных может иметь список контрольных точек, связывающих одну или несколько точек растра с их геодезическими координатами. Все контрольные точки заданы в одной и той же координатной системе, возвращаемой методом GDALDataset::GetGCPProjection(). Каждая контрольная точка (описываемая классом GDAL_GCP) содержит следующее:
typedef struct
{
char *pszId;
char *pszInfo;
double dfGCPPixel;
double dfGCPLine;
double dfGCPX;
double dfGCPY;
double dfGCPZ;
} GDAL_GCP;
Строка pszId должна быть уникальным (и, часто, но не всегда, числовым) идентификатором для контрольной точке в списке точек данного набора. pszInfo --- это обычно пустая строка, но она также может содержать любой вспомогательный текст, относящийся к данной точке. Теоретически это поле может также содержать машинно читаемую информацию о статусе данной точки, однако в настоящий момент эта возможность не реализована.
Координаты (dfGCPPixel, dfGCPLine) задают положение точки на растре. Координаты (dfGCPX, dfGCPY, dfGCPZ) задают соответствующую привязку точки к геодезическим координатам (координата Z часто бывает нулём).
Модель данных GDAL не содержит механизма преобразования, получаемого из контрольных точек, --- это оставлено для приложений более высокого уровня. Обычно для этого применяются полиномы от 1-го до 5-го порядка.
Обычно набор данных содержит либо аффинное преобразование, либо контрольные точки, либо ничего. В редких случаях может присутствовать и то, и другое, тогда не определено, какой из способов имеет преимущество.
Метаданные --- это вспомогательные данные, хранящиеся в виде пар ключ/значение. Их состав определяется форматом хранения данных и приложением. Ключи должны быть "хорошими" лексемами (без пробельных и специальных символов). Значения могут иметь любую длину и содержать любые символы, за исключением нулевого символа ASCII.
Механизм управления метаданными хорошо оптимизирован для работы с очень большими блоками данных. Однако работа с метаданными, превышающими в размере 100KiB скорее всего приведёт к снижению производительности.
В будущем предполагается введение нескольких стандартных ключей с предопределённой семантикой, однако в настоящий момент таковых нет.
Некоторые форматы данных содержат собственные метаданные, в то время как драйверы для других форматов могут отображать поля, специфичные для данного формата, в записи метаданных. Например, драйвер TIFF возвращает содержимое некоторых информационных тегов в виде метаданных, включая поле дата/время, которое будет выглядеть как:
TIFFTAG_DATETIME=1999:05:11 11:29:56
Растровый канал описывается в GDAL с помощью класса GDALRasterBand. Он не обязательно должен представлять всё изображение. Например, 24-битное RGB-изображение должно быть представлено как набор данных с тремя каналами, по одному для красной, зелёной и синей компоненты.
Растровый канал имеет следующие свойства:
-
Ширина и высота в пикселах и строках. Они будут теми же самыми, что и для всего набора данных, если это канал в полном разрешении.
-
Тип данных (GDALDataType). Один из вещественных (Byte, UInt16, Int16, UInt32, Int32, Float32, Float64), или комплексных типов CInt16, CInt32, CFloat32, and CFloat64.
-
Размер блока. Предпочтительный (наиболее эффективный) размер блока данных для считывания. Для изображений, хранящихся построчно, это в большинстве случаев будет одна строка.
-
Список метаданных в виде пар ключ/значение в том же формате, что и для всего набора данных, но содержащих информацию, специфичную для данного канала.
-
Необязательная строка описания.
-
Необязательный список категорий (например, названий классов на тематической карте).
-
Необязательные минимальное и максимальное значение.
-
Необязательные калибровочные коэффициенты для пересчёта значений растра в физические величины (например, перевод отсчётов высоты в метры).
-
Необязательное название единиц измерения. Например, это поле может содержать единицы измерения высоты для модели рельефа.
-
Цветовая интерпретация канала. Одна из:
-
GCI_Undefined: по умолчанию, не определено.
-
GCI_GrayIndex: одиночное изображение в оттенках серого.
-
GCI_PaletteIndex: изображение с цветовой палитрой.
-
GCI_RedBand: красная компонента RGB- или RGBA-изображения.
-
GCI_GreenBand: зелёная компонента RGB- или RGBA-изображения.
-
GCI_BlueBand: синяя компонента RGB- или RGBA-изображения.
-
GCI_AlphaBand: альфа-канал RGBA-изображения.
-
GCI_HueBand: компонента цвета HLS-изображения.
-
GCI_SaturationBand: компонента насыщенности HLS-изображения.
-
GCI_LightnessBand: компонента яркости HLS-изображения.
-
GCI_CyanBand: голубая компонента CMY- или CMYK-изображения.
-
GCI_MagentaBand: пурпурная компонента CMY- или CMYK-изображения.
-
GCI_YellowBand: жёлтая компонента CMY- или CMYK-изображения.
-
GCI_BlackBand: чёрная компонента CMY- или CMYK-изображения.
-
Таблица цветов (палитра), которая будет подробно описана ниже.
-
Информация об уменьшенных обзорных изображениях (пирамидах).
Таблица цветов состоит из нуля или нескольких записей, описываемых на языке C в виде следующей структуры:
typedef struct
{
/- серый, красный, голубой или цвет -/
short c1;
/- зелёный, пурпурный или яркость -/
short c2;
/- синий, жёлтый или насыщенность -/
short c3;
/- альфа-канал или чёрный -/
short c4;
} GDALColorEntry;
Таблица цветов также имеет индикатор интерпретации (GDALPaletteInterp), который указывает на то, как параметры c1/c2/c3/c4 должны быть проинтерпретированы приложением. Этот индикатор может принимать следующие значения:
-
GPI_Gray: Считать c1 значением в градациях серого.
-
GPI_RGB: Считать c1 красным, c2 зелёным, c3 синим, а c4 --- альфа-каналом.
-
GPI_CMYK: Считать c1 голубым, c2 пурпурным, c3 жёлтым, c4 чёрным.
-
GPI_HLS: Считать c1 цветом, c2 яркостью, c3 насыщенностью.
Для связывания цвета с пикселем значение этого пиксела используется в качестве индекса в таблице цветов. Это значит, что цвета всегда располагаются в таблице начиная с нулевого индекса и далее по возрастанию. Не существует механизма для предварительного масштабирования значений, прежде, чем будет применена таблица цветов.
Канал может содержать обзорные изображения. Каждое обзорное изображение представлено в виде отдельного канала GDALRasterBand. Размер обзорного изображения (в терминах строк и столбцов) будет отличаться от базового полноразмерного растра, однако географически они будут покрывать один и тот же регион.
Обзорные изображения применяются для быстрого отображения уменьшенных копий растра, вместо того, чтобы читать полноразмерное изображение с последующим масштабированием.
Канал также обладает свойством HasArbitraryOverviews, которое равно TRUE, если растр может быть эффективно прочитан в любом разрешении, но не имеет чётких пирамидальных слоёв. Такими свойствами обладают некоторые алгоритмы кодирования изображений с помощью БПФ и вейвлетов, а также изображения, получаемые из внешних источников (таких, как OGDI), когда масштабирование производится на удалённой стороне.