ジオメトリの OGC WKB 表現
ジオメトリの WKB(Well-Known Binary)表現は、OGC(Open Geospatial Consortium)の Simple Features 仕様の一部であり、XY 座標を使用してポイント フィーチャ、ライン フィーチャ、ポリゴン フィーチャのシンプルな格納モデルを実装します。ジオメトリ値の汎用的な表現が、連続的なバイト ストリームとして提供されます。これにより、ODBC クライアントとデータベースの間で、ジオメトリ値をバイナリ形式でやり取りできます。このジオメトリ値は圧縮されません。
OGC WKB ジオメトリ格納タイプは、多くのベンダに採用され、拡張されている仕様であり、Esri でも ArcGIS ソフトウェアによるジオデータベースで使用できるデータの 1 つとしてサポートしています。
OGC WKB ジオメトリ格納タイプは、ジオメトリ インスタンスを set {Unsigned Integer, Double} から抽出された一連の数値タイプとしてシリアライズし、各数値タイプをバイト列としてシリアライズすることによって得られます。数値タイプのシリアライズには、数値タイプの標準バイナリ表現として定義されている NDR または XDR が使用されます。
XDR は eXtended Data Representation の略語です。XDR は、OSI モデルのプレゼンテーション レイヤの IETF 規格です。XDR を使用すると、データを独立した方法で転送できるため、コンピュータ システム間でのデータ転送が可能になります。NDR は Network Data Representation の略語です。NDR は、OSI モデルのプレゼンテーション レイヤの実装です。
ジオメトリのバイト ストリームに使用されるバイナリ エンコーディングは、シリアライズされたバイトの先頭にある 1 バイトのタグによって定義されます。2 つのジオメトリ エンコーディングの違いはバイト オーダーだけです。XDR エンコーディングはビッグエンディアン、NDR エンコーディングはリトルエンディアンです。つまり、unsigned integer(正の整数をエンコードする [0, 4294967295] の範囲の 32 ビット(4 バイト)データ タイプ)の XDR エンコーディング表現はビッグエンディアンであり、double(IEEE 754 倍精度フォーマットを使用して倍精度数値をエンコードする 64 ビット(8 バイト)倍精度データ タイプ)の XDR エンコーディング表現もビッグエンディアンです。逆に、unsigned integer の NDR 表現はリトルエンディアン(最下位バイトが先頭)であり、double の NDR 表現もリトルエンディアンです。
NDR データ タイプと XDR データ タイプ間での unsigned integer と double の変換は、バイト ストリームで unsigned integer または double のバイトを逆にする簡単な演算です。
このジオメトリ格納タイプを Oracle または SQL Server に格納されたジオデータベースで使用して、2 次元のジオメトリを格納することができます。OGC WKB 表現で格納されたフィーチャクラスも、ビジネス テーブル、フィーチャ テーブル、空間インデックス テーブルの 3 つのテーブルで構成されます。これは、ArcSDE Compressed Binary で格納されたフィーチャクラスに使用されるテーブルと同じです。
ビジネス テーブルには属性と空間列が含まれています。空間列は、フィーチャ テーブルと空間インデックス テーブルへのキーとなります。
ビジネス テーブルとフィーチャ テーブル間のリレーションシップは、空間列と FID 列を通じて管理されます。ArcGIS によって管理されるこのキーは一意です。
フィーチャクラスのほとんどのデータを OGC WKB 形式で格納したい場合は、DBTUNE テーブルの DEFAULTS コンフィグレーション キーワードで、GEOMETRY_STORAGE パラメータの値を OGCWKB に変更します。逆に、一部のフィーチャクラスだけを OGC WKB 形式で格納したい場合は、それらのフィーチャクラスの作成時に WKB_GEOMETRY コンフィグレーション キーワードを指定することができます。
WKB ジオメトリ バイト ストリームの解説
ジオメトリの WKB 表現の基本要素は、2 つの double 型の値で構成されるポイントのバイト ストリームです。他のジオメトリのバイト ストリームは、すでに定義されているジオメトリのバイト ストリームに基づいて構築されます。次に、バイト ストリームの定義を示します。
基本タイプの定義
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]
}
ジオメトリの WKB 表現の要件
ジオメトリの WKB 表現は、ジオメトリ オブジェクト モデルと Open Geospatial Abstract Specification で定義されているジオメトリ タイプのインスタンスを表現するために設計されています。
リング、ポリゴン、マルチポリゴンには、次のような要件があります。
- リニア リング:リングはシンプルで閉じています。つまり、リニア リングに交差はありません。
- ポリゴン:ポリゴンの境界で 2 つのリニア リングが互いに交差してはなりません。ポリゴンの境界でリニア リングが交差する場合は、最大で 1 つのポイントであり、かつ接線である場合に限られます。
- マルチポリゴン:マルチポリゴンの要素である 2 つのポリゴンの内部が交差してはなりません。マルチポリゴンの要素である 2 つのポリゴンの境界が接するのは、有限数のポイントに限られます。