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
Um Polígono é uma superfície bidimensional armazenada como uma sequência de pontos que definem um anel delimitador exterior e zero ou mais anéis interiores.
Instâncias de polígonos
Uma instância de Polígono pode ser formada a partir de um anel que tem pelo menos três pontos distintos. Uma instância de Polígono também pode estar vazia.
O exterior e quaisquer anéis interiores de um Polígono definem o seu limite. O espaço dentro dos anéis define o interior do Polígono.
A ilustração a seguir mostra exemplos de instâncias de Polígono .
Como mostra a ilustração:
A Figura 1 é uma ocorrência de Polígono cujo limite é definido por um anel exterior.
A Figura 2 é uma ocorrência de Polígono cujo limite é definido por um anel exterior e dois anéis interiores. A área dentro dos anéis internos faz parte do exterior da instância do Polígono .
A Figura 3 é uma ocorrência válida de Polígono porque seus anéis internos se cruzam em um único ponto tangente.
Instâncias aceites
Instâncias de polígono aceitas são instâncias que podem ser armazenadas em uma variável de geometria ou geografia sem lançar uma exceção. As seguintes instâncias de polígono são aceitas:
- Uma instância de polígono vazio
- Uma ocorrência de Polygon que tem um anel externo aceitável (LineString) e zero ou mais anéis internos aceitáveis (LineStrings)
Os seguintes critérios são necessários para que um anel (LineString) seja aceitável.
- A instância de LineString deve ser aceita.
- A instância de LineString deve ter pelo menos quatro pontos.
- Os pontos inicial e final da ocorrência de LineString devem ser os mesmos.
O exemplo a seguir mostra instâncias de Polígono aceitas.
DECLARE @g1 geometry = 'POLYGON EMPTY';
DECLARE @g2 geometry = 'POLYGON((1 1, 3 3, 3 1, 1 1))';
DECLARE @g3 geometry = 'POLYGON((-5 -5, -5 5, 5 5, 5 -5, -5 -5),(0 0, 3 0, 3 3, 0 3, 0 0))';
DECLARE @g4 geometry = 'POLYGON((-5 -5, -5 5, 5 5, 5 -5, -5 -5),(3 0, 6 0, 6 3, 3 3, 3 0))';
DECLARE @g5 geometry = 'POLYGON((1 1, 1 1, 1 1, 1 1))';
Como @g4 e @g5 mostram que uma instância de Polygon aceita pode não ser uma instância de Polygon válida.
@g5 também mostra que uma instância de Polígono precisa conter apenas um anel com qualquer quatro pontos para ser aceita.
Os exemplos a seguir geram um System.FormatException porque as instâncias do Polygon não são aceitas.
DECLARE @g1 geometry = 'POLYGON((1 1, 3 3, 1 1))';
DECLARE @g2 geometry = 'POLYGON((1 1, 3 3, 3 1, 1 5))';
@g1 não é aceito porque a ocorrência de LineString para o anel externo não contém pontos suficientes.
@g2 não é aceito porque o ponto inicial da ocorrência de LineString do anel externo não é o mesmo que o ponto final. O exemplo seguinte tem um anel exterior aceitável, mas o anel interior não é aceitável. Isso também dispara um System.FormatException.
DECLARE @g geometry = 'POLYGON((-5 -5, -5 5, 5 5, 5 -5, -5 -5),(0 0, 3 0, 0 0))';
Instâncias válidas
Os anéis internos de um Polígono podem tocar a si mesmos e uns aos outros em pontos de tangência únicos, mas se os anéis internos de um Polígono cruzarem, a instância não é válida.
O exemplo a seguir mostra instâncias válidas do Polygon .
DECLARE @g1 geometry = 'POLYGON((-20 -20, -20 20, 20 20, 20 -20, -20 -20))';
DECLARE @g2 geometry = 'POLYGON((-20 -20, -20 20, 20 20, 20 -20, -20 -20), (10 0, 0 10, 0 -10, 10 0))';
DECLARE @g3 geometry = 'POLYGON((-20 -20, -20 20, 20 20, 20 -20, -20 -20), (10 0, 0 10, 0 -10, 10 0), (-10 0, 0 10, -5 -10, -10 0))';
SELECT @g1.STIsValid(), @g2.STIsValid(), @g3.STIsValid();
@g3 é válido porque os dois anéis interiores tocam num único ponto e não se cruzam. O exemplo a seguir mostra Polygon instâncias que não são válidas.
DECLARE @g1 geometry = 'POLYGON((-20 -20, -20 20, 20 20, 20 -20, -20 -20), (20 0, 0 10, 0 -20, 20 0))';
DECLARE @g2 geometry = 'POLYGON((-20 -20, -20 20, 20 20, 20 -20, -20 -20), (10 0, 0 10, 0 -10, 10 0), (5 0, 1 5, 1 -5, 5 0))';
DECLARE @g3 geometry = 'POLYGON((-20 -20, -20 20, 20 20, 20 -20, -20 -20), (10 0, 0 10, 0 -10, 10 0), (-10 0, 0 10, 0 -10, -10 0))';
DECLARE @g4 geometry = 'POLYGON((-20 -20, -20 20, 20 20, 20 -20, -20 -20), (10 0, 0 10, 0 -10, 10 0), (-10 0, 1 5, 0 -10, -10 0))';
DECLARE @g5 geometry = 'POLYGON((10 0, 0 10, 0 -10, 10 0), (-20 -20, -20 20, 20 20, 20 -20, -20 -20) )';
DECLARE @g6 geometry = 'POLYGON((1 1, 1 1, 1 1, 1 1))';
SELECT @g1.STIsValid(), @g2.STIsValid(), @g3.STIsValid(), @g4.STIsValid(), @g5.STIsValid(), @g6.STIsValid();
@g1 não é válido porque o anel interno toca o anel externo em dois lugares.
@g2 não é válido porque o segundo anel interno está dentro do interior do primeiro anel interno.
@g3 não é válido porque os dois anéis internos tocam em múltiplos pontos consecutivos.
@g4 não é válido porque os interiores dos dois anéis internos se sobrepõem.
@g5 não é válido porque o anel exterior não é o primeiro anel.
@g6 não é válido porque o anel não tem pelo menos três pontos distintos.
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.
No sentido contrário aos ponteiros do relógio
DECLARE @square GEOGRAPHY;
SET @square = GEOGRAPHY::STPolyFromText('POLYGON((0 20, 0 0, 20 0, 20 20, 0 20))', 4326);
SELECT @square;
No sentido dos ponteiros do relógio
DECLARE @square GEOGRAPHY;
SET @square = GEOGRAPHY::STPolyFromText('POLYGON((0 20, 20 20, 20 0, 0 0, 0 20))', 4326);
SELECT @square;
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 Open Geospatial Consortium (OGC) Well-Known Text (WKT) ou Well-Known Binary (WKB) que produza um objeto maior que um hemisfério lança 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.
A orientação pode ser invertida aproveitando o método estendido ReorientObject (geography Data Type).
Examples
Exemplo A.
O exemplo a seguir cria uma instância simples geometry Polygon com uma lacuna e SRID 10.
DECLARE @g geometry;
SET @g = geometry::STPolyFromText(
'POLYGON((0 0, 0 3, 3 3, 3 0, 0 0), (1 1, 1 2, 2 1, 1 1))',
10);
Exemplo B.
Uma instância que não é válida pode ser inserida e convertida em uma instância válida geometry . No exemplo seguinte de um Polygon, os anéis interior e exterior sobrepõem-se e a ocorrência não é válida.
DECLARE @g geometry;
SET @g = geometry::Parse(
'POLYGON((1 0, 0 1, 1 2, 2 1, 1 0), (2 0, 1 1, 2 2, 3 1, 2 0))'
);
Exemplo C.
No exemplo a seguir, a instância inválida é tornada válida com MakeValid().
SET @g = @g.MakeValid();
SELECT @g.ToString();
A geometry instância retornada do exemplo anterior é um MultiPolygon.
MULTIPOLYGON (((2 0, 3 1, 2 2, 1.5 1.5, 2 1, 1.5 0.5, 2 0)),
((1 0, 1.5 0.5, 1 1, 1.5 1.5, 1 2, 0 1, 1 0)))
Exemplo D.
Este é outro exemplo de conversão de uma instância inválida em uma instância de geometria válida. No exemplo a seguir, a Polygon instância foi criada usando três pontos que são exatamente os mesmos:
DECLARE @g geometry
SET @g = geometry::Parse('POLYGON((1 3, 1 3, 1 3, 1 3))');
SET @g = @g.MakeValid();
SELECT @g.ToString()
A instância de geometria retornada anteriormente é um Point(1 3). Se o Polygon dado é POLYGON((1 3, 1 5, 1 3, 1 3)) então MakeValid() retornaria LINESTRING(1 3, 1 5).
Conteúdo relacionado
- STArea (tipo de dados de geometria)
- STExteriorRing (tipo de dados de geometria)
- STNumInteriorRing (tipo de dados de geometria)
- STInteriorRingN (tipo de dados de geometria)
- STCentroid (tipo de dados de geometria)
- STPointOnSurface (tipo de dados de geometria)
- MultiPolygon
- Dados Espaciais
- STIsValid (tipo de dados geográficos)
- STIsValid (tipo de dados de geometria)