使用者の手引きおよび解説書

OGC による事前割り当てバイナリー (WKB) 表現

地理情報エクステンダーには、バイナリー表現から図形を生成する関数がいくつかあります。

ST_GeomFromWKB
任意の図形タイプの WKB 表現から図形を作成します。

ST_PointFromWKB
ポイントの WKB 表現からポイントを作成します。

ST_LineFromWKB
折れ線の WKB 表現から折れ線を作成します。

ST_PolyFromWKB
ポリゴンの WKB 表現からポリゴンを作成します。

ST_MPointFromWKB
複数ポイントの WKB 表示から複数ポイントを作成します。

ST_MLineFromWKB
複数折れ線の WKB 表現から複数折れ線を作成します。

ST_MPolyFromWKB
複数ポリゴンの WKB 表現から複数ポリゴンを作成します。

事前割り当てバイナリー表現は、連続する一連のバイトです。これにより、ODBC クライアントと SQL データベースの間で図形をバイナリー形式で交換することができます。これらの図形関数では、バイナリー表現をマップする C プログラミング言語構造を定義する必要があるので、第 3 世代 (3GL) プログラムで使用するよう意図されています。第 4 世代言語 (4GL) 環境での使用には適していません。 ST_AsBinary 関数は、既存の図形値を事前割り当てバイナリー表現に変換します。

図形の事前割り当てバイナリー表現を入手するには、数値型順序列として図形インスタンスを順序付けします。このタイプはセット (Unsigned Integer, Double) から引き出され、その後、それぞれの数値型をバイトの順序列として順序付けします。タイプの順序付けには、数値型を表す標準の定義済みバイナリー表現 (NDR、XDR の 2 つがある) のいずれかを使います。順序付けされたバイトに先行する 1 バイトのタグとして、図形バイト・ストリームに使われる特定のバイナリー・エンコード (NDR または XDR) が記述されます。この 2 つの形状のエンコードの唯一の違いは、バイト順序の違いです。 XDR エンコードはビッグ・エンディアンであり、 NDR エンコードはリトル・エンディアンです。

数値型の定義

無符号整数 は、 [1, 4294967295] の範囲にある負でない整数をコード化する 32 ビット (4 バイト) のデータ型です。

倍精度 は、 IEEE 754 倍精度形式を用いて倍精度の数値をコード化する 64 ビット (8 バイト) の倍精度データ型です。

これらの定義は、XDR、NDR の両方に共通です。

数値型の XDR (ビッグ・エンディアン) エンコード

無符号整数の XDR 表現はビッグ・エンディアンです (最初のバイトが最上位桁)。

倍精度の XDR 表現はビッグ・エンディアンです (最初のビットが符号ビット)。

数値型の NDR (リトル・エンディアン) エンコード

無符号整数の NDR 表現はリトル・エンディアンです (最初のバイトが最下位桁)。

倍精度の NDR 表現はリトル・エンディアンです (最後のバイトが符号ビット)。

NDR と XDR の間の変換

NDR データ型と XDR データ型の間の無符号整数と倍精度の変換は、簡単な操作です。この操作には、バイト・ストリーム内にあるそれぞれの無符号整数または倍精度でバイトの順序を反転させることが関係します。

WKBGeometry バイト・ストリームの説明

図形の事前割り当てバイナリー表現について以下に説明します。基本的な構成ブロックは、2 つの倍精度からなるポイントのバイト・ストリームです。ほかの図形のバイト・ストリームは、定義済みの図形のバイト・ストリームを使って作成されます。

// 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 表現での宣言

図形の事前割り当てバイナリー表現は、 Geometry Object Model および OpenGIS Abstract Specification で記述されている図形タイプのインスタンスを表すように設計されています。

これらの宣言では、リング、ポリゴンおよび複数ポリゴンについて、以下のように暗黙指定されています。

線形リング
リングは単純で閉じています。つまり線形リングは自身と交差できません。

ポリゴン
任意のポリゴンの境界にある線形リングのうち、 2 つが互いに重なり合うことはできません。ポリゴンの境界にある線形リングは、交差できるとしても単一のポイントで接するだけです。

複数ポリゴン
複数ポリゴンの要素であるポリゴンのうち、内部で 2 つが互いに交差することはできません。複数ポリゴンの要素である任意の 2 つのポリゴンの境界は、接することができる場合でも接点の数は有限です。


[ ページのトップ | 前ページ | 次ページ | 目次 | 索引 ]