# Модель данных GDAL

Настоящий документ описывает модель данных, применяемую библиотекой 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).

### Наземные контрольные точки (Ground Control Points, GCPs)

Набор данных может иметь список контрольных точек, связывающих одну или несколько точек растра с их геодезическими координатами. Все контрольные точки заданы в одной и той же координатной системе, возвращаемой методом 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

Метаданные выделены в именованные группы, называемые доменами. Базовый домен не имеет имени (NULL или ""). Существует несколько специальных доменов, служащих определённым целям. Заметим, что в настоящий момент не существует способа перечислить все домены, доступные для данного объекта, однако приложение может проверить доступность любого домена, который оно умеет обрабатывать.

Следующие записи метаданных имеют чётко определённую семантику в базовом домене:

- AREA_OR_POINT: Принимает значение "Area" (по умолчанию) или "Point". Показывает, что значение пиксела либо соответствует среднему значению данной величины по всей области, занимаемой пикселем, либо представляет точечное значение в центре пиксела. Это не влияет на интерпретацию географической привзяки, которая остаётся связанной с границами пиксела.
- NODATA_VALUES: Список разделённых пробелами значений обозначающих признак на отсутствия данных. Число пикселей в списке соответствует числу каналов в наборе данных. При таком способе указания отсутствия данных пиксель считается пустым тогда итолько тогда, когда если во всех каналах его значение совпадает соответствующему полю в списке NODATA_VALUES. Эта запись пока не очень широко используется драйверами, алгоритмами и вспомогательными программами GDAL.
- MATRIX_REPRESENTATION: Показывает, в каком виде представлены матричные данные. Используется для наборов данных поляризационных радиолокаторов с синтезированной апертурой (Polarimetric SAR). Может принимать следующие значения:
  - SCATTERING
  - SYMMETRIZED_SCATTERING
  - COVARIANCE
  - SYMMETRIZED_COVARIANCE
  - COHERENCY
  - SYMMETRIZED_COHERENCY
  - KENNAUGH
  - SYMMETRIZED_KENNAUGH
- POLARMETRIC_INTERP: Эта запись определена для растровых каналов данных поляризационного радиолокатора с синтезированной апертурой (Polarimetric SAR). Показывает, какую позицию в заданном матричном представлении данных занимает данный канал. Например, для набора данных, представленных как матрица разброса, эта запись может принимать значения HH, HV, VH, VV. Если набор данных является матрицей ковариаций, эта запись будет принимать одно из значений: Covariance_11, Covariance_22, Covariance_33, Covariance_12, Covariance_13, Covariance_23 (поскольку сама матрица Эрмитова, то этих данных достаточно для её задания).

#### Домен вложенных наборов данных (SUBDATASETS)

Домен SUBDATASETS содержит список дочерних наборов данных. Обычно он используется для получения указателей на изображения, хранящиеся все вместе в едином файле (таком, как HDF или NITF). Например, файл формата NITF с четырьмя изображениями может иметь следующий список вложенных наборов данных:

      SUBDATASET_1_NAME=NITF_IM:0:multi_1b.ntf
      SUBDATASET_1_DESC=Image 1 of multi_1b.ntf
      SUBDATASET_2_NAME=NITF_IM:1:multi_1b.ntf
      SUBDATASET_2_DESC=Image 2 of multi_1b.ntf
      SUBDATASET_3_NAME=NITF_IM:2:multi_1b.ntf
      SUBDATASET_3_DESC=Image 3 of multi_1b.ntf
      SUBDATASET_4_NAME=NITF_IM:3:multi_1b.ntf
      SUBDATASET_4_DESC=Image 4 of multi_1b.ntf
      SUBDATASET_5_NAME=NITF_IM:4:multi_1b.ntf
      SUBDATASET_5_DESC=Image 5 of multi_1b.ntf

Значение записи _NAME --- строка, которая может быть передана в функцию GDALOpen() для получения доступа к изображению. Запись _DESC предназначена для описания изображения в виде читаемой человеком строки и может быть показана пользователю для облегчения выбора.

#### Домен структуры изображения (IMAGE_STRUCTURE)

Метаданные в базовом домене содержат информацию, связанную с изображением, однако не содержат данных о том, как это изображение хранится на диске. Таким образом, эти метаданные могут быть спокойно скопированы вместе с остальным набором данными в новый формат. Тем не менее, некоторая важная информация тесно связана с конкретным форматом и способом хранения данных. Во избежание перенесения этой информации при копировании данных, она помещена в специальный домен, называемый IMAGE_STRUCTURE, который не должен слепо копироваться в другие форматы.

В настоящий момент спецификацией RFC 14 определены следующие специальные записи в домене IMAGE_STRUCTURE.

- COMPRESSION: Алгоритм сжатия, используемый для данного набора данных или канала. Не существует определённого каталога имён алгоритмов сжатия, однако если данный формат поддерживает параметр создания COMPRESSION, точно такой же список возможных значений должен быть использован и здесь.
- NBITS: Число бит на значение пиксела в канале или во всех каналах данного набора данных. Обычно присутствует только в случаях нестандартного числа бит для этого типа данных, например, если 1-битовый файл TIFF представлен в GDAL в виде GDT_Byte.
- INTERLEAVE: Применимо только к наборам данных и может принимать значения PIXEL, LINE или BAND. Может быть использовано в качестве подсказки для наиболее эффективного способа доступа к данным.
- PIXELTYPE: Может использоваться для каналов GDT_Byte (или соответсвующих наборов данных) и принимать значение SIGNEDBYTE, указывающее на то, что положительные значения от 128 до 255 должны интерпретироваться как отрицательные от -128 до -1 для приложений, умеющих обрабатывать байты со знаком.

#### Домен RPC

Домен RPC содержит метаданные, описывающие геометрическую модель изображения в виде полиномов с рациональными коэффициентами (Rational Polynomial Coefficient). Эта геометрическая модель может быть использована для пересчёта между координатами строка/столбец и географическими координатами. Модель определяется следующими записями:

- ERR_BIAS: Ошибка - уклон. Уклон среднеквадратичной ошибки в метрах по горизонтальной оси для всех точек изображения (-1.0 если неизвестно).
- ERR_RAND: Ошибка - случайная. Среднеквадратичная случайная ошибка в метрах по горизонтальной оси для каждой точки изображения (-1.0 если неизвестно).
- LINE_OFF: Смещение строки.
- SAMP_OFF: Смещение пиксела.
- LAT_OFF: Смещение геодезической широты.
- LONG_OFF: Смещение геодезической долготы.
- HEIGHT_OFF: Смещение геодезической высоты.
- LINE_SCALE: Масштаб строки.
- SAMP_SCALE: Масштаб пиксела.
- LAT_SCALE: Масштаб геодезической широты.
- LONG_SCALE: Масштаб геодезической долготы.
- HEIGHT_SCALE: Масштаб геодезической высоты.
- LINE_NUM_COEFF (1-20): Числители коэффициентов строк. Двадцать коэффициентов полинома в числителе уравнения rn (разделены пробелами).
- LINE_DEN_COEFF (1-20): Знаменатели коэффициентов строк. Двадцать коэффициентов полинома в знаменателе уравнения rn (разделены пробелами).
- SAMP_NUM_COEFF (1-20): Числители коэффициентов пикселей. Двадцать коэффициентов полинома в числителе уравнения cn (разделены пробелами).
- SAMP_DEN_COEFF (1-20): Знаменатели коэффициентов пикселей. Двадцать коэффициентов полинома в знаменателе уравнения cn (разделены пробелами).

Эти поля напрямую взяты из документа, предлагающего поддержку RPC в GeoTIFF (http://geotiff.maptools.org/rpc_prop.html), который в свою очередь следует определению NITF RPC00B.

#### Домены "xml:"

Любой домен, чьё имя имеет префикс "xml:", является не обычной базой метаданных вида имя/значение, а единым документом XML представленным одной большой строкой.

## Растровый канал

Растровый канал описывается в GDAL с помощью класса GDALRasterBand. Он не обязательно должен представлять всё изображение. Например, 24-битное RGB-изображение должно быть представлено как набор данных с тремя каналами, по одному для красной, зелёной и синей компоненты.

Растровый канал имеет следующие свойства:

- Ширина и высота в пикселах и строках. Они будут теми же самыми, что и для всего набора данных, если это канал в полном разрешении.

- Тип данных (GDALDataType). Один из вещественных (Byte, UInt16, Int16, UInt32, Int32, Float32, Float64), или комплексных типов CInt16, CInt32, CFloat32, and CFloat64.

- Размер блока. Предпочтительный (наиболее эффективный) размер блока данных для считывания. Для изображений, хранящихся построчно, это в большинстве случаев будет одна строка.

- Список метаданных в виде пар ключ/значение в том же формате, что и для всего набора данных, но содержащих информацию, специфичную для данного канала.

- Необязательная строка описания.

- Необязательный маркер отсутсвия данных (см. также запись метаданных NODATA_VALUES для набора данных, содержащий маркеры отсутствия данных для всех каналов).

- Необязательный канал маски, маркирующий пикселы, в которых данные отсутствуют или прозрачны. См. обсуждение RFC 15: Band Masks.

- Необязательный список категорий (например, названий классов на тематической карте).

- Необязательные минимальное и максимальное значение.

- Необязательные калибровочные коэффициенты для пересчёта значений растра в физические величины (например, перевод отсчётов высоты в метры).

- Необязательное название единиц измерения. Например, это поле может содержать единицы измерения высоты для модели рельефа.

- Цветовая интерпретация канала. Одна из:

  - 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), когда масштабирование производится на удалённой стороне.

Generated for GDAL by 1.7.1.