Partager via


Polygone

A Polygon est une surface à deux dimensions stockée sous la forme d’une séquence de points définissant un anneau englobant extérieur et zéro ou plusieurs anneaux intérieurs.

Instances de polygones

Une Polygon instance peut être formée à partir d’un anneau qui a au moins trois points distincts. Une Polygon instance peut également être vide.

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

L’illustration ci-dessous montre des exemples d’instances Polygon .

Exemples d'instances de polygones géométriques

Comme illustré dans l’illustration :

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

  2. La figure 2 est une Polygon instance 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 valide Polygon , car ses anneaux intérieurs se croisent à un point tangent unique.

Instances acceptées

Les instances acceptées Polygon sont des instances qui peuvent être stockées dans une geometry ou geography une variable sans lever d’exception. Voici les instances acceptées Polygon :

  • Instance vide Polygon

  • 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épart et de fin de l’instance LineString doivent être identiques.

L’exemple suivant montre les instances acceptées Polygon .

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 @g4 et @g5 afficher une instance acceptée Polygon peut ne pas être une instance valide Polygon . @g5 indique également qu’une instance Polygon doit contenir uniquement un anneau avec quatre points à accepter.

Les exemples suivants lèvent un System.FormatException car les Polygon instances 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 d’anneau LineString extérieur n’est pas identique au point de terminaison. L’exemple suivant a un anneau extérieur acceptable, mais l’anneau intérieur n’est pas acceptable. 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

Les anneaux intérieurs d’un Polygon peuvent se toucher entre eux et avec les autres en des points de tangence uniques, mais si les anneaux intérieurs d’une Polygon se croisent, l’instance n’est pas valide.

L’exemple suivant montre des instances valides Polygon .

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 touchent à un point unique et ne se croisent pas. L’exemple suivant montre Polygon les instances 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 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 touchent à plusieurs points consécutifs. @g4 n’est pas valide, car les deux anneaux intérieurs se superposent. @g5 n’est pas valide, car l’anneau extérieur n’est pas le premier anneau. @g6 n’est pas valide, car l’anneau n’a pas au moins trois points distincts.

Exemples

L’exemple suivant crée une instance simple geometry``Polygon avec un trou et 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 aninstance qui n’est pas valide peut être entrée et convertie en instance valide geometry . 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 valide avec MakeValid().

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

L’instance geometry retournée à partir de 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 identiques :

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 de géométrie retournée ci-dessus est un Point(1 3). Si l’élément Polygon donné est POLYGON((1 3, 1 5, 1 3, 1 3)), alors MakeValid() retournerait LINESTRING(1 3, 1 5).

Voir aussi

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)MultiPolygoneDonnées spatiales (SQL Server)STIsValid (type de données geography)STIsValid (type de données geometry)