文档首页
MySQL 9.0 参考手册
相关文档 下载此手册
PDF (US Ltr) - 40.0Mb
PDF (A4) - 40.1Mb
手册页 (TGZ) - 258.2Kb
手册页 (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 9.0 参考手册  /  ...  /  支持的空间数据格式

13.4.3 支持的空间数据格式

两种标准空间数据格式用于在查询中表示几何对象

  • Well-Known Text (WKT) 格式

  • Well-Known Binary (WKB) 格式

在内部,MySQL 以与 WKT 或 WKB 格式不同的格式存储几何值。(内部格式类似于 WKB,但开头有 4 个字节表示 SRID。)

有函数可用于在不同数据格式之间转换;参见 第 14.16.6 节,“几何格式转换函数”

以下各节介绍了 MySQL 使用的空间数据格式

Well-Known Text (WKT) 格式

几何值的 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) 格式

几何值的 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 的值来表示 PointLineStringPolygonMultiPointMultiLineStringMultiPolygonGeometryCollection

  • 一个 Point 值具有 X 和 Y 坐标,每个坐标都表示为双精度值。

更复杂的几何值的 WKB 值具有更复杂的数据结构,如 OpenGIS 规范中所述。

内部几何存储格式

MySQL 使用 4 个字节来表示 SRID,然后是值的 WKB 表示来存储几何值。有关 WKB 格式的说明,参见 Well-Known Binary (WKB) 格式

对于 WKB 部分,适用以下 MySQL 特定注意事项

  • 字节顺序指示符字节为 1,因为 MySQL 将几何存储为小端序值。

  • MySQL 支持 PointLineStringPolygonMultiPointMultiLineStringMultiPolygonGeometryCollection 的几何类型。不支持其他几何类型。

  • 只有 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)