Новые типы данных в SQL Server 2008 - Различия между geography и geometry

ОГЛАВЛЕНИЕ

Различия между geography и geometry

Типы данных geography и geometry созданы для работы с различными видами данных, поэтому следует знать о некоторых ключевые отличиях между ними. В типе данных geometry, расстояния и площади задаются в тех же единицах измерения, что и координаты объектов. Например, расстояние между точками (0,0) и (6,8) всегда будет 10 единиц. В типа geography иначе, он использует эллиптические координаты, выражающиеся в градусах широты и долготы.

Если координаты выражены парами широты и долготы, тип данных GEOMETRY возвращает некорректные результаты. Следующий код T-SQL расчитывает расстояние между POINTS (точками) (90 0) и (90 180). Обе они находятся на северном полюсе, поэтмоу расстояние должно быть равным 0. В случае GEOMETRY расчетное расстояние оказывается 180.

DECLARE @g1 GEOMETRY, @g2 GEOMETRY, @g3 GEOGRAPHY, @g4 GEOGRAPHY
SELECT @g1 = GEOMETRY::STGeomFromText('POINT (90 0)', 0)
SELECT @g2 = GEOMETRY::STGeomFromText('POINT (90 180)', 0)

SELECT @g3 = GEOGRAPHY::STGeomFromText('POINT (90 0)', 4326)
SELECT @g4 = GEOGRAPHY::STGeomFromText('POINT (90 180)', 4326)
SELECT @g2.STDistance(@g1) AS 'GEOMETRY',
       @g4.STDistance(@g3) AS 'GEOGRAPHY';

--Results
--GEOMETRY               GEOGRAPHY
------------------------ ----------------------
--180                    0
Ориентация пространственных данных для этих типов данных тоже различается. В планарной системе, используемой типом данных geometry, ориентация многоугольника не является важным фактором. Например, многоугольник с координатами ((0, 0), (10, 0), (0, 20), (0, 0)) – то же самое, что и многоугольник ((0, 0), (0, 20), (10, 0), (0, 0)). Напротив, тип данных geography использует модель, в которой необходимо определять ориентацию многоугольника. Возьмем, например, кольцо вдоль экватора. Относится ли многоугольник, описываемый этим кольцом, к северному или южному полушарию? Это значит, что при работе с данными geography, ориентация и расположение должны описываться точно.

Есть и дополнительные ограничения, накладываемые SQL Server 2008 на тип данных geography. Например, каждый элемент должен попадать в одно полушарие. Большие пространственные объекты недопустимы и вызовут ArgumentException. Типы данных geography, требующие двух вводов, возвращают NULL, если результаты методов не попадают в одно полушарие.

В SQL Server есть несколько методов, позволяющих выполнять операции с объектами geography и geometry. На рис. 13 показаны некоторые примеры использования методов работы с пространственными данными в SQL Server 2008. Я не могу в ограниченном объеме статьи рассказать об этом подробнее, но вы сможете найти полные описания в SQL Server Books Online.

Рис. 13 Working with spatial data

DECLARE @gm geometry;
DECLARE @gg geography;
DECLARE @h geography;

SET @gm = geometry::STGeomFromText('POLYGON((0 0, 13 0, 3 3, 0 13, 0 0),(2 2, 2 1, 1 1, 1 2, 2 2))', 0);
SELECT @gm.STArea();

--Results
--38

SET @gg = geography::STGeomFromText('LINESTRING(0 0, 5 5)', 4326);
--Calculate the distance to a point slightly offset from the LINESTRING.
SET @h = geography::STGeomFromText('POINT(4 4)', 4326);
SELECT @gg.STDistance(@h);

--Results
-- 430.182777043046

--Calculate the distance to a point on the LINESTRING.
SET @h = geography::STGeomFromText('POINT(5 5)', 4326);
SELECT @gg.STDistance(@h);

--Results
-- 0

DECLARE @temp table ([name] varchar(10), [geom] geography);

INSERT INTO @temp values ('Point', geography::STGeomFromText('POINT(
5 10)', 4326));
INSERT INTO @temp values ('LineString', geography::STGeomFromText(
'LINESTRING(13 5, 50 25)', 4326));
--Calculate the distance to a point on the LINESTRING.
--Display the number of dimensions for a geography object stored in a --table variable.
INSERT INTO @temp values ('Polygon', geography::STGeomFromText(
'POLYGON((47.653 -122.358, 47.649 -122.348, 47.658 -122.348, 47.658 -122.358, 47.653 -122.358))', 4326));

SELECT [name], [geom].STDimension() as [dim]
FROM @temp;

--Results
--name       dim
------------ -----------
--Point      0
--LineString 1
--Polygon    2
Надеюсь, что эта информация о семи новых типах данных в SQL Server 2008 принесла пользу.
Автор: Kelly Wilson
Иcточник: TechNet Magazine
Опубликована - 15.04.2008