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