Двоичный формат

Двоичное представление данных (WKB-формат) определяет формат в виде структур данных, описание которых содержится, как правило, в заголовочном файле приложения (см. пример). Каждый элемент содержит спецификатор порядка байт (для работы на различных аппаратных платформах). Все коды элементов и их компонентов выражаются 4-байтовыми беззнаковыми целыми числами, координаты – вещественными числами двойной точности.

Пример заголовочного файла для описания данных в WKB-формате

Основные типы WKB

// byte   : 8-bit unsigned integer (1 byte)
// uint32 : 32-bit unsigned integer (4 bytes)
// double : double precision number (8 bytes)
enum wkbGeometryType
{
wkbPoint              = 1,
wkbLineString         = 2,
wkbPolygon            = 3,
wkbMultiPoint         = 4,
wkbMultiLineString    = 5,
wkbMultiPolygon       = 6,
wkbGeometryCollection = 7
}
enum wkbByteOrder
{
wkbXDR = 0,    // Прямой порядок байтов
wkbNDR = 1     // Обратный порядок байтов
}

Примечание

В двоичном формате СУБД ЛИНТЕР поддерживает только прямой порядок байтов.

Вспомогательные типы WKB

// Building Blocks : Point, LinearRing
Point
{
        double  x;
        double  y;
}
LinearRing
{
        uint32  numPoints;
        Point   points[numPoints];
}

WKB-представление геометрических типов

WKBPoint
{
        byte    byteOrder;
        uint32  wkbType;     // 1
        Point   point;
}

WKBLineString
{
        byte    byteOrder;
        uint32  wkbType;     // 2
        uint32  numPoints;
        Point   points[numPoints];
}

WKBPolygon
{
        byte       byteOrder;
        uint32     wkbType;  // 3
        uint32     numRings;
        LinearRing rings[numRings];
}

WKBMultiPoint
{
        byte       byteOrder;
        uint32     wkbType;  // 4
        uint32     num_wkbPoints;
        WKBPoint   WKBPoints[num_wkbPoints];
}

WKBMultiLineString
{
        byte          byteOrder;
        uint32        wkbType;    // 5
        uint32        num_wkbLineStrings;
        WKBLineString WKBLineStrings[num_wkbLineStrings];
}

WKBMultiPolygon
{
        byte       byteOrder;
        uint32     wkbType;    // 6
        uint32     num_wkbPolygons;
        WKBPolygon wkbPolygons[num_wkbPolygons];
}

WKBCircle
{
        byte    byteOrder;
        uint32  wkbType;
        Point   point;
        double  r;           // радиус
}

WKBGeometry
{
        union
        {
                WKBPoint              point;
                WKBLineString         linestring;
                WKBPolygon            polygon;
                WKBGeometryCollection collection;
                WKBMultiPoint         mpoint;
                WKBMultiLineString    mlinestring;
                WKBMultiPolygon       mpolygon;
        }
}

WKBGeometryCollection
{
        byte        byte_order;
        uint32      wkbType;    // 7
        uint32      num_wkbGeometries;
        WKBGeometry wkbGeometries[num_wkbGeometries];
}

Примечание

Тип данных BOX не имеет собственного идентификатора типа (wkbType), так как топологически не отличается от POLYGON, а типы CIRCLE и LINE – имеют: wkbCircle = 0x81, wkbLine = 0x82.

Пример WKB-формата

WKB-представление точки POINT (1,1) – последовательность из 21 байта:

0101000000000000000000F03F000000000000F03F
где:
Byte order: 01
WKB type  : 01000000
X         : 000000000000F03F
Y         : 000000000000F03F