- Титульная страница
- Описания

# Модель данных 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

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

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

Generated for GDAL by 1.5.1.