Reduce (тип данных geometry)
Область применения: SQL Server
База данных SQL Azure
Управляемый экземпляр SQL Azure
базе данных SQL в Microsoft Fabric
Возвращает аппроксимацию для указанного экземпляра geometry. Она вычисляется при помощи расширенного алгоритма Дугласа-Пекера с заданным допуском.
Синтаксис
.Reduce ( tolerance )
Аргументы
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).
В. Использование функции 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;