Основные сведения о типах пространственных данных
Область применения: SQL Server
База данных SQL Azure Управляемый экземпляр SQL Azure
конечную точку аналитики SQL в хранилище Microsoft Fabric в базе данных SQL Microsoft Fabric
в Microsoft Fabric
Существует два типа пространственных данных. Тип данных 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 и geography выделены синим.
Существует дополнительный экземплярный тип для типа данных geography : FullGlobe. Типы данных geometry и geography могут распознавать определенный экземпляр, если он имеет правильный формат, даже в том случае, если он не был определен явно. Например, если вы определяете экземпляр Point явным образом с помощью STPointFromText()
метода, геометрии и географии распознает экземпляр как точку, если входные данные метода хорошо сформированы. Если определить такой же экземпляр с помощью метода STGeomFromText()
, то оба типа данных geometry и geography будут распознавать экземпляр как Point.
Подтипы для типов geometry и geography делятся на простые типы и типы-коллекции. Некоторые методы, например STNumCurves()
, работают только с простыми типами.
Простые типы:
Типы коллекций:
Различия типов данных geometry и geography
Два этих типа пространственных данных часто демонстрируют одинаковое поведение. У них имеется ряд ключевых различий в способе хранения данных и управления ими.
Определение границ соединения
Определяющими данными для типов LineString и Polygon могут быть только вершины. Границей соединения между двумя вершинами в типе geometry является прямая линия. Однако границей соединения между двумя вершинами в типе geography является короткая большая эллиптическая кривая, проложенная между вершинами. Большой эллипс представляет собой пересечение эллипсоида с плоскостью, проходящей через его центр. Большая эллиптическая кривая представляет собой сегмент кривой на большом эллипсе.
Определение сегментов дуги
Сегменты дуги для типов geometry определяются на декартовой координатной плоскости XY (значения Z не учитываются). Сегменты дуги для типов geography определяются сегментами кривой на эталонной сфере. Любую параллель на эталонной сфере можно определить двумя взаимодополняющими дугами, где точки для обеих дуг имеют постоянный угол широты.
Измерения в пространственных типах данных
В планарной модели, или модели плоской Земли, измерение расстояний и площадей проводятся в таких же единицах измерения, в каких представляются координаты. При использовании типа данных geometry расстояние между точками (2, 2) и (5, 6) составляет пять единиц, независимо от используемых единиц.
В эллиптической модели, или модели круглой Земли, координаты указываются в градусах долготы и широты. Однако длина и области обычно измеряются в метрах и квадратных метрах, хотя измерение может зависеть от идентификатора пространственной ссылки экземпляра географии . Самой распространенной единицей измерения типа данных geography является метр.
Ориентация пространственных данных
В планарной системе ориентация кольца многоугольника является несущественным фактором. Простые функции OGC для спецификации SQL не диктуют порядок кругов, и SQL Server не применяет порядок кругов.
В эллиптической модели без указания ориентации многоугольник не определен или является неоднозначным. Например, описывает ли кольцо вокруг экватора северное или южное полушарие? При использовании типа данных geography для хранения пространственного экземпляра необходимо указать ориентацию кольца и точно описать расположение экземпляра.
Внутренняя часть многоугольника в эллиптической системе определяется по правилу левой руки: если двигаться вдоль географического прямоугольника, следуя по точкам в том порядке, в котором они указаны, область слева будет считаться внутренней частью, а область справа — внешней.
Если уровень совместимости равен 100 или ниже в SQL Server, то тип данных geography имеет следующие ограничения:
Любой экземпляр geography должен лежать в пределах одного полушария. Не допускается сохранение пространственных объектов больше размера полушария.
Любой экземпляр geography в представлении консорциума OGC Well-Known Text (WKT) или Well-Known Binary (WKB), порождающий объект больше полушария, приводит к возникновению исключения ArgumentException.
Методы типа данных geography, требующие ввода двух экземпляров географических регионов, таких как
STIntersection()
,STUnion()
STDifference()
иSTSymDifference()
, возвращают значение NULL, если результаты из методов не помещаются внутри одного полушария.STBuffer()
также возвращает значение NULL, если выходные данные превышают одно полушарие.
В SQL Server FullGlobe — это особый тип Многоугольника, охватывающего весь земной шар. Этот объект имеет площадь, но не имеет границ и вершин.
Внешнее и внутреннее кольца для типа данных geography
Простые функции OGC для спецификации SQL обсуждают внешние кольца и внутренние кольца, но это различие имеет мало смысла для типа данных географических данных SQL Server. Любое кольцо многоугольника можно использовать для внешнего кольца.
Дополнительные сведения о спецификациях консорциума OGC см. в одном из следующих документов:
- Спецификации OGC, простой доступ к функциям, часть 1 — общая архитектура
- Спецификации OGC, простой доступ к функциям, часть 2 — параметры SQL
Сегменты дуги
Три типа, допускающих создание экземпляров, могут принимать сегменты дуги: CircularString, CompoundCurveи CurvePolygon. Сегмент дуги определяется тремя точками на двумерной плоскости, при этом третья точка не может совпадать с первой. Несколько примеров сегментов дуги:
Первые два примера показывают типичные сегменты дуги. Обратите внимание, что каждая из трех точек лежит на периметре круга.
Два других примера показывают, как можно определить сегмент линии с помощью сегмента дуги. Для определения сегмента дуги по-прежнему требуются три точки, тогда как обычный сегмент линии можно определить с помощью двух точек.
Методы, работающие на типах сегментов круговой дуги, используют сегменты прямой линии для приближения круговой дуги. Количество сегментов линии, используемых для приближения дуги, будет зависеть от длины и кривизны дуги. Значения Z можно хранить для каждого типа сегментов круговой дуги, но не будут использоваться в вычислениях.
Примечание.
Если для сегментов дуги даются значения Z, они должны совпадать для всех точек сегмента дуги. Только в этом случае они могут быть приняты в качестве ввода. Например: CIRCULARSTRING(0 0 1, 2 2 1, 4 0 1)
принимается, но CIRCULARSTRING(0 0 1, 2 2 2, 4 0 1)
не принимается.
Сравнение LineStr и 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 хорошо подходят для хранения линейных границ, например городского квартала.
Сравнение LineStr и 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 пришлось бы преобразовать кривую в несколько сегментов линии меньшего размера.
Сравнение CircularStr и 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. Экземпляры многоугольников этого делать не могут.
Ограничения
В базе данных SQL в Microsoft Fabric поддерживаются географические и геометрические типы данных, но не могут быть зеркально отражены в Fabric OneLake.