查詢中會使用兩種標準空間資料格式來表示幾何物件
已知文字 (WKT) 格式
已知二進位 (WKB) 格式
在內部,MySQL 以與 WKT 或 WKB 格式都不相同的格式儲存幾何值。(內部格式類似 WKB,但帶有初始 4 個位元組來指示 SRID。)
有可用的函式可在不同資料格式之間轉換;請參閱第 14.16.6 節,「幾何圖形格式轉換函式」。
以下章節說明 MySQL 使用的空間資料格式
幾何值的已知文字 (WKT) 表示法旨在以 ASCII 格式交換幾何資料。OpenGIS 規格提供 Backus-Naur 文法,指定用於編寫 WKT 值的正式產生規則 (請參閱第 13.4 節,「空間資料類型」)。
幾何物件的 WKT 表示法範例
Point
POINT(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 | +---------------------------------------+
具有四個點的
LineString
LINESTRING(0 0, 10 10, 20 25, 50 60)
點座標對以逗號分隔。
具有一個外部環和一個內部環的
Polygon
POLYGON((0 0,10 0,10 10,0 10,0 0),(5 5,7 5,7 7,5 7, 5 5))
具有三個
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))')
具有兩個
LineString
值的MultiLineString
MULTILINESTRING((10 10, 20 20), (15 15, 30 15))
具有兩個
Polygon
值的MultiPolygon
MULTIPOLYGON(((0 0,10 0,10 10,0 10,0 0)),((5 5,7 5,7 7,5 7, 5 5)))
由兩個
Point
值和一個LineString
組成的GeometryCollection
GEOMETRYCOLLECTION(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)