Visão geral de tipos de dados espaciaisSpatial Data Types Overview

THIS TOPIC APPLIES TO: yesSQL ServeryesAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse
  • Há dois tipos de dados espaciais.There are two types of spatial data. O tipo de dados geometry dá suporte a dados planares ou a dados euclidianos (planisfério).The geometry data type supports planar, or Euclidean (flat-earth), data. O tipo de dados geometry está de acordo com os Recursos Simples do Open Geospatial Consortium (OGC) para o SQL Specification versão 1.1.0 e compatível com o SQL MM (padrão ISO).The geometry data type both conforms to the Open Geospatial Consortium (OGC) Simple Features for SQL Specification version 1.1.0 and is compliant with SQL MM (ISO standard).
  • Além disso, o SQL ServerSQL Server dá suporte ao tipo de dados geometry que armazena dados elipsoidais (globo), como coordenadas de latitude e longitude de GPS.In addition, SQL ServerSQL Server supports the geography data type, which stores ellipsoidal (round-earth) data, such as GPS latitude and longitude coordinates.
  • -> [!IMPORTANT]
    -> Para obter uma descrição detalhada e exemplos de recursos espaciais apresentados no SQL Server 2012SQL Server 2012, incluindo aprimoramentos nos tipos de dados espaciais, baixe o white paper, New Spatial Features in SQL Server Code-Named "Denali"(Novos recursos espaciais no SQL Server codinome "Denali").-> For a detailed description and examples of spatial features introduced in SQL Server 2012SQL Server 2012, including enhancements to the spatial data types, download the white paper, New Spatial Features in SQL Server Code-Named "Denali".
  • -## Objetos de dados espaciais-## Spatial Data Objects
  • Os tipos de dados geometry e geography oferecem suporte a dezesseis objetos de dados espaciais, ou tipos de instâncias.The geometry and geography data types support sixteen spatial data objects, or instance types. No entanto, apenas onze desses tipos de instâncias podem ser instanciados. É possível criar e trabalhar com essas instâncias (ou criar uma instância delas) em um banco de dados.However, only eleven of these instance types are instantiable; you can create and work with these instances (or instantiate them) in a database. Essas instâncias derivam determinadas propriedades de seus tipos de dados pai que as distingue como Points, LineStrings, CircularStrings, CompoundCurves, Polygons, CurvePolygons ou como instâncias geometry ou geography múltiplas em uma GeometryCollection.These instances derive certain properties from their parent data types that distinguish them as Points, LineStrings, CircularStrings, CompoundCurves, Polygons, CurvePolygons or as multiple geometry or geography instances in a GeometryCollection. O tipoGeography tem um tipo de instância adicional, FullGlobe.Geography type has an additional instance type, FullGlobe.
  • A figura a seguir ilustra a hierarquia geometry na qual os tipos de dados geometry e geography se baseiam.The figure below depicts the geometry hierarchy upon which the geometry and geography data types are based. Os tipos a partir dos quais se podem criar instâncias de geometry e geography são indicados em azul.The instantiable types of geometry and geography are indicated in blue.
  • geom_hierarchy
  • Como a figura indica, os dez tipos dos quais se pode criar uma instância dos tipos de dados geometry e geography são Point, MultiPoint, LineString, CircularString, MultiLineString, CompoundCurve, Polygon, CurvePolygon, MultiPolygone GeometryCollection.As the figure indicates, the ten instantiable types of the geometry and geography data types are Point, MultiPoint, LineString, CircularString, MultiLineString, CompoundCurve, Polygon, CurvePolygon, MultiPolygon, and GeometryCollection. Há um tipo adicional do qual se pode criar uma instância para o tipo de dados de geography: FullGlobe.There is one additional instantiable type for the geography data type: FullGlobe. Os tipos geometry e geography podem reconhecer uma instância específica desde que ela esteja bem-formada, ainda que não esteja definida explicitamente.The geometry and geography types can recognize a specific instance as long as it is a well-formed instance, even if the instance is not defined explicitly. Por exemplo, se você definir uma instância de Point explicitamente usando o método STPointFromText(), geometry e geography a reconhecerão como uma instância de Point, desde que a entrada do método esteja bem formada.For example, if you define a Point instance explicitly using the STPointFromText() method, geometry and geography recognize the instance as a Point, as long as the method input is well-formed. Se você definir a mesma instância usando o método STGeomFromText() , os tipos de dados geometry e geography reconhecem a instância como um Point.If you define the same instance using the STGeomFromText() method, both the geometry and geography data types recognize the instance as a Point.
  • Os subtipos dos tipos geometry e geography são divididos em tipos simples e de coleção.The subtypes for geometry and geography types are divided into simple and collection types. Alguns métodos como STNumCurves() só funcionam com tipos simples.Some methods like STNumCurves() work only with simple types.
  • Os tipos simples incluem:Simple types include:
  • -- Ponto-- Point
  • -- LineString-- LineString
  • -- CircularString-- CircularString
  • -- CompoundCurve-- CompoundCurve
  • -- Polígono-- Polygon
  • -- CurvePolygon-- CurvePolygon
  • Os tipos de coleção incluem:Collection types include:
  • -- MultiPoint-- MultiPoint
  • -- MultiLineString-- MultiLineString
  • -- MultiPolygon-- MultiPolygon
  • -- GeometryCollection-- GeometryCollection
  • -## Diferenças entre os tipos de dados de geometria e geografia-## Differences Between the geometry and geography Data Types
  • Os dois tipos de dados espaciais sempre se comportam de maneira muito semelhante, mas há algumas diferenças importantes na maneira como eles são armazenados e manipulados.The two types of spatial data often behave quite similarly, but there are some key differences in how the data is stored and manipulated.
  • -### Como são definidas bordas de conexão-### How connecting edges are defined
  • Os dados definidos para os tipos LineString e Polygon são somente vértices.The defining data for LineString and Polygon types are vertices only. A borda de conexão entre dois vértices em um tipo geometry é uma linha reta.The connecting edge between two vertices in a geometry type is a straight line. No entanto, a borda de conexão entre dois vértices em um tipo de geografia é um amplo arco elíptico curto entre os dois vértices.However, the connecting edge between two vertices in a geography type is a short great elliptic arc between the two vertices. Uma grande elipse é a interseção do elipsoide com um plano no centro, e um amplo arco elíptico é um segmento de arco na grande elipse.A great ellipse is the intersection of the ellipsoid with a plane through its center and a great elliptic arc is an arc segment on the great ellipse.
  • -### Como são definidos segmentos de arco circular-### How circular arc segments are defined
  • Os segmentos de arco circular para tipos geometry são definidos no plano de coordenadas cartesianas XY (são ignorados valores Z).Circular arc segments for geometry types are defined on the XY Cartesian coordinate plane (Z values are ignored). Os segmentos de arco circular para tipos geography são definidos por segmentos de curva em uma esfera de referência.Circular arc segments for geography types are defined by curve segments on a reference sphere. Qualquer paralelo na esfera de referência pode ser definido por dois arcos circulares complementares, onde os pontos para ambos os arcos têm um ângulo de latitude constante.Any parallel on the reference sphere can be defined by two complementary circular arcs where the points for both arcs have a constant latitude angle.
  • -### Medidas em tipos de dados espaciais-### Measurements in spatial data types
  • No sistema planar ou de terra plana, as medidas de distâncias e de áreas são fornecidas na mesma unidade de medida das coordenadas.In the planar, or flat-earth, system, measurements of distances and areas are given in the same unit of measurement as coordinates. Usando o tipo de dados geometry , a distância entre (2, 2) e (5, 6) é de 5 unidades, independentemente das unidades usadas.Using the geometry data type, the distance between (2, 2) and (5, 6) is 5 units, regardless of the units used.
  • No sistema elipsoidal ou de terra redonda, as coordenadas são fornecidas em graus de latitude ou de longitude.In the ellipsoidal, or round-earth system, coordinates are given in degrees of latitude and longitude. No entanto os comprimentos e áreas são normalmente medidos em metros e metros quadrados, embora a medida possa depender do SRID (identificador de referência espacial) da instância de geography .However, lengths and areas are usually measured in meters and square meters, though the measurement may depend on the spatial reference identifier (SRID) of the geography instance. A unidade de medida mais comum para o tipo de dados geography é em metros.The most common unit of measurement for the geography data type is meters.
  • -### Orientação de dados espaciais-### Orientation of spatial data
  • No sistema de planar, a orientação de anel de um polígono não é um fator importante.In the planar system, the ring orientation of a polygon is not an important factor. Por exemplo, um polígono descrito por ((0, 0), (10, 0), (0, 20), (0, 0)) é o mesmo que um polígono descrito por ((0, 0), (0, 20), (10, 0), (0, 0)).For example, a polygon described by ((0, 0), (10, 0), (0, 20), (0, 0)) is the same as a polygon described by ((0, 0), (0, 20), (10, 0), (0, 0)). Os Recursos Simples do OGC para SQL Specification não ditam uma ordenação de anel e o SQL ServerSQL Server não impõe ordenação de anel.The OGC Simple Features for SQL Specification does not dictate a ring ordering, and SQL ServerSQL Server does not enforce ring ordering.
  • Em um sistema elipsoidal, um polígono não tem nenhum significado ou é ambíguo, sem uma orientação.In an ellipsoidal system, a polygon has no meaning, or is ambiguous, without an orientation. Por exemplo, um anel ao redor do equador descreve o hemisfério norte ou o sul?For example, does a ring around the equator describe the northern or southern hemisphere? Se usarmos o tipo de dados geography para armazenar a instância espacial, deveremos especificar a orientação do anel e descrever precisamente o local da instância.If we use the geography data type to store the spatial instance, we must specify the orientation of the ring and accurately describe the location of the instance. O interior do polígono em um sistema elipsoidal é definido pela regra à esquerda.The interior of the polygon in an ellipsoidal system is defined by the left-hand rule.
  • Quando o nível de compatibilidade é 100 ou abaixo no SQL Server 2017SQL Server 2017 , o tipo de dados geography tem as seguintes restrições:When the compatibility level is 100 or below in SQL Server 2017SQL Server 2017 then the geography data type has the following restrictions:
  • -- Cada instância de geography deve se ajustar dentro de um único hemisfério.-- Each geography instance must fit inside a single hemisphere. Nenhum objeto espacial maior do que um hemisfério pode ser armazenado.No spatial objects larger than a hemisphere can be stored.
  • -- Qualquer instância de geography de uma representação WKT (Well-Known Text) ou WKB (Well-Known Binary) do Open Geospatial Consortium (OGC) que reproduza um objeto maior do que um hemisfério aciona uma ArgumentException.-- Any geography instance from an Open Geospatial Consortium (OGC) Well-Known Text (WKT) or Well-Known Binary (WKB) representation that produces an object larger than a hemisphere throws an ArgumentException.
  • -- Os métodos de tipo de dados geography que requerem a entrada de duas instâncias de geography, como STIntersection(), STUnion(), STDifference() e STSymDifference(), retornarão nulo se os resultados dos métodos não se ajustarem dentro de um único hemisfério.-- The geography data type methods that require the input of two geography instances, such as STIntersection(), STUnion(), STDifference(), and STSymDifference(), will return null if the results from the methods do not fit inside a single hemisphere. STBuffer() também retornará nulo se a saída ultrapassar um único hemisfério.STBuffer() will also return null if the output exceeds a single hemisphere.
  • No SQL Server 2017SQL Server 2017, FullGlobe é um tipo especial de polígono que abrange o globo inteiro.In SQL Server 2017SQL Server 2017, FullGlobe is a special type of Polygon that covers the entire globe. FullGlobe tem uma área, mas nenhuma borda ou vértices.FullGlobe has an area, but no borders or vertices.
  • -### Anéis externos e internos não são importantes no tipo de dados geography-### Outer and inner rings not important in geography data type
  • Os Recursos Simples do OGC para SQL Specification discutem anéis externos e internos, mas essa distinção faz pouco sentido para o tipo de dados SQL ServerSQL Server geometry : qualquer anel de um polígono pode ser usado como anel externo.The OGC Simple Features for SQL Specification discusses outer rings and inner rings, but this distinction makes little sense for the SQL ServerSQL Server geography data type; any ring of a polygon can be taken to be the outer ring.
  • Para obter mais informações sobre especificações do OCG, consulte o seguinte:For more information on OGC specifications, see the following:
  • -- Especificações do OGC, acesso de recurso simples parte 1 – Arquitetura comum-- OGC Specifications, Simple Feature Access Part 1 - Common Architecture
  • -- Especificações do OGC, acesso de recurso simples parte 2 – opções de SQL-- OGC Specifications, Simple Feature Access Part 2 – SQL Options
  • -## Segmentos de arco circular-## Circular Arc Segments
  • Três tipos instanciáveis podem adotar segmentos de arco circular: CircularString, CompoundCurvee CurvePolygon.Three instantiable types can take circular arc segments: CircularString, CompoundCurve, and CurvePolygon. Um segmento de arco circular é definido por três pontos em um plano bidimensional, e o terceiro ponto não pode ser igual ao primeiro.A circular arc segment is defined by three points in a two dimensional plane and the third point cannot be the same as the first point.
  • As figuras A e B mostram segmentos de arco circular típicos.Figures A and B show typical circular arc segments. Observe como cada um dos três pontos se situa no perímetro de um círculo.Note how each of the three points lie on the perimeter of a circle.
  • As figuras C e D mostram como um segmento de linha pode ser definido como um segmento de arco circular.Figures C and D show how a line segment can be defined as a circular arc segment. Observe que três pontos ainda são necessários para definir o segmento de arco circular, ao contrário de um segmento de linha normal, que pode ser definido por apenas dois pontos.Note that three points are still needed to define the circular arc segment unlike a regular line segment which can be defined by just two points.
  • Os métodos que operam em tipos de segmento de arco circular usam segmentos de linha reta para aproximar o arco circular. O número de segmentos de linha usado para aproximar o arco dependerá do comprimento e da curvatura do arco. Podem ser armazenados valores Z para cada um dos tipos de segmento de arco circular; porém, os métodos não usarão os valores Z em seus cálculos.Methods operating on circular arc segment types use straight line segments to approximate the circular arc. The number of line segments used to approximate the arc will depend on the length and curvature of the arc. Z values can be stored for each of the circular arc segment types; however, methods will not use the Z values in their calculations.
  • -> [!NOTE]
    -> Se forem fornecidos valores Z para segmentos de arco circular, eles deverão ser iguais para todos os pontos no segmento de arco circular para que o segmento seja aceito para entrada.-> If Z values are given for circular arc segments then they must be the same for all points in the circular arc segment for it to be accepted for input. Por exemplo, CIRCULARSTRING(0 0 1, 2 2 1, 4 0 1) é aceito, mas CIRCULARSTRING(0 0 1, 2 2 2, 4 0 1) não é.For example: CIRCULARSTRING(0 0 1, 2 2 1, 4 0 1) is accepted, but CIRCULARSTRING(0 0 1, 2 2 2, 4 0 1) is not accepted.
  • -### Comparação de LineString e CircularString-### LineString and CircularString comparison
  • O diagrama a seguir mostra triângulos isósceles idênticos (o triângulo A usa segmentos de linha para definir o triângulo, e o triângulo B usa segmentos de arco circular para definir o triângulo):The following diagram shows identical isosceles triangles (triangle A uses line segments to define the triangle and triangle B uses circular arc segments to defined the triangle):
  • 7e382f76-59da-4b62-80dc-caf93e637c14
  • Este exemplo mostra como armazenar os triângulos isósceles anteriores que usam uma instância LineString e uma CircularString :This example shows how to store the above isosceles triangles using both a LineString instance and CircularString instance:
  • -\`tsql</span><span class="sxs-lookup"><span data-stu-id="7a722-187">-`tsql
    -DECLARE @g1 geometry;-DECLARE @g1 geometry;
    -DECLARE @g2 geometry;-DECLARE @g2 geometry;
    -SET @g1 = geometry::STGeomFromText('LINESTRING(1 1, 5 1, 3 5, 1 1)', 0);-SET @g1 = geometry::STGeomFromText('LINESTRING(1 1, 5 1, 3 5, 1 1)', 0);
    -SET @g2 = geometry::STGeomFromText('CIRCULARSTRING(1 1, 3 1, 5 1, 4 3, 3 5, 2 3, 1 1)', 0);-SET @g2 = geometry::STGeomFromText('CIRCULARSTRING(1 1, 3 1, 5 1, 4 3, 3 5, 2 3, 1 1)', 0);
    -IF @g1.STIsValid() = 1 AND @g2.STIsValid() = 1-IF @g1.STIsValid() = 1 AND @g2.STIsValid() = 1
  • BEGINBEGIN
  • SELECT @g1.ToString(), @g2.ToString()SELECT @g1.ToString(), @g2.ToString()
  • SELECT @g1.STLength() AS [LS Length], @g2.STLength() AS [CS Length]SELECT @g1.STLength() AS [LS Length], @g2.STLength() AS [CS Length]
  • ENDEND
    -```
  • Note que uma instância CircularString requer sete pontos para definir o triângulo, mas uma instância LineString requer somente quatro pontos para definir o triângulo.Notice that a CircularString instance requires seven points to define the triangle, but a LineString instance requires only four points to define the triangle. O motivo para isso é que uma instância CircularString armazena segmentos de arco circular e não segmentos de linha.The reason for this is that a CircularString instance stores circular arc segments and not line segments. Portanto, os lados do triângulo armazenados na instância CircularString são ABC, CDE e EFA, ao passo que os lados do triângulo armazenados na instância LineString são AC, CE e EA.So the sides of the triangle stored in the CircularString instance are ABC, CDE, and EFA whereas the sides of the triangle stored in the LineString instance are AC, CE, and EA.
  • Considere o seguinte trecho de código:Consider the following code snippet:
  • -tsql -SET @g1 = geometry::STGeomFromText('LINESTRING(0 0, 2 2, 4 0)', 0); -SET @g2 = geometry::STGeomFromText('CIRCULARSTRING(0 0, 2 2, 4 0)', 0); -SELECT @g1.STLength() AS [LS Length], @g2.STLength() AS [CS Length]; -
  • Esse trecho produzirá os seguintes resultados:This snippet will produce the following results:
  • --LS LengthCS Length -5.65685…6.28318… -
  • A ilustração a seguir mostra como cada tipo é armazenado (a linha vermelha mostra LineString@g1e a linha azul mostra CircularString@g2):The following illustration shows how each type is stored (red line shows LineString@g1, blue line shows CircularString@g2):
  • e52157b5-5160-4a4b-8560-50cdcf905b76
  • Como a ilustração acima mostra, as instâncias CircularString usam menos pontos para armazenar limites de curva com maior precisão que instâncias LineString .As the illustration above shows, CircularString instances use fewer points to store curve boundaries with greater precision than LineString instances. As instânciasCircularString são úteis para armazenar limites circulares como um raio de pesquisa de vinte milhas de um ponto específico.CircularString instances are useful for storing circular boundaries like a twenty-mile search radius from a specific point. InstânciasLineString são boas para armazenar limites que são lineares como um quarteirão de cidade.LineString instances are good for storing boundaries that are linear like a square city block.
  • -### Comparação de LineString e CompoundCurve-### LineString and CompoundCurve comparison
  • Os exemplos de código seguintes mostram como armazenar a mesma figura usando instâncias LineString e CompoundCurve :The following code examples show how to store the same figure using LineString and CompoundCurve instances:
  • -tsql -SET @g = geometry::Parse('LINESTRING(2 2, 4 2, 4 4, 2 4, 2 2)'); -SET @g = geometry::Parse('COMPOUNDCURVE((2 2, 4 2), (4 2, 4 4), (4 4, 2 4), (2 4, 2 2))'); -SET @g = geometry::Parse('COMPOUNDCURVE((2 2, 4 2, 4 4, 2 4, 2 2))'); -
  • ouor
  • Nos exemplos anteriores, uma instância LineString ou uma instância CompoundCurve poderiam armazenar a figura.In the examples above, either a LineString instance or a CompoundCurve instance could store the figure. Este próximo exemplo usa uma CompoundCurve para armazenar uma fatia de pizza:This next example uses a CompoundCurve to store a pie slice:
  • -tsql -SET @g = geometry::Parse('COMPOUNDCURVE(CIRCULARSTRING(2 2, 1 3, 0 2),(0 2, 1 0, 2 2))'); -
  • Uma instância CompoundCurve pode armazenar o segmento de arco circular (2 2, 1 3, 0 2) diretamente, ao passo que uma instância LineString teria que converter a curva em vários segmentos de linha menores.A CompoundCurve instance can store the circular arc segment (2 2, 1 3, 0 2) directly whereas a LineString instance would have to convert the curve into several smaller line segments.
  • -### Comparação de CircularString e CompoundCurve-### CircularString and CompoundCurve comparison
  • O exemplo de código a seguir mostra como a fatia de pizza pode ser armazenada em uma instância CircularString :The following code example shows how the pie slice can be stored in a CircularString instance:
  • -tsql -DECLARE @g geometry; -SET @g = geometry::Parse('CIRCULARSTRING( 0 0, 1 2.1082, 3 6.3246, 0 7, -3 6.3246, -1 2.1082, 0 0)'); -SELECT @g.ToString(), @g.STLength(); -
  • Para armazenar a fatia de pizza usando uma instância CircularString , é necessário que três pontos sejam usados para cada segmento de linha.To store the pie slice using a CircularString instance requires that three points be used for each line segment. Se um ponto intermediário não for conhecido, ele deverá ser calculado ou o ponto de extremidade do segmento de linha deverá ser dobrado como mostra o seguinte trecho de código:If an intermediate point is not known, it either has to be calculated or the endpoint of the line segment has to be doubled as the following snippet shows:
  • -tsql -SET @g = geometry::Parse('CIRCULARSTRING( 0 0, 3 6.3246, 3 6.3246, 0 7, -3 6.3246, 0 0, 0 0)'); -
  • As instânciasCompoundCurve permitem componentes LineString e CircularString , de forma que somente dois pontos para os segmentos de linha da fatia de pizza precisam ser conhecidos.CompoundCurve instances allow both LineString and CircularString components so that only two points to the line segments of the pie slice need to be known. Este exemplo de código mostra como usar uma CompoundCurve para armazenar a mesma figura:This code example shows how to use a CompoundCurve to store the same figure:
  • -tsql -DECLARE @g geometry; -SET @g = geometry::Parse('COMPOUNDCURVE(CIRCULARSTRING( 3 6.3246, 0 7, -3 6.3246), (-3 6.3246, 0 0, 3 6.3246))'); -SELECT @g.ToString(), @g.STLength(); -
  • -### Comparação de Polygon e CurvePolygon-### Polygon and CurvePolygon comparison
  • InstânciasCurvePolygon podem usar instâncias CircularString e CompoundCurve instances when defining their exterior e interior rings.CurvePolygon instances can use CircularString and CompoundCurve instances when defining their exterior and interior rings. InstânciasPolygon não podem usar os tipos de segmento de arco circular: CircularString e CompoundCurve.Polygon instances cannot use the circular arc segment types: CircularString and CompoundCurve.
  • -## Confira também-## See Also
    - -- Dados espaciais (SQL Server) -- referência de método do tipo de dados geometry -- referência de método do tipo de dados geography -- Spatial Data (SQL Server) -- geometry Data Type Method Reference -- geography Data Type Method Reference
    -- STNumCurves (Tipo de dados geometry) -- STNumCurves (geometry Data Type)
    -- STNumCurves (Tipo de dados geography) -- STNumCurves (geography Data Type)
    -- STGeomFromText (Tipo de dados geometry) -- STGeomFromText (geometry Data Type)
    -- STGeomFromText (tipo de dados geography)-- STGeomFromText (geography Data Type)