兩種標準空間資料格式用於表示查詢中的幾何物件
已知文字 (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)
空間函數(例如
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
值的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 第 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)