Reduce (тип данных geometry)
Возвращает приближенное значение для указанного экземпляра 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();
Б.Использование функции 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;