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

Двоичное представление данных (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