两种标准空间数据格式用于在查询中表示几何对象
Well-Known Text (WKT) 格式
Well-Known Binary (WKB) 格式
在内部,MySQL 以一种与 WKT 或 WKB 格式不同的格式存储几何值。(内部格式类似于 WKB,但开头有 4 个字节表示 SRID。)
有一些函数可用于在不同的数据格式之间进行转换;请参阅 第 14.16.6 节,“几何格式转换函数”。
以下部分描述了 MySQL 使用的空间数据格式
几何值的 Well-Known Text (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()之类的接受 WKT 格式的MultiPoint值表示形式的空间函数允许值内的各个点用括号括起来。例如,以下两个函数调用都是有效的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))
几何值的 Well-Known Binary (WKB) 表示形式用于以二进制流的形式交换几何数据,这些二进制流由包含几何 WKB 信息的 BLOB 值表示。该格式由 OpenGIS 规范定义(请参阅 第 13.4 节,“空间数据类型”)。它还在 ISO SQL/MM Part 3: Spatial 标准中定义。
WKB 使用 1 字节无符号整数、4 字节无符号整数和 8 字节双精度数(IEEE 754 格式)。一个字节是 8 位。
例如,与 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 格式的描述,请参阅 Well-Known Binary (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)