两种标准空间数据格式用于在查询中表示几何对象
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 表示示例
一个
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))
几何值的 Well-Known Binary (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 格式的说明,参见 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 字节,由以下组件组成(从十六进制值可以看出)
整数 SRID 4 字节(0)
整数字节顺序 1 字节(1 = 小端序)
整数类型信息 4 字节(1 =
Point
)双精度 X 坐标 8 字节(1)
双精度 Y 坐标 8 字节(-1)