兩種標準空間資料格式用於表示查詢中的幾何物件
已知文字 (WKT) 格式
已知二進位 (WKB) 格式
在內部,MySQL 以與 WKT 或 WKB 格式都不相同的格式儲存幾何值。(內部格式類似 WKB,但開頭有 4 個位元組來指示 SRID。)
有函數可用於在不同的資料格式之間進行轉換;請參閱 第 14.16.6 節「幾何格式轉換函數」。
以下章節描述 MySQL 使用的空間資料格式
幾何值的已知文字 (WKT) 表示法旨在以 ASCII 格式交換幾何資料。OpenGIS 規範提供 Backus-Naur 文法,用於指定寫入 WKT 值的正式產生規則(請參閱 第 13.4 節「空間資料類型」)。
幾何物件的 WKT 表示法範例
一個
PointPOINT(15 20)點座標的指定沒有分隔逗號。這與 SQL
Point()函數的語法不同,後者需要在座標之間使用逗號。請注意使用適合給定空間操作的上下文的語法。例如,以下陳述式都使用ST_X()從Point物件中提取 X 座標。第一個使用Point()函數直接產生物件。第二個使用 WKT 表示法,並使用ST_GeomFromText()將其轉換為Point。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 | +---------------------------------------+一個具有四個點的
LineStringLINESTRING(0 0, 10 10, 20 25, 50 60)點座標對以逗號分隔。
一個具有一個外部環和一個內部環的
PolygonPOLYGON((0 0,10 0,10 10,0 10,0 0),(5 5,7 5,7 7,5 7, 5 5))一個具有三個
Point值的MultiPointMULTIPOINT(0 0, 20 20, 60 60)空間函數(例如
ST_MPointFromText()和ST_GeomFromText())接受MultiPoint值的 WKT 格式表示,允許值內的各個點以括號括起來。例如,以下兩個函數呼叫都是有效的ST_MPointFromText('MULTIPOINT (1 1, 2 2, 3 3)') ST_MPointFromText('MULTIPOINT ((1 1), (2 2), (3 3))')一個具有兩個
LineString值的MultiLineStringMULTILINESTRING((10 10, 20 20), (15 15, 30 15))一個具有兩個
Polygon值的MultiPolygonMULTIPOLYGON(((0 0,10 0,10 10,0 10,0 0)),((5 5,7 5,7 7,5 7, 5 5)))一個由兩個
Point值和一個LineString組成的GeometryCollectionGEOMETRYCOLLECTION(POINT(10 10), POINT(30 30), LINESTRING(15 15, 20 20))
幾何值的已知二進位 (WKB) 表示法用於交換以二進位串流表示的幾何資料,這些串流由包含幾何 WKB 資訊的 BLOB 值表示。此格式由 OpenGIS 規範定義(請參閱 第 13.4 節「空間資料類型」)。它也在 ISO SQL/MM 第 3 部分:空間標準中定義。
WKB 使用 1 位元組無號整數、4 位元組無號整數和 8 位元組雙精度數字 (IEEE 754 格式)。一個位元組為八位元。
例如,對應於 POINT(1 -1) 的 WKB 值由以下 21 個位元組的序列組成,每個位元組以兩個十六進位數字表示
0101000000000000000000F03F000000000000F0BF該序列由下表中顯示的元件組成。
表 13.2 WKB 元件範例
| 元件 | 大小 | 值 |
|---|---|---|
| 位元組順序 | 1 個位元組 | 01 |
| WKB 類型 | 4 個位元組 | 01000000 |
| X 座標 | 8 個位元組 | 000000000000F03F |
| Y 座標 | 8 個位元組 | 000000000000F0BF |
元件表示法如下
位元組順序指示器為 1 或 0,表示小端或大端儲存。小端和大端位元組順序也分別稱為網路資料表示 (NDR) 和外部資料表示 (XDR)。
WKB 類型是一個程式碼,指示幾何類型。MySQL 使用 1 到 7 的值來指示
Point、LineString、Polygon、MultiPoint、MultiLineString、MultiPolygon和GeometryCollection。Point值具有 X 和 Y 座標,每個座標都表示為雙精度值。
更複雜的幾何值的 WKB 值具有更複雜的資料結構,如 OpenGIS 規範中所詳述。
MySQL 使用 4 個位元組來指示 SRID,後跟值的 WKB 表示法來儲存幾何值。有關 WKB 格式的說明,請參閱已知二進位 (WKB) 格式。
對於 WKB 部分,適用以下 MySQL 特有的考量
位元組順序指示器位元組為 1,因為 MySQL 將幾何圖形儲存為小端值。
MySQL 支援
Point、LineString、Polygon、MultiPoint、MultiLineString、MultiPolygon和GeometryCollection的幾何類型。不支援其他幾何類型。只有
GeometryCollection可以為空。此類值以 0 個元素儲存。多邊形環可以按順時針和逆時針方向指定。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 個位元組,由以下元件組成(從十六進位值中可以看出)
整數 SRID 的 4 個位元組 (0)
整數位元組順序的 1 個位元組 (1 = 小端)
4 個位元組用於整數類型資訊 (1 =
Point)8 個位元組用於雙精度 X 座標 (1)
8 個位元組用於雙精度 Y 座標 (−1)