Reduce (tipo di dati geometry)
Restituisce un'approssimazione dell'istanza geometry specificata prodotta eseguendo un estensione dell'algoritmo Douglas-Peucker sull'istanza con la tolleranza specificata.
Sintassi
.Reduce ( tolerance )
Argomenti
- tolerance
Valore di tipo float. tolerance è la tolleranza per l'input dell'algoritmo di approssimazione.
Tipi restituiti
SQL Server tipo restituito: geometry
Tipo CLR restituito: SqlGeometry
Osservazioni
Per i tipi relativi a una raccolta, questo algoritmo funziona in modo indipendente su ciascun tipo geometry contenuto nell'istanza.
Questo algoritmo non modifica le istanze Point.
Sulle istanze LineString, CircularString e CompoundCurve, l'algoritmo di approssimazione mantiene i punti di inizio e fine originali dell'istanza e, in modo iterativo, aggiunge nuovamente il punto dall'istanza originale con la maggiore deviazione rispetto al risultato finché nessun punto devia più della tolleranza specificata.
Reduce() restituisce un'istanza LineString, CircularString o CompoundCurve per le istanze CircularString. Reduce() restituisce un'istanza CompoundCurve o LineString per le istanze CompoundCurve.
Sulle istanze Polygon, l'algoritmo di approssimazione viene applicato in modo indipendente a ogni anello. Il metodo genera un'eccezione FormatException se l'istanza Polygon restituita non è valida. Se ad esempio Reduce() viene applicato per semplificare ogni anello nell'istanza e gli anelli risultanti si sovrappongono, viene creata un'istanza MultiPolygon non valida. Sulle istanze CurvePolygon con un anello esterno e nessun anello interno, Reduce() restituisce un'istanza CurvePolygon, LineString o Point. Se CurvePolygon dispone di anelli interni, viene restituita un'istanza CurvePolygon o MultiPoint.
Quando viene rilevato un segmento di arco circolare, l'algoritmo di approssimazione controlla se è possibile approssimare l'arco secondo la corda in metà della tolleranza specificata. Se la corda soddisfa questi criteri, l'arco circolare viene sostituito nei calcoli dalla corda. Se non soddisfa questi criteri, l'arco circolare viene mantenuto e l'algoritmo di approssimazione viene applicato ai segmenti rimanenti.
Esempi
A.Utilizzo di Riduce() per semplificare LineString
Nell'esempio seguente viene creata un'istanza LineString e viene utilizzato il metodo Reduce() per semplificarla.
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.Utilizzo di Riduce() con livelli di tolleranza diversi su CircularString
Nell'esempio seguente Reduce() viene utilizzato con tre livelli di tolleranza su un'istanza 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();
Nell'esempio viene prodotto l'output seguente:
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)
Ogni istanza restituita contiene i punti finali (0 0) e (24 0).
C.Utilizzo di Riduce() con livelli di tolleranza diversi su CompoundCurve
Nell'esempio seguente Reduce() viene utilizzato con due livelli di tolleranza su un'istanza 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();
In questo esempio si noti che la seconda istruzione SELECT restituisce l'istanza LineString: LineString(0 0, 16 0).
Visualizzazione di un esempio in cui i punti di inizio e fine originali vengono persi
Nell'esempio seguente viene illustrato come i punti di inizio e fine originali potrebbero non essere mantenuti dall'istanza risultante. Questa situazione si verifica perché mantenere i punti di inizio e fine originali comporterebbe un'istanza LineString non valida.
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;