Criar, construir e consultar instâncias de geometria
Aplica-se a: SQL Server Banco de Dados SQL do Azure Instância Gerenciada de SQL do Azure
O tipo de dados espaciais planares, geometry, representa dados em um sistema de coordenadas euclidiano (plano). Esse tipo é implementado como um tipo de dados CLR (Common Language Runtime) no SQL Server.
O tipo geometry é predefinido e está disponível em cada banco de dados. É possível criar colunas de tabelas do tipo geometry e operar com dados geometry da mesma maneira como outros tipos CLR são usados.
O tipo de dados de geometria (planar) suportado pelo SQL Server está em conformidade com os recursos simples do Open Geospatial Consortium (OGC) para a especificação SQL versão 1.1.0.
Para obter mais informações sobre especificações do OCG, consulte o seguinte:
OGC Specifications, Simple Feature Access Part 1 - Common Architecture
Especificações do OGC, Simple Feature Access Part 2 – SQL Options (Acesso de recurso simples Parte 2 – opções de SQL)
O SQL Server oferece suporte a um subconjunto do padrão GML 3.1 existente, que é definido no seguinte esquema: https://schemas.microsoft.com/sqlserver/profiles/gml/SpatialGML.xsd.
Criando ou construindo uma nova instância de geometria
Criando uma nova instância de geometria de uma instância existente
O tipo de dados geometry fornece vários métodos internos que podem ser usados para criar novas instâncias geometry baseadas em instâncias existentes.
Para criar um buffer em torno de uma geometria
STBuffer (tipo de dados geometry)
BufferWithTolerance (tipo de dados geometry)
Para criar uma versão simplificada de uma geometria
Reduce (tipo de dados geometry)
Para cria o casco convexo de uma geometria
STConvexHull (tipo de dados geometry)
Para criar uma geometria da interseção de duas geometrias
STIntersection (tipo de dados geometry)
Para criar uma geometria da união de duas geometrias
STUnion (tipo de dados geometry)
Para criar uma geometria dos pontos onde uma geometria não sobrepõe outra
STDifference (tipo de dados geometry)
Para criar uma geometria dos pontos onde duas geometrias não se sobrepõem
STSymDifference (tipo de dados geometry)
Para criar uma instância de Point arbitrária que está em uma geometria existente
STPointOnSurface (tipo de dados geometry)
Construindo uma instância de geometria da entrada de texto conhecida
O tipo de dados geometry fornece vários métodos internos que geram uma geometria da representação WKT do OGC (Open Geospatial Consortium). O padrão WKT é uma cadeia de caracteres de texto que permite que dados de geometria sejam trocados em formulário textual.
Para construir qualquer tipo de instância de geometria de entrada WKT
STGeomFromText (tipo de dados geometry)
Parse (tipo de dados geometry)
Para construir uma instância de Point de geometria de entrada WKT
STPointFromText (tipo de dados geometry)
Para construir uma instância de MultiPoint de geometria de entrada WKT
STMPointFromText (tipo de dados geometry)
Para construir uma instância de LineString de geometria de entrada WKT
STLineFromText (tipo de dados geometry)
Para construir uma instância de MultiLineString de geometria de entrada WKT
STMLineFromText (tipo de dados geometry)
Para construir uma instância de Polygon de geometria de entrada WKT
STPolyFromText (tipo de dados geometry)
Para construir uma instância de MultiPolygon de geometria de entrada WKT
STMPolyFromText (tipo de dados geometry)
Para construir uma instância de GeometryCollection de geometria de entrada WKT
STGeomCollFromText (tipo de dados geometry)
Construindo uma instância de geometria da entrada binária conhecida
WKB é um formato binário especificado pelo OGC (Open Geospatial Consortium) que permite que dados geometry sejam trocados entre um aplicativo cliente e um banco de dados SQL. As seguintes funções aceitam entrada WKB para construir geometrias:
Para construir qualquer tipo de instância de geometria de entrada WKB
STGeomFromWKB (tipo de dados geometry)
Para construir uma instância de Point de geometria de entrada WKB
STPointFromWKB (tipo de dados geometry)
Para construir uma instância de MultiPoint de geometria de entrada WKB
STMPointFromWKB (tipo de dados de geometry)
Para construir uma instância de LineString de geometria de entrada WKB
STLineFromWKB (tipo de dados geometry)
Para construir uma instância de MultiLineString de geometria de entrada WKB
STMLineFromWKB (tipo de dados geometry)
Para construir uma instância de Polygon de geometria de entrada WKB
STPolyFromWKB (tipo de dados geometry)
Para construir uma instância de MultiPolygon de geometria de entrada WKB
STMPolyFromWKB (tipo de dados geometry)
Para construir uma instância de GeometryCollection de geometria de entrada WKB
STGeomCollFromWKB (tipo de dados geometry)
Construindo uma instância de geometria de entrada de texto GML
O tipo de dados geometry fornece um método que gera uma instância geometry de GML, uma representação XML de uma instância de objetos de geometria. O SQL Server oferece suporte a um subconjunto de GML.
Para construir qualquer tipo de instância de geometria de entrada GML
GeomFromGml (tipo de dados geometry)
Retornando texto conhecido e binário conhecido de uma instância de geometria
É possível usar os seguintes métodos para retornar o formato WKT ou WKB de uma instância de geometry :
Para retornar a representação WKT de uma instância de geometria
STAsText (tipo de dados geometry)
ToString (tipo de dados geometry)
Para retornar a representação WKT de uma instância de geometria incluindo qualquer valor Z e M
AsTextZM (tipo de dados geometry)
Para retornar a representação WKB de uma instância de geometria
STAsBinary (tipo de dados geometry)
Para retornar uma representação GML de uma instância de geometria
AsGml (tipo de dados geometry)
Consultando as propriedades e comportamentos de instâncias de geometria
Todas as instâncias de geometria têm várias propriedades que podem ser recuperadas por meio de métodos fornecidos pelo SQL Server. Os tópicos a seguir definem propriedades e comportamentos de tipos de geometria e os métodos de consulta de cada um.
Informações de validade, tipo de instância e GeometryCollection
Quando uma instância geometry é construída, é possível usar os seguintes métodos para determinar se ela está bem formada, para retornar o tipo da instância ou, se ela for uma instância de coleção, retornar uma instância geometry específica.
Para retornar o tipo de instância de uma geometria
STGeometryType (tipo de dados geometry)
Para determinar se uma geometria é um determinado tipo de instância
InstanceOf (tipo de dados geometry)
Para determinar se uma instância de geometria está bem formada para seu tipo de instância
STIsValid (tipo de dados geometry)
Para converter uma instância de geometria em uma instância de geometria bem formada com um tipo de instância
MakeValid (tipo de dados geometry)
Para retornar o número de geometrias em uma instância de coleção de geometrias
STNumGeometries (tipo de dados geometry)
Para retornar uma geometria específica em uma instância coleção de geometrias
STGeometryN (Tipo de Dados de geometria) STGeometryN (Tipo de Dados de geometria)
Número de Pontos
Todas as instâncias de geometry não vazias são compostas por pontos. Esses pontos representam as coordenadas X e Y do plano no qual as geometrias são obtidas. geometry fornece vários métodos internos de consulta de pontos de uma instância.
Para retornar o número de pontos que compõem uma instância
STNumPoints (tipo de dados geometry)
Para retornar um ponto específico em uma instância
STPointN
Para retornar um ponto arbitrário que está em uma instância
STPointOnSurface
Para retornar o ponto inicial de uma instância
STStartPoint
Para retornar o ponto de extremidade de uma instância
STEndpoint
Para retornar a coordenada X de uma instância de Point
STX (tipo de dados geometry)
Para retornar a coordenada Y de uma instância de Point
STY
Para retornar o ponto do centro geométrico de uma instância de Polygon, CurvePolygon ou MultiPolygon
STCentroid
Dimensão
Uma instância geometry não vazia pode ser zero, uni ou bidimensional. Instâncias geographycom dimensional zero, como Point e MultiPoint, não têm tamanho nem área. Objetos unidimensionais, como LineString, CircularString, CompoundCurvee MultiLineString, têm comprimento. Instâncias bidimensionais, como Polygon, CurvePolygone MultiPolygon, têm área e comprimento. Instâncias vazias relatarão uma dimensão de -1 e uma GeometryCollection relatará uma área dependente dos tipos de seu conteúdo.
Para retornar a dimensão de uma instância
STDimension
Para retornar o comprimento de uma instância
STLength
Para retornar a área de uma instância
STArea
Vazio
Uma instância emptygeometry não tem pontos. O comprimento de instâncias LineString, CircularString, CompoundCurvee MultiLineString é zero. A área de instâncias de Polygon, CurvePolygone MultiPolygon vazias é 0.
Para determinar se uma instância está vazia
STIsEmpty.
Simples
Para que uma geometry da instância seja simples, ela deve atender a estes dois requisitos:
Não deve haver interseção de nenhuma figura da instância consigo mesma, exceto em seus pontos de extremidade.
Não pode haver nenhuma interseção entre duas figuras da instância em nenhum ponto que não esteja nos seus dois limites.
Observação
Geometrias vazias são sempre simples.
Para determinar se uma instância é simples
STIsSimple.
Limite, interior e exterior
O interior de uma instância geometry é o espaço ocupado pela instância e o exterior é o espaço não ocupado por ela.
OLimite é definido pelo OGC da seguinte maneira:
Instâncias dePoint e MultiPoint não têm um limite.
Os limites deLineString e MultiLineString boundaries are formed by the start points e end points, removing those that occur an even number of times.
DECLARE @g geometry;
SET @g = geometry::Parse('MULTILINESTRING((0 1, 0 0, 1 0, 0 1), (1 1, 1 0))');
SELECT @g.STBoundary().ToString();
O limite de uma instância de Polygon ou MultiPolygon é o conjunto de seus anéis.
DECLARE @g geometry;
SET @g = geometry::Parse('POLYGON((0 0, 3 0, 3 3, 0 3, 0 0), (1 1, 1 2, 2 2, 2 1, 1 1))');
SELECT @g.STBoundary().ToString();
Para retornar o limite de uma instância
STBoundary
Envelope
O envelope de uma instância geometry , também conhecido como a caixa delimitadora, é o retângulo alinhado com o eixo formado pelas coordenadas máxima e mínima (X,Y) da instância.
Para retornar o envelope de uma instância
STEnvelope
Fechamento
Uma instância closedgeometry é uma figura cujos pontos inicial e final são os mesmos. As instânciasPolygon são consideradas fechadas. As instânciasPoint não estão fechadas.
Um anel é uma instância de LineString simples e fechada.
Para determinar se uma instância está fechada
STIsClosed
Para determinar se uma instância é um anel
STIsRing
Para retornar o anel exterior de uma instância de Polygon
STExteriorRing
Para retornar o número de anéis interiores em um Polígono
STNumInteriorRing
Para retornar um anel interior especificado de um Polígono
STInteriorRingN
SRID (Spatial Reference ID)
A SRID (ID de referência espacial) é um identificador que especifica o sistema de coordenadas no qual a instância geometry é representada. Duas instâncias com SRIDs diferentes são incomparáveis.
Para definir ou retornar o SRID de uma instância
STSrid
Observação
Essa propriedade pode ser modificada.
Determinando relações entre instâncias de geometria
O tipo de dados geometry fornece vários métodos internos que podem ser usados para determinar relações entre duas instâncias geometry .
Para determinar se duas instâncias abrangem o mesmo conjunto de pontos
STEquals
Para determinar se duas instâncias são não contíguas
STDisjoint
Para determinar se há interseção entre duas instâncias
STIntersects
Para determinar se duas instâncias se tocam
STTouches
Para determinar se duas instâncias se sobrepõem
STOverlaps
Para determinar se duas instâncias se cruzam
STCrosses
Para determinar se uma instância está dentro de outra
STWithin
Para determinar se uma instância contém outra
STContains
Para determinar se uma instância sobrepõe outra
STOverlaps
Para determinar se duas instâncias estão espacialmente relacionadas
STRelate
Para determinar a distância mais curta entre pontos em duas instâncias de geometria
STDistance
Padrão de instâncias de geometria para SRID zero
O SRID padrão para instâncias de geometria no SQL Server é 0. Com dados espaciais de geometry , o SRID da instância espacial não é necessário para executar cálculos. Portanto as instâncias podem residir em espaço planar não definido. Para indicar um espaço planar indefinido nos cálculos dos métodos de tipo de dados de geometria, o Mecanismo de Banco de Dados do SQL Server usa o SRID 0.
Exemplos
Os dois exemplos a seguir mostram como adicionar e consultar dados geométricos.
Exemplo A.
Este exemplo cria uma tabela com uma coluna de identidade e uma coluna de geometry
, GeomCol1
. Uma terceira coluna renderiza a coluna de geometry
em sua representação WKT (Well-Known Text) do Open Geospatial Consortium (OGC) e usa o método STAsText()
. Em seguida, duas linhas são inseridas: uma linha que contém uma instância LineString
de geometry
e uma linha que contém uma instância de Polygon
.
IF OBJECT_ID ( 'dbo.SpatialTable', 'U' ) IS NOT NULL
DROP TABLE dbo.SpatialTable;
GO
CREATE TABLE SpatialTable
( id int IDENTITY (1,1),
GeomCol1 geometry,
GeomCol2 AS GeomCol1.STAsText()
);
GO
INSERT INTO SpatialTable (GeomCol1)
VALUES (geometry::STGeomFromText('LINESTRING (100 100, 20 180, 180 180)', 0));
INSERT INTO SpatialTable (GeomCol1)
VALUES (geometry::STGeomFromText('POLYGON ((0 0, 150 0, 150 150, 0 150, 0 0))', 0));
GO
Exemplo B.
Este exemplo usa o método STIntersection()
para retornar os pontos em que as duas instâncias de geometry
inseridas anteriormente se cruzam.
DECLARE @geom1 geometry;
DECLARE @geom2 geometry;
DECLARE @result geometry;
SELECT @geom1 = GeomCol1 FROM SpatialTable WHERE id = 1;
SELECT @geom2 = GeomCol1 FROM SpatialTable WHERE id = 2;
SELECT @result = @geom1.STIntersection(@geom2);
SELECT @result.STAsText();