Benutzer- und Referenzhandbuch

Die bekannten OGC-Binärdarstellungen (WKB)

DB2 Spatial Extender hat verschiedene Funktionen, die Geometrien aus Binärdarstellungen generieren:

ST_GeomFromWKB
Erstellt eine Geometrie aus einer bekannten Binärdarstellung eines beliebigen Geometrietyps.

ST_PointFromWKB
Erstellt einen Punkt aus einer bekannten Binärdarstellung eines Punkts.

ST_LineFromWKB
Erstellt eine Linienfolge aus einer bekannten Binärdarstellung einer Linienfolge.

ST_PolyFromWKB
Erstellt ein Polygon aus einer bekannten Binärdarstellung eines Polygons.

ST_MPointFromWKB
Erstellt eine Mehrpunktangabe aus einer bekannten Binärdarstellung einer Mehrpunktangabe.

ST_MLineFromWKB
Erstellt eine Mehrlinienfolge aus einer bekannten Binärdarstellung einer Mehrlinienfolge.

ST_MPolyFromWKB
Erstellt ein Multipolygon aus einer bekannten Binärdarstellung eines Multipolygons.

Die bekannte Binärdarstellung ist ein fortlaufender Byte-Datenstrom. Sie ermöglicht den Austausch der Geometrie zwischen einem ODBC-Client und einer SQL-Datenbank in binärer Form. Da diese Geometriefunktionen die Definition von C-Programmstrukturen für die Zuordnung der Binärdarstellung erfordert, sind diese Funktionen für Sprachen der dritten Generation (3GL) konzipiert. Für Umgebungen mit Sprachen der vierten Generation (4GL) sind diese Funktionen nicht geeignet. Die Funktion ST_AsBinary setzt eine vorhandene Geometrie um in eine Binärdarstellung.

Die bekannte Binärdarstellung für die Geometrie ergibt sich durch die Serialisierung eines Geometrieexemplars als Folge numerischer Typen. Diese Typen werden aus der Gruppe (unsigned integer, double) gezogen, und jeder numerische Typ wird als Folge von Bytes serialisiert. Die Typen werden mit einer der beiden rein definierten binären Standarddarstellungen für numerische Typen (NDR, XDR) serialisiert. Ein den serialisierten Bytes vorangestellter Ein-Byte-Befehl beschreibt die spezifische Binärcodierung (NDR oder XDR) für einen Geometrie-Bytestrom. Der einzige Unterschied zwischen den beiden Codierungen der Geometrie ist die Byteanordnung: Die XDR-Codierung entspricht Big Endian; die NDR-Codierung entspricht Little Endian.

Definition numerischer Typen

Ein unsigned integer (ganze Zahl ohne Vorzeichen) ist ein 32-Bit-Datentyp (4 Byte), der eine nicht negative Ganzzahl im Bereich [0, 4294967295] codiert.

Ein double (Gleitkommazahl mit doppelter Genauigkeit) ist ein 64-Bit-Datentyp (8 Byte) mit doppelter Genauigkeit, der eine Zahl mit doppelter Genauigkeit mit dem IEEE 754 Double Precision Format codiert.

Diese Definitionen gelten sowohl für XDR als auch für NDR.

XDR-Codierung (Big Endian) numerischer Typen

Die XDR-Darstellung eines unsigned integer ist Big Endian (das erste Byte ist das signifikanteste Byte).

Die XDR-Darstellung eines double ist Big Endian (das erste Bit ist das Vorzeichenbit).

NDR-Codierung (Little Endian) numerischer Typen

Die XDR-Darstellung eines unsigned integer ist Little Endian (das erste Byte ist das am wenigsten signifikante Byte).

Die XDR-Darstellung eines double ist Little Endian (das letzte Bit ist das Vorzeichenbit).

Umsetzung zwischen NDR und XDR

Die Umsetzung zwischen den Datentypen NDR und XDR für unsigned integers und doubles ist eine einfache Operation. Sie umfaßt die Umkehrung der Byteanordnung innerhalb jedes unsigned integer oder double im Bytestrom.

Beschreibung der WKBGeometry-Byteströme

Dieser Abschnitt beschreibt die bekannte Binärdarstellung für die Geometrie. Der Grundbaustein ist der Bytestrom für einen Punkt, der aus zwei doubles besteht. Die Byteströme für andere Geometrien werden mit den Byteströmen für bereits definierte Geometrien erstellt.

// Basic Type definitions
// byte : 1 byte
// uint32 : 32 bit unsigned integer  (4 bytes)
// double : double precision number (8 Byte)
 
// 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;
  }
};
 

Die folgende Abbildung zeigt eine NDR-Darstellung.

Abbildung 39. Darstellung im NDR-Format. (B=1) des Typs Polygon (T=3) mit 2 linears (NR=2), jeder Ring hat 3 Punkte (NP=3).

[Abbildung]

Aussagen zur WKB-Darstellung

Die bekannte Binärdarstellung für die Geometrie ist für die Darstellung der Exemplare der Geometrietypen konzipiert; dies wird im Geometrie-Objektmodell und in der OpenGIS Abstract-Spezifikation beschrieben.

Diese Aussagen haben folgende Implikation für Ringe, Polygone und Multipolygone:

Lineare Ringe
Ringe sind einfach und geschlossen; dies bedeutet, daß lineare Ringe sich nicht selbst schneiden können.

Polygone
Keine zwei linearen Ringe innerhalb der Begrenzung eines Polygons können einander schneiden. Die linearen Ringe in der Begrenzung eines Polygons können sich in maximal einem einzigen Punkt berühren.

Multipolygone
Die Innenbereiche von zwei Polygonen, die Elemente eines Multipolygons sind, können sich nicht schneiden. Die Begrenzungen zweier beliebiger Polygone, die Elemente eines Multipolygons sind, können sich nur in einer endlichen Anzahl von Punkten schneiden.


[ Seitenanfang | Vorherige Seite | Nächste Seite | Inhaltsverzeichnis | Index ]