用户指南和参考

OGC 公认二进制 (WKB) 表示

DB2 Spatial Extender 具有几个从二进制表示生成几何图形的函数:

ST_GeomFromWKB
从任何几何图形类型的 WKB 表示创建几何图形。

ST_PointFromWKB
从点 WKB 表示创建点。

ST_LineFromWKB
从线条 WKB 表示创建线条。

ST_PolyFromWKB
从多边形 WKB 表示创建多边形。

ST_MPointFromWKB
从多点 WKB 表示创建多个点。

ST_MLineFromWKB
从多线条 WKB 表示创建多线条。

ST_MPolyFromWKB
从复合多边形 WKB 表示创建复合多边形。

公认二进制表示是相邻的字节流。 它允许以二进制形式在 ODBC 客户机和 SQL 数据库之间交换几何图形。 因为这些几何图形函数需要定义 C 程序设计语言结构来映射二进制表示, 所以只打算在第三代语言 (3GL) 程序内使用它们。 它们不适合第四代语言 (4GL) 环境。 ST_AsBinary 函数将现存几何图形值转换为公认二进制表示。

几何图形的公认二进制表示是通过将几何图形实例串行化为数字类型的序列来实现的。 从集合(无符号整数,双精度)抽取这些类型,然后将每个数字类型串行化为字节的序列。 使用数字类型的两个良好定义的标准二进制表示 (NDR, XDR) 之一使这些类型串行化。 已串行化的字节之前的一字节标记描述用于几何图形字节流的特定二进制编码 (NDR 或 XDR)。 几何图形的两种编码之间的唯一差异是字节次序的差异: XDR 编码是“大尾结构”;NDR 编码是“小尾结构”。

数字类型定义

无符号整数是 32 位(4 字节) 的数据类型,它对 [0, 4294967295] 范围内的非负整数进行编码。

双精度是 64 位(8 字节)的双精度数据类型, 它使用 IEEE 754 双精度格式对双精度数进行编码。

这些定义是 XDR 和 NDR 的公共定义。

数字类型的 XDR(大尾结构)编码

无符号整数的 XDR 表示是“大尾结构”(最高有效位字节优先)。

双精度数的 XDR 表示是“大尾结构”(符号位是第一个字节)。

数字类型的 NDR(小尾结构)编码

无符号整数的 NDR 表示是“小尾结构”(最低有效位优先)。

双精度数的 NDR 表示是“小尾结构”(符号位是最后一个字节)。

NDR 和 XDR之间的转换

无符号整数和双精度数的 NDR 和 XDR 数据类型之间的转换是一个简单操作。 它涉及使字节流中的每个无符号整数或双精度数内的字节次序反向。

WKBGeometry 字节流的说明

本节描述几何图形的公认二进制表示。 基本构件块是点的字节流,它由两个双精度数组成。 其他几何图形的字节流是使用已定义的几何图形的字节流构建的。

// Basic Type definitions
// 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,
};
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;
    WKBMultiPoint            mpoint;
    WKBMultiLineString       mlinestring;
    WKBMultiPolygon          mpolygon;
  }
};
 

下图显示一种 NDR 表示。

图 39. NDR 格式的表示. (B=1),类型为多边形 (T=3), 具有 2 条直线 (NR=2),每个环具有 3 个点 (NP=3)。


[图形]

WKB 表示的要求

几何图形的公认二进制表示设计成能表示一些几何图形的实例, 在“几何图形模型”和“OpenGIS 抽象规范”中描述了这些几何图形。

这些要求对环、多边形和复合多边形隐含下列要求:

线性环
环是简单且封闭的,这意指线性环不能自相交。

多边形
多边形的边界内的任何两个线性环不能彼此交叉。 多边形的边界内的线性环最多可在一个点相交,但只能为正切。

复合多边形
若两个多边形是某个复合多边形的元素,则其内部不能相交。 若任何两个多边形是某个复合多边形的元素,则其边界仅可接触有限的点数。


[ 页的顶部 | 上一页 | 下一页 | 目录 | 索引 ]