Reduce (tipo de dados geometry)
Retorna uma aproximação de determinada instância de geometry produzida pela execução de uma extensão do algoritmo Douglas-Peucker na instância com a tolerância especificada.
Sintaxe
.Reduce ( tolerance )
Argumentos
- tolerance
É um valor do tipo float. tolerance é a tolerância a ser inserida para o algoritmo de aproximação.
Tipos de retorno
SQL Server tipo de retorno: geometry
Tipo de retorno CLR: SqlGeometry
Comentários
Para tipos de coleção, esse algoritmo funciona independentemente em cada geometry contido na instância.
Esse algoritmo não modifica instâncias de Point.
Em instâncias de LineString, CircularString e CompoundCurve, o algoritmo de aproximação retém os pontos de início e de término da instância e adiciona de volta, iterativamente, o ponto da instância original que mais se desvia do resultado, até que nenhum ponto se desvie mais do que a tolerância especificada.
Reduce() retorna uma instância de LineString, CircularString ou CompoundCurve para instâncias de CircularString. Reduce() retorna uma instância de CompoundCurve ou LineString para instâncias CompoundCurve.
Em instâncias de Polygon, o algoritmo de aproximação é aplicado independentemente a cada anel. O método produzirá uma FormatException se a instância de Polygon retornada não for válida. Por exemplo, uma instância inválida de MultiPolygon será criada se Reduce() for aplicado para simplificar cada anel na instância e os anéis resultantes se sobrepuserem. Em instâncias de CurvePolygon com um anel exterior e nenhum anel interior, Reduce() retorna uma instância de CurvePolygon, LineString ou de Point. Se o CurvePolygon tiver anéis interiores, uma instância de CurvePolygon ou de MultiPoint será retornada.
Quando um segmento de arco circular é encontrado, o algoritmo de aproximação verifica se o arco pode ser aproximado por sua corda dentro de metade da tolerância dada. Se a corda conhecer estes critérios, o arco circular será substituído nos cálculos pela corda. Caso contrário, o arco circular será retido e o algoritmo de aproximação será aplicado aos segmentos restantes.
Exemplos
A.Usando Reduce() para simplificar um LineString
O exemplo a seguir cria uma instância de LineString e usa Reduce() para simplificar a instância.
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.Usando Reduce() com níveis de tolerância variados em um CircularString
O exemplo a seguir usa Reduce() com três níveis de tolerância em uma instância de 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();
Esse exemplo gera a saída a seguir:
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)
Cada uma das instâncias retornadas contém os pontos de extremidade (0 0) e (24 0).
C.Usando Reduce() com níveis de tolerância variados em um CompoundCurve
O exemplo a seguir usa Reduce() com dois níveis de tolerância em uma instância de 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();
Neste aviso de exemplo, observe que a segunda instrução SELECT retorna a instância de LineString: LineString(0 0, 16 0).
Mostrando um exemplo onde os pontos originais de início e de término são perdidos
O exemplo a seguir mostra como os pontos originais de início e de término talvez não sejam retidos pela instância resultante. Isso ocorre porque a retenção dos pontos originais de início e de término resultariam em uma instância inválida de LineString.
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;