STGeomFromText: примеры (SQL)
STGeomFromText('wkt', srid): geometryБазовая информация о STGeomFromText
Функция STGeomFromText в Microsoft SQL Server используется для создания экземпляра данных типа geometry из их текстового представления в формате WKT (Well-Known Text). Эта функция является ключевой при работе с пространственными данными, когда информация поступает из внешних источников, таких как текстовые файлы, JSON или ввод пользователя.
Синтаксис функции: STGeomFromText ( 'geometry_tagged_text' , SRID )
- geometry_tagged_text (обязательный): Входной параметр типа
nvarchar(max), содержащий представление возвращаемого экземпляра geometry в формате WKT. - SRID (необязательный): Параметр типа
int, представляющий идентификатор пространственной ссылки (Spatial Reference ID) создаваемого экземпляра geometry. Если параметр не указан, используется значение по умолчанию, равное 0.
Возвращаемым значением является экземпляр типа geometry. Функция способна создавать объекты любых поддерживаемых типов: Point, LineString, Polygon, MultiPoint, MultiLineString, MultiPolygon, GeometryCollection.
Простые примеры использования
Создание точечного объекта (Point) с SRID по умолчанию (0).
SELECT STGeomFromText('POINT(10 20)') AS GeoResult;0x00000000010C0000000000000024400000000000003440
Создание линии (LineString) с указанием SRID.
SELECT STGeomFromText('LINESTRING(0 0, 10 10, 20 25)', 4326).ToString() AS WKT, STGeomFromText('LINESTRING(0 0, 10 10, 20 25)', 4326).STSrid AS SRID;WKT: LINESTRING (0 0, 10 10, 20 25) SRID: 4326
Создание полигона (Polygon).
SELECT STGeomFromText('POLYGON((0 0, 10 0, 10 10, 0 10, 0 0))').STArea() AS Area;Area: 100
Альтернативные функции в MS SQL
GEOMETRY::Parse: Функция, аналогичная STGeomFromText с SRID=0. Принимает только текстовый аргумент WKT. Используется для простых случаев, когда не требуется указывать систему координат. SELECT GEOMETRY::Parse('POINT(5 7)');
GEOMETRY::Point и другие статические методы: Позволяют создавать объекты geometry напрямую из числовых координат, минуя этап формирования строки WKT. Это повышает производительность и читаемость кода. SELECT GEOMETRY::Point(10, 20, 4326); — эквивалентно STGeomFromText('POINT(10 20)', 4326).
STPointFromText: Специализированная функция для создания именно точечных объектов. Требует меньше проверок, чем универсальная STGeomFromText, и может быть предпочтительнее для работы только с точками.
Функции в других СУБД и языках
PostgreSQL/PostGIS: Функция ST_GeomFromText(text WKT, integer srid). Работает аналогично. Пример: SELECT ST_GeomFromText('POINT(30 10)', 4326);
MySQL: ST_GeomFromText(wkt[, srid]) и синоним ST_GeometryFromText(). С версии 8.0 поддерживает необязательный SRID. SELECT ST_AsText(ST_GeomFromText('LINESTRING(0 0,1 1)'));
Oracle: SDO_GEOMETRY(wkt CLOB, srid NUMBER) — конструктор объекта, а не функция. Пример: SDO_GEOMETRY('POINT(50 100)', 8307);
SQLite с расширением SpatiaLite: GeomFromText(wkt Geometry, [SRID]). Пример: SELECT GeomFromText('POLYGON((0 0, 1 0, 1 1, 0 1, 0 0))');
Типичные ошибки
Некорректный формат WKT: Строка не соответствует стандарту.
SELECT STGeomFromText('POINT(10,20)'); -- Запятая вместо пробелаMsg 6522, Level 16, State 1: .NET Framework error: Microsoft.SqlServer.Types.GLArgumentException: 24142.
Незамкнутый полигон: Первая и последняя точка полигона не совпадают.
SELECT STGeomFromText('POLYGON((0 0, 10 0, 10 10, 0 10))');Msg 6522, Level 16: ... 24141: Заданный входной текст для типа geometry не является действительным.
Несовместимость SRID при операциях: Попытка сравнить или связать объекты с разными SRID.
DECLARE @g1 geometry = STGeomFromText('POINT(0 0)', 4326);
DECLARE @g2 geometry = STGeomFromText('POINT(1 1)', 3857);
SELECT @g1.STEquals(@g2);Msg 6522, Level 16: ... 24205: ... Different SRIDs.
Изменения в версиях
В SQL Server 2012 и более поздних версиях функция STGeomFromText была расширена для полной поддержки стандарта OGC Simple Features for SQL. Существенных изменений в синтаксисе или поведении функции в последних основных версиях SQL Server (2016, 2017, 2019, 2022) не зафиксировано. Повышение производительности и стабильности работы происходит в рамках общих улучшений пространственного модуля.
Расширенные примеры применения
Создание составной геометрии (GeometryCollection).
DECLARE @col geometry = STGeomFromText('GEOMETRYCOLLECTION(POINT(1 2), LINESTRING(3 4, 5 6, 7 8))', 4326);
SELECT @col.STNumGeometries() AS Count, @col.STGeometryN(2).ToString() AS SecondElement;Count: 2 SecondElement: LINESTRING (3 4, 5 6, 7 8)
Использование в INSERT для загрузки данных из внешнего источника.
CREATE TABLE #Buildings (Id INT, Geom geometry);
INSERT INTO #Buildings VALUES
(1, STGeomFromText('POLYGON((0 0, 100 0, 100 100, 0 100, 0 0))', 4326)),
(2, STGeomFromText('POLYGON((150 0, 200 0, 200 50, 150 50, 150 0))', 4326));
SELECT Id, Geom.STArea() AS Area FROM #Buildings;Id Area 1 10000 2 2500
Динамическое построение геометрии на основе вычислений.
DECLARE @Radius FLOAT = 5;
DECLARE @CenterX FLOAT = 10;
DECLARE @CenterY FLOAT = 20;
DECLARE @CircleWKT NVARCHAR(MAX);
SET @CircleWKT = 'POLYGON((';
WITH Nums AS (SELECT 0 AS n UNION ALL SELECT n+1 FROM Nums WHERE n < 32)
SELECT @CircleWKT += CAST(@CenterX + @Radius * COS(2*PI()*n/32) AS NVARCHAR) + ' ' +
CAST(@CenterY + @Radius * SIN(2*PI()*n/32) AS NVARCHAR) + CASE WHEN n<32 THEN ',' ELSE '))' END
FROM Nums;
SELECT STGeomFromText(@CircleWKT, 4326) AS ApproxCircle;0x000000000104... (бинарное представление полигона, аппроксимирующего круг)