几何的 OGC 熟知二进制表示
几何的熟知二进制表示是开放地理空间联盟 (OGC) 简单要素规范的一部分,该规范规定了使用 x,y 坐标实现点、线和面要素的简单存储模型。该存储类型将几何值表示为不间断的字节流形式。它允许在 ODBC 客户端与数据库之间以二进制形式交换几何值。并且未进行压缩。
OGC 熟知二进制几何存储类型是一个备受关注的规范,大多数采纳者已采用该规范并对其进行扩展,ESRI 在 ArcGIS 和 ArcSDE 软件中将其作为地理数据库支持的一部分。
获得 OGC 熟知二进制几何存储类型的方法有两种,一是通过将几何实例序列化为从 {Unsigned Integer, Double} 集获得的数值类型序列,二是使用两个明确定义的、数值类型的标准二进制表示中的一个(NDR 或 XDR)将各数值类型序列化为字节序列。
XDR 代表扩展数据表示。XDR 是 OSI 模型中表示层的 IETF 标准。XDR 使得数据可以独立的方式进行传输,从而可以在计算机系统之间传输数据。NDR 代表网络数据表示。NDR 是 OSI 模型中表示层的实现。
用于几何字节流的特定二进制编码通过序列化字节前的单字节标记进行描述。两种几何编码之间的唯一区别是字节顺序不同。XDR 编码为大字节,而 NDR 编码为小字节。也就是说,无符号整型(对 [0,4294967295] 范围内的非负整数进行编码的 32 位(4 字节)数据类型)的 XDR 编码表示是大字节,如同双精度(使用 IEEE 754 双精度格式对双精度数进行编码的 64 位(8 字节)双精度数据类型)的 XDR 编码表示。相反,无符号整型的 NDR 表示为小字节(最低有效字节优先),并且双精度型的 NDR 表示为小字节。
无符号整型和双精度型的 NDR 和 XDR 数据类型间的转换是一种要对字节流中的各无符号整型和双精度型内的字节进行反转的简单操作。
此几何存储类型可与存储在 Oracle 或 SQL Server 中的 ArcSDE 地理数据库一起使用,用以存储二维几何。以 OGC 熟知二进制表示存储的要素类也由三个表组成:业务表、要素表和空间索引表。这些表与用于以 ArcSDE 压缩二进制存储的要素类的表相同。
业务表包含属性和空间列。空间列是要素表和空间索引表的键。
业务表和要素表之间的关系通过空间列和要素 FID 列来管理。此键由 ArcSDE 维护,并且是唯一的。
如果要以 OGC 熟知二进制格式存储大部分要素类数据,则可将 DBTUNE 表 DEFAULTS 配置关键字下的 GEOMETRY_STORAGE 参数值更改为 OGCWKB。相反,如果只想以 OGC 熟知二进制格式存储某些要素类,则可在创建那些要素类时指定 WKB_GEOMETRY 配置关键字。
WKB 几何字节流的描述
几何熟知二进制表示的基本结构单元是由两个双精度型组成的点的字节流。可以使用已定义几何的字节流构建其他几何的字节流。以下是字节流的定义:
基本类型定义
byte :1 byte
uint32:32 bit unsigned integer (4 bytes)
double :double precision number (8 bytes)
Building Blocks :Point, LinearRing
Point {
double x;
double y;
};
LinearRing {
uint32 numPoints;
Point points[numPoints];
}
enum wkbGeometryType {
wkbPoint = 1,
wkbLineString = 2,
wkbPolygon = 3,
wkbMultiPoint = 4,
wkbMultiLineString = 5,
wkbMultiPolygon = 6,
wkbGeometryCollection = 7
};
enum wkbByteOrder {
wkbXDR = 0, Big Endian
wkbNDR = 1 Little Endian
};
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];
}
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]
}
几何熟知二进制表示的声明
几何的熟知二进制表示用于表示在几何对象模型和开放地理抽象规范中描述的几何类型的实例。
对于环、面和多面,这些声明暗示以下内容:
- 线性环:环是简单且闭合的,这意味着线性环可能不自相交。
- 面:面边界上的两个线性环可能彼此不交叉。面边界上的线性环可能相交,但最多在单个点上相切。
- 多面:作为多面构成元素的两个面的内部可能不相交。作为多面构成元素任意两个多面的边界可能仅在有限的点处相交。