Reduce (type de données geometry)
Retourne une approximation de l'instance geometry donnée 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
SQL Server type de retour : geometry
Type de retour CLR : SqlGeometry
Notes
Pour les types collection, cet algorithme fonctionne indépendamment sur chaque geometry contenue dans l'instance.
Cet algorithme ne modifie pas d'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, et il rajoute de manière itérative le point de l'instance d'origine qui dévie le plus du résultat, 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 produira un FormatException si l'instance Polygon retournée n'est pas valide ; par exemple, une instance MultiPolygon non valide est créée si Reduce() est appliquée pour simplifier chaque anneau dans l'instance et que 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 le CurvePolygon comporte des anneaux intérieurs, une instance CurvePolygon ou MultiPoint est retournée.
Lorsqu'un segment d'arc de cercle est rencontré, 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. S'il ne respecte pas ce critère, l'arc circulaire est conservé et l'algorithme d'approximation est appliqué aux segments restants.
Exemples
A.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. Cela se produit car la conservation des points de début et de fin d'origine provoquerait 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;