Criar, construir e consultar instâncias de geometria
O tipo de dados espaciais planares, geometry
, representa dados em um sistema de coordenadas euclidiano (plano). Este 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 geometry
tipo de dados (planar) compatível com SQL Server está em conformidade com os Recursos Simples do OGC (Open Geospatial Consortium) 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 dá 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 de 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 de geometry
fornece vários métodos internos que geram uma geometria da representação WKT do Open Geospatial Consortium (OGC). 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 Open Geospatial Consortium (OGC) que permite que dados de 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 geometry
tipo de dados fornece um método que gera uma geometry
instância de GML, uma representação XML de objetos geométricos. 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 geometry
instâncias têm várias propriedades que podem ser recuperadas por meio de métodos que SQL Server fornece. 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 de 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 de 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 geometry)STGeometryN (tipo de dados geometry)
Número de pontos
Todas as instâncias nãompty geometry
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. geometries
de dimensão zero, como Point
e MultiPoint
, não têm nenhum comprimento ou área. Objetos unidimensionais, como LineString, CircularString, CompoundCurve
e MultiLineString
, têm comprimento. Instâncias bidimensionais, como Polygon
, CurvePolygon
e 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 vaziageometry
não tem nenhum ponto. O comprimento de instâncias LineString, CircularString
, CompoundCurve
e MultiLineString
é zero. A área de instâncias de Polygon
, CurvePolygon
e MultiPolygon
vazias é 0.
Para determinar se uma instância está vazia
STIsEmpty.
Simples
Para que uma geometry
instância seja simples, ela deve atender aos 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 geometry
instância é o espaço ocupado pela instância e o exterior é o espaço não ocupado.
OLimite é definido pelo OGC da seguinte maneira:
Instâncias de
Point
eMultiPoint
não têm um limite.Limites de
LineString
eMultiLineString
são formados pelos pontos iniciais e de extremidade removendo os que ocorrem um número par de vezes.
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 geometry
instância, também conhecido como a caixa delimitadora, é o retângulo alinhado ao eixo formado pelas coordenadas mínima e máxima (X,Y) da instância.
Para retornar o envelope de uma instância
STEnvelope
Fechamento
Uma instância fechadageometry
é uma figura cujos pontos iniciais e pontos de extremidade são os mesmos. As instâncias Polygon
são consideradas fechadas. As instâncias Point
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 ID de referência espacial (SRID) é 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
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 de 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 geometry
instâncias 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 espaço planar indefinido nos cálculos de métodos de tipo de geometry
dados, o Mecanismo de Banco de Dados SQL Server usa SRID 0.
Exemplos
Os dois exemplos a seguir mostram como adicionar e consultar dados geométricos.
O primeiro exemplo cria uma tabela com uma coluna de identidade e uma coluna de
geometry
GeomCol1
. Uma terceira coluna renderiza a coluna degeometry
em sua representação WKT (Well-Known Text) do Open Geospatial Consortium (OGC) e usa o métodoSTAsText()
. Em seguida, duas linhas são inseridas: uma linha que contém uma instânciaLineString
degeometry
e uma linha que contém uma instância dePolygon
.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
O segundo exemplo usa o método
STIntersection()
para retornar os pontos onde as duas instâncias degeometry
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();