Reduce (type de données geometry)
S’applique à : SQL Server Azure SQL Database Azure SQL Managed Instance
Retourne une approximation de l’instance geometry donnée. L’approximation est produite en exécutant une extension de l’algorithme de Douglas-Peucker sur l’instance, avec la tolérance donnée.
Syntaxe
.Reduce ( tolerance )
Arguments
tolerance
Valeur de type float. tolerance est la tolérance à entrer pour l’algorithme d’approximation.
Types de retour
Type de retour SQL Server : geometry
Type de retour CLR : SqlGeometry
Remarques
Pour les types de collection, cet algorithme fonctionne indépendamment sur chaque geometry contenu dans l’instance.
Cet algorithme ne modifie pas les instances Point.
Sur les instances LineString, CircularString et CompoundCurve, l’algorithme d’approximation conserve les points de début et de fin d’origine de l’instance. Il rajoute de manière itérative le point de l’instance d’origine qui dévie le plus du résultat. Ce processus continue jusqu’à ce qu’aucun point ne dévie plus de la tolérance donnée.
Reduce()
retourne une instance LineString, CircularString ou CompoundCurve pour les instances CircularString. Reduce()
retourne une instance CompoundCurve ou LineString pour les instances CompoundCurve.
Sur les instances Polygon, l’algorithme d’approximation est appliqué indépendamment à chaque anneau. La méthode produit FormatException
si l’instance Polygon retournée est non valide. Par exemple, une instance MultiPolygon non valide est créée si Reduce()
est appliquée pour simplifier chaque anneau de l’instance et si les anneaux résultants se chevauchent. Sur les instances CurvePolygon avec un anneau extérieur et sans anneau intérieur, Reduce()
retourne une instance CurvePolygon, LineString ou Point. Si CurvePolygon a des anneaux intérieurs, une instance CurvePolygon ou MultiPoint est retournée.
Quand un segment d’arc de cercle est trouvé, l’algorithme d’approximation vérifie si l’arc peut se rapprocher par sa pression simultanée dans la moitié de la tolérance donnée. Si la pression simultanée satisfait à ce critère, l’arc circulaire est remplacé dans les calculs par la pression simultanée. Si elle ne respecte pas ce critère, l’arc circulaire est conservé et l’algorithme d’approximation est appliqué aux segments restants.
Exemples
R. Utilisation de Reduce() pour simplifier un LineString
L'exemple suivant crée une instance LineString
et utilise Reduce()
afin de simplifier l'instance.
DECLARE @g geometry;
SET @g = geometry::STGeomFromText('LINESTRING(0 0, 0 1, 1 0, 2 1, 3 0, 4 1)', 0);
SELECT @g.Reduce(.75).ToString();
B. Utilisation de Reduce() avec variation de niveaux de tolérance sur un CircularString
L’exemple suivant utilise Reduce()
avec trois niveaux de tolérance sur une instance CircularString :
DECLARE @g geometry = 'CIRCULARSTRING(0 0, 8 8, 16 0, 20 -4, 24 0)';
SELECT @g.Reduce(5).ToString();
SELECT @g.Reduce(15).ToString();
SELECT @g.Reduce(16).ToString();
Cet exemple produit la sortie suivante :
CIRCULARSTRING (0 0, 8 8, 16 0, 20 -4, 24 0)
COMPOUNDCURVE (CIRCULARSTRING (0 0, 8 8, 16 0), (16 0, 24 0))
LINESTRING (0 0, 24 0)
Chacune des instances retournées contient les points de terminaison (0 0) et (24 0).
C. Utilisation de Reduce() avec variation des niveaux de tolérance sur un CompoundCurve
L’exemple suivant utilise Reduce()
avec deux niveaux de tolérance sur une instance CompoundCurve :
DECLARE @g geometry = 'COMPOUNDCURVE(CIRCULARSTRING(0 0, 8 8, 16 0, 20 -4, 24 0),(24 0, 20 4, 16 0))';
SELECT @g.Reduce(15).ToString();
SELECT @g.Reduce(16).ToString();
Dans cet exemple, notez que la deuxième instruction SELECT retourne l’instance LineString : LineString(0 0, 16 0)
.
Affichage d'un exemple où les points de début et de fin d'origine sont perdus
L’exemple suivant affiche comment les points de début et de fin d’origine peuvent ne pas être conservés par l’instance résultante. Ce comportement se produit, car la conservation des points de début et de fin d’origine donne lieu à une instance LineString non valide.
DECLARE @g geometry = 'LINESTRING(0 0, 4 0, 2 .01, 1 0)';
DECLARE @h geometry = @g.Reduce(1);
SELECT @g.STIsValid() AS Valid
SELECT @g.ToString() AS Original, @h.ToString() AS Reduced;