STSrid: примеры (SQL)
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 для набора объектов:
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)
Использование в сочетании с проверкой типа пространственного объекта:
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 и преобразование:
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 заключается в использовании метода объекта, в то время как в других СУБД это обычные скалярные функции.