Comprendre WKT et WKB

Février 2011


Précédent

Table des matières

Suivant


SpatiaLite supporte les données géométrique (Geometry data) conformément au standard OGC-SFS (Open Geospatial Consortium - Simple Feature SQL).
http://www.opengeospatial.org/standards/sfs

Geometry est une donnée abstraite comportant des sous-classes concrètes.
Vous ne pouvez pas instancier directement la classe Geometry (car elle est abstraite , et ne correspond à aucune implémentation): mais vous pouvez instancier des  sous-classes.   (nb: instancier une sous classe "point" reviens a définir une colonne géométrique destinée à contenir des points)


Sub-Class

Exemple

POINT

LINESTRING

POLYGON

MULTIPOINT

MULTILINESTRING

MULTIPOLYGON

GEOMETRYCOLLECTION

Collection de géométries (toutes les combinaisons possibles des sous-classes précédentes.
Attention:

  • GEOMETRYCOLLECTION n'est pas supporté par le format Shapefile.

  • cette sous-classe n'est généralement pas supporté par les logiciels SIG classiques (viewers  etc).

C'est pourquoi elle est très peu répandue dans le monde des SIG. Evitons donc de l'utiliser...



les notations WKT et WKT

Geometry est un type de donnée complexe: c'est pourquoi OGC-SFS a défini deux notations standards différentes pour représenter les valeurs géométriques:

  • WKT (Well Known Text)  est destiné à être user friendly (destiné à être lu par des humains).

  • WKB (Well Known Binary) est utilisé pour assurer l' import/export/échange de données entre différentes plate-formes, sans risque.



Dimension: XY (2D) le plus commun ...

Geometry Type

WKT exemple

POINT

POINT(123.45 543.21)

LINESTRING

LINESTRING(100.0 200.0, 201.5 102.5, 1234.56 123.89)
trois noeuds

POLYGON

POLYGON((101.23 171.82, 201.32 101.5, 215.7 201.953, 101.23 171.82))
bordure extérieur, pas de bordures intérieures


POLYGON((10 10, 20 10, 20 20, 10 20, 10 10),
(13 13, 17 13, 17 17, 13 17, 13 13))
une bordure extérieur et une bordure intérieure

MULTIPOINT

MULTIPOINT(1234.56 6543.21, 1 2, 3 4, 65.21 124.78)
Trois points

MULTILINESTRING

MULTILINESTRING((1 2, 3 4), (5 6, 7 8, 9 10), (11 12, 13 14))
les première et dernière ligne ont deux nœuds chacune;
la deuxième en a 3.

MULTIPOLYGON

MULTIPOLYGON(((0 0,10 20,30 40,0 0),(1 1,2 2,3 3,1 1)),
((100 100,110 110,120 120,100 100)))
2 polygones: le premier à une bordure interieure

GEOMETRYCOLLECTION

GEOMETRYCOLLECTION(POINT(1 1),
LINESTRING(4 5, 6 7, 8 9),
POINT(30 30))



XYZ (3D)

Geometry Type

WKT example

POINT

POINTZ(13.21 47.21 0.21)

LINESTRING

LINESTRINGZ(15.21 57.58 0.31, 15.81 57.12 0.33)

POLYGON

...

MULTIPOINT

MULTIPOINTZ(15.21 57.58 0.31, 15.81 57.12 0.33)

MULTILINESTRING

...

MULTIPOLYGON

...

GEOMETRYCOLLECTION

GEOMETRYCOLLECTIONZ(POINTZ(13.21 47.21 0.21),
LINESTRINGZ(15.21 57.58 0.31,
15.81 57.12 0.33))



Dimension: XYM (2D + Mesure)
Attention: ceci n'est pas de la 3D.
M signifie mesure , et non une dimension géométrique.

Geometry Type

WKT example

POINT

POINTM(13.21 47.21 1000.0)

LINESTRING

LINESTRINGM(15.21 57.58 1000.0, 15.81 57.12 1100.0)

POLYGON

...

MULTIPOINT

MULTIPOINTM(15.21 57.58 1000.0, 15.81 57.12 1100.0)

MULTILINESTRING

...

MULTIPOLYGON

...

GEOMETRYCOLLECTION

GEOMETRYCOLLECTIONM(POINTM(13.21 47.21 1000.0),
LINESTRINGM(15.21 57.58 1000.0, 15.81 57.12 1100.0))



XYZM (3D + Mesure)

Geometry Type

WKT example

POINT

POINTZM(13.21 47.21 0.21 1000.0)

LINESTRING

LINESTRINGZM(15.21 57.58 0.31 1000.0, 15.81 57.12 0.33 1100.0)

POLYGON

...

MULTIPOINT

MULTIPOINTZM(15.21 57.58 0.31 1000.0, 15.81 57.12 0.33 1100.0)

MULTILINESTRING

...

MULTIPOLYGON

...

GEOMETRYCOLLECTION

GEOMETRYCOLLECTIONZM(POINTZM(13.21 47.21 0.21 1000.0),
LINESTRINGZM(15.21 57.58 0.31 1000.0, 15.81 57.12 0.33 1100.0))



Plusieurs fonctions spatiales utilisent WKT et WKB;
examiner l'ensemble de ces fonction serais fastidieux et pas vraiment utile pour un débutant. Nous allons donc nous contenter des plus courantes.


SELECT Hex(ST_GeomFromText('POINT(1.2345 2.3456)'));

0001FFFFFFFF8D976E1283C0F33F16FBCBEEC9C302408D976E1283C0F33F16FBCBEEC9C302407C010000008D976E1283C0F33F16FBCBEEC9C30240FE


SELECT ST_AsText(x'0001FFFFFFFF8D976E1283C0F33F16FBCBEEC9C302408D976E1283C0F33F16FBCBEEC9C302407C010000008D976E1283C0F33F16FBCBEEC9C30240FE');

POINT(1.2345 2.3456)


SELECT Hex(ST_AsBinary(x'0001FFFFFFFF8D976E1283C0F33F16FBCBEEC9C302408D976E1283C0F33F16FBCBEEC9C302407C010000008D976E1283C0F33F16FBCBEEC9C30240FE'));

01010000008D976E1283C0F33F16FBCBEEC9C30240


SELECT Hex(ST_AsBinary(ST_GeomFromText('POINT(1.2345 2.3456)')));

01010000008D976E1283C0F33F16FBCBEEC9C30240


SELECT ST_AsText(ST_GeomFromWKB(x'01010000008D976E1283C0F33F16FBCBEEC9C30240'));

POINT(1.2345 2.3456)


Attention: les deux notations WKT et WKB permettent un échange standard des données (import/export);
De toute façon, le format de stockage utilisé par SpatiaLite est différent: BLOB Geometry.
Cependant, vous ne serez jamais dérangés par ce format interne: tout est géré de façon transparente.
Vous devrez simplement utiliser les fonctions permettant de traiter WKT ou WKB.


SELECT ST_GeometryType(ST_GeomFromText('POINT(1.2345 2.3456)'));

POINT


SELECT ST_GeometryType(ST_GeomFromText('POINTZ(1.2345 2.3456 10)'));

POINT Z


SELECT ST_GeometryType(ST_GeomFromText('POINT ZM(1.2345 2.3456 10 20)'));

POINT ZM

ST_GeometryType() retournera le type de géométrie d'une valeur BLOB Geometry.


SELECT ST_Srid(ST_GeomFromText('POINT(1.2345 2.3456)'));

-1


SELECT ST_Srid(ST_GeomFromText('POINT(1.2345 2.3456)', 4326));

4326

ST_Srid() retourne le SRID (EPSG) de la valeur BLOB Geometry.



Erreurs fréquentes

"J'ai déclaré une colonne géométrie de type MULTIPOINT;
maintenant je dois absolument insérer un
POINT a cette table,
mais j'obtiens une erreur de type
constraint failed "

Tout type MULTIxxxxx peut stocker un seul type d'élément: vous devez simplement utiliser la syntaxe WKT appropriée.
Notez également qu'il existe des fonction de type casting capable de convertir le type de géométrie.


SELECT ST_GeometryType(ST_GeomFromText('MULTIPOINT(1.2345 2.3456)'));

MULTIPOINT


SELECT ST_AsText(CastToMultiLineString(ST_GeomFromText('LINESTRING(1.2345 2.3456, 12.3456 23.4567)')));

MULTILINESTRING((1.2345 2.3456, 12.3456 23.4567))


SELECT ST_AsText(CastToXYZM(ST_GeomFromText('POINT(1.2345 2.3456)')));

POINT ZM(1.2345 2.3456 0 0)


SELECT ST_AsText(CastToXY(ST_GeomFromText('POINT ZM(1.2345 2.3456 10 20)')));

POINT(1.2345 2.3456)


Précédent

Table des matières

Suivant


Author: Alessandro Furieri a.furieri@lqt.it
Traduce from English by RIVIERE Romain

This work is licensed under the Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) license.


Permission is granted to copy, distribute and/or modify this document under the terms of the
GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation;
with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.