SQL Server 2008 Spatial (2)

Le type geometry dans SQL Server 2008

Introduction

Dans la première partie de cet article, nous avons eu l'occasion de découvrir le nouveau type de donnée geography, que nous avons utilisé pour calculer la distance entre deux points à la surface du globe.

SQL Server 2008 nous propose un second type de données spatiales : geometry. Ce type sera utilisé de préférence avec des surfaces de petites dimensions (le plan d'un bâtiment par exemple).

Définir un polygone

Nous allons commencer par définir deux carrés. L'unité des coordonnées utilisées n'a ici aucune importance. Pour plus de simplicité, nous allons travailler en pixels.

DECLARE @poly1 geometry = 'POLYGON((100 100, 200 100, 200 200, 100 200, 100 100))'
DECLARE @poly2 geometry = 'POLYGON((100 100, 200 100, 200 200, 100 200, 100 100))'

Un carré est un polygone fermé; il faut donc 5 points pour le définir.


Opérations booléennes

Nous allons maintenant effectuer quelques opérations booléennes sur nos deux carrés qui se recoupent :

SELECT @poly1.STDifference(@poly2).ToString() [Difference]

Difference
-------------------------------------------------------------------------
POLYGON ((100 100, 200 100, 200 150, 150 150, 150 200, 100 200, 100 100))

SELECT @poly1.STIntersection(@poly2).ToString() [Intersection]

Intersection
-------------------------------------------------------
POLYGON ((150 150, 200 150, 200 200, 150 200, 150 150))

SELECT @poly1.STUnion(@poly2).ToString() [Union]

Union
-------------------------------------------------------------------------------------------
POLYGON ((100 100, 200 100, 200 150, 250 150, 250 250, 150 250, 150 200, 100 200, 100 100))

Les résultats obtenus sont présentés dans les figures 1 à 3.

Surface, périmètre et centre

Le type geometry nous offre également deux méthodes pour calculer la surface et le périmètre d'un polygone. Les résultats obtenus sont présentés dans les figures 4 à 6.

SELECT @poly1.STArea() Aire

Aire
----------------------
10000

SELECT @poly1.STLength() [Périmètre]

Périmètre
----------------------
400

Le centre d'un polygone est le point de croisement de ses différentes bissectrices. Il peut être retrouvé à l'aide de la méthode STCentroid() :

SELECT @poly1.STCentroid().ToString() Centre

Centre
---------------
POINT (150 150)

Pour obtenir les coordonnées x et y du point central sous une forme numérique, vous pouvez également utiliser les propriétés STX et STY, comme le montre l'exemple qui suit :

SELECT @poly1.STCentroid().STX X, @poly1.STCentroid().STY Y

X Y
---------------------- ----------------------
150 150

Détection d'inclusion

Dans ce dernier exemple, nous allons définir deux points :

DECLARE @point1 geometry = 'POINT(120 130)'
DECLARE @point2 geometry = 'POINT(80 130)'

La méthode STContains() va nous permettre de déterminer lequel de ces deux points est inclus dans le premier polygone :

SELECT @poly1.STContains(@point1), @poly2.STContains(@point1)

----- -----
1 0

Enfin, la méthode STPointOnSurface() permet de sélectionner un point aléatoire à l'intérieur du polygone.

SELECT @poly1.STPointOnSurface().ToString() Alea

Alea
---------------------------------------------
POINT (166.66666666666666 166.66666666666666)

Commentaires