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 zéro 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.
Comme indiqué par l'illustration :
La Figure 1 est une instance Polygon dont la limite est définie par un anneau extérieur.
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.
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 des instances qui peuvent être stockées dans une variable geometry ou geography sans lever d'exception. Les instances Polygon suivantes sont acceptées :
Instance Polygon vide
Instance Polygon qui a un anneau extérieur acceptable et zéro ou plusieurs anneaux intérieurs acceptables
Les critères suivants sont nécessaires pour qu'un anneau soit acceptable.
L'instance LineString doit être acceptée.
L'instance LineString doit avoir au moins quatre points.
Les points de début et de fin de l'instance LineString doivent être les mêmes.
L'exemple suivant illustre 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))';
DECLARE @g5 geometry = 'POLYGON((1 1, 1 1, 1 1, 1 1))';
Comme le montrent @g4 and @g5, une instance Polygon acceptée peut ne pas être une instance Polygon valide. @g5 montre également qu'une instance Polygon doit contenir uniquement un anneau avec quatre points quelconques à accepter.
Les exemples suivants lèvent une System.FormatException parce que 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é parce que l'instance LineString pour l'anneau extérieur ne contient pas assez 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 identique au point de fin. L'exemple suivant a un anneau extérieur acceptable, mais l'anneau intérieur n'est pas acceptable. Cela lève également une 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 parce que les deux anneaux intérieurs se touchent à un point unique et ne se croisent pas l'un l'autre. L'exemple suivant montre des instances Polygon qui ne sont pas 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) )';
DECLARE @g6 geometry = 'POLYGON((1 1, 1 1, 1 1, 1 1))';
SELECT @g1.STIsValid(), @g2.STIsValid(), @g3.STIsValid(), @g4.STIsValid(), @g5.STIsValid(), @g6.STIsValid();
@g1 n'est pas valide car la boucle interne touche l'anneau intérieur à deux endroits. @g2 n'est pas valide car le deuxième anneau intérieur est à l'intérieur du premier anneau intérieur. @g3 n'est pas valide car les deux anneaux intérieurs se touchent au niveau de plusieurs points consécutifs. @g4 n'est pas valide car les parties intérieures des deux anneaux intérieurs se chevauchent. @g5 n'est pas valide car l'anneau extérieur n'est pas le premier anneau. @g6 n'est pas valide car la boucle n'a pas au moins trois points distincts.
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 instance qui n'est pas valide peut être entrée et convertie en 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)))
Voici un autre exemple de conversion d'une instance non valide en instance geometry valide. Dans l'exemple suivant, l'instance Polygon a été créée à l'aide de trois points qui sont exactement les mêmes :
DECLARE @g geometry
SET @g = geometry::Parse('POLYGON((1 3, 1 3, 1 3, 1 3))');
SET @g = @g.MakeValid();
SELECT @g.ToString()
L'instance geometry retourné ci-dessus est un Point(1 3). Si le Polygon donné est POLYGON((1 3, 1 5, 1 3, 1 3)), alors MakeValid() retourne LINESTRING(1 3, 1 5).
Voir aussi
Référence
STArea (type de données geometry)
STExteriorRing (type de données geometry)
STNumInteriorRing (type de données geometry)
STInteriorRingN (type de données geometry)
STCentroid (type de données geometry)
STPointOnSurface (type de données geometry)
STIsValid (type de données geography)
STIsValid (type de données geometry)