Panoramica dei tipi di dati spazialiSpatial Data Types Overview

QUESTO ARGOMENTO SI APPLICA A:sìSQL Server (a partire dalla versione 2012)sìDatabase SQL di AzurenoAzure SQL Data Warehouse noParallel Data Warehouse THIS TOPIC APPLIES TO:yesSQL Server (starting with 2012)yesAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

  • Esistono due tipi di dati spaziali.There are two types of spatial data. Il tipo di dati geometry supporta dati planari o euclidei (terra piatta).The geometry data type supports planar, or Euclidean (flat-earth), data. Il tipo di dati geometry è conforme a Open Geospatial Consortium (OGC) Simple Features for SQL Specification versione 1.1.0 e a SQL MM (standard 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).
  • Inoltre, SQL ServerSQL Server supporta il tipo di dati geography , che archivia dati ellissoidali (terra rotonda), ad esempio coordinate di latitudine e longitudine 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]
    -> Per una descrizione dettagliata e alcuni esempi delle funzionalità spaziali introdotte in SQL Server 2012SQL Server 2012, tra cui i miglioramenti apportati ai tipi di dati spaziali, scaricare il white paper Nuove funzionalità spaziali in SQL Server nome in codice "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".
  • -## Oggetti dati spaziali-## Spatial Data Objects
  • I tipi di dati geometry e geography supportano sedici oggetti dati spaziali o tipi di istanza.The geometry and geography data types support sixteen spatial data objects, or instance types. Solo per undici di questi tipi di istanza, tuttavia, è possibile creare istanze. È possibile creare e usare queste istanze (o crearne un'istanza) in un database.However, only eleven of these instance types are instantiable; you can create and work with these instances (or instantiate them) in a database. Queste istanze derivano determinate proprietà dai relativi tipi di dati padre che consentono di distinguerle come Points, LineStrings, CircularStrings, CompoundCurves, Polygons, CurvePolygons o come più istanze di geometry o geography in un oggetto 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. Il tipoGeography dispone di un tipo di istanza aggiuntivo, FullGlobe.Geography type has an additional instance type, FullGlobe.
  • Nella figura seguente viene illustrata la gerarchia geometry sulla quale si basano i tipi di dati geometry e geography .The figure below depicts the geometry hierarchy upon which the geometry and geography data types are based. I tipi di geometry e geography di cui è possibile creare istanze sono indicati in blu.The instantiable types of geometry and geography are indicated in blue.
  • geom_hierarchy
  • Come indicato nella figura, i dieci tipi di cui è possibile creare istanze dei tipi di dati geometry e geography sono 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. Vi è un tipo aggiuntivo di cui è possibile creare istanze per il tipo di dati geography, ovvero FullGlobe.There is one additional instantiable type for the geography data type: FullGlobe. I tipi geometry e geography sono in grado di riconoscere un'istanza specifica purché si tratti di un'istanza con formato corretto, anche se non definita in modo esplicito.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. Ad esempio, se si definisce un'istanza Point usando in modo esplicito il metodo STPointFromText(), geometry e geography riconoscono l'istanza come Point, purché il formato dell'input del metodo sia corretto.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 si definisce la stessa istanza utilizzando il metodo STGeomFromText() , entrambi i tipi di dati geometry e geography riconoscono l'istanza come Point.If you define the same instance using the STGeomFromText() method, both the geometry and geography data types recognize the instance as a Point.
  • I sottotipi per i tipi geometry e geography sono divisi in tipi semplici e di raccolta.The subtypes for geometry and geography types are divided into simple and collection types. Alcuni metodi come STNumCurves() possono essere utilizzati solo con tipi semplici.Some methods like STNumCurves() work only with simple types.
  • I tipi semplici includono:Simple types include:
  • -- Point-- Point
  • -- LineString-- LineString
  • -- CircularString-- CircularString
  • -- CompoundCurve-- CompoundCurve
  • -- Polygon-- Polygon
  • -- CurvePolygon-- CurvePolygon
  • I tipi di raccolta includono:Collection types include:
  • -- MultiPoint-- MultiPoint
  • -- MultiLineString-- MultiLineString
  • -- MultiPolygon-- MultiPolygon
  • -- GeometryCollection-- GeometryCollection
  • -## Differenze tra i tipi di dati geometry e geography-## Differences Between the geometry and geography Data Types
  • I due tipi di dati spaziali si comportano spesso in modo simile, ma esistono alcune differenze fondamentali nel modo in cui i dati vengono archiviati e modificati.The two types of spatial data often behave quite similarly, but there are some key differences in how the data is stored and manipulated.
  • -### Definizione dei bordi di collegamento-### How connecting edges are defined
  • I dati di definizione per i tipi LineString e Polygon sono solo vertici.The defining data for LineString and Polygon types are vertices only. Il bordo di collegamento tra due vertici in un tipo geometry è una linea retta.The connecting edge between two vertices in a geometry type is a straight line. Tuttavia, il bordo di collegamento tra due vertici in un tipo geografico è un corto arco di grande ellissi tra i due vertici.However, the connecting edge between two vertices in a geography type is a short great elliptic arc between the two vertices. Una grande ellisse è l'intersezione dell'ellissoide con un piano attraverso il centro e un arco di grande ellisse è un segmento di arco sulla grande ellisse.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.
  • -### Definizione di segmenti di arco circolare-### How circular arc segments are defined
  • I segmenti di arco circolare per i tipi geometry vengono definiti sul piano delle coordinate cartesiane XY (i valori Z vengono ignorati).Circular arc segments for geometry types are defined on the XY Cartesian coordinate plane (Z values are ignored). I segmenti di arco circolare per i tipi geography vengono definiti da segmenti di curva su una sfera di riferimento.Circular arc segments for geography types are defined by curve segments on a reference sphere. Qualsiasi parallelo sulla sfera di riferimento può essere definito da due archi circolari complementari in cui i punti per entrambi gli archi hanno un angolo di latitudine costante.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.
  • -### Misurazioni nei tipi di dati spaziali-### Measurements in spatial data types
  • Nel sistema planare, o terra piatta, le misurazioni delle distanze e delle aree vengono fornite nella stessa unità di misurazione delle coordinate.In the planar, or flat-earth, system, measurements of distances and areas are given in the same unit of measurement as coordinates. Usando il tipo di dati geometry , la distanza tra (2, 2) e (5, 6) è 5 unità, indipendentemente dalle unità usate.Using the geometry data type, the distance between (2, 2) and (5, 6) is 5 units, regardless of the units used.
  • Nel sistema ellissoidale, o terra rotonda, le coordinate sono fornite in gradi di latitudine e longitudine.In the ellipsoidal, or round-earth system, coordinates are given in degrees of latitude and longitude. Tuttavia, le lunghezze e le aree sono misurate generalmente in metri e metri quadrati, sebbene la misurazione possa dipendere dall'identificatore di riferimento spaziale (SRID) dell'istanza 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à di misurazione più comune per il tipo di dati geography è il metro.The most common unit of measurement for the geography data type is meters.
  • -### Orientamento dei dati spaziali-### Orientation of spatial data
  • Nel sistema planare l'orientamento dell'anello di un poligono non è un fattore di particolare rilevanza.In the planar system, the ring orientation of a polygon is not an important factor. Ad esempio, un poligono descritto da ((0, 0), (10, 0), (0, 20), (0, 0)) è identico al poligono descritto da ((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)). OGC Simple Features for SQL Specification non indica un ordinamento dell'anello e SQL ServerSQL Server non impone tale ordinamento.The OGC Simple Features for SQL Specification does not dictate a ring ordering, and SQL ServerSQL Server does not enforce ring ordering.
  • In un sistema ellissoidale, un poligono non ha significato, o è ambiguo, senza un orientamento.In an ellipsoidal system, a polygon has no meaning, or is ambiguous, without an orientation. Ad esempio, un anello intorno all'equatore descrive l'emisfero nord o sud?For example, does a ring around the equator describe the northern or southern hemisphere? Se si utilizza il tipo di dati geography per archiviare l'istanza spaziale, è necessario specificare l'orientamento dell'anello e descrivere accuratamente la posizione dell'istanza.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'interno del poligono in un sistema ellissoidale è definito dal lato sinistro della regola.The interior of the polygon in an ellipsoidal system is defined by the left-hand rule.
  • Quando il livello di compatibilità è uguale o minore di 100 in SQL Server 2017SQL Server 2017 , al tipo di dati geography si applicano le restrizioni seguenti:When the compatibility level is 100 or below in SQL Server 2017SQL Server 2017 then the geography data type has the following restrictions:
  • -- Ogni istanza geography deve adattarsi all'interno di un singolo emisfero.-- Each geography instance must fit inside a single hemisphere. Non è possibile archiviare oggetti spaziali con dimensioni maggiori di un emisfero.No spatial objects larger than a hemisphere can be stored.
  • -- Qualsiasi istanza geography di una rappresentazione Open Geospatial Consortium (OGC) Well-Known Text (WKT) o Well-Known Binary (WKB) che produca un oggetto più grande di un emisfero genera 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.
  • -- I metodi del tipo di dati geography che richiedono l'input di due istanze geography , ad esempio STIntersection(), STUnion(), STDifference() e STSymDifference(), restituiranno Null se i risultati dei metodi non si adattano a un singolo emisfero.-- 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. Anche STBuffer() restituirà Null se l'output supera un singolo emisfero.STBuffer() will also return null if the output exceeds a single hemisphere.
  • In SQL Server 2017SQL Server 2017 FullGlobe è un tipo speciale di Polygon che copre l'intero globo.In SQL Server 2017SQL Server 2017, FullGlobe is a special type of Polygon that covers the entire globe. FullGlobe dispone di un'area, ma non ha bordi o vertici.FullGlobe has an area, but no borders or vertices.
  • -### Anelli interni ed esterni non rilevanti nel tipo di dati geography-### Outer and inner rings not important in geography data type
  • In OGC Simple Features for SQL Specification vengono trattati anelli esterni e interni, ma questa distinzione non è significativa per il tipo di dati SQL ServerSQL Server geography . È possibile scegliere qualsiasi anello di un poligono come anello esterno.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.
  • Per ulteriori informazioni sulle specifiche OGC, vedere quanto riportato di seguito:For more information on OGC specifications, see the following:
  • -- OGC Specifications, Simple Feature Access Part 1 - Common Architecture (Specifiche OGC, accesso semplificato alle caratteristiche Parte 1- Architettura comune)-- OGC Specifications, Simple Feature Access Part 1 - Common Architecture
  • -- OGC Specifications, Simple Feature Access Part 2 – SQL Options (Specifiche OGC, accesso semplificato alle caratteristiche Parte 2 - Opzioni SQL)-- OGC Specifications, Simple Feature Access Part 2 – SQL Options
  • -## Segmenti di arco circolare-## Circular Arc Segments
  • Tre tipi di cui è possibile creare istanze possono accettare segmenti di arco circolare: CircularString, CompoundCurvee CurvePolygon.Three instantiable types can take circular arc segments: CircularString, CompoundCurve, and CurvePolygon. Un segmento di arco circolare è definito da tre punti in un piano bidimensionale. Il terzo punto non può corrispondere al primo punto.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.
  • Nelle figure A e B vengono illustrati segmenti di arco circolare tipici.Figures A and B show typical circular arc segments. Si noti come ognuno dei tre punti giace sul perimetro di un cerchio.Note how each of the three points lie on the perimeter of a circle.
  • Nelle figure C e D viene illustrato come un segmento di linea possa essere definito segmento di arco circolare.Figures C and D show how a line segment can be defined as a circular arc segment. Si noti che sono ancora necessari tre punti per definire il segmento di arco circolare, diversamente da un segmento di linea regolare, che può essere definito solo da due punti.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.
  • I metodi che operano sui tipi di segmento di arco circolare utilizzano segmenti di linea retta per simulare l'arco circolare. Il numero di segmenti di linea utilizzati per simulare l'arco dipenderanno dalla lunghezza e dalla curvatura dell'arco. Benché sia possibile archiviare i valori Z per ognuno dei tipi di segmento di arco circolare, i metodi non utilizzeranno i valori Z nei calcoli.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 si specificano valori Z per segmenti di arco circolare, tali valori devono essere gli stessi per tutti i punti nel segmento di arco circolare perché questo venga accettato per l'input.-> 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. Ad esempio, CIRCULARSTRING(0 0 1, 2 2 1, 4 0 1) è ammesso, mentre CIRCULARSTRING(0 0 1, 2 2 2, 4 0 1) non lo è.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.
  • -### Confronto tra LineString e CircularString-### LineString and CircularString comparison
  • Nel diagramma seguente vengono illustrati triangoli isosceli identici. Nel triangolo A vengono utilizzati segmenti di linea per definire il triangolo, mentre nel triangolo B vengono utilizzati segmenti di arco circolare.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
  • In questo esempio viene illustrato come archiviare i triangoli isosceli precedenti utilizzando un'istanza LineString e un'istanza 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="72914-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()</span><span class="sxs-lookup">SELECT @g1.ToString(), @g2.ToString()</span></span>
  • SELECT @g1.STLength() AS [LS Length], @g2.STLength() AS [CS Length]SELECT @g1.STLength() AS [LS Length], @g2.STLength() AS [CS Length]
  • ENDEND
    -```
  • Si noti che un'istanza CircularString richiede sette punti per definire il triangolo, mentre un'istanza LineString richiede solo quattro punti.Notice that a CircularString instance requires seven points to define the triangle, but a LineString instance requires only four points to define the triangle. Il motivo è che un'istanza CircularString archivia segmenti di arco circolare e non segmenti di linea.The reason for this is that a CircularString instance stores circular arc segments and not line segments. Di conseguenza, i lati del triangolo archiviati nell'istanza CircularString sono ABC, CDE ed EFA, mentre i lati del triangolo archiviati nell'istanza LineString sono AC, CE ed 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.
  • Si consideri il frammento di codice seguente: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]; -
  • Il frammento di codice produrrà i risultati seguenti:This snippet will produce the following results:
  • --LS LengthCS Length -5.65685…6.28318… -
  • La figura seguente illustra come viene archiviato ogni tipo. La linea rossa indica LineString@g1, mentre la linea blu indica 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
  • Come illustrato nella figura precedente, le istanze CircularString utilizzano un numero minore di punti per archiviare i limiti delle curve con maggiore precisione delle istanze LineString .As the illustration above shows, CircularString instances use fewer points to store curve boundaries with greater precision than LineString instances. Le istanzeCircularString sono ideali per l'archiviazione di limiti circolari come un raggio cercato di venti miglia da un punto specifico.CircularString instances are useful for storing circular boundaries like a twenty-mile search radius from a specific point. Le istanzeLineString sono ideali per l'archiviazione di limiti lineari come un blocco urbano quadrato.LineString instances are good for storing boundaries that are linear like a square city block.
  • -### Confronto tra LineString e CompoundCurve-### LineString and CompoundCurve comparison
  • Negli esempi di codice seguenti viene illustrato come archiviare la stessa figura utilizzando istanze 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))'); -
  • oor
  • Negli esempi precedenti un'istanza LineString o un'istanza CompoundCurve potrebbe archiviare la figura.In the examples above, either a LineString instance or a CompoundCurve instance could store the figure. Nell'esempio seguente viene utilizzata un'istanza CompoundCurve per archiviare una sezione di un grafico a torta: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))'); -
  • Un'istanza CompoundCurve consente di archiviare direttamente il segmento di arco circolare (2 2, 1 3, 0 2), mentre con un'istanza LineString è necessario convertire la curva in diversi segmenti di linea più piccoli.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.
  • -### Confronto tra CircularString e CompoundCurve-### CircularString and CompoundCurve comparison
  • Nell'esempio di codice seguente viene illustrata l'archiviazione di una sezione di un grafico a torta in un'istanza 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(); -
  • Per archiviare la sezione del grafico a torta utilizzando un'istanza CircularString , è necessario utilizzare tre punti per ogni segmento di linea.To store the pie slice using a CircularString instance requires that three points be used for each line segment. Se un punto intermedio non è noto, deve essere calcolato oppure è necessario raddoppiare l'endpoint del segmento di linea, come illustrato nel frammento di codice seguente: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)'); -
  • Le istanzeCompoundCurve consentono componenti sia LineString sia CircularString , in modo che solo due punti nei segmenti di linea della sezione del grafico a torta debbano essere noti.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. In questo esempio di codice viene illustrato come utilizzare un'istanza CompoundCurve per archiviare la stessa 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(); -
  • -### Confronto tra Polygon e CurvePolygon-### Polygon and CurvePolygon comparison
  • Le istanzeCurvePolygon possono utilizzare istanze 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. Le istanzePolygon non possono utilizzare i tipi di segmento di arco circolare: CircularString e CompoundCurve.Polygon instances cannot use the circular arc segment types: CircularString and CompoundCurve.
  • -## Vedere anche-## See Also
    - -- Dati spaziali (SQL Server) -- Guida di riferimento ai metodi per il tipo di dati geometry -- Guida di riferimento ai metodi per il tipo di dati geometry -- Spatial Data (SQL Server) -- geometry Data Type Method Reference -- geography Data Type Method Reference
    -- STNumCurves (tipo di dati geometry) -- STNumCurves (geometry Data Type)
    -- STNumCurves (tipo di dati geography) -- STNumCurves (geography Data Type)
    -- STGeomFromText (tipo di dati geometry) -- STGeomFromText (geometry Data Type)
    -- STGeomFromText (tipo di dati geography)-- STGeomFromText (geography Data Type)