# 11.4.3 支持的空间数据格式
两种标准空间数据格式用于表示查询中的几何对象:
众所周知的文本 (WKT) 格式
众所周知的二进制 (WKB) 格式
在内部,MySQL 以不同于 WKT 或 WKB 格式的格式存储几何值。(内部格式类似于 WKB,但有一个初始的 4 个字节来指示 SRID。)
有可用于在不同数据格式之间转换的功能;看第 12.17.6 节,“几何格式转换函数”.
以下部分描述了 MySQL 使用的空间数据格式:
# 知名文本 (WKT) 格式
几何值的众所周知的文本 (WKT) 表示是为交换 ASCII 格式的几何数据而设计的。OpenGIS 规范提供了一个 Backus-Naur 文法,该文法指定了编写 WKT 值的正式生产规则(参见第 11.4 节,“空间数据类型”)。
几何对象的 WKT 表示示例:
一种
观点
:POINT(15 20)
指定点坐标时不使用逗号分隔。这与 SQL 的语法不同
观点()
函数,它需要在坐标之间使用逗号。注意使用适合给定空间操作上下文的语法。例如,以下语句都使用ST_X()
从 a 中提取 X 坐标观点
目的。第一个直接使用观点()
功能。第二个使用 WKT 表示转换为观点
和ST_GeomFromText()
.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(0 0, 10 10, 20 25, 50 60)
点坐标对用逗号分隔。
一种
多边形
带一个外环和一个内环:POLYGON((0 0,10 0,10 10,0 10,0 0),(5 5,7 5,7 7,5 7, 5 5))
一种
多点
与三个观点
价值观:MULTIPOINT(0 0, 20 20, 60 60)
空间函数如
ST_MPointFromText()
和ST_GeomFromText()
接受 WKT 格式的表示多点
values 允许值中的各个点用括号括起来。例如,以下两个函数调用都是有效的:ST_MPointFromText('MULTIPOINT (1 1, 2 2, 3 3)') ST_MPointFromText('MULTIPOINT ((1 1), (2 2), (3 3))')
一种
多行字符串
有两个线串
价值观:MULTILINESTRING((10 10, 20 20), (15 15, 30 15))
一种
多多边形
有两个多边形
价值观:MULTIPOLYGON(((0 0,10 0,10 10,0 10,0 0)),((5 5,7 5,7 7,5 7, 5 5)))
一种
几何集合
由两个组成观点
价值观和一线串
:GEOMETRYCOLLECTION(POINT(10 10), POINT(30 30), LINESTRING(15 15, 20 20))
# 众所周知的二进制 (WKB) 格式
几何值的众所周知的二进制 (WKB) 表示用于将几何数据交换为由表示的二进制流斑点
包含几何 WKB 信息的值。此格式由 OpenGIS 规范定义(参见第 11.4 节,“空间数据类型”)。它也在 ISO 中定义SQL/MM 第 3 部分:空间标准。
WKB 使用 1 字节无符号整数、4 字节无符号整数和 8 字节双精度数(IEEE 754 格式)。一个字节是八位。
例如,一个 WKB 值对应于点(1 -1)
由这个 21 个字节的序列组成,每个字节由两个十六进制数字表示:
0101000000000000000000F03F000000000000F0BF
该序列由下表中显示的组件组成。
表 11.2 WKB 组件示例
零件 | 尺寸 | 价值 |
---|---|---|
字节顺序 | 1 个字节 | 01 |
WKB 类型 | 4字节 | 01000000 |
X坐标 | 8 个字节 | 000000000000F03F |
Y坐标 | 8 个字节 | 000000000000F0BF |
组件表示如下:
字节顺序指示符是 1 或 0,表示 little-endian 或 big-endian 存储。little-endian 和 big-endian 字节顺序也分别称为网络数据表示 (NDR) 和外部数据表示 (XDR)。
WKB 类型是表示几何类型的代码。MySQL 使用从 1 到 7 的值来表示
观点
,线串
,多边形
,多点
,多行字符串
,多多边形
, 和几何集合
.一种
观点
value 具有 X 和 Y 坐标,每个坐标都表示为双精度值。更复杂几何值的 WKB 值具有更复杂的数据结构,详见 OpenGIS 规范。
# 内部几何存储格式
MySQL 使用 4 个字节存储几何值以指示 SRID,后跟该值的 WKB 表示。有关 WKB 格式的说明,请参阅众所周知的二进制 (WKB) 格式.
对于 WKB 部分,这些 MySQL 特定的注意事项适用:
字节顺序指示字节为 1,因为 MySQL 将几何存储为 little-endian 值。
MySQL 支持几何类型
观点
,线串
,多边形
,多点
,多行字符串
,多多边形
, 和几何集合
.不支持其他几何类型。仅有的
几何集合
可以为空。这样的值与 0 个元素一起存储。多边形环可以顺时针和逆时针指定。MySQL 在读取数据时会自动翻转环。
笛卡尔坐标以空间参考系的长度单位存储,X 值在 X 坐标中,Y 值在 Y 坐标中。轴方向是由空间参考系统指定的方向。
地理坐标以空间参考系的角度单位存储,经度在 X 坐标中,纬度在 Y 坐标中。轴方向和子午线是由空间参考系统指定的。
这
长度()
函数返回值存储所需的空间(以字节为单位)。例子:
mysql> SET @g = ST_GeomFromText('POINT(1 -1)');
mysql> SELECT LENGTH(@g);
+------------+
| LENGTH(@g) |
+------------+
| 25 |
+------------+
mysql> SELECT HEX(@g);
+----------------------------------------------------+
| HEX(@g) |
+----------------------------------------------------+
| 000000000101000000000000000000F03F000000000000F0BF |
+----------------------------------------------------+
值长度为 25 个字节,由这些组件组成(从十六进制值可以看出):
整数 SRID (0) 的 4 个字节
1 个字节用于整数字节顺序(1 = little-endian)
4 个字节用于整数类型信息(1 =
观点
)双精度 X 坐标 8 个字节 (1)
双精度 Y 坐标 (−1) 为 8 个字节