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