空間データ型の概要Spatial Data Types Overview

適用対象: ○SQL Server ○Azure SQL Database XAzure Synapse Analytics (SQL DW) XParallel Data Warehouse APPLIES TO: YesSQL Server YesAzure SQL Database NoAzure Synapse Analytics (SQL DW) NoParallel Data Warehouse

空間データには 2 つの型があります。There are two types of spatial data. geometry データ型は平面 (ユークリッド (平面地球)) データをサポートしています。The geometry data type supports planar, or Euclidean (flat-earth), data. geometry データ型 (平面) は、Open Geospatial Consortium (OGC) Simple Features for SQL Specification version 1.1.0 および SQL MM (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). SQL ServerSQL Server ではそのほかに、 geography データ型もサポートされています。このデータ型は、GPS の緯度経度座標などの楕円体 (球体地球) データを格納します。In addition, SQL ServerSQL Server supports the geography data type, which stores ellipsoidal (round-earth) data, such as GPS latitude and longitude coordinates.

空間データ オブジェクトSpatial Data Objects

geometry データ型と geography データ型は、16 の空間データ オブジェクト (インスタンス型) をサポートしています。The geometry and geography data types support sixteen spatial data objects, or instance types. ただし、 インスタンス化可能なインスタンス型、つまりデータベース内でインスタンスを作成して使用することができる (インスタンス化できる) インスタンス型は、そのうちの 11 種類のみです。However, only eleven of these instance types are instantiable; you can create and work with these instances (or instantiate them) in a database. これらのインスタンスは、親データ型から派生するプロパティによって、 PointsLineStrings, CircularStringsCompoundCurvesPolygonsCurvePolygons 、または GeometryCollection 内の複数の geometry インスタンスや geographyインスタンスとして識別されます。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. Geography 型には、 FullGlobeという追加のインスタンス型があります。Geography type has an additional instance type, FullGlobe.

次の図は、 geometry の階層を表しています。 geometry データ型と geography データ型はこの階層に基づいています。The figure below depicts the geometry hierarchy upon which the geometry and geography data types are based. geometrygeography のインスタンス化可能な型は青で示されています。The instantiable types of geometry and geography are indicated in blue.

geom_hierarchy

図に示されているように、 geometry データ型と geography データ型のインスタンス化可能な型は PointMultiPointLineStringCircularStringMultiLineStringCompoundCurvePolygonCurvePolygonMultiPolygon、および GeometryCollectionの 10 種類です。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. geography データ型には、もう 1 つ次のインスタンス化可能な型があります:FullGlobeThere is one additional instantiable type for the geography data type: FullGlobe. geometry 型および geography 型は、特定のインスタンスが適切な形式のインスタンスである限り、明示的に定義されていない場合でも、そのインスタンスを認識できます。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. たとえば、STPointFromText() メソッドを使用して Point インスタンスを明示的に定義した場合、そのインスタンスは、メソッドの入力が適切な形式である限り、 geometrygeography によって Pointとして認識されます。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. STGeomFromText() メソッドを使用して同じインスタンスを定義した場合は、 geometry データ型と geography データ型の両方で Pointとして認識されます。If you define the same instance using the STGeomFromText() method, both the geometry and geography data types recognize the instance as a Point.

geometry 型および geography 型のサブタイプには、単純型とコレクション型があります。The subtypes for geometry and geography types are divided into simple and collection types. STNumCurves() などのメソッドは、単純型でのみ機能します。Some methods like STNumCurves() work only with simple types.

単純型は、次のとおりです。Simple types include:

コレクション型は、次のとおりです。Collection types include:

geometry データ型と geography データ型の違いDifferences Between the geometry and geography Data Types

2 つの空間データ型の動作はよく似ていますが、データの格納および操作の方法にいくつかの重要な違いがあります。The two types of spatial data often behave quite similarly, but there are some key differences in how the data is stored and manipulated.

接続エッジの定義方法How connecting edges are defined

LineString 型と Polygon 型の定義データは頂点のみです。The defining data for LineString and Polygon types are vertices only. geometry 型の 2 つの頂点間の接続エッジは直線です。The connecting edge between two vertices in a geometry type is a straight line. 一方、geography 型の 2 つの頂点間の接続エッジは、2 つの頂点を結ぶ短い方の大楕円弧です。However, the connecting edge between two vertices in a geography type is a short great elliptic arc between the two vertices. 大楕円は、楕円体とその中心を通る平面との交線であり、大楕円弧は、大楕円の円弧セグメントです。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.

円弧セグメントの定義方法How circular arc segments are defined

geometry 型の円弧セグメントは、XY デカルト座標平面上に定義されます (Z 値は無視されます)。Circular arc segments for geometry types are defined on the XY Cartesian coordinate plane (Z values are ignored). geography 型の円弧セグメントは、参照球の曲線セグメントによって定義されます。Circular arc segments for geography types are defined by curve segments on a reference sphere. 参照球の平行線は、両方の円弧の点に一定の緯度角がある、2 つの補助的な円弧によって定義できます。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.

空間データ型の測定Measurements in spatial data types

平面 (平面地球) 座標系では、距離や面積の測定値は座標と同じ測定単位で表されます。In the planar, or flat-earth, system, measurements of distances and areas are given in the same unit of measurement as coordinates. geometry データ型を使用した場合、(2, 2) と (5, 6) の間の距離は、使用されている単位に関係なく 5 単位になります。Using the geometry data type, the distance between (2, 2) and (5, 6) is 5 units, regardless of the units used.

楕円体 (球体地球) 座標系では、座標は緯度と経度で表されます。In the ellipsoidal, or round-earth system, coordinates are given in degrees of latitude and longitude. ただし、長さと面積は、 geography インスタンスの SRID (Spatial Reference Identifier) によっても異なりますが、通常はメートルと平方メートルで測定されます。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. メートルは、 geography データ型の最も一般的な測定単位です。The most common unit of measurement for the geography data type is meters.

空間データの方向Orientation of spatial data

平面座標系では、ポリゴンのリングの方向は重要ではありません。In the planar system, the ring orientation of a polygon is not an important factor. たとえば、((0, 0), (10, 0), (0, 20), (0, 0)) によって表されるポリゴンは、((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 では、リングの順序は定められていません。 SQL ServerSQL Server でもリングの順序は強制されません。The OGC Simple Features for SQL Specification does not dictate a ring ordering, and SQL ServerSQL Server does not enforce ring ordering.

楕円体座標系では、ポリゴンは方向がないと意味がなくなります (あいまいになります)。In an ellipsoidal system, a polygon has no meaning, or is ambiguous, without an orientation. たとえば、赤道の周りのリングが北半球を表すのか南半球を表すのかがわからなくなります。For example, does a ring around the equator describe the northern or southern hemisphere? geography データ型を使用して空間インスタンスを格納する場合は、リングの方向を指定し、インスタンスの位置を正確に示す必要があります。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. 楕円体座標系でのポリゴンの内部は、"左手の法則" によって定義されています。geography のポリゴンのリングに沿って歩いていると想像する場合、点が一覧表示されている順序に従って、左側の領域がポリゴンの内部として扱われ、右側の領域がポリゴンの外部として扱われます。The interior of the polygon in an ellipsoidal system is defined by the "left-hand rule": if you imagine yourself walking along the ring of a geography Polygon, following the points in the order in which they are listed, the area on the left is being treated as the interior of the Polygon, and the area on the right as the exterior of the Polygon.

SQL Server 2019 (15.x)SQL Server 2019 (15.x) で互換性レベルが 100 以下である場合、 geography データ型には次の制約があります。When the compatibility level is 100 or below in SQL Server 2019 (15.x)SQL Server 2019 (15.x) then the geography data type has the following restrictions:

  • geography インスタンスが 1 つの半球に収まる必要があります。Each geography instance must fit inside a single hemisphere. 半球よりも大きい空間オブジェクトを格納することはできません。No spatial objects larger than a hemisphere can be stored.
  • Open Geospatial Consortium (OGC) の Well-Known Text (WKT) 表現または Well-Known Binary (WKB) 表現の geography インスタンスでは、半球より大きいオブジェクトが生成される場合に 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.
  • 2 つの geography インスタンスの入力を必要とする geography データ型のメソッド (STIntersection()、STUnion()、STDifference()、STSymDifference() など) では、メソッドの結果が 1 つの半球に収まらない場合に null が返されます。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() でも、出力が 1 つの半球に収まらない場合に null が返されます。STBuffer() will also return null if the output exceeds a single hemisphere.

SQL Server 2019 (15.x)SQL Server 2019 (15.x)FullGlobe は、球全体を覆う特殊な多角形です。In SQL Server 2019 (15.x)SQL Server 2019 (15.x), FullGlobe is a special type of Polygon that covers the entire globe. FullGlobe には領域がありますが、境界や頂点はありません。FullGlobe has an area, but no borders or vertices.

geography データ型では外部リングと内部リングは重要ではないOuter and inner rings not important in geography data type

OGC Simple Features for SQL Specification では外部リングと内部リングが取り上げられていますが、SQL ServerSQL Server geography データ型ではこの区別はほとんど意味を持ちません。ポリゴンのリングはすべて外部リングと見なすことができます。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.

OGC の仕様の詳細については、以下を参照してください。For more information on OGC specifications, see the following:

円弧セグメントCircular Arc Segments

円弧セグメントでは、次の 3 つのインスタンス化可能な型を使用できます:CircularStringCompoundCurveCurvePolygonThree instantiable types can take circular arc segments: CircularString, CompoundCurve, and CurvePolygon. 円弧セグメントは、2 次元平面内の 3 つの点によって定義されます。3 番目のポイントを最初のポイントと同じにすることはできません。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.

図 A と図 B は、一般的な円弧のセグメントを示します。Figures A and B show typical circular arc segments. 3 つの点が 1 つの円周上にあることに注意してください。Note how each of the three points lie on the perimeter of a circle.

図 C および図 D は、直線セグメントを円弧セグメントとして定義できる方法を示しています。Figures C and D show how a line segment can be defined as a circular arc segment. 2 つの点のみによって定義できる通常の直線セグメントとは異なり、円弧セグメントを定義するには 3 つの点が必要であることに注意してください。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.
円弧型を操作するメソッドは、直線セグメントを使用して大まかな円弧を作成します。大まかな円を作成するために使用される直線セグメントの数は、円弧の長さと曲率によって異なります。Z 値はそれぞれの円弧型で格納できますが、メソッドは計算に Z 値を使用しません。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.

注意

Z 値が円弧セグメントに指定されている場合、円弧セグメントが入力として許容されるようにするには、円弧セグメント内のすべての点で Z 値が同じである必要があります。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. たとえば、 CIRCULARSTRING(0 0 1, 2 2 1, 4 0 1) は許容されますが、 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.

LineString と CircularString の比較LineString and CircularString comparison

この例は、LineString インスタンスと CircularString インスタンスの両方を使用して同一の二等辺三角形を格納する方法を示しています。This example shows how to store identical 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

CircularString インスタンスでは、三角形を定義するために 7 つの点が必要ですが、 LineString インスタンスでは、三角形を定義するために必要な点は 4 つだけです。Notice that a CircularString instance requires seven points to define the triangle, but a LineString instance requires only four points to define the triangle. その理由は、 CircularString インスタンスは直線セグメントではなく円弧セグメントを格納するためです。The reason for this is that a CircularString instance stores circular arc segments and not line segments. したがって、 CircularString インスタンスに格納される三角形の辺は ABC、CDE、および EFA であるのに対し、 LineString インスタンスに格納される三角形の辺は AC、CE、および 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.

次の例を確認してください。Consider the following example:

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

結果セットは次のようになります。Here is the result set.

LS LengthCS Length
5.65685...6.28318...

CircularString インスタンスでは LineString インスタンスよりも少ない点を使用して、さらに高い精度で曲面境界を格納します。CircularString instances use fewer points to store curve boundaries with greater precision than LineString instances. CircularString インスタンスは、たとえば特定の点から半径 20 マイルの検索を行う際など、円形境界を格納する場合に便利です。CircularString instances are useful for storing circular boundaries like a twenty-mile search radius from a specific point. LineString インスタンスは、四角い都市区画のような直線的な境界を格納する場合に適しています。LineString instances are good for storing boundaries that are linear like a square city block.

LineString と CompoundCurve の比較LineString and CompoundCurve comparison

次のコード例は、 LineString インスタンスと 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))');

上の例では、 LineString インスタンスまたは CompoundCurve インスタンスで図を格納できます。In the examples above, either a LineString instance or a CompoundCurve instance could store the figure. 次の例では、 CompoundCurve を使用して円のスライスを格納します。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))');  

CompoundCurve インスタンスは円弧セグメント (2 2, 1 3, 0 2) を直接格納できますが、 LineString インスタンスでは曲線をいくつかの小さな直線セグメントに変換する必要があります。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.

CircularString と CompoundCurve の比較CircularString and CompoundCurve comparison

次のコード例は、 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();

CircularString インスタンスを使用して円のスライスを格納するには、各直線セグメントで 3 つの点を使用する必要があります。To store the pie slice using a CircularString instance requires that three points be used for each line segment. 中間点が不明な場合は、中間点を計算するか、次のスニペットで示すように直線セグメントの端点を二重にする必要があります。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)');

CompoundCurve インスタンスは LineString コンポーネントおよび CircularString コンポーネントを許可して、認識される必要がある点が、円のスライスの直線セグメントの 2 点だけになるようにします。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. このコード例は、 CompoundCurve を使用して同じ図を格納する方法を示します。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();

Polygon と CurvePolygon の比較Polygon and CurvePolygon comparison

CurvePolygon インスタンスは、外部リングと内部リングを定義するときに CircularString インスタンスと CompoundCurve インスタンスを使用できます。CurvePolygon instances can use CircularString and CompoundCurve instances when defining their exterior and interior rings. Polygon インスタンスは、次の円弧型を使用することはできません:CircularString および CompoundCurvePolygon instances cannot use the circular arc segment types: CircularString and CompoundCurve.

参照See Also