Sdílet prostřednictvím


Redukce (datový typ geometrie)

platí pro:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceSQL databáze v Microsoft Fabric

Vrátí aproximaci dané instance geometrie . Aproximace je vytvořena spuštěním rozšíření algoritmu Douglas-Peucker v instanci s danou tolerance.

Syntax

  
.Reduce ( tolerance )  

Arguments

tolerance
Je hodnota typu float. tolerance je tolerance vstupu pro algoritmus aproximace.

Návratové typy

Návratový typ SQL Serveru: geometrie

Návratový typ CLR: SqlGeometry

Remarks

U typů kolekcí tento algoritmus pracuje nezávisle na každé geometrii obsažené v instanci.

Tento algoritmus neupravuje instance bodů .

V instancích LineString, CircularString a CompoundCurve uchovává algoritmus aproximace původní počáteční a koncové body instance. Algoritmus dále iterativním způsobem přidá zpět bod z původní instance, která se nejvíce liší od výsledku. Tento proces pokračuje, dokud nedojde k tomu, že se odchýlí více než daná tolerance.

Reduce() vrátí instanci LineString, CircularString nebo CompoundCurve pro instance CircularString . Reduce() vrátí instanci CompoundCurve nebo LineString pro instance CompoundCurve .

U instancí Mnohoúhelníku se algoritmus aproximace použije nezávisle na každém okruhu. Metoda vytvoříFormatException, pokud vrácená instance Polygonu není platná. Pokud se například použije neplatná instance Reduce(), která se použije ke zjednodušení každého okruhu v instanci a výsledných okruhů se překrývají. U instancí CurvePolygon s vnějším kroužkem a bez vnitřních kroužků Reduce() vrátí Instance CurvePolygon, LineString nebo Point . Pokud má KřivkaPolygon vnitřní kroužky , vrátí se instance CurvePolygon nebo MultiPoint .

Když se najde kruhový obloukový segment, algoritmus aproximace zkontroluje, zda může být oblouk přibližný pomocí jeho akordu v rámci poloviny dané tolerance. Akordy, které splňují tato kritéria, mají kruhový oblouk nahrazen ve výpočtech chordem. Pokud chord nesplňuje tato kritéria, je kruhový oblouk zachován a algoritmus aproximace se použije u zbývajících segmentů.

Examples

A. Zjednodušení řetězce LineString pomocí funkce Reduce()

Následující příklad vytvoří LineString instanci a používá Reduce() k zjednodušení 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. Použití funkce Reduce() s různými úrovněmi tolerance u kruhového řetězce

Následující příklad používá Reduce() se třemi úrovněmi tolerance u 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();

Tento příklad vytvoří následující výstup:

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)

Každá vrácená instance obsahuje koncové body (0 0) a (24 0).

C. Použití funkce Reduce() s různými úrovněmi tolerance u compoundCurve

Následující příklad používá Reduce() se dvěma úrovněmi tolerance u 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();

V tomto příkladu si všimněte, že druhý příkaz SELECT vrátí linestring instance: LineString(0 0, 16 0).

Zobrazení příkladu ztráty původních počátečních a koncových bodů

Následující příklad ukazuje, jak původní počáteční a koncové body nemusí být zachovány výslednou instancí. K tomuto chování dochází, protože zachování původní počáteční a koncové body by vedlo k neplatné instanci 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;  

Viz také

Rozšířené metody statické geometrie