Reduce (тип данных geometry)

Применимо к:SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure

Возвращает аппроксимацию для указанного экземпляра geometry. Она вычисляется при помощи расширенного алгоритма Дугласа-Пекера с заданным допуском.

Синтаксис

  
.Reduce ( tolerance )  

Примечание.

Сведения о синтаксисе Transact-SQL для SQL Server 2014 (12.x) и более ранних версиях см . в документации по предыдущим версиям.

Аргументы

tolerance
Значение типа float. Аргумент tolerance представляет собой допуск, который должен быть введен в алгоритм приближения.

Типы возвращаемых данных

Тип возвращаемых данных SQL Server: geometry

Тип возвращаемых данных CLR: SqlGeometry

Замечания

Для типов коллекции этот алгоритм работает независимо для каждого экземпляра geometry, содержащегося в экземпляре.

Этот алгоритм не изменяет экземпляры Point.

Для экземпляров LineString, CircularString и CompoundCurve алгоритм аппроксимации сохраняет исходные начальную и конечную точки экземпляра. Затем алгоритм итеративно добавляет точки из изначальной кривой, наиболее далеко отстоящие от текущего аппроксимированного результата. Этот процесс продолжается до точки, отклонение которой меньше заданного допуска.

Reduce() возвращает экземпляр LineString, CircularString или CompoundCurve для экземпляров CircularString. Reduce() возвращает экземпляр CompoundCurve или LineString для экземпляров CompoundCurve.

Для экземпляров Polygon алгоритм приближения применяется независимо к каждому кольцу. Этот метод вызывает исключение FormatException, если возвращаемый экземпляр Polygon недопустим. Например, недопустимый экземпляр MultiPolygon создается, если метод Reduce() применяется для упрощения всех кругов в экземпляре и результирующие круги перекрываются. Для экземпляров CurvePolygon с внешним кругом и без внутренних Reduce() возвращает экземпляр CurvePolygon, LineString или Point. Если экземпляр CurvePolygon имеет внутренние кольца, возвращается экземпляр CurvePolygon или MultiPoint.

При обнаружении сегмента дуги алгоритм проверяет, можно ли выполнить аппроксимацию дуги ее хордой в пределах половины заданного допуска. В хордах, соответствующих этому критерию, дуга в расчетах заменяется хордой. Если хорда не соответствует этому критерию, дуга сохраняется, а алгоритм применяется к оставшимся сегментам.

Примеры

А. Использование функции Reduce() для упрощения экземпляра LineString

В следующем примере создается экземпляр LineString и используется метод Reduce() для упрощения этого экземпляра.

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. Использование функции Reduce() с разными уровнями допуска для экземпляра CircularString

В приведенном ниже примере используется функция Reduce() с тремя уровнями допуска для экземпляра 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();

В примере получается следующий вывод.

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)

Каждый из возвращенных экземпляров содержит конечные точки (0 0) и (24 0).

C. Использование функции Reduce() с разными уровнями допуска для экземпляра CompoundCurve

В приведенном ниже примере используется функция Reduce() с двумя уровнями допуска для экземпляра 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();

В этом примере обратите внимание, что вторая инструкция SELECT возвращает экземпляр LineString: LineString(0 0, 16 0).

Демонстрация примера, в котором исходные начальная и конечная точки потеряны.

В следующем примере показано, как исходные начальная и конечная точки могут не сохраняться в результирующем экземпляре. Это происходит из-за того, что сохранение исходных начальной и конечной точек может сделать получившийся экземпляр 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;  

См. также

Расширенные статические геометрические методы