Información general de los tipos de datos espacialesSpatial Data Types Overview

ESTE TEMA SE APLICA A:síSQL Server (a partir de 2012)síAzure SQL DatabasenoAzure SQL Data Warehouse noAlmacenamiento de datos paralelos THIS TOPIC APPLIES TO:yesSQL Server (starting with 2012)yesAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

Hay dos tipos de datos espaciales.There are two types of spatial data. El tipo de datos geometry admite datos planares o euclidianos (planisferio).The geometry data type supports planar, or Euclidean (flat-earth), data. El tipo de datos geometry se ajusta tanto a las características simples de Open Geospatial Consortium (OGC) para la especificación SQL versión 1.1.0 como a SQL MM (estándar 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).

Además, SQL ServerSQL Server admite el tipo de datos geography , que almacena datos elipsoidales (tierra redonda), como coordenadas de latitud y longitud GPS.In addition, SQL ServerSQL Server supports the geography data type, which stores ellipsoidal (round-earth) data, such as GPS latitude and longitude coordinates.

Importante

Para obtener una descripción detallada y ejemplos de las características espaciales introducidas en SQL Server 2012SQL Server 2012, incluidas las mejoras en los tipos de datos espaciales, descargue las notas del producto Nuevas características espaciales de SQL Server Code-Named "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 datos espaciales Spatial Data Objects

Los tipos de datos geometry y geography admiten dieciséis objetos de datos espaciales o tipos de instancia.The geometry and geography data types support sixteen spatial data objects, or instance types. Pero solo se pueden crear instanciasde once de estos tipos de instancia; puede crear y trabajar con estas instancias (o crear instancias de ellas) en una base de datos.However, only eleven of these instance types are instantiable; you can create and work with these instances (or instantiate them) in a database. Estas instancias obtienen determinadas propiedades de sus tipos de datos primarios que los distinguen como Points, LineStrings, CircularStrings, CompoundCurves, Polygons, CurvePolygons o como varias instancias de geometry o geography en una 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. El tipoGeography tiene un tipo de instancia adicional, FullGlobe.Geography type has an additional instance type, FullGlobe.

La figura siguiente describe la jerarquía de geometry en la que se basan los tipos de datos geometry y geography .The figure below depicts the geometry hierarchy upon which the geometry and geography data types are based. Los tipos a partir de los que pueden crearse instancias de geometry y geography se indican en azul.The instantiable types of geometry and geography are indicated in blue.

geom_hierarchy

Como la figura indica, los diez tipos a partir de los que pueden crearse instancias de los tipos de datos geometry y geography son Point, MultiPoint, LineString, CircularString, MultiLineString, CompoundCurve, Polygon, CurvePolygon, MultiPolygony 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. Existe un tipo adicional a partir del que pueden crearse instancias para el tipo de datos Geography: FullGlobe.There is one additional instantiable type for the geography data type: FullGlobe. Los tipos geometry y geography pueden reconocer una instancia concreta siempre y cuando se trate de una instancia bien formada, aunque no se haya definido explícitamente.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 ejemplo, si define una instancia Point usando explícitamente el método STPointFromText(), geometry y geography reconocen la instancia como Point, con tal de que la entrada de método esté bien 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. Si define la misma instancia mediante el método STGeomFromText() , los tipos de datos geometry y geography reconocen la instancia como Point.If you define the same instance using the STGeomFromText() method, both the geometry and geography data types recognize the instance as a Point.

Los subtipos de los tipos Geometry y Geography se dividen en tipos simples y de colección.The subtypes for geometry and geography types are divided into simple and collection types. Algunos métodos como STNumCurves() funcionan solo con los tipos simples.Some methods like STNumCurves() work only with simple types.

Los tipos simples incluyen:Simple types include:

Diferencias entre los tipos de datos geometry y geography Differences Between the geometry and geography Data Types

Los dos tipos de datos espaciales se comportan a menudo de manera bastante similar pero hay algunas diferencias clave en la manera en la que los datos se almacenan y se manipulan.The two types of spatial data often behave quite similarly, but there are some key differences in how the data is stored and manipulated.

Definición de bordes de conexiónHow connecting edges are defined

Los datos de definición para los tipos LineString y Polygon son solo los vértices.The defining data for LineString and Polygon types are vertices only. El borde de conexión entre dos vértices en un tipo Geometría es una línea recta.The connecting edge between two vertices in a geometry type is a straight line. Sin embargo, el borde de conexión entre dos vértices en un tipo de geografía es un arco elíptico grande corto entre los dos vértices.However, the connecting edge between two vertices in a geography type is a short great elliptic arc between the two vertices. Una elipse grande es la intersección del elipsoide con un plano por su centro y un arco elíptico grande es un segmento de arco de la elipse grande.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.

Definición de los segmentos de arco circularHow circular arc segments are defined

Los segmentos de arco circular para los tipos Geometry se definen en el plano de coordenadas cartesianas XY (se ignoran los valores Z).Circular arc segments for geometry types are defined on the XY Cartesian coordinate plane (Z values are ignored). Los segmentos de arco circular para los tipos Geography se definen mediante segmentos de curva en una esfera de referencia.Circular arc segments for geography types are defined by curve segments on a reference sphere. Los paralelos de la esfera de referencia se pueden definir mediante dos arcos circulares complementarios en los que los puntos de ambos arcos tienen un ángulo de latitud 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 en tipos de datos espacialesMeasurements in spatial data types

En el sistema plano, o de tierra plana, las medidas de distancias y las áreas se proporcionan en la misma unidad de medida que las coordenadas.In the planar, or flat-earth, system, measurements of distances and areas are given in the same unit of measurement as coordinates. Usando el tipo de datos geometry , la distancia entre (2, 2) y (5, 6) es 5 unidades, independientemente de las unidades usadas.Using the geometry data type, the distance between (2, 2) and (5, 6) is 5 units, regardless of the units used.

En el sistema elíptico o de tierra redonda, las coordenadas se proporcionan en grados de latitud y longitud.In the ellipsoidal, or round-earth system, coordinates are given in degrees of latitude and longitude. Pero las longitudes y las áreas normalmente se miden en metros y metros cuadrados, aunque la medida puede depender del identificador de referencia espacial (SRID) de la instancia 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. La unidad de medida más común para el tipo de datos geography es el metro.The most common unit of measurement for the geography data type is meters.

Orientación de datos espacialesOrientation of spatial data

En el sistema plano, la orientación de anillo de un polígono no es un factor importante.In the planar system, the ring orientation of a polygon is not an important factor. Por ejemplo, un polígono descrito por ((0, 0), (10, 0), (0, 20), (0, 0)) es igual que un 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)). Las características simples de OGC para la especificación de SQL no dictan una ordenación de anillos y SQL ServerSQL Server no exige la ordenación de anillos.The OGC Simple Features for SQL Specification does not dictate a ring ordering, and SQL ServerSQL Server does not enforce ring ordering.

En un sistema elíptico, un polígono no tiene ningún significado, o es ambiguo, sin una orientación.In an ellipsoidal system, a polygon has no meaning, or is ambiguous, without an orientation. Por ejemplo, ¿un anillo alrededor del ecuador describe el hemisferio norte o el hemisferio sur?For example, does a ring around the equator describe the northern or southern hemisphere? Si usamos el tipo de datos geography para almacenar la instancia espacial, debemos especificar la orientación del anillo y describir con precisión la ubicación de la instancia.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. El interior del polígono de un sistema elipsoidal se define mediante la regla de la mano izquierda.The interior of the polygon in an ellipsoidal system is defined by the left-hand rule.

Cuando el nivel de compatibilidad es 100 o menor en SQL Server 2017SQL Server 2017 , el tipo de datos geography tiene las siguientes restricciones:When the compatibility level is 100 or below in SQL Server 2017SQL Server 2017 then the geography data type has the following restrictions:

  • Cada instancia de geography debe ajustarse en un hemisferio único.Each geography instance must fit inside a single hemisphere. No se puede almacenar ningún objeto espacial mayor que un hemisferio.No spatial objects larger than a hemisphere can be stored.

  • Cualquier instancia de geography de una representación Well-Known Text (WKT) o Well-Known Binary (WKB) de Open Geospatial Consortium (OGC) que genera un objeto mayor que un hemisferio inicia una 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.

  • Los métodos del tipo de datos geography que requieren la entrada de dos instancias de geography , como STIntersection(), STUnion(), STDifference() y STSymDifference(), devolverán NULL si los resultados de los métodos no se ajustan en un hemisferio único.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() también devolverá NULL si la salida supera un único hemisferio.STBuffer() will also return null if the output exceeds a single hemisphere.

    En SQL Server 2017SQL Server 2017, FullGlobe es un tipo especial de Polygon que abarca el mundo entero.In SQL Server 2017SQL Server 2017, FullGlobe is a special type of Polygon that covers the entire globe. FullGlobe tiene un área, pero no tiene bordes o vértices.FullGlobe has an area, but no borders or vertices.

Anillos externos e internos no importantes en el tipo de datos GeographyOuter and inner rings not important in geography data type

Las características simples de OGC para la especificación de SQL analizan los anillos externos e internos, pero esta distinción tiene poco sentido para el tipo de datos SQL ServerSQL Server geography ; se puede tomar cualquier anillo de un polígono como anillo 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 obtener más información acerca de las especificaciones de OGC, vea lo siguiente:For more information on OGC specifications, see the following:

Segmentos de arco circular Circular Arc Segments

Tres tipos instanciables pueden tomar segmentos de arco circular: CircularString, CompoundCurvey CurvePolygon.Three instantiable types can take circular arc segments: CircularString, CompoundCurve, and CurvePolygon. Un segmento de arco circular se define mediante tres puntos en un plano bidimensional y el tercer punto no puede ser igual que el primero.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.

Las figuras A y B muestran segmentos de arco circular.Figures A and B show typical circular arc segments. Observe que cada uno de los tres puntos pertenece al perímetro de un círculo.Note how each of the three points lie on the perimeter of a circle.

Las figuras C y D muestran cómo se puede definir el segmento de una línea como segmento de arco circular.Figures C and D show how a line segment can be defined as a circular arc segment. Observe que esos tres puntos continúan siendo necesarios para definir el segmento de arco circular a diferencia de un segmento de línea normal que se puede definir mediante dos puntos únicamente.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.

Los métodos que funcionan en tipos de segmentos de arco circular usan segmentos de línea recta para aproximarse al arco circular.Methods operating on circular arc segment types use straight line segments to approximate the circular arc. El número de segmentos de línea utilizado para aproximarse al arco dependerá de su longitud y curvatura.The number of line segments used to approximate the arc will depend on the length and curvature of the arc. Los valores Z se pueden almacenar para cada uno de los tipos de segmentos de arco circular; sin embargo, los métodos no usarán los valores Z en sus cálculos.Z values can be stored for each of the circular arc segment types; however, methods will not use the Z values in their calculations.

Nota

Si se dan valores Z para los segmentos de arco circular, deben ser iguales para todos los puntos del segmento de arco circular para que se acepte como 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 ejemplo: se acepta CIRCULARSTRING(0 0 1, 2 2 1, 4 0 1) , pero no se acepta CIRCULARSTRING(0 0 1, 2 2 2, 4 0 1) .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.

Comparación de LineString y CircularStringLineString and CircularString comparison

En el siguiente diagrama se muestran triángulos isósceles idénticos (el triángulo A usa segmentos de línea para definir el triángulo y el triángulo B, segmentos de arco circular):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

En este ejemplo se muestra cómo almacenar los triángulos isósceles anteriores tanto con una instancia de LineString como con una instancia de CircularString :This example shows how to store the above isosceles triangles using both a LineString instance and CircularString instance:

DECLARE @g1 geometry;  
DECLARE @g2 geometry;  
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);  
IF @g1.STIsValid() = 1 AND @g2.STIsValid() = 1  
  BEGIN  
      SELECT @g1.ToString(), @g2.ToString()  
      SELECT @g1.STLength() AS [LS Length], @g2.STLength() AS [CS Length]  
  END  

Tenga en cuenta que una instancia de CircularString requiere siete puntos para definir el triángulo, pero una instancia de LineString requiere solo cuatro puntos para definir el 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. Esto se debe a que una instancia de CircularString almacena los segmentos de arco circular y no los de línea.The reason for this is that a CircularString instance stores circular arc segments and not line segments. Por tanto, los lados del triángulo almacenado en la instancia de CircularString son ABC, CDE y EFA mientras que los del triángulo almacenado en la instancia de LineString son AC, CE y 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 el fragmento de código siguiente:Consider the following code snippet:

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];  

Este fragmento de código generará los siguientes resultados:This snippet will produce the following results:

LS LengthCS Length  
5.65685…6.28318…  

En la ilustración siguiente se muestra cómo se almacena cada tipo (la línea roja indica LineString @g1 y la azul, 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 se muestra en la ilustración anterior, las instancias de CircularString usan menos puntos para almacenar límites curvos con mayor precisión que las instancias de LineString .As the illustration above shows, CircularString instances use fewer points to store curve boundaries with greater precision than LineString instances. Las instancias deCircularString son útiles para almacenar límites circulares, como un radio de búsqueda de veinte millas desde un punto específico.CircularString instances are useful for storing circular boundaries like a twenty-mile search radius from a specific point. Las instancias deLineString funcionan bien para almacenar límites que son lineales como un bloque de ciudad cuadrado.LineString instances are good for storing boundaries that are linear like a square city block.

Comparación de LineString y CompoundCurveLineString and CompoundCurve comparison

En los siguientes ejemplos de código se muestra cómo almacenar la misma figura con instancias de LineString y CompoundCurve :The following code examples show how to store the same figure using LineString and CompoundCurve instances:

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))');  

oor

En los ejemplos anteriores, una instancia de LineString o un instancia de CompoundCurve pudieron almacenar la figura.In the examples above, either a LineString instance or a CompoundCurve instance could store the figure. En el siguiente ejemplo se usa CompoundCurve para almacenar un segmento de gráfico circular:This next example uses a CompoundCurve to store a pie slice:

SET @g = geometry::Parse('COMPOUNDCURVE(CIRCULARSTRING(2 2, 1 3, 0 2),(0 2, 1 0, 2 2))');  

Una instancia de CompoundCurve puede almacenar directamente el segmento de arco circular (2 2, 1 3, 0 2), mientras que una instancia de LineString tendría que convertir la curva en varios segmentos de línea más pequeños.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.

Comparación de CircularString y CompoundCurveCircularString and CompoundCurve comparison

En el siguiente ejemplo de código se muestra cómo se puede almacenar el segmento de gráfico circular en una instancia de CircularString :The following code example shows how the pie slice can be stored in a CircularString instance:

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 almacenar el segmento de gráfico circular mediante una instancia de CircularString se requiere que se usen tres puntos para cada segmento de línea.To store the pie slice using a CircularString instance requires that three points be used for each line segment. Si no se conoce un punto intermedio, se debe calcular o se debe duplicar el extremo del segmento de línea como muestra el siguiente fragmento 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:

SET @g = geometry::Parse('CIRCULARSTRING( 0 0, 3 6.3246, 3 6.3246, 0 7, -3 6.3246, 0 0, 0 0)');  

Las instancias deCompoundCurve permiten componentes tanto de LineString como de CircularString para que solo se necesiten conocer dos puntos en los segmentos de línea del segmento de gráfico circular.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. En este ejemplo de código se muestra cómo usar CompoundCurve para almacenar la misma figura:This code example shows how to use a CompoundCurve to store the same figure:

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();  

Comparación de Polygon y CurvePolygonPolygon and CurvePolygon comparison

Las instancias deCurvePolygon pueden usar las instancias de CircularString y CompoundCurve instances when defining their exterior y interior rings.CurvePolygon instances can use CircularString and CompoundCurve instances when defining their exterior and interior rings. Las instancias dePolygon no pueden usar los tipos de segmento de arco circular: CircularString y CompoundCurve.Polygon instances cannot use the circular arc segment types: CircularString and CompoundCurve.

Vea tambiénSee Also