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 CurvePolygon é uma superfície topologicamente fechada definida por um anel delimitador externo e zero ou mais anéis internos nos dados espaciais do Mecanismo de Banco de Dados SQL.
Important
Para obter uma descrição detalhada e exemplos de recursos espaciais introduzidos no SQL Server 2012 (11.x), incluindo o subtipo CurvePolygon , baixe o white paper Novos recursos espaciais no SQL Server 2012.
Os critérios a seguir definem atributos de uma ocorrência de CurvePolygon :
O limite da ocorrência de CurvePolygon é definido pelo anel externo e todos os anéis internos.
O interior da instância CurvePolygon é o espaço entre o anel exterior e todos os anéis interiores.
Uma ocorrência de CurvePolygon difere de uma ocorrência de Polygon porque uma ocorrência de CurvePolygon pode conter os seguintes segmentos de arco circular: CircularString e CompoundCurve.
Instâncias CompoundCurve
A ilustração abaixo mostra figuras válidas do CurvePolygon :
Instâncias aceitadas
Para que uma ocorrência de CurvePolygon seja aceita, ela precisa estar vazia ou conter apenas anéis de arco circulares que são aceitos. Um arco circular aceite em forma de anel cumpre os seguintes requisitos.
É uma instância aceita LineString, CircularString ou CompoundCurve. Para obter mais informações sobre instâncias aceitas, consulte LineString, CircularString e CompoundCurve.
Tem pelo menos quatro pontos.
O início e o ponto final têm as mesmas coordenadas X e Y.
Note
Os valores Z e M são ignorados.
O exemplo a seguir mostra instâncias CurvePolygon aceitas.
DECLARE @g1 geometry = 'CURVEPOLYGON EMPTY';
DECLARE @g2 geometry = 'CURVEPOLYGON((0 0, 0 0, 0 0, 0 0))';
DECLARE @g3 geometry = 'CURVEPOLYGON((0 0 1, 0 0 2, 0 0 3, 0 0 3))'
DECLARE @g4 geometry = 'CURVEPOLYGON(CIRCULARSTRING(1 3, 3 5, 4 7, 7 3, 1 3))';
DECLARE @g5 geography = 'CURVEPOLYGON((-122.3 47, 122.3 -47, 125.7 -49, 121 -38, -122.3 47))';
@g3 é aceite mesmo que os pontos de início e fim tenham valores Z diferentes porque os valores Z são ignorados.
@g5 é aceito mesmo que a instância de tipo de geografia não seja válida.
Os exemplos a seguir lançam System.FormatException.
DECLARE @g1 geometry = 'CURVEPOLYGON((0 5, 0 0, 0 0, 0 0))';
DECLARE @g2 geometry = 'CURVEPOLYGON((0 0, 0 0, 0 0))';
@g1 não é aceite porque os pontos inicial e final não têm o mesmo valor Y.
@g2 não é aceite porque o anel não tem pontos suficientes.
Instâncias válidas
Para que uma ocorrência de CurvePolygon seja válida, os anéis externos e internos devem atender aos seguintes critérios:
- Eles só podem tocar em pontos tangenciais únicos.
- Não podem cruzar-se.
- Cada anel deve conter pelo menos quatro pontos.
- Cada anel deve estar num formato de curva aceitável.
As instâncias do CurvePolygon também precisam atender a critérios específicos, dependendo se são tipos de dados de geometria ou geografia .
Tipo de dados de geometria
Uma instância geometryCurvePolygon válida deve ter os seguintes atributos:
- Todos os anéis interiores devem estar contidos no anel exterior.
- Pode ter vários anéis interiores, mas um anel interior não pode conter outro anel interior.
- Nenhum anel pode cruzar-se a si próprio ou a outro anel.
- Os anéis só podem tocar em pontos tangente únicos (número de pontos onde os anéis tocam deve ser finito).
- O interior do polígono tem de estar ligado.
O exemplo a seguir mostra instâncias de geometryCurvePolygon válidas.
DECLARE @g1 geometry = 'CURVEPOLYGON EMPTY';
DECLARE @g2 geometry = 'CURVEPOLYGON(CIRCULARSTRING(1 3, 3 5, 4 7, 7 3, 1 3))';
SELECT @g1.STIsValid(), @g2.STIsValid();
As instâncias CurvePolygon têm as mesmas regras de validade que as instâncias Polygon, com a exceção de que as instâncias CurvePolygon podem aceitar os novos tipos de segmento de arco circular. Para obter mais exemplos de instâncias válidas ou não válidas, consulte Polígono.
Tipo de dados geográficos
Uma instância geographyCurvePolygon válida deve ter os seguintes atributos:
- O interior do polígono é conectado usando a regra da mão esquerda.
- Nenhum anel pode cruzar-se a si próprio ou a outro anel.
- Os anéis só podem tocar em pontos tangente únicos (número de pontos onde os anéis tocam deve ser finito).
- O interior do polígono tem de estar ligado.
O exemplo a seguir mostra uma instância válida de CurvePolygon em geografia.
DECLARE @g geography = 'CURVEPOLYGON((-122.3 47, 122.3 47, 125.7 49, 121 38, -122.3 47))';
SELECT @g.STIsValid();
Examples
A. Instanciar uma instância de geometria com um CurvePolygon vazio
Este exemplo mostra como criar uma ocorrência vazia de CurvePolygon :
DECLARE @g geometry;
SET @g = geometry::Parse('CURVEPOLYGON EMPTY');
B. Declarar e instanciar uma instância de geometria com um CurvePolygon na mesma instrução
Este trecho de código mostra como declarar e inicializar uma ocorrência de geometria com um CurvePolygon na mesma instrução:
DECLARE @g geometry = 'CURVEPOLYGON(CIRCULARSTRING(2 4, 4 2, 6 4, 4 6, 2 4))'
C. Instanciar uma instância de geografia com um CurvePolygon
Este trecho de código mostra como declarar e inicializar uma ocorrência de geografia com um CurvePolygon:
DECLARE @g geography = 'CURVEPOLYGON(CIRCULARSTRING(-122.358 47.653, -122.348 47.649, -122.348 47.658, -122.358 47.658, -122.358 47.653))';
D. Armazene um CurvePolygon com apenas um anel delimitador exterior
Este exemplo mostra como armazenar um círculo simples em uma ocorrência de CurvePolygon (somente um anel delimitador externo é usado para definir o círculo):
DECLARE @g geometry;
SET @g = geometry::Parse('CURVEPOLYGON(CIRCULARSTRING(2 4, 4 2, 6 4, 4 6, 2 4))');
SELECT @g.STArea() AS Area;
E. Armazene um CurvePolygon que contém anéis interiores
Este exemplo cria um donut em uma ocorrência de CurvePolygon (um anel delimitador externo e um anel interior são usados para definir o donut):
DECLARE @g geometry;
SET @g = geometry::Parse('CURVEPOLYGON(CIRCULARSTRING(0 4, 4 0, 8 4, 4 8, 0 4), CIRCULARSTRING(2 4, 4 2, 6 4, 4 6, 2 4))');
SELECT @g.STArea() AS Area;
Este exemplo mostra uma ocorrência válida de CurvePolygon e uma instância inválida ao usar anéis interiores:
DECLARE @g1 geometry, @g2 geometry;
SET @g1 = geometry::Parse('CURVEPOLYGON(CIRCULARSTRING(0 5, 5 0, 0 -5, -5 0, 0 5), (-2 2, 2 2, 2 -2, -2 -2, -2 2))');
IF @g1.STIsValid() = 1
BEGIN
SELECT @g1.STArea();
END
SET @g2 = geometry::Parse('CURVEPOLYGON(CIRCULARSTRING(0 5, 5 0, 0 -5, -5 0, 0 5), (0 5, 5 0, 0 -5, -5 0, 0 5))');
IF @g2.STIsValid() = 1
BEGIN
SELECT @g2.STArea();
END
SELECT @g1.STIsValid() AS G1, @g2.STIsValid() AS G2;
Ambos @g1 e @g2 usam o mesmo anel delimitador exterior: um círculo com um raio de 5, e ambos usam um quadrado para um anel interior. No entanto, a instância @g1 é válida, mas a instância @g2 é inválida. A razão que @g2 é inválida é que o anel interior divide o espaço interior delimitado pelo anel exterior em quatro regiões separadas. O desenho a seguir mostra o que ocorreu: