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

Применение функции STSRid для пространственных данных в SQL Server
Раздел: Функции для работы с пространственными данными, Пространственные
STSrid: int

Функция STSRid в MS SQL Server

Функция STSRid применяется для работы с пространственными данными в SQL Server. Она позволяет получить или изменить идентификатор системы пространственных координат (SRID) для экземпляров geometry или geography.

Использование функции актуально при преобразовании данных между различными системами координат, проверке корректности пространственных объектов или подготовке данных для операций, требующих одинаковых SRID у всех участвующих объектов.

Синтаксис функции имеет два варианта:

1. Для получения текущего значения SRID: geometry_instance.STSRid() или geography_instance.STSRid().

2. Для установки нового значения SRID: geometry_instance.STSRid ( new_srid ) или geography_instance.STSRid ( new_srid ).

Аргумент new_srid должен быть целым числом (тип int). Для типа geometry допустимы любые числовые значения, однако SQL Server использует только значение SRID для сопоставления пространственных данных. Для типа geography SRID должен соответствовать одной из поддерживаемых систем координат, например 4326 для системы WGS 84.

Возвращаемое значение: при вызове без аргументов функция возвращает целое число — текущий SRID экземпляра. При вызове с аргументом возвращается новый экземпляр geometry или geography с измененным SRID. Исходный экземпляр не изменяется.

Примеры использования STSRid

Получение SRID из существующего объекта:

DECLARE @g geometry;
SET @g = geometry::STGeomFromText('POINT(10 20)', 4326);
SELECT @g.STSRid() AS CurrentSRID;
CurrentSRID
-----------
4326

Изменение SRID для объекта geometry:

DECLARE @g geometry;
SET @g = geometry::STGeomFromText('POINT(10 20)', 4326);
SELECT @g.STSRid(3857).ToString() AS ModifiedGeometry,
       @g.STSRid() AS OriginalSRID,
       @g.STSRid(3857).STSRid() AS NewSRID;
ModifiedGeometry      OriginalSRID NewSRID
--------------------- ------------ -------
POINT (10 20)         4326         3857

Проверка SRID для geography с системой координат WGS 84:

DECLARE @g geography;
SET @g = geography::Point(55.7558, 37.6176, 4326);
SELECT @g.STSRid() AS GeographySRID;
GeographySRID
-------------
4326

Похожие функции в MS SQL

В MS SQL Server для работы с пространственными данными существуют другие функции, которые могут быть полезны в различных сценариях.

Функция STSridProperty также позволяет получить SRID экземпляра. Она является синонимом для метода STSRid() без параметров. Выбор между ними зависит от стиля написания кода.

Методы STTransform и STAsText решают иные задачи. STTransform преобразует geometry между различными системами координат с изменением координат объекта. STAsText возвращает текстовое представление объекта без учета SRID.

Использование STSRid предпочтительно, когда требуется только изменить идентификатор системы координат без преобразования самих координат, например, для приведения объектов к единому SRID перед выполнением пространственных операций.

Типичные ошибки при работе с STSRid

Ошибка несовместимости SRID при пространственных операциях:

DECLARE @g1 geometry = geometry::STGeomFromText('POINT(10 20)', 4326);
DECLARE @g2 geometry = geometry::STGeomFromText('POINT(30 40)', 3857);
SELECT @g1.STDistance(@g2);
Msg 6522, Level 16, State 1, Line 4
A .NET Framework error occurred during execution of user-defined routine or aggregate 'geometry': 
System.ArgumentException: 24200: The spatial reference IDs (SRIDs) of the inputs do not match.

Попытка установить недопустимый SRID для geography:

DECLARE @g geography = geography::Point(55.7558, 37.6176, 4326);
SELECT @g.STSRid(9999);
Msg 6522, Level 16, State 1, Line 2
A .NET Framework error occurred during execution of user-defined routine or aggregate 'geography': 
System.ArgumentException: 24200: The specified SRID is not valid. It must match one of the supported SRIDs.

Использование функции с некорректным типом данных:

DECLARE @text varchar(100) = 'POINT(10 20)';
SELECT @text.STSRid();
Msg 2528, Level 16, State 1, Line 2
The data types varchar and geometry are incompatible in the 'STSrid' operator.

Изменения в последних версиях SQL Server

В SQL Server 2012 и более поздних версиях функция STSRid получила расширенную поддержку для типа geography. Были добавлены дополнительные проверки корректности SRID для географических данных.

Начиная с SQL Server 2016, улучшена интеграция пространственных функций с другими компонентами платформы, но синтаксис и основные возможности STSRid остались неизменными.

В актуальных версиях SQL Server функция демонстрирует стабильную работу как с geometry, так и с geography типами данных без существенных изменений в поведении.

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

Массовое обновление SRID для набора объектов:

Пример sql
CREATE TABLE #SpatialData (id int, geom geometry);
INSERT INTO #SpatialData VALUES 
(1, geometry::STGeomFromText('POINT(10 20)', 4326)),
(2, geometry::STGeomFromText('LINESTRING(0 0, 10 10)', 4326));

-- Изменение SRID для всех записей
UPDATE #SpatialData
SET geom = geom.STSRid(3857);

SELECT id, geom.STSRid() AS NewSRID, geom.ToString() AS Geometry
FROM #SpatialData;
id NewSRID Geometry
-- ------- --------------------
1  3857    POINT (10 20)
2  3857    LINESTRING (0 0, 10 10)

Использование в сочетании с проверкой типа пространственного объекта:

Пример sql
DECLARE @g geometry = geometry::STGeomFromText('POLYGON((0 0, 10 0, 10 10, 0 10, 0 0))', 4326);
SELECT 
    @g.STGeometryType() AS GeometryType,
    @g.STSRid() AS OriginalSRID,
    @g.STSRid(3857).STSRid() AS ModifiedSRID,
    @g.STArea() AS Area;
GeometryType OriginalSRID ModifiedSRID Area
------------ ------------ ------------ -----------
Polygon      4326         3857         100

Создание географии с конкретным SRID и преобразование:

Пример sql
DECLARE @geo geography;
SET @geo = geography::STGeomFromText('POINT(37.6176 55.7558)', 4326);

-- Проверка расстояния с преобразованием SRID (хотя для geography это обычно не требуется)
SELECT 
    @geo.STSRid() AS OriginalSRID,
    @geo.STDistance(geography::STGeomFromText('POINT(37.6176 55.7558)', 4326)) AS DistanceSameSRID,
    @geo.STSRid(4326).STDistance(geography::STGeomFromText('POINT(37.6176 55.7558)', 4326)) AS DistanceAfterChange;
OriginalSRID DistanceSameSRID DistanceAfterChange
------------ ---------------- -------------------
4326         0                0

Аналоги функции в других СУБД

В PostgreSQL с модулем PostGIS функция ST_SRID аналогична по функциональности. Она также позволяет получать и устанавливать SRID. Однако синтаксис установки нового SRID отличается.

-- Получение SRID в PostgreSQL
SELECT ST_SRID(ST_GeomFromText('POINT(10 20)', 4326));
st_srid
-------
4326
-- Установка SRID в PostgreSQL
SELECT ST_SetSRID(ST_GeomFromText('POINT(10 20)'), 3857);

В Oracle функция SDO_SRID используется для получения SRID, а для установки применяется процедура SDO_GEOM.SET_SRID.

В MySQL функция ST_SRID работает аналогично, но поддерживается только для типа geometry. В SQLite с расширением SpatiaLite также существует функция ST_SRID с похожим поведением.

Основное отличие MS SQL заключается в использовании метода объекта, в то время как в других СУБД это обычные скалярные функции.

MS SQL STSrid function comments

En
STSrid Returns the spatial reference identifier (SRID) of a geography instance