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 todos os bancos de dados. É possível criar colunas de tabelas do tipo geometry e operar em dados de geometry da mesma maneira como outros tipos CLR são usados.
O tipo de dados de geometry (planar) que tem suporte do SQL Server está de acordo com os Recursos Simples do Open Geospatial Consortium (OGC) para o SQL Specification 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
OGC Specifications, Simple Feature Access Part 2 – SQL Options
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.
Neste tópico
Criando ou construindo uma nova instância de geometria
Criando uma nova instância de geometria de uma instância existente
Construindo uma instância de geometria da entrada de texto conhecida
Construindo uma instância de geometria da entrada binária conhecida
Construindo uma instância de geometria de entrada de texto GML
Retornando texto conhecido e binário conhecido de uma instância de geometria
Consultando as propriedades e comportamentos de instâncias de geometria
Informações de validade, tipo de instância e GeometryCollection
Número de pontos
Dimensão
Vazio
Limite, interior e exterior
Envelope
Fechamento
SRID (Spatial Reference ID)
Determinando relações entre instâncias de geometria
Padrão de instâncias de geometria para SRID zero
Exemplos
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)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)
[TOP]
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)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)
[TOP]
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)
[TOP]
Construindo uma instância de geometria de entrada de texto GML
O tipo de dados de geometria fornece um método que gera uma instância de 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)
[TOP]
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)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)
[TOP]
Consultando as propriedades e comportamentos de instâncias de geometria
Todas as instâncias de geometry 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 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 de geometria)
[TOP]
Número de pontos
Todas as instâncias de geometry não vazias são compostas de 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
STPointNPara retornar um ponto arbitrário que está em uma instância
STPointOnSurfacePara retornar o ponto inicial de uma instância
STStartPointPara retornar o ponto de extremidade de uma instância
STEndpointPara 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
STYPara retornar o ponto do centro geométrico de uma instância de Polygon, CurvePolygon ou MultiPolygon
STCentroid
[TOP]
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
STDimensionPara retornar o comprimento de uma instância
STLengthPara retornar a área de uma instância
STArea
[TOP]
Vazio
Uma instância vazia de geometry não tem pontos. 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.
[TOP]
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.
[TOP]
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.
O Limite é definido pelo OGC da seguinte maneira:
Instâncias de Point e MultiPoint não têm um limite.
Limites de LineString e MultiLineString 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
[TOP]
Envelope
O envelope de uma instância de 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
[TOP]
Fechamento
Uma instância closed geometry é uma figura cujos pontos inicial e final 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
STIsClosedPara determinar se uma instância é um anel
STIsRingPara retornar o anel exterior de uma instância de Polygon
STExteriorRingPara retornar o número de anéis interiores em um Polígono
STNumInteriorRingPara retornar um anel interior especificado de um Polígono
STInteriorRingN
[TOP]
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.
[TOP]
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
STEqualsPara determinar se duas instâncias são não contíguas
STDisjointPara determinar se há interseção entre duas instâncias
STIntersectsPara determinar se duas instâncias se tocam
STTouchesPara determinar se duas instâncias se sobrepõem
STOverlapsPara determinar se duas instâncias se cruzam
STCrossesPara determinar se uma instância está dentro de outra
STWithinPara determinar se uma instância contém outra
STContainsPara determinar se uma instância sobrepõe outra
STOverlapsPara determinar se duas instâncias estão espacialmente relacionadas
STRelatePara determinar a distância mais curta entre pontos em duas instâncias de geometria
STDistance
[TOP]
Padrão de instâncias de geometria para SRID zero
O padrão de SRID para instâncias de geometry 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 não definido nos cálculos de métodos de tipo de dados de geometry, o Mecanismo de Banco de Dados do SQL Server usa SRID 0.
Exemplos
Os dois exemplos a seguir mostram como adicionar e consultar dados de geometria.
O primeiro 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 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
O segundo exemplo usa o método STIntersection() para retornar os pontos onde 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();
[TOP]