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.
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 :
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.
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() :
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 :
Détection d'inclusion
Dans ce dernier exemple, nous allons définir deux points :
La méthode STContains() va nous permettre de déterminer lequel de ces deux points est inclus dans le premier polygone :
Enfin, la méthode STPointOnSurface() permet de sélectionner un point aléatoire à l'intérieur du polygone.
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