Polygon

Un Polygon est une surface à deux dimensions stockée en tant que séquence de points définissant un anneau englobant extérieur et aucun ou plusieurs anneaux intérieurs.

Instances Polygon

Une instance Polygon peut être formée à partir d'un anneau qui possède au moins trois points distincts. Une instance Polygon peut également être vide.

Les anneaux extérieurs et intérieurs d'un Polygon définissent sa limite. L'espace dans les anneaux définit l'intérieur du Polygon.

L'illustration suivante montre des exemples d'instances Polygon.

Exemples d'instances Polygon géométriques

Comme indiqué par l'illustration :

  1. La Figure 1 est une instance Polygon dont la limite est définie par un anneau extérieur.

  2. La Figure 2 est une instance Polygon dont la limite est définie par un anneau extérieur et deux anneaux intérieurs. La zone à l'intérieur des anneaux intérieurs fait partie de l'extérieur de l'instance Polygon.

  3. La Figure 3 est une instance Polygon valide car ses anneaux intérieurs se croisent à un point tangent unique.

Instances acceptées

Les instances Polygon acceptées sont celles qui peuvent être stockées dans une variable geometry ou geography, sans qu'une exception ne soit levée. Les instances ci-dessous sont des instances Polygon acceptées pour le type geometry :

  • Instance Polygon vide

  • Instance Polygon avec un anneau extérieur acceptable et aucun ou plusieurs anneaux intérieurs acceptables

Les critères suivants sont nécessaires pour qu'un anneau soit accepté.

  • L'instance LineString doit être acceptée.

  • L'instance LineString doit avoir au moins quatre points, dont trois points distincts.

  • Les points de départ et de terminaison de l'instance LineString doivent avoir les mêmes valeurs x et y.

    Notes

    Les valeurs Z et M sont ignorées.

Une instance Polygon de type geography ne sera acceptée que si elle est valide. Pour plus d'informations sur les instances Polygon valides de type geography, consultez BkmkValidGeographyPolygons.

L'exemple suivant montre des instances Polygon acceptées.

DECLARE @g1 geometry = 'POLYGON EMPTY';
DECLARE @g2 geometry = 'POLYGON((1 1, 3 3, 3 1, 1 1))';
DECLARE @g3 geometry = 'POLYGON((-5 -5, -5 5, 5 5, 5 -5, -5 -5),(0 0, 3 0, 3 3, 0 3, 0 0))';
DECLARE @g4 geometry = 'POLYGON((-5 -5, -5 5, 5 5, 5 -5, -5 -5),(3 0, 6 0, 6 3, 3 3, 3 0))';

Comme le montre @g4, une instance Polygon acceptée peut ne pas être une instance Polygon valide. Les exemples suivants lèvent une exception System.FormatException car les instances Polygon ne sont pas acceptées.

DECLARE @g1 geometry = 'POLYGON((1 1, 3 3, 1 1))';
DECLARE @g2 geometry = 'POLYGON((1 1, 3 3, 3 1, 1 5))';

@g1 n'est pas accepté car l'instance LineString de l'anneau extérieur ne contient pas suffisamment de points. @g2 n'est pas accepté car le point de départ de l'instance LineString de l'anneau extérieur n'est pas le même que le point de terminaison. L'exemple suivant présente un anneau extérieur acceptable et un anneau intérieur non acceptable. Cet exemple provoque une exception System.FormatException.

DECLARE @g geometry = 'POLYGON((-5 -5, -5 5, 5 5, 5 -5, -5 -5),(0 0, 3 0, 0 0))';

Instances valides

Les anneaux intérieurs d'un Polygon peuvent se toucher eux-mêmes et l'un l'autre à des points tangents uniques, mais si les anneaux intérieurs d'un Polygon se croisent, l'instance n'est pas valide.

L'exemple suivant montre des instances Polygon valides.

DECLARE @g1 geometry = 'POLYGON((-20 -20, -20 20, 20 20, 20 -20, -20 -20))';
DECLARE @g2 geometry = 'POLYGON((-20 -20, -20 20, 20 20, 20 -20, -20 -20), (10 0, 0 10, 0 -10, 10 0))';
DECLARE @g3 geometry = 'POLYGON((-20 -20, -20 20, 20 20, 20 -20, -20 -20), (10 0, 0 10, 0 -10, 10 0), (-10 0, 0 10, -5 -10, -10 0))';
SELECT @g1.STIsValid(), @g2.STIsValid(), @g3.STIsValid();

@g3 est valide car les deux anneaux intérieurs se touchent à un point unique mais ne se croisent pas. L'exemple suivant montre des instances Polygon non valides.

DECLARE @g1 geometry = 'POLYGON((-20 -20, -20 20, 20 20, 20 -20, -20 -20), (20 0, 0 10, 0 -20, 20 0))';
DECLARE @g2 geometry = 'POLYGON((-20 -20, -20 20, 20 20, 20 -20, -20 -20), (10 0, 0 10, 0 -10, 10 0), (5 0, 1 5, 1 -5, 5 0))';
DECLARE @g3 geometry = 'POLYGON((-20 -20, -20 20, 20 20, 20 -20, -20 -20), (10 0, 0 10, 0 -10, 10 0), (-10 0, 0 10, 0 -10, -10 0))';
DECLARE @g4 geometry = 'POLYGON((-20 -20, -20 20, 20 20, 20 -20, -20 -20), (10 0, 0 10, 0 -10, 10 0), (-10 0, 1 5, 0 -10, -10 0))';
SELECT @g1.STIsValid(), @g2.STIsValid(), @g3.STIsValid(), @g4.STIsValid();

@g1 n'est pas valide car l'anneau intérieur touche l'anneau extérieur à deux endroits. @g2 n'est pas valide car le deuxième anneau intérieur se trouve à l'intérieur du premier anneau intérieur. @g3 n'est pas valide car les deux anneaux intérieurs se touchent à plusieurs points consécutifs. @g4 n'est pas valide car l'intérieur des deux anneaux intérieurs se chevauchent.

Type de données Geometry

Pour qu'une instance Polygon de type geometry soit valide, elle doit répondre aux critères suivants :

  1. Le premier anneau correspond à l'anneau extérieur.

  2. Tous les anneaux intérieurs se trouvent dans l'anneau extérieur.

  3. Aucun anneau intérieur ne se trouve dans un autre anneau intérieur.

  4. Aucun anneau ne se croise lui-même ou un autre anneau.

  5. Deux anneaux ne partagent pas le même côté.

  6. L'intérieur d'un anneau intérieur ne peut pas chevaucher l'intérieur d'un autre anneau intérieur.

  7. Les anneaux peuvent uniquement se toucher eux-mêmes ou un autre anneau sur aucun ou sur un nombre fini de points de tangente.

  8. L'intérieur de l'instance Polygon est connecté. Il doit y avoir au moins un chemin entre deux des points intérieurs de l'instance, qui soit entièrement situé à l'intérieur de l'instance.

L'exemple suivant montre des instances Polygon valides.

DECLARE @g1 geometry = 'POLYGON((-20 -20, -20 20, 20 20, 20 -20, -20 -20))';
DECLARE @g2 geometry = 'POLYGON((-20 -20, -20 20, 20 20, 20 -20, -20 -20), (10 0, 0 10, 0 -10, 10 0))';
DECLARE @g3 geometry = 'POLYGON((-20 -20, -20 20, 20 20, 20 -20, -20 -20), (10 0, 0 10, 0 -10, 10 0), (-10 0, 0 10, -5 -10, -10 0))';
SELECT @g1.STIsValid(), @g2.STIsValid(), @g3.STIsValid();

@g3 est valide car les deux anneaux intérieurs se touchent à un point unique mais ne se croisent pas. L'exemple suivant montre des instances Polygon non valides.

DECLARE @g1 geometry = 'POLYGON((-20 -20, -20 20, 20 20, 20 -20, -20 -20), (20 0, 0 10, 0 -20, 20 0))';
DECLARE @g2 geometry = 'POLYGON((-20 -20, -20 20, 20 20, 20 -20, -20 -20), (10 0, 0 10, 0 -10, 10 0), (5 0, 1 5, 1 -5, 5 0))';
DECLARE @g3 geometry = 'POLYGON((-20 -20, -20 20, 20 20, 20 -20, -20 -20), (10 0, 0 10, 0 -10, 10 0), (-10 0, 0 10, 0 -10, -10 0))';
DECLARE @g4 geometry = 'POLYGON((-20 -20, -20 20, 20 20, 20 -20, -20 -20), (10 0, 0 10, 0 -10, 10 0), (-10 0, 1 5, 0 -10, -10 0))';
DECLARE @g5 geometry = 'POLYGON((10 0, 0 10, 0 -10, 10 0), (-20 -20, -20 20, 20 20, 20 -20, -20 -20) )';
SELECT @g1.STIsValid(), @g2.STIsValid(), @g3.STIsValid(), @g4.STIsValid(), @g5.STIsValid();

@g1 n'est pas valide car l'anneau intérieur touche l'anneau extérieur à deux endroits. @g2 n'est pas valide car le deuxième anneau intérieur se trouve à l'intérieur du premier anneau intérieur. @g3 n'est pas valide car les deux anneaux intérieurs se touchent à plusieurs points consécutifs. @g4 n'est pas valide car l'intérieur des deux anneaux intérieurs se chevauchent. @g5 n'est pas valide car le premier anneau est un anneau intérieur et le deuxième anneau est un anneau extérieur.

Type de données Geography

Pour qu'une instance Polygon de type geography soit valide, elle doit répondre aux critères suivants :

  1. L'instance doit répondre à toutes les conditions requises pour l'acceptation d'une instance Polygon de type geometry.

  2. L'intérieur de l'instance est connecté à l'aide d'une règle gauche.

  3. L'instance peut être contenue dans une hémisphère.

  4. Aucun anneau ne se croise lui-même ou un autre anneau.

  5. Les anneaux peuvent uniquement se toucher eux-mêmes ou un autre anneau sur aucun ou sur un nombre fini de points de tangente.

L'exemple suivant provoque une exception Microsoft.SqlServer.Types.GLArgumentException car l'instance Polygon dépasse de l'hémisphère.

DECLARE @g geography = 'POLYGON((-122.358 47.653, 122.348 47.649, 122.348 47.658, 122.358 47.658, -122.358 47.653))';

L'exemple suivant montre une instance Polygon valide pour le type geography.

DECLARE @g geography = 'POLYGON((-122.358 47.653, -122.348 47.649, -122.348 47.658, -122.358 47.658, -122.358 47.653))';

Exemples

L'exemple suivant crée une instance geometryPolygon simple avec un trou et un SRID 10.

DECLARE @g geometry;
SET @g = geometry::STPolyFromText('POLYGON((0 0, 0 3, 3 3, 3 0, 0 0), (1 1, 1 2, 2 1, 1 1))', 10);

Une instancenon valide peut être entrée et convertie en une instance geometry valide. Dans l'exemple suivant d'un Polygon, les anneaux intérieurs et extérieurs se chevauchent et l'instance n'est pas valide.

DECLARE @g geometry;
SET @g = geometry::Parse('POLYGON((1 0, 0 1, 1 2, 2 1, 1 0), (2 0, 1 1, 2 2, 3 1, 2 0))');

Dans l'exemple suivant, l'instance non valide est rendue valide avec MakeValid().

SET @g = @g.MakeValid();
SELECT @g.ToString();

L'instance geometry retournée par l'exemple ci-dessus est un MultiPolygon.

MULTIPOLYGON (((2 0, 3 1, 2 2, 1.5 1.5, 2 1, 1.5 0.5, 2 0)), ((1 0, 1.5 0.5, 1 1, 1.5 1.5, 1 2, 0 1, 1 0)))