STArea: примеры (SQL)

Использование STArea для определения площади в SQL Server
Раздел: Геопространственные функции, Пространственные
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 на эллипсоидальных моделях. Рекомендуется использовать актуальные накопительные обновления для исправления потенциальных ошибок в пространственных расчетах.

Расширенные примеры

Вычисление общей площади для нескольких полигонов, хранящихся в таблице.

Пример sql
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

Сравнение площади объекта до и после буферизации.

Пример sql
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 для фильтрации объектов по размеру.

Пример sql
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.

Пример sql
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

MS SQL STArea function comments

En
STArea Returns the total surface area of a geography instance