STArea: примеры (SQL)
STArea: floatОписание функции STArea
Функция STArea() в Microsoft SQL Server возвращает общую площадь поверхности геометрического объекта типа geometry или geography. Ее используют в запросах, где требуется вычислить размер территории, представленной пространственным объектом. Чаще всего функцию применяют для анализа данных в геоинформационных системах, планировании землепользования или кадастровом учете.
Функция не принимает аргументов. Она вызывается как метод экземпляра объекта geometry или geography. Синтаксис: geometry_instance.STArea() или geography_instance.STArea().
Возвращаемое значение имеет тип float. Для объектов geometry площадь измеряется в квадратных единицах, заданных системой координат (SRID). Для geography площадь возвращается в квадратных метрах. Если экземпляр является пустой коллекцией, точкой, линией или кривой, функция возвращает 0. Для недопустимых объектов возвращается NULL.
Краткие примеры использования
Пример расчета площади для полигона в типе geometry.
DECLARE @g geometry;
SET @g = geometry::STGeomFromText('POLYGON((0 0, 4 0, 4 4, 0 4, 0 0))', 0);
SELECT @g.STArea() AS Площадь;Площадь 16
Пример с географическим объектом. Площадь в квадратных метрах.
DECLARE @g geography;
SET @g = geography::STGeomFromText('POLYGON((10 50, 12 50, 12 52, 10 52, 10 50))', 4326);
SELECT @g.STArea() AS Площадь_КвМетры;Площадь_КвМетры 49550290361.8841
Пример с составным полигоном (с отверстием).
DECLARE @g geometry =
geometry::STGeomFromText('POLYGON((0 0, 8 0, 8 8, 0 8, 0 0), (2 2, 2 4, 4 4, 4 2, 2 2))', 0);
SELECT @g.STArea() AS Площадь_С_Отверстием;Площадь_С_Отверстием 60
Похожие функции в MS SQL
STLength() вычисляет длину линейного объекта или периметр. STPerimeter() возвращает длину внешней границы полигонального объекта. STNumPoints() подсчитывает количество точек в геометрическом объекте.
Функцию STArea() используют, когда нужна площадь поверхности. STPerimeter() применяют для определения длины границы полигона. Выбор зависит от задачи: площадь для размера территории, периметр для длины ограждения.
Альтернативы в других СУБД
PostgreSQL/PostGIS: Функция ST_Area(geometry). Для geography возвращает площадь в квадратных метрах.
SELECT ST_Area(ST_GeomFromText('POLYGON((0 0, 4 0, 4 4, 0 4, 0 0))'));16
Oracle Spatial: Метод SDO_GEOM.SDO_AREA или функция ST_Area для объектов SDO_GEOMETRY. Требует указания единиц измерения.
SELECT SDO_GEOM.SDO_AREA(SDO_GEOMETRY('POLYGON((0 0, 4 0, 4 4, 0 4, 0 0))'), 0.005) FROM DUAL;16
MySQL: Функция ST_Area() для пространственных объектов. Результат зависит от SRID.
SELECT ST_Area(ST_GeomFromText('POLYGON((0 0, 4 0, 4 4, 0 4, 0 0))'));16
SQLite с расширением SpatiaLite имеет функцию Area(geometry).
Основное отличие MS SQL - единый метод для типов geometry и geography, с автоматическим преобразованием единиц для географического типа.
Типичные ошибки
Ошибка при вызове для недопустимого объекта.
DECLARE @g geometry;
SET @g = geometry::STGeomFromText('LINESTRING(0 0, 1 1)', 0);
SELECT @g.STArea() AS Площадь_Линии;Площадь_Линии 0
Для линии возвращается 0, а не ошибка. Недопустимый объект, например, самопересекающийся полигон без установки валидности, может вернуть NULL или некорректный результат.
Игнорирование единиц измерения для типа geography. Результат всегда в квадратных метрах, что иногда забывают.
DECLARE @g geography = geography::Point(50, 10, 4326).STBuffer(1000);
SELECT @g.STArea() / 1000000 AS Площадь_КвКм;Площадь_КвКм 3.138408
Изменения в последних версиях
Существенных изменений в поведении функции STArea() в последних версиях MS SQL Server не было. С выходом SQL Server 2012 улучшена точность вычислений для типа geography на эллипсоидальных моделях. Рекомендуется использовать актуальные накопительные обновления для исправления потенциальных ошибок в пространственных расчетах.
Расширенные примеры
Вычисление общей площади для нескольких полигонов, хранящихся в таблице.
CREATE TABLE #Участки (id INT, geom geometry);
INSERT INTO #Участки VALUES
(1, geometry::STGeomFromText('POLYGON((0 0, 5 0, 5 5, 0 5, 0 0))', 0)),
(2, geometry::STGeomFromText('POLYGON((10 10, 15 10, 15 15, 10 15, 10 10))', 0));
SELECT SUM(geom.STArea()) AS Общая_Площадь FROM #Участки;
DROP TABLE #Участки;Общая_Площадь 50
Сравнение площади объекта до и после буферизации.
DECLARE @g geometry = geometry::Point(0, 0, 0).STBuffer(10);
SELECT @g.STArea() AS Площадь_Буфера,
geometry::Point(0, 0, 0).STArea() AS Площадь_Точки;Площадь_Буфера Площадь_Точки 313.997077718982 0
Использование в условиях WHERE для фильтрации объектов по размеру.
DECLARE @g1 geometry = geometry::STGeomFromText('POLYGON((0 0, 3 0, 3 3, 0 3, 0 0))', 0);
DECLARE @g2 geometry = geometry::STGeomFromText('POLYGON((0 0, 10 0, 10 10, 0 10, 0 0))', 0);
SELECT CASE WHEN @g1.STArea() > @g2.STArea() THEN 'Первый больше'
ELSE 'Второй больше или равен' END AS Сравнение;Сравнение Второй больше или равен
Расчет площади для объектов типа GeometryCollection.
DECLARE @g geometry =
geometry::STGeomFromText('GEOMETRYCOLLECTION(POLYGON((0 0, 2 0, 2 2, 0 2, 0 0)), POLYGON((4 4, 6 4, 6 6, 4 6, 4 4)))', 0);
SELECT @g.STArea() AS Площадь_Коллекции;Площадь_Коллекции 8