Polygone

S’applique à :SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

Un polygone 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 polygone définissent sa limite. L’espace dans les anneaux définit l’intérieur du polygone.

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

Examples of geometry Polygon instances

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 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 (LineString) et zéro, un ou plusieurs anneaux intérieurs acceptables (LineStrings)

Les critères suivants sont nécessaires pour qu’un anneau (LineString) 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 et @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 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 de l’anneau extérieur ne contient pas suffisamment de points. @g2n’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 terminaison. 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 polygone peuvent se toucher eux-mêmes et les uns les autres à des points tangents uniques, mais si les anneaux intérieurs d’une croix Polygone , 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 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 dans l’intérieur du premier anneau intérieur. @g3 n’est pas valide, car les deux anneaux internes touchent à plusieurs points consécutifs. @g4 n’est pas valide, car les intérieurs 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 l’anneau n’a pas au moins trois points distincts.

Orientation des données spatiales

L’orientation de l’anneau d’un polygone n’est pas un facteur important dans le système planaire. Les fonctionnalités simples OGC pour la spécification SQL ne déterminent pas l’ordre des anneaux et SQL Server n’applique pas l’ordre des anneaux.

Dans un système ellipsoïdal, un polygone sans orientation n’a aucune signification ou est ambigu. Par exemple, un anneau autour de l'équateur décrit-il l'hémisphère Nord ou Sud ? Si nous utilisons le type de données geography pour stocker l’instance spatiale, nous devons spécifier l’orientation de l’anneau et décrire précisément l’emplacement de l’instance.

L’intérieur du polygone dans un système ellipsoïdal est défini par la « règle de gauche » : si vous vous imaginez en train de longer l’anneau formé par un polygone geography en suivant les points dans l’ordre dans lequel ils sont listés, la zone de gauche est considérée comme l’intérieur du polygone et la zone de droite comme l’extérieur.

Dans le sens inverse des aiguilles d’une montre

DECLARE @square GEOGRAPHY;
SET @square = GEOGRAPHY::STPolyFromText('POLYGON((0 20, 0 0, 20 0, 20 20, 0 20))', 4326);
SELECT @square;

Visualization of 'left-hand rule' counter-clockwise orientation

Sens horaire

DECLARE @square GEOGRAPHY;
SET @square = GEOGRAPHY::STPolyFromText('POLYGON((0 20, 20 20, 20 0, 0 0, 0 20))', 4326);
SELECT @square;

Visualization of 'left-hand rule' clockwise orientation

Lorsque le niveau de compatibilité est 100 ou inférieur dans SQL Server, le type de données geography a les restrictions suivantes :

  • Chaque instance geography doit être contenue à l’intérieur d’un seul hémisphère. Aucun objet spatial plus grand qu'un hémisphère ne peut être stocké.

  • Toute instance geography d’une représentation WKB (Well-Known Binary) ou WKT (Well-Known Text) OGC (Open Geospatial Consortium) qui produit un objet plus grand qu’un hémisphère lève une ArgumentException.

  • Les méthodes de type de données geography qui nécessitent l’entrée de deux instances géographiques (telles que STIntersection(), STUnion(), STDifference() et STSymDifference()) retournent null si les résultats des méthodes ne correspondent pas à un seul hémisphère. STBuffer() retourne également null si la sortie dépasse un seul hémisphère.

L’orientation peut être inversée en tirant parti de la méthode étendue ReorientObject .

Examples

Exemple A.

L’exemple suivant crée une instance geometryPolygon simple avec un intervalle 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);

Exemple B.

Une instance 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))'
    );  

Exemple C.

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)))

Exemple D.

Il s’agit d’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

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