Présentation des types de données spatialesSpatial Data Types Overview

CETTE RUBRIQUE S’APPLIQUE À :ouiSQL Server (à partir de la version 2012)ouiAzure SQL DatabasenonAzure SQL Data Warehouse nonParallel Data Warehouse THIS TOPIC APPLIES TO:yesSQL Server (starting with 2012)yesAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

Il existe deux types de données spatiales.There are two types of spatial data. Le type de données geometry prend en charge les données planaires, ou euclidiennes (monde en deux dimensions).The geometry data type supports planar, or Euclidean (flat-earth), data. Le type de données geometry se conforme à la fois à la spécification Open Geospatial Consortium (OGC) Simple Features for SQL version 1.1.0. et à la norme SQL MM (norme 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).

De plus, SQL ServerSQL Server prend en charge le type de données geography , qui stocke des données ellipsoïdes (monde sphérique), telles que des coordonnées GPS de latitude et de longitude.In addition, SQL ServerSQL Server supports the geography data type, which stores ellipsoidal (round-earth) data, such as GPS latitude and longitude coordinates.

Important

Pour obtenir une description détaillée et des exemples des nouvelles fonctionnalités spatiales dans SQL Server 2012SQL Server 2012, notamment les optimisations des types de données spatiales, téléchargez le livre blanc New Spatial Features in SQL Server Code-Named "Denali"(Nouvelles fonctions spatiales dans SQL Server nom de code « 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".

Objets de données spatiales Spatial Data Objects

Les types de données geometry et geography prennent en charge seize objets de données spatiales, ou types d’instances.The geometry and geography data types support sixteen spatial data objects, or instance types. Toutefois, seuls onze de ces types d’instances sont instanciables; vous pouvez créer et utiliser ces instances (ou les instancier) dans une base de données.However, only eleven of these instance types are instantiable; you can create and work with these instances (or instantiate them) in a database. Ces instances dérivent certaines propriétés de leurs types de données parents qui les distinguent comme Points, LineStrings, CircularStrings, CompoundCurves, Polygons, CurvePolygons , ou comme instances multiples de geometry ou geography dans un 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. Le typeGeography a un type d’instance supplémentaire, FullGlobe.Geography type has an additional instance type, FullGlobe.

La figure ci-dessous représente la hiérarchie geometry sur laquelle les types de données geometry et geography sont basés.The figure below depicts the geometry hierarchy upon which the geometry and geography data types are based. Les types instanciables de geometry et geography sont indiqués en bleu.The instantiable types of geometry and geography are indicated in blue.

geom_hierarchy

Comme l’indique la figure, les dix types instanciables des types de données geometry et geography sont Point, MultiPoint, LineString, CircularString, MultiLineString, CompoundCurve, Polygon, CurvePolygon, MultiPolygonet 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. Il existe un type instanciable supplémentaire pour le type de données geography : FullGlobe.There is one additional instantiable type for the geography data type: FullGlobe. Les types geometry et geography peuvent reconnaître une instance spécifique du moment qu’il s’agit d’une instance bien formée, même si elle n’est pas définie de manière explicite.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. Par exemple, si vous définissez explicitement une instance Point à l’aide de la méthode STPointFromText(), geometry et geography reconnaissent l’instance comme un Point, du moment que l’entrée de méthode est de forme correcte.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 vous définissez la même instance à l’aide de la méthode STGeomFromText() , les types de données geometry et geography reconnaissent l’instance comme un Point.If you define the same instance using the STGeomFromText() method, both the geometry and geography data types recognize the instance as a Point.

Les sous-types des types geometry et geography sont divisés en types simples et de collection.The subtypes for geometry and geography types are divided into simple and collection types. Certaines méthodes, telles que STNumCurves() , fonctionnent uniquement avec les types simples.Some methods like STNumCurves() work only with simple types.

Exemples de types simples :Simple types include:

Différences entre les types de données geometry et geography Differences Between the geometry and geography Data Types

Les deux types de données spatiales se comportent souvent à peu près de la même façon, mais il existe des différences clés dans la façon dont les données sont stockées et manipulées.The two types of spatial data often behave quite similarly, but there are some key differences in how the data is stored and manipulated.

Mode de définition des arêtes de connexionHow connecting edges are defined

Les données de définition concernant les types LineString et Polygon sont uniquement des sommets.The defining data for LineString and Polygon types are vertices only. L'arête reliant deux sommets dans un type geometry forme une ligne droite.The connecting edge between two vertices in a geometry type is a straight line. Toutefois, l'arête reliant deux sommets dans un type geography est un grand arc elliptique court entre les deux sommets.However, the connecting edge between two vertices in a geography type is a short great elliptic arc between the two vertices. Une grande ellipse correspond à l'intersection de l'ellipsoïde avec un plan passant par son centre tandis qu'un grand arc elliptique est un segment d'arc sur la grande ellipse.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.

Mode de définition des segments d'arc de cercleHow circular arc segments are defined

Les segments d'arc de cercle pour les types geography sont définis sur le plan des coordonnées cartésiennes XY (les valeurs Z sont ignorées).Circular arc segments for geometry types are defined on the XY Cartesian coordinate plane (Z values are ignored). Les segments d'arc de cercle pour les types geography sont définis par des segments de courbe sur une sphère de référence.Circular arc segments for geography types are defined by curve segments on a reference sphere. Toute parallèle sur la sphère de référence peut être définie par deux arcs de cercle complémentaires où les points des deux arcs ont un angle de latitude constant.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.

Mesures dans les types de données spatialesMeasurements in spatial data types

Dans le système planaire, ou monde en deux dimensions, les mesures de distances et de surfaces sont données dans la même unité de mesure que les coordonnées.In the planar, or flat-earth, system, measurements of distances and areas are given in the same unit of measurement as coordinates. Avec le type de données geometry , la distance entre (2, 2) et (5, 6) est 5 unités, quelles que soient les unités utilisées.Using the geometry data type, the distance between (2, 2) and (5, 6) is 5 units, regardless of the units used.

Dans le système ellipsoïdal, ou monde sphérique, les coordonnées sont données en degrés de latitude et de longitude.In the ellipsoidal, or round-earth system, coordinates are given in degrees of latitude and longitude. Toutefois, les longueurs et surfaces sont généralement mesurées en mètres et en mètres carrés, bien que la mesure puisse dépendre de l’identificateur de référence spatiale (SRID) de l’instance 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. L’unité de mesure la plus courante pour le type de données geography est le mètre.The most common unit of measurement for the geography data type is meters.

Orientation des données spatialesOrientation of spatial data

Dans le système planaire, l'orientation d'anneau d'un polygone n'est pas un facteur important.In the planar system, the ring orientation of a polygon is not an important factor. Par exemple, un polygone décrit par ((0, 0), (10, 0), (0, 20), (0, 0)) est le même qu'un polygone décrit par ((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)). La spécification OGC Simple Features for SQL ne stipule pas d'ordonnancement d'anneau et SQL ServerSQL Server n'applique pas d'ordonnancement d'anneau.The OGC Simple Features for SQL Specification does not dictate a ring ordering, and SQL ServerSQL Server does not enforce ring ordering.

Dans un système ellipsoïdal, un polygone n'a aucune signification, ou est ambigu, sans orientation.In an ellipsoidal system, a polygon has no meaning, or is ambiguous, without an orientation. Par exemple, un anneau autour de l'équateur décrit-il l'hémisphère Nord ou Sud ?For example, does a ring around the equator describe the northern or southern hemisphere? Si nous utilisons le type de données geography pour stocker l’instance spatiale, nous devons spécifier l’orientation de l’anneau et décrire précisément l’emplacement de l’instance.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. L'intérieur du polygone dans un système ellipsoïdal est défini par la règle gauche.The interior of the polygon in an ellipsoidal system is defined by the left-hand rule.

Quand le niveau de compatibilité est égal ou inférieur à 100 dans SQL Server 2017SQL Server 2017 , le type de données geography présente les restrictions suivantes :When the compatibility level is 100 or below in SQL Server 2017SQL Server 2017 then the geography data type has the following restrictions:

  • Chaque instance geography doit être contenue à l’intérieur d’un seul hémisphère.Each geography instance must fit inside a single hemisphere. Aucun objet spatial plus grand qu'un hémisphère ne peut être stocké.No spatial objects larger than a hemisphere can be stored.

  • Toute instance geography d’une représentation WKB (Well-Known Binary) ou WKT (Well-Known Text) OGC (Open Geospatial Consortium) qui produit un objet plus grand qu’un hémisphère lève une 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.

  • Les méthodes de type de données geography qui nécessitent l’entrée de deux instances geography , telles que STIntersection(), STUnion(), STDifference() et STSymDifference(), retournent Null si les résultats des méthodes ne s’ajustent pas à l’intérieur d’un seul hémisphère.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() retourne également null si la sortie dépasse un seul hémisphère.STBuffer() will also return null if the output exceeds a single hemisphere.

    Dans SQL Server 2017SQL Server 2017, FullGlobe est un type spécial de polygone qui couvre le globe entier.In SQL Server 2017SQL Server 2017, FullGlobe is a special type of Polygon that covers the entire globe. FullGlobe a une zone, mais aucune bordure ni sommet.FullGlobe has an area, but no borders or vertices.

Les anneaux internes et externes ne sont pas importants dans le type de données geographyOuter and inner rings not important in geography data type

La spécification OGC Simple Features for SQL traite des anneaux externes et internes, mais cette distinction n’a que peu de sens pour le type de données SQL ServerSQL Server geography ; tout anneau d’un polygone peut être accepté comme étant l’anneau externe.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.

Pour plus d'informations sur les spécifications OGC, reportez-vous aux sites Web suivants :For more information on OGC specifications, see the following:

Segments d'arc de cercle Circular Arc Segments

Trois types instanciables acceptent des segments d’arc de cercle : CircularString, CompoundCurveet CurvePolygon.Three instantiable types can take circular arc segments: CircularString, CompoundCurve, and CurvePolygon. Un segment d'arc de cercle est défini par trois points dans un plan à deux dimensions ; le troisième point doit être différent du premier point.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.

Les figures A et B affichent des segments d'arc de cercle types.Figures A and B show typical circular arc segments. Remarquez comment chacun des trois points se situe sur le périmètre d'un cercle.Note how each of the three points lie on the perimeter of a circle.

Les figures C et D montrent comment un segment de ligne peut être défini comme un segment d'arc de cercle.Figures C and D show how a line segment can be defined as a circular arc segment. Notez que trois points sont toujours nécessaires pour définir le segment d'arc de cercle contrairement à un segment de ligne ordinaire qui peut être défini par deux points seulement.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.

Les méthodes qui fonctionnent sur les types de segment d'arc de cercle utilisent des segments de ligne droite pour se rapprocher de l'arc de cercle.Methods operating on circular arc segment types use straight line segments to approximate the circular arc. Le nombre de segments de ligne utilisé pour se rapprocher de l'arc dépend de la longueur et de la courbure de l'arc.The number of line segments used to approximate the arc will depend on the length and curvature of the arc. Les valeurs Z peuvent être stockées pour chacun des types de segment d'arc de cercle ; toutefois, les méthodes n'utilisent pas les valeurs Z dans leurs calculs.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

Si des valeurs Z sont fournies pour les segments d'arc de cercle, elles doivent être identiques pour tous les points dans le segment d'arc de cercle pour que ce dernier soit accepté comme entrée.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. Par exemple, CIRCULARSTRING(0 0 1, 2 2 1, 4 0 1) est autorisé, contrairement à 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.

Comparaison de LineString et de CircularStringLineString and CircularString comparison

Le diagramme suivant montre des triangles isocèles identiques (le triangle A utilise des segments de ligne pour définir le triangle, tandis que le triangle B utilise des segments d'arc de cercle) :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

Cet exemple indique comment stocker les triangles isocèles ci-dessus à l’aide d’une instance LineString et d’une instance 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  

Remarquez qu’une instance CircularString nécessite sept points pour définir le triangle, alors qu’une instance LineString n’en nécessite que quatre.Notice that a CircularString instance requires seven points to define the triangle, but a LineString instance requires only four points to define the triangle. En effet, une instance CircularString stocke des segments d’arc de cercle et non des segments de ligne.The reason for this is that a CircularString instance stores circular arc segments and not line segments. Ainsi, les côtés du triangle stockés dans l’instance CircularString sont ABC, CDE et EFA, alors que les côtés du triangle stockés dans l’instance LineString sont AC, CE et 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.

Prenez l'exemple de l'extrait de code suivant :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];  

Cet extrait de code produira les résultats suivants :This snippet will produce the following results:

LS LengthCS Length  
5.65685…6.28318…  

L’illustration suivante montre le mode de stockage de chaque type (la ligne rouge affiche LineString@g1, la ligne bleue affiche 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

Comme le montre l’illustration ci-dessus, les instances CircularString utilisent moins de points pour stocker des limites de courbe avec une précision supérieure que les instances LineString .As the illustration above shows, CircularString instances use fewer points to store curve boundaries with greater precision than LineString instances. Les instancesCircularString conviennent particulièrement bien au stockage de limites circulaires, comme par exemple un rayon de recherche de 20 kilomètres autour d’un point spécifique.CircularString instances are useful for storing circular boundaries like a twenty-mile search radius from a specific point. Les instancesLineString conviennent particulièrement bien au stockage de limites qui sont linéaires, comme un bloc d’agglomération carré.LineString instances are good for storing boundaries that are linear like a square city block.

Comparaison de LineString et de CompoundCurveLineString and CompoundCurve comparison

Les exemples de code suivants montrent comment stocker la même figure à l’aide des instances LineString et 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))');  

ouor

Dans les exemples ci-dessus, une instance LineString ou une instance CompoundCurve pourrait stocker la figure.In the examples above, either a LineString instance or a CompoundCurve instance could store the figure. L’exemple suivant utilise un CompoundCurve pour stocker un graphique en secteurs :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))');  

Une instance CompoundCurve peut stocker le segment d’arc de cercle (2 2, 1 3, 0 2) directement, alors qu’une instance LineString doit convertir la courbe en plusieurs segments de ligne plus petits.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.

Comparaison de CircularString et de CompoundCurveCircularString and CompoundCurve comparison

L’exemple de code suivant indique comment le graphique en secteurs peut être stocké dans une instance 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();  

Pour stocker le graphique en secteurs à l’aide d’une instance CircularString , il faut utiliser trois points pour chaque segment de ligne.To store the pie slice using a CircularString instance requires that three points be used for each line segment. Si un point intermédiaire n'est pas connu, il doit être calculé ou le point de terminaison du segment de ligne doit être doublé comme le montre l'extrait de code suivant :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)');  

Les instancesCompoundCurve autorisent à la fois les composants LineString and CircularString . Ainsi, seuls deux points des segments de ligne du graphique en secteurs sont nécessaires.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. Cet exemple de code indique comment utiliser un CompoundCurve pour stocker la même figure :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();  

Comparaison de Polygon et de CurvePolygonPolygon and CurvePolygon comparison

Les instancesCurvePolygon peuvent utiliser des instances CircularString et CompoundCurve instances when defining their exterior et interior rings.CurvePolygon instances can use CircularString and CompoundCurve instances when defining their exterior and interior rings. Les instancesPolygone ne peuvent pas utiliser les types de segment d’arc de cercle : CircularString et CompoundCurve.Polygon instances cannot use the circular arc segment types: CircularString and CompoundCurve.

Voir aussiSee Also