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 suivantes sont des instances Polygon acceptées pour le type geometry :
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 exigés pour qu'un anneau soit acceptable.
L'instance LineString doit être acceptée.
L'instance LineString doit avoir au moins quatre points qui incluent trois points distincts.
Les points de début et de fin de l'instance LineString doivent avoir les mêmes valeurs X et Y.
[!REMARQUE]
Les valeurs Z et M sont ignorées.
Une instance Polygon d'un type geography est acceptée uniquement si l'instance est valide. Pour plus d'informations, consultez Valid Geography Polygon Instances.
L'exemple suivant affiche des instances Polygon acceptées de types geometry.
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 l'indique @g4, une instance Polygon acceptée peut ne pas être une instance Polygon valide. Les exemples suivants lèvent un 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 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 le même que le point de fin. L'exemple suivant a un anneau extérieur acceptable, mais l'anneau intérieur ne l'est pas. Cela lève également un System.FormatException.
DECLARE @g geometry = 'POLYGON((-5 -5, -5 5, 5 5, 5 -5, -5 -5),(0 0, 3 0, 0 0))';
Instances valides
La validité d'une instance Polygon dépend de son type de variable.
Type de données Geometry
Pour qu'une instance Polygon d'un type geometry soit valide, elle doit satisfaire aux critères suivants :
Le premier anneau est l'anneau extérieur.
Tous les anneaux intérieurs se trouvent dans l'anneau extérieur.
Aucun anneau intérieur ne se trouve dans un autre anneau intérieur.
Aucun anneau ne se croise lui-même ou ne croise un autre anneau.
Deux anneaux ne peuvent pas partager le même contour.
L'intérieur d'un anneau intérieur ne peut pas recouvrir l'intérieur d'un autre anneau intérieur.
Tous les anneaux peuvent uniquement se toucher eux-mêmes ou un autre anneau à zéro ou un nombre fini de points tangents.
L'intérieur de l'instance Polygon est connecté. Il doit exister au moins un chemin d'accès entre tous deux points intérieurs de l'instance qui se trouve entièrement à l'intérieur de l'instance.
L'exemple suivant affiche 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 et ne croisent pas. L'exemple suivant affiche 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) )';
SELECT @g1.STIsValid(), @g2.STIsValid(), @g3.STIsValid(), @g4.STIsValid(), @g5.STIsValid();
@g1 n'est pas valide car l'anneau interne touche l'anneau extérieur en deux emplacements. @g2 n'est pas valide car le deuxième anneau interne figure à l'intérieur du premier anneau interne. @g3 n'est pas valide car les deux anneaux internes se touchent en plusieurs points consécutifs. @g4 n'est pas valide car les intérieurs des deux anneaux internes se recouvrent. @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 d'un type geography soit valide, elle doit satisfaire aux critères suivants :
L'instance doit respecter toutes les règles obligatoires pour être une instance Polygon acceptée de type geometry.
L'intérieur de l'instance est connecté à l'aide d'une règle gauche.
L'instance peut s'ajuster dans un hémisphère.
Aucun anneau ne se coupe lui-même ou ne croise un autre anneau.
Tous les anneaux peuvent uniquement se toucher eux-mêmes ou un autre anneau à zéro ou un nombre fini de points tangents.
L'exemple suivant lève un Microsoft.SqlServer.Types.GLArgumentException car l'instance Polygon dépasse un 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 affiche 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 orifice et un SRID de 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 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 précédent 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)))
Voir aussi