Guida di riferimento per l'utente

Le rappresentazioni WKB (well-known binary) OGC

DB2 Spatial Extender dispone di varie funzioni che generano geometrie dalle rappresentazioni in formato binario:

ST_GeomFromWKB
Crea una geometria dalla rappresentazione WKB di qualsiasi tipo di geometria.

ST_PointFromWKB
Crea un punto dalla rappresentazione WKB di un punto.

ST_LineFromWKB
Crea una stringa lineare dalla rappresentazione WKB di una stringa lineare.

ST_PolyFromWKB
Crea un poligono dalla rappresentazione WKB di un poligono.

ST_MPointFromWKB
Crea un multipunto dalla rappresentazione WKB di un multipunto.

ST_MLineFromWKB
Crea una multistringa lineare dalla rappresentazione WKB di una multistringa lineare.

ST_MPolyFromWKB
Crea un multipoligono dalla rappresentazione WKB di un multipoligono.

La rappresentazione WKB rappresenta un flusso di byte contiguo. Tale rappresentazione consente lo scambio tra un client ODBC e un database SQL in formato binario. Poiché queste funzioni della geometria richiedono che la definizione delle strutture di linguaggio di programmazione C corrispondano alla rappresentazione binaria, sono state progettate per l'utilizzo in un programma (3GL). Inoltre non sono adatte per un ambiente (4GL). La funzione ST_AsBinary converte un valore della geometria esistente in una rappresentazione WKB.

La rappresentazione WKB per la geometria si ottiene mediante la serializzazione di un'istanza geometrica in una sequenza di tipi numerici. Questi tipi si rilevano dal gruppo (unsigned integer, double), quindi ciascun tipo numerico è disposto in serie come sequenza di byte. I tipi vengono serializzati utilizzando una delle due rappresentazioni binarie standard definite per i tipi numerici (NDR, XDR). Una tag a un byte che precede i byte serializzati descrive la codifica binaria specifica (NDR o XDR) utilizzata per un flusso di byte della geometria. L'unica differenza tra le due codifiche di geometria è uno degli ordinamenti byte: la codifica XDR è Big Endian; la codifica NDR è Little Endian.

Definizioni del tipo numerico

Un unsigned integer è un tipo di dati a 32 bit (4 byte) che codifica un valore integer non negativo nell'intervallo [0, 4294967295].

Un double è un tipo di dati di precisione doppia a 64 bit (8 byte) che codifica un numero di precisione doppia utilizzando il formato di precisione doppia IEEE 754.

Queste definizioni sono comuni per XDR e NDR.

Codifica XDR (Big Endian) dei tipi numerici

La rappresentazione XDR di un unsigned integer è Big Endian (prima il byte più rilevante).

La rappresentazione XDR di un double è Big Endian (il bit di segno è il primo byte).

Codifica NDR (Little Endian) dei tipi numerici

La rappresentazione NDR di un unsigned integer è Little Endian (prima i byte minori).

La rappresentazione NDR di un double è Little Endian (il bit di segno è l'ultimo byte).

Conversione tra NDR e XDR

La conversione tra i tipi di dati NDR e XDR per gli unsigned integer e i double è un'operazione semplice. Tale operazione comprende l'inversione dell'ordine di byte all'interno di ciascun unsigned integer o double del flusso di byte.

Descrizione dei flussi di byte WKBGeometry

Questa sezione descrive la rappresentazione WKB per la geometria. Il blocco di creazione di base è il flusso di byte relativo a un punto che comprende due double. I flussi di byte per le altre geometrie vengono creati utilizzando i flussi di byte delle geometrie già definite.

// 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;
  }
};
 

La seguente figura illustra una rappresentazione NDR.

Figura 39. Rappresentazione nel formato NDR. (B=1) di tipo poligono (T=3) con 2 lineari (NR=2), ciascun anello con 3 punti (NP=3).


[Figure]

Asserzioni relative alla rappresentazione WKB

La rappresentazione WKB della geometria è progettata per rappresentare le istanze dei tipi di geometria descritti in Geometry Object Model e in OpenGIS Abstract Specification.

Queste asserzioni fanno riferimento agli anelli, i poligoni e i multipoligoni:

Anelli lineari
Gli anelli sono semplici e chiusi, quindi non possono intersecarsi tra loro.

Poligoni
Due anelli lineari nei contorni di un poligono non possono intersecarsi. Gli anelli lineari nei contorni di un poligono possono intersecarsi solo in un punto singolo, come tangente.

Multipoligoni
Gli interni di due poligoni, elementi di un multipoligono, non possono intersecarsi. I contorni di due poligoni, elementi di un multipoligono, possono toccarsi solo in un numero limitato di punti.


[ Inizio pagina | Pagina precedente | Pagina successiva | Indice | Indice analitico ]