クエリーでジオメトリオブジェクトを表現するために、次の 2 つの標準空間データ形式が使用されます。
WKT (Well-Known Text) 形式
WKB (Well-Known Binary) 形式
MySQL の内部では、WKT、WKB のどちらの形式とも異なる形式でジオメトリ値が格納されます。 (内部形式は WKB と似ていますが、SRID を示す最初の 4 バイトがあります。)
異なるデータ形式間の変換に使用できる関数があります。セクション12.17.6「ジオメトリ形式変換関数」を参照してください。
次の各セクションでは、MySQL で使用される空間データフォーマットについて説明します:
ジオメトリ値の WKT (Well-Known Text) 表現は、ASCII 形式のジオメトリデータを交換するために設計されています。 OpenGIS 仕様書には、WKT 値を書き込むための公式の運用ルールを指定するバッカス-ナウア記法が用意されています (セクション11.4「空間データ型」を参照してください)。
ジオメトリオブジェクトの WKT 表現の例:
-
Point
:POINT(15 20)
点の座標は、区切り用のカンマなしに指定されます。 これは、座標間にカンマを必要とする SQL
Point()
関数の構文とは異なります。 特定の空間演算のコンテキストに適した構文を慎重に使用してください。 たとえば、次のステートメントはどちらもST_X()
を使用してPoint
オブジェクトから X 座標を抽出します。 最初の場合は、Point()
関数を直接使用してオブジェクトを生成します。 2 番目は、ST_GeomFromText()
を使用してPoint
に変換された WKT 表現を使用します。mysql> SELECT ST_X(Point(15, 20)); +---------------------+ | ST_X(POINT(15, 20)) | +---------------------+ | 15 | +---------------------+ mysql> SELECT ST_X(ST_GeomFromText('POINT(15 20)')); +---------------------------------------+ | ST_X(ST_GeomFromText('POINT(15 20)')) | +---------------------------------------+ | 15 | +---------------------------------------+
-
4 つの点を含む
LineString
:LINESTRING(0 0, 10 10, 20 25, 50 60)
点の座標のペアはカンマで区切られます。
-
外側のリングと内側のリングを 1 つずつ含む
Polygon
:POLYGON((0 0,10 0,10 10,0 10,0 0),(5 5,7 5,7 7,5 7, 5 5))
-
3 つの
Point
値を含むMultiPoint
:MULTIPOINT(0 0, 20 20, 60 60)
MultiPoint
値の WKT 形式表現を受け入れるST_MPointFromText()
やST_GeomFromText()
などの空間関数では、値内の個々のポイントをカッコで囲むことができます。 たとえば、次の関数コールは両方とも有効です:ST_MPointFromText('MULTIPOINT (1 1, 2 2, 3 3)') ST_MPointFromText('MULTIPOINT ((1 1), (2 2), (3 3))')
-
2 つの
LineString
値を含むMultiLineString
:MULTILINESTRING((10 10, 20 20), (15 15, 30 15))
-
2 つの
Polygon
値を含むMultiPolygon
:MULTIPOLYGON(((0 0,10 0,10 10,0 10,0 0)),((5 5,7 5,7 7,5 7, 5 5)))
-
2 つの
Point
値と 1 つのLineString
から構成されたGeometryCollection
:GEOMETRYCOLLECTION(POINT(10 10), POINT(30 30), LINESTRING(15 15, 20 20))
ジオメトリ値の WKB (Well-Known Binary) 表現は、ジオメトリ WKB 情報を含む BLOB
値によって表現されたバイナリストリームとしてジオメトリデータを交換するために使用されます。 この形式は、OpenGIS 仕様によって定義されています (セクション11.4「空間データ型」を参照してください)。 これはまた、ISO の SQL/MM Part 3: Spatial 標準でも定義されています。
WKB は、1 バイトの符号なしの整数、4 バイトの符号なしの整数、および 8 バイトの倍精度数 (IEEE 754 形式) を使用します。 1 バイトは 8 ビットです。
たとえば、POINT(1 -1)
に対応する WKB 値は、21 バイトのシーケンスで構成され、それぞれが 2 桁の 16 進数で表されます:
0101000000000000000000F03F000000000000F0BF
順序は、次のテーブルに示すコンポーネントで構成されます。
表 11.2 WKB コンポーネントの例
コンポーネント | Size | 値 |
---|---|---|
バイト順 | 1 バイト | 01 |
WKB タイプ | 4 バイト | 01000000 |
X 座標 | 8 バイト | 000000000000F03F |
Y 座標 | 8 バイト | 000000000000F0BF |
各コンポーネントが表す内容は次のとおりです。
バイト順序インジケータは 1 または 0 で、リトルエンディアンまたはビッグエンディアンの記憶域を示します。 リトルエンディアンバイト順序、ビッグエンディアンバイト順序はそれぞれ NDR (Network Data Representation)、XDR (External Data Representation) とも呼ばれます。
WKB 型はジオメトリ型を示すコードです。 MySQL は、1 から 7 までの値を使用して、
Point
,LineString
,Polygon
,MultiPoint
,MultiLineString
,MultiPolygon
およびGeometryCollection
を示します。Point
値には X 座標と Y 座標が含まれますが、それぞれ倍精度値として表現されます。
さらに複雑なジオメトリ値の WKB 値は、OpenGIS 仕様書に詳しく記されているように、より複雑なデータ構造になります。
MySQL では、SRID の後に WKB 表現の値が続くことを示す 4 バイトを使用してジオメトリ値が格納されます。 WKB 形式については、WKB (Well-Known Binary) 形式を参照してください。
WKB 部分では、次の MySQL 固有の考慮事項が適用されます:
MySQL ではジオメトリがリトルエンディアン値として格納されるため、バイト順序インジケータバイトは 1 です。
MySQL は、
Point
,LineString
,Polygon
,MultiPoint
,MultiLineString
,MultiPolygon
およびGeometryCollection
のジオメトリタイプをサポートしています。 その他のジオメトリタイプはサポートされていません。空にできるのは
GeometryCollection
のみです。 このような値は 0 個の要素で格納されます。Polygon リングは時計回りと反時計回りの両方で指定できます。 MySQL は、データの読取り時にリングを自動的に反転します。
デカルト座標は空間参照システムの長さ単位で格納され、X 座標に X 値、Y 座標に Y 値が格納されます。 軸方向は、空間参照システムによって指定された方向です。
地理座標は空間参照システムの角度単位で格納され、経度は X 座標に、緯度は Y 座標に格納されます。 軸方向と子午線は、空間参照システムによって指定された方向です。
LENGTH()
関数は、値の格納に必要な領域をバイト単位で返します。 例:
mysql> SET @g = ST_GeomFromText('POINT(1 -1)');
mysql> SELECT LENGTH(@g);
+------------+
| LENGTH(@g) |
+------------+
| 25 |
+------------+
mysql> SELECT HEX(@g);
+----------------------------------------------------+
| HEX(@g) |
+----------------------------------------------------+
| 000000000101000000000000000000F03F000000000000F0BF |
+----------------------------------------------------+
値の長さは 25 バイトで、次のコンポーネントで構成されます (16 進数値から確認できます):
SRID を示す整数 4 バイト (0)
バイトオーダーを示す整数 1 バイト (1 = リトルエンディアン)
型情報を示す整数 4 バイト (1 =
Point
)X 座標を示す倍精度 8 バイト (1)
Y 座標を示す倍精度 8 バイト (−1)