Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Aplica-se a:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Endpoint de análise SQL no Microsoft Fabric
Armazém no Microsoft Fabric
Base de dados SQL no Microsoft Fabric
Existem dois tipos de dados espaciais. O tipo de dados de geometria suporta dados planares ou euclidianos (terraplanistas). O tipo de dados de geometria está em conformidade com o Open Geospatial Consortium (OGC) Simple Features for SQL Specification versão 1.1.0 e é compatível com o SQL MM (norma ISO).
O SQL Server também oferece suporte ao tipo de dados geográficos , que armazena dados elípticos (terra redonda), como coordenadas de latitude e longitude do GPS.
Tip
As ferramentas espaciais do SQL Server são uma coleção de ferramentas de código aberto patrocinada pela Microsoft para uso com os tipos espaciais no SQL Server. Este projeto fornece um conjunto de funções reutilizáveis que as aplicações podem utilizar. Estas funções podem incluir rotinas de conversão de dados, novas transformações, agregados, etc. Consulte Microsoft/SQLServerSpatialTools no GitHub para obter mais detalhes.
Objetos de dados espaciais
Os tipos de dados de geometria e geografia suportam 16 tipos de objetos de dados espaciais ou tipos de instância. No entanto, apenas 11 desses tipos de instância são instanciáveis; Você pode criar e trabalhar com essas instâncias (ou instanciá-las) em um banco de dados. Essas instâncias derivam determinadas propriedades de seus tipos de dados pai.
A figura a seguir mostra a hierarquia de geometria na qual os tipos de dados de geometria e geografia são baseados. Os tipos instanciáveis de geometria e geografia são indicados em azul.
Há um tipo instanciável adicional para o tipo de dados geográficos : FullGlobe. Os tipos de geometria e geografia podem reconhecer uma instância específica, desde que seja uma instância bem formada, mesmo que a instância não esteja definida explicitamente. Por exemplo, se você definir uma ocorrência Point explicitamente usando o STPointFromText() método, geometria e geografia reconhecerão a instância como um Point, desde que a entrada do método esteja bem formada. Se você definir a mesma instância usando o STGeomFromText() método, os tipos de dados geometria e geografia reconhecerão a instância como um Point.
Os subtipos para tipos de geometria e geografia são divididos em tipos simples e de coleção. Alguns métodos como STNumCurves() apenas trabalham com tipos simples.
Os tipos simples são:
Os tipos de coleção são:
Diferenças de tipo de dados de geometria e geografia
Os dois tipos de dados geográficos comportam-se frequentemente de forma semelhante. Existem algumas diferenças fundamentais na forma como os dados são armazenados e manipulados.
Como as bordas de conexão são definidas
Os dados que definem os tipos LineString e Polygon são apenas vértices. A borda de conexão entre dois vértices em um tipo de geometria é uma linha reta. No entanto, a borda de conexão entre dois vértices em um tipo de geografia é um curto grande arco elíptico entre os dois vértices. Uma grande elipse é a intersecção do elipsoide com um plano através do seu centro. Um grande arco elíptico é um segmento de arco na grande elipse.
Como os segmentos de arco circulares são definidos
Os segmentos de arco circulares para tipos de geometria são definidos no plano de coordenadas cartesianas XY (os valores Z são ignorados). Os segmentos de arco circulares para tipos de geografia são definidos por segmentos de curva em uma esfera de referência. Qualquer paralelo na esfera de referência pode ser definido por dois arcos circulares complementares onde os pontos para ambos os arcos têm um ângulo de latitude constante.
Medições em tipos de dados espaciais
No sistema planar (terra plana), as medidas de distâncias e áreas são dadas na mesma unidade de medida que as coordenadas. Usando o tipo de dados de geometria , a distância entre (2, 2) e (5, 6) é de cinco unidades, independentemente das unidades utilizadas.
Em um sistema elipsoidal, ou terra redonda, as coordenadas são dadas em graus de latitude e longitude. No entanto, comprimentos e áreas são normalmente medidos em metros e metros quadrados, embora a medição possa depender do identificador de referência espacialda instância geográfica . A unidade de medida mais comum para o tipo de dados geográficos são os metros.
Orientação dos dados geográficos
A orientação do anel de um polígono não é um fator importante no sistema planar. A Especificação de Recursos Simples do OGC para SQL não especifica uma ordenação dos anéis, e o SQL Server não impõe a ordenação dos anéis.
Em um sistema elipsoidal, um polígono sem orientação não tem significado ou é ambíguo. Por exemplo, um anel em torno do equador descreve o hemisfério norte ou sul? Se usarmos o tipo de dados geográficos para armazenar a instância espacial, devemos especificar a orientação do anel e descrever com precisão a localização da instância.
O interior do polígono em um sistema elíptico é definido pela "regra da mão esquerda": se você se imaginar andando ao longo do anel de um Polígono geográfico, seguindo os pontos na ordem em que eles são listados, a área à esquerda está sendo tratada como o interior do Polígono, e a área à direita como o exterior do Polígono.
Quando o nível de compatibilidade é 100 ou inferior no SQL Server, o tipo de dados geográficos tem as seguintes restrições:
Cada instância geográfica deve caber dentro de um único hemisfério. Nenhum objeto espacial maior que um hemisfério pode ser armazenado.
Qualquer instância geográfica de uma representação Well-Known Text (WKT) ou Well-Known Binary (WKB) do Open Geospatial Consortium (OGC) que produza um objeto maior que um hemisfério gera um ArgumentException.
Os métodos de tipo de dados geográficos que exigem a entrada de duas instâncias geográficas, como
STIntersection(),STUnion(),STDifference(), eSTSymDifference(), retornarão nulos se os resultados dos métodos não se encaixarem dentro de um único hemisfério.STBuffer()também retornará null se a saída exceder um único hemisfério.
No SQL Server, FullGlobe é um tipo especial de Polígono que cobre todo o globo. Tem uma área, mas sem fronteiras ou vértices.
Anéis externos e internos no tipo de dados geography
O OGC Simple Features for SQL Specification discute anéis externos e anéis internos, mas essa distinção faz pouco sentido para o tipo de dados de geografia do SQL Server; qualquer anel de um polígono pode ser considerado o anel externo.
Para obter mais informações sobre as especificações OGC, consulte os seguintes documentos:
- Especificações OGC, Simple Feature Access Parte 1 - Arquitetura Comum
- Especificações OGC, Simple Feature Access Part 2 - Opções SQL
Segmentos de arco circulares
Três tipos instanciáveis podem ter segmentos de arco circular: CircularString, CompoundCurve e CurvePolygon. Um segmento de arco circular é definido por três pontos num plano bidimensional e o terceiro ponto não pode ser igual ao primeiro ponto. Alguns exemplos de segmentos de arco circular:
Os dois primeiros exemplos mostram segmentos de arco circulares típicos. Observe como cada um dos três pontos fica no perímetro de um círculo.
Outros dois exemplos mostram como um segmento de linha pode ser definido como um segmento de arco circular. Três pontos ainda são necessários para definir o segmento de arco circular, ao contrário de um segmento de linha regular, que pode ser definido por apenas dois pontos.
Os métodos que operam em tipos de segmento de arco circular usam segmentos de linha reta para aproximar o arco circular. O número de segmentos de linha usados para aproximar o arco dependerá do comprimento e da curvatura do arco. Os valores Z podem ser armazenados para cada um dos tipos de segmento de arco circular, mas não serão usados nos cálculos.
Note
Se os valores Z são dados para segmentos de arco circular, então eles devem ser os mesmos para todos os pontos no segmento de arco circular para que ele seja aceito para entrada. Por exemplo: CIRCULARSTRING(0 0 1, 2 2 1, 4 0 1) é aceite, mas CIRCULARSTRING(0 0 1, 2 2 2, 4 0 1) não é aceite.
Comparação entre LineStr e CircularString
Este exemplo mostra como armazenar triângulos isósceles idênticos usando uma ocorrência de LineString e uma ocorrência de 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
Uma ocorrência de CircularString requer sete pontos para definir o triângulo. A ocorrência de LineString requer apenas quatro pontos para definir o triângulo. A razão para isso é que uma ocorrência de CircularString armazena segmentos de arco circulares e não segmentos de linha. Os lados do triângulo armazenados na ocorrência de CircularString são ABC, CDE e EFA. Os lados do triângulo armazenados na ocorrência de LineString são AC, CE e EA.
Considere o seguinte exemplo:
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];
Aqui está o conjunto de resultados.
LS Length CS Length
5.65685... 6.28318...
As instâncias CircularString usam menos pontos para armazenar limites de curva com maior precisão do que as instâncias LineString . As instâncias CircularString são úteis para armazenar limites circulares como um raio de pesquisa de 20 milhas a partir de um ponto específico. As instâncias LineString são boas para armazenar limites lineares como um bloco de cidade quadrado.
Comparação entre LineStr e CompoundCurve
Os exemplos de código a seguir mostram como armazenar a mesma figura usando instâncias LineString e 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))');
Nos exemplos anteriores, uma ocorrência de LineString ou uma ocorrência de CompoundCurve poderia armazenar a figura. Este próximo exemplo usa um CompoundCurve para armazenar uma fatia de pizza:
SET @g = geometry::Parse('COMPOUNDCURVE(CIRCULARSTRING(2 2, 1 3, 0 2),(0 2, 1 0, 2 2))');
Uma ocorrência de CompoundCurve pode armazenar o segmento de arco circular (2, 2, 1, 3, 0, 2) diretamente, mas uma ocorrência de LineString teria que converter a curva em vários segmentos de linha menores.
Comparação entre CircularStr e CompoundCurve
O exemplo de código a seguir mostra como a fatia de pizza pode ser armazenada em uma ocorrência de 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();
O armazenamento da fatia de pizza usando uma instância de CircularString requer que três pontos sejam usados para cada segmento de linha. Se um ponto intermediário não for conhecido, ele deve ser calculado ou o ponto final do segmento de linha deve ser dobrado, como mostra o seguinte trecho:
SET @g = geometry::Parse('CIRCULARSTRING( 0 0, 3 6.3246, 3 6.3246, 0 7, -3 6.3246, 0 0, 0 0)');
As instâncias CompoundCurve permitem os componentes LineString e CircularString para que apenas dois pontos para os segmentos de linha da fatia de pizza precisem ser conhecidos. Este exemplo de código mostra como usar um CompoundCurve para armazenar a mesma figura:
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();
Comparação de polígonos e curvasPolígonos
As instâncias CurvePolygon podem usar instâncias CircularString e CompoundCurve ao definir seus anéis externos e internos. As instâncias Polygon não podem.
Limitations
Na base de dados SQL no Microsoft Fabric, os tipos de dados geográficos e geométricos são suportados, mas não podem ser espelhados para o Fabric OneLake.