Polygon

S’applique à : SQL Server base de données Azure SQL Azure 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 .

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 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 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é, 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 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.

Orientation des données spatiales

L’orientation d’anneau d’un polygone n’est pas un facteur important dans le système planaire. La spécification OGC Simple Features for SQL ne stipule pas d’ordonnancement d’anneau et SQL Server n’applique pas d’ordonnancement d’anneau.

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 anti-horaire

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

Visualisation de l’orientation antihoraire de la « règle de gauche »

Dans le sens horaire

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

Visualisation de l’orientation horaire de la « règle de gauche »

Quand le niveau de compatibilité est égal ou inférieur à 100 dans SQL Server, le type de données geography présente 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 geography, (telles que STIntersection(), STUnion(), STDifference() et STSymDifference()), retournent null si les résultats des méthodes ne s’ajustent pas à l’intérieur d’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.

Exemples

Exemple A.

L’exemple suivant crée une instance geometry Polygon 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 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))'
    );  

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)