# Reduce (geometry Data Type)

**Applies to:**
SQL Server
Azure SQL Database
Azure SQL Managed Instance

Returns an approximation of the given **geometry** instance. The approximation is produced by running an extension of the Douglas-Peucker algorithm on the instance with the given tolerance.

## Syntax

```
.Reduce ( tolerance )
```

Note

To view Transact-SQL syntax for SQL Server 2014 (12.x) and earlier versions, see Previous versions documentation.

## Arguments

*tolerance*

Is a value of type **float**. *tolerance* is the tolerance to input for the approximation algorithm.

## Return Types

SQL Server return type: **geometry**

CLR return type: **SqlGeometry**

## Remarks

For collection types, this algorithm operates independently on each **geometry** contained in the instance.

This algorithm doesn't modify **Point** instances.

On **LineString**, **CircularString**, and **CompoundCurve** instances, the approximation algorithm keeps the original start and end points of the instance. The algorithm next iteratively adds back the point from the original instance that most deviates from the result. This process continues until no point deviates more than the given tolerance.

`Reduce()`

returns a **LineString**, **CircularString**, or **CompoundCurve** instance for **CircularString** instances. `Reduce()`

returns either a **CompoundCurve** or **LineString** instance for **CompoundCurve** instances.

On **Polygon** instances, the approximation algorithm is applied independently to each ring. The method will produce a `FormatException`

if the returned **Polygon** instance isn't valid; for example, a non-valid **MultiPolygon** instance is created if `Reduce()`

is applied to simplify each ring in the instance and the resulting rings overlap. On **CurvePolygon** instances with an exterior ring and no interior rings, `Reduce()`

returns a **CurvePolygon**, **LineString**, or **Point** instance. If the **CurvePolygon** has interior rings then a **CurvePolygon** or **MultiPoint** instance is returned.

When a circular arc segment is found, the approximation algorithm checks whether the arc can be approximated by its chord within half the given tolerance. Chords meeting this criteria have the circular arc replaced in the calculations by the chord. If a chord doesn't meet this criteria, then the circular arc is kept and the approximation algorithm is applied to the remaining segments.

## Examples

### A. Using Reduce() to simplify a LineString

The following example creates a `LineString`

instance and uses `Reduce()`

to simplify the 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. Using Reduce() with varying tolerance levels on a CircularString

The following example uses `Reduce()`

with three tolerance levels on a **CircularString** instance:

```
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();
```

This example produces the following output:

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

Each of the instances returned contain the endpoints (0 0) and (24 0).

### C. Using Reduce() with varying tolerance levels on a CompoundCurve

The following example uses `Reduce()`

with two tolerance levels on a **CompoundCurve** instance:

```
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();
```

In this example notice that the second **SELECT** statement returns the **LineString** instance: `LineString(0 0, 16 0)`

.

### Showing an example where the original start and end points are lost

The following example shows how the original start and endpoints may not be retained by the resulting instance. This behavior occurs because keeping the original start and end points would result in an invalid **LineString** instance.

```
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;
```

## See Also

## Feedback

https://aka.ms/ContentUserFeedback.

Coming soon: Throughout 2024 we will be phasing out GitHub Issues as the feedback mechanism for content and replacing it with a new feedback system. For more information see:Submit and view feedback for