Основные сведения о типах пространственных данных

Применяется к:SQL ServerAzure SQL DatabaseAzure, управляемому экземпляру SQL Azure

Существует два типа пространственных данных. Тип данных geometry поддерживает планарные или эвклидовы данные (система координат для плоской Земли). Тип данных geometry соответствует спецификации Simple Features for SQL Открытого геопространственного консорциума (OGC) версии 1.1.0 и стандарту SQL MM (стандарт ISO). SQL Server также поддерживает тип данных географии, в котором хранятся данные многоточия (круглые земли), такие как широта GPS и координаты долготы.

Совет

Пространственные инструменты SQL Server — это спонсируемая корпорацией Майкрософт коллекция инструментов с открытым исходным кодом для использования с пространственными типами в SQL Server. Этот проект предоставляет набор повторно используемых функций, которые могут использовать приложения. Эти функции могут включать подпрограммы преобразования данных, новые преобразования, агрегаты и т. д. Дополнительные сведения см. в статье Microsoft/SQLServerSpatialTools в GitHub.

Объекты пространственных данных

Типы данных geometry и geography поддерживают 16 типов пространственных данных или типов экземпляров. Однако только 11 из этих типов экземпляров являются материализуемыми. Такие экземпляры можно создавать в базе данных и работать с ними. Эти экземпляры наследуют от родительских типов данных некоторые свойства.

На рисунке ниже изображена иерархия geometry, на которой основаны типы данных geometry и geography. Инстанциируемые типы geometry и geography выделены синим.

geom_hierarchy

Существует дополнительный экземплярный тип для типа данных geography: FullGlobe. Типы данных geometry и geography могут распознавать определенный экземпляр, если он имеет правильный формат, даже в том случае, если он не был определен явно. Например, если определить экземпляр Point явно с помощью метода STPointFromText(), то типы данных geometry и geography будут распознавать экземпляр как Point, если входные данные метода имели правильный формат. Если определить такой же экземпляр с помощью метода STGeomFromText() , то оба типа данных geometry и geography будут распознавать экземпляр как Point.

Подтипы для типов geometry и geography делятся на простые типы и типы-коллекции. Некоторые методы, например STNumCurves() , работают только с простыми типами.

Простые типы:

Типы коллекций:

Различия типов данных geometry и geography

Два этих типа пространственных данных часто демонстрируют одинаковое поведение. У них имеется ряд ключевых различий в способе хранения данных и управления ими.

Определение границ соединения

Определяющими данными для типов LineString и Polygon могут быть только вершины. Границей соединения между двумя вершинами в типе geometry является прямая линия. Однако границей соединения между двумя вершинами в типе geography является короткая большая эллиптическая кривая, проложенная между вершинами. Большой эллипс представляет собой пересечение эллипсоида с плоскостью, проходящей через его центр. Большая эллиптическая кривая представляет собой сегмент кривой на большом эллипсе.

Определение сегментов дуги

Сегменты дуги для типов geometry определяются на декартовой координатной плоскости XY (значения Z не учитываются). Сегменты дуги для типов geography определяются сегментами кривой на эталонной сфере. Любую параллель на эталонной сфере можно определить двумя взаимодополняющими дугами, где точки для обеих дуг имеют постоянный угол широты.

Измерения в пространственных типах данных

В планарной модели, или модели плоской Земли, измерение расстояний и площадей проводятся в таких же единицах измерения, в каких представляются координаты. При использовании типа данных geometry расстояние между точками (2, 2) и (5, 6) составляет пять единиц, независимо от используемых единиц.

В эллиптической модели, или модели круглой Земли, координаты указываются в градусах долготы и широты. Однако длины и площади обычно измеряются в метрах и квадратных метрах, хотя измерения могут зависеть от идентификатора пространственной ссылки экземпляра geography. Самой распространенной единицей измерения типа данных geography является метр.

Ориентация пространственных данных

В планарной системе ориентация кольца многоугольника является несущественным фактором. Простые функции OGC для спецификации SQL не диктуют порядок кругов, и SQL Server не применяет порядок кругов.

В эллиптической модели без указания ориентации многоугольник не определен или является неоднозначным. Например, описывает ли кольцо вокруг экватора северное или южное полушарие? При использовании типа данных geography для хранения пространственного экземпляра необходимо указать ориентацию кольца и точно описать расположение экземпляра.

Внутренняя часть многоугольника в эллиптической системе определяется по правилу левой руки: если двигаться вдоль географического прямоугольника, следуя по точкам в том порядке, в котором они указаны, область слева будет считаться внутренней частью, а область справа — внешней.

Если уровень совместимости равен 100 или ниже в SQL Server, то тип данных geography имеет следующие ограничения:

  • Любой экземпляр geography должен лежать в пределах одного полушария. Не допускается сохранение пространственных объектов больше размера полушария.

  • Любой экземпляр geography в представлении консорциума OGC Well-Known Text (WKT) или Well-Known Binary (WKB), порождающий объект больше полушария, приводит к возникновению исключения ArgumentException.

  • Методы типа данных geography , требующие указания двух экземпляров geography , такие как STIntersection(), STUnion(), STDifference() и STSymDifference(), возвратят NULL, если результаты методов не умещаются в одном полушарии. Метод STBuffer() также возвращает значение NULL, если выходные данные выходят за пределы одного полушария.

В SQL Server FullGlobe — это особый тип Многоугольника, охватывающего весь земной шар. Этот объект имеет площадь, но не имеет границ и вершин.

Внешнее и внутреннее кольца для типа данных geography

Простые функции OGC для спецификации SQL обсуждают внешние кольца и внутренние кольца, но это различие имеет мало смысла для типа данных географических данных SQL Server. Любое кольцо многоугольника можно использовать для внешнего кольца.

Дополнительные сведения о спецификациях консорциума OGC см. в одном из следующих документов:

Сегменты дуги

Три типа, допускающих создание экземпляров, могут принимать сегменты дуги: CircularString, CompoundCurveи CurvePolygon. Сегмент дуги определяется тремя точками на двумерной плоскости, при этом третья точка не может совпадать с первой. Несколько примеров сегментов дуги:

circular_arc_segments

Первые два примера показывают типичные сегменты дуги. Обратите внимание, что каждая из трех точек лежит на периметре круга.

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

Методы, работающие на типах сегментов круговой дуги, используют сегменты прямой линии для приближения круговой дуги. Количество сегментов линии, используемых для приближения дуги, будет зависеть от длины и кривизны дуги. Значения Z можно хранить для каждого типа сегментов круговой дуги, но не будут использоваться в вычислениях.

Заметка

Если для сегментов дуги даются значения Z, они должны совпадать для всех точек сегмента дуги. Только в этом случае они могут быть приняты в качестве ввода. Например: CIRCULARSTRING(0 0 1, 2 2 1, 4 0 1) принимается, но CIRCULARSTRING(0 0 1, 2 2 2, 4 0 1) не принимается.

Сравнение типов LineString и CircularString

В следующем примере показано, как сохранить одинаковые равнобедренные треугольники с помощью экземпляра LineString и экземпляра CircularString:

DECLARE @g1 geometry;
DECLARE @g2 geometry;
SET @g1 = geometry::STGeomFromText('LINESTRING(1 1, 5 1, 3 5, 1 1)', 0);
SET @g2 = geometry::STGeomFromText('CIRCULARSTRING(1 1, 3 1, 5 1, 4 3, 3 5, 2 3, 1 1)', 0);
IF @g1.STIsValid() = 1 AND @g2.STIsValid() = 1
  BEGIN
      SELECT @g1.ToString(), @g2.ToString()
      SELECT @g1.STLength() AS [LS Length], @g2.STLength() AS [CS Length]
  END

Обратите внимание, что экземпляру CircularString требуется семь точек для определения треугольника. Экземпляру LineString для этого достаточно всего четырех точек. Причиной этого является то, что экземпляр CircularString хранит сегменты дуги, а не сегменты линии. Сторонами треугольника, хранящегося в экземпляре CircularString, являются ABC, CDE и EFA. Сторонами треугольника, хранящегося в экземпляре LineString, являются AC, CE и EA.

Рассмотрим следующий пример:

SET @g1 = geometry::STGeomFromText('LINESTRING(0 0, 2 2, 4 0)', 0);
SET @g2 = geometry::STGeomFromText('CIRCULARSTRING(0 0, 2 2, 4 0)', 0);
SELECT @g1.STLength() AS [LS Length], @g2.STLength() AS [CS Length];

Результирующий набор:

LS Length    CS Length
5.65685...   6.28318...

Экземпляры CircularString используют меньшее число точек для хранения границ кривой и обеспечивают большую точность, чем экземпляры LineString. Экземпляры CircularString удобны для хранения круговых границ, например область поиска радиусом в 20 миль от указанной точки. ОбъектыLineString хорошо подходят для хранения линейных границ, например городского квартала.

Сравнение типов LineString и CompoundCurve

В следующем примере кода показано, как одна и та же фигура сохраняется с помощью экземпляров LineString и CompoundCurve :

SET @g = geometry::Parse('LINESTRING(2 2, 4 2, 4 4, 2 4, 2 2)');
SET @g = geometry::Parse('COMPOUNDCURVE((2 2, 4 2), (4 2, 4 4), (4 4, 2 4), (2 4, 2 2))');
SET @g = geometry::Parse('COMPOUNDCURVE((2 2, 4 2, 4 4, 2 4, 2 2))');

В этих примерах фигура может храниться как экземпляр LineString или как экземпляр CompoundCurve . В следующем примере тип CompoundCurve используется для хранения среза круговой диаграммы:

SET @g = geometry::Parse('COMPOUNDCURVE(CIRCULARSTRING(2 2, 1 3, 0 2),(0 2, 1 0, 2 2))');  

Экземпляр CompoundCurve может хранить сегмент дуги (2 2, 1 3, 0 2) непосредственно, в то время как экземпляру LineString пришлось бы преобразовать кривую в несколько сегментов линии меньшего размера.

Сравнение типов CircularString и CompoundCurve

В следующем примере кода показано, как можно сохранить срезы круговой диаграммы в экземпляре CircularString :

DECLARE @g geometry;
SET @g = geometry::Parse('CIRCULARSTRING( 0 0, 1 2.1082, 3 6.3246, 0 7, -3 6.3246, -1 2.1082, 0 0)');
SELECT @g.ToString(), @g.STLength();

Для хранения среза круговой диаграммы с помощью экземпляра CircularString требуется три точки для каждого сегмента линии. Если промежуточная точка неизвестна, необходимо либо вычислить ее, либо сдублировать конечную точку сегмента линии, как показано в следующем фрагменте кода:

SET @g = geometry::Parse('CIRCULARSTRING( 0 0, 3 6.3246, 3 6.3246, 0 7, -3 6.3246, 0 0, 0 0)');

ЭкземплярыCompoundCurve позволяют использовать компоненты LineString и CircularString , поэтому необходимо знать только две точки сегментов линии среза круговой диаграммы. В этом примере кода показано, как использовать тип CompoundCurve для хранения той же фигуры:

DECLARE @g geometry;
SET @g = geometry::Parse('COMPOUNDCURVE(CIRCULARSTRING( 3 6.3246, 0 7, -3 6.3246), (-3 6.3246, 0 0, 3 6.3246))');
SELECT @g.ToString(), @g.STLength();

Сравнение типов Polygon и CurvePolygon

ЭкземплярыCurvePolygon могут использовать экземпляры CircularString и CompoundCurve instances when defining their exterior и interior rings. Экземпляры многоугольников этого делать не могут.

См. также