查詢中會使用兩種標準空間資料格式來表示幾何物件
已知文字 (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)接受
MultiPoint值的 WKT 格式表示法的空間函式 (例如ST_MPointFromText()和ST_GeomFromText()) 允許值中的個別點以括號括住。例如,以下兩個函式呼叫都是有效的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 Part 3: Spatial 標準中定義。
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 個位元組,由以下組件組成(如從十六進制值中可見):
4 個位元組用於整數 SRID (0)
1 個位元組用於整數位元組順序 (1 = 小端)
4 個位元組用於整數類型資訊 (1 =
Point)8 個位元組用於雙精度 X 坐標 (1)
8 個位元組用於雙精度 Y 坐標 (−1)