Représentation binaire connue OGC pour la géométrie
La représentation binaire connue de la géométrie fait partie de la spécification relative aux entités simples de l'Open Geospatial Consortium (OGC), qui applique un modèle de stockage simple pour les entités ponctuelles, linéaires et surfaciques à l'aide des coordonnées x,y. Cette représentation constitue une représentation portable d'une valeur de géométrie sous la forme d'un flux contigu d'octets. Elle permet l'échange de valeurs de géométrie sous forme binaire entre un client ODBC et une base de données. Elle n'est pas compressée.
Le type de stockage de géométrie binaire connu OGC est une spécification ciblée adoptée et étendue par la plupart des éditeurs, y compris Esri dans le cadre de la prise en charge des géodatabases par les logiciels ArcGIS.
Le type de stockage de géométrie binaire connu OGC est obtenu en sérialisant une instance de géométrie sous forme de séquence de types numériques de l'ensemble {Entier non signé, Réel double}, puis en sérialisant chaque type numérique sous forme de séquence d'octets à l'aide de l'une des deux représentations binaires standard définies pour les types numériques - NDR ou XDR.
XDR est l'abréviation de eXtended Data Representation. La représentation XDR est une norme de l'IETF pour la couche de présentation dans le modèle OSI. Elle permet le transport de données de façon indépendante pour faciliter leur transfert entre systèmes informatiques. NDR est l'abréviation de Network Data Representation. Il s'agit d'une mise en œuvre de la couche de présentation dans le modèle OSI.
Le codage binaire spécifique utilisé pour un flux d'octets de géométrie est décrit par une balise d'un octet qui précède les octets sérialisés. La seule différence entre les deux codages de géométrie est l'ordre des octets. Le codage XDR est big-endian, alors que le codage NDR est little-endian. Cela signifie que la représentation codée XDR d'un entier non signé (type de données 32 bits (4 octets) codant un entier naturel de la plage [0 à 4294967295]) est big-endian, tout comme la représentation codée XDR d'un réel double (type de données double précision 64 bits (8 octets), codant un nombre à double précision au format double précision IEEE 754. Inversement, la représentation NDR d'un entier non signé est little endian (octet de poids faible en premier) et la représentation NDR d'un réel double est little endian.
La conversion entre les types de données NDR et XDR pour les entiers non signés et les réels doubles est une opération simple, impliquant l'inversion dans le flux d'octets des octets de chaque entier non signé ou réel double.
Ce type de stockage de géométries permet le stockage de géométrie bidimensionnelle avec les géodatabases stockées dans Oracle ou SQL Server. Les classes d'entités stockées dans la représentation binaire connue OGC se composent de trois tables : la table métier, la table d'entités et la table d'index spatial. Il s'agit des mêmes tables qui sont utilisées pour les classes d'entités stockées au format binaire compressé ArcSDE.
La table métier contient des attributs et une colonne spatiale. La colonne spatiale est une clé permettant d'accéder à la table d'entités et à la table d'index spatial.
La relation entre la table métier et la table d'entités est gérée par la colonne spatiale et la colonne FID. Cette clé conservée par ArcGIS est unique.
Si vous souhaitez stocker la plupart de vos données de classes d'entités au format binaire connu OGC, définissez le paramètre GEOMETRY_STORAGE du mot-clé de configuration DEFAULTS de la table DBTUNE sur OGCWKB. Si au contraire vous ne souhaitez stocker qu'une partie des classes d'entités au format binaire connu OGC, vous pouvez spécifier le mot-clé de configuration WKB_GEOMETRY lors de la création de ces classes d'entités.
Description des flux d'octets des géométries WKB
La brique de base de la représentation binaire connue pour la géométrie est le flux d'octets d'un point, qui consiste en deux réels doubles. Les flux d'octets d'autres géométries sont créés à l'aide des flux d'octets de géométries déjà définies. Voici une définition du flux d'octets :
Type de base - Définitions
octet : 1 octet
uint32 : entier non signé 32 bits (4 octets)
double : nombre à double précision (8 octets)
Briques de base : 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]
}
Assertions pour la représentation binaire connue pour la géométrie
La représentation binaire connue pour la géométrie est conçue pour représenter des instances des types de géométrie décrits dans le modèle d'objets géométrie et dans la spécification résumée d'Open Geospatial.
Ces assertions ont les conséquences suivantes pour les boucles, polygones et multi-polygones :
- Boucles linéaires : les boucles sont simples et fermées, ce qui signifie que les boucles linéaires ne peuvent être auto-sécantes.
- Polygones : deux boucles linéaires du contour d'un polygone ne peuvent pas être sécantes. Les boucles linéaires du contour d'un polygone ne peuvent être sécantes qu'en un point isolé et uniquement de façon tangente.
- Multi-polygones : les intérieurs de deux polygones appartenant à un même multi-polygone ne peuvent être sécants. Les contours de deux polygones appartenant à un même multi-polygone ne peuvent se toucher qu'en un nombre fini de points.