两种标准空间数据格式用于在查询中表示几何对象
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)
诸如
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
值的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 格式)。一个字节是 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)