### 11.4.3 支持的空间数据格式

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

-   众所周知的文本 (WKT) 格式

-   众所周知的二进制 (WKB) 格式

    在内部，MySQL 以不同于 WKT 或 WKB 格式的格式存储几何值。（内部格式类似于 WKB，但有一个初始的 4 个字节来指示 SRID。）

    有可用于在不同数据格式之间转换的功能；看[第 12.17.6 节，“几何格式转换函数”](gis-format-conversion-functions.html).

    以下部分描述了 MySQL 使用的空间数据格式：

-   [知名文本 (WKT) 格式](gis-data-formats.html#gis-wkt-format)

-   [众所周知的二进制 (WKB) 格式](gis-data-formats.html#gis-wkb-format)

-   [内部几何存储格式](gis-data-formats.html#gis-internal-format)

#### 知名文本 (WKT) 格式

[](<>)[](<>)[](<>)

几何值的众所周知的文本 (WKT) 表示是为交换 ASCII 格式的几何数据而设计的。OpenGIS 规范提供了一个 Backus-Naur 文法，该文法指定了编写 WKT 值的正式生产规则（参见[第 11.4 节，“空间数据类型”](spatial-types.html)）。

几何对象的 WKT 表示示例：

-   一种`观点`：

    ```
    POINT(15 20)
    ```

    指定点坐标时不使用逗号分隔。这与 SQL 的语法不同[`观点（）`](gis-mysql-specific-functions.html#function_point)函数，它需要在坐标之间使用逗号。注意使用适合给定空间操作上下文的语法。例如，以下语句都使用[`ST_X()`](gis-point-property-functions.html#function_st-x)从 a 中提取 X 坐标`观点`目的。第一个直接使用[`观点（）`](gis-mysql-specific-functions.html#function_point)功能。第二个使用 WKT 表示转换为`观点`和[`ST_GeomFromText()`](gis-wkt-functions.html#function_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()`](gis-wkt-functions.html#function_st-mpointfromtext)和[`ST_GeomFromText()`](gis-wkt-functions.html#function_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) 表示用于将几何数​​据交换为由表示的二进制流[`斑点`](blob.html)包含几何 WKB 信息的值。此格式由 OpenGIS 规范定义（参见[第 11.4 节，“空间数据类型”](spatial-types.html)）。它也在 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) 格式](gis-data-formats.html#gis-wkb-format).

对于 WKB 部分，这些 MySQL 特定的注意事项适用：

-   字节顺序指示字节为 1，因为 MySQL 将几何存储为 little-endian 值。

-   MySQL 支持几何类型`观点`,`线串`,`多边形`,`多点`,`多行字符串`,`多多边形`， 和`几何集合`.不支持其他几何类型。

-   仅有的`几何集合`可以为空。这样的值与 0 个元素一起存储。

-   多边形环可以顺时针和逆时针指定。MySQL 在读取数据时会自动翻转环。

    笛卡尔坐标以空间参考系的长度单位存储，X 值在 X 坐标中，Y 值在 Y 坐标中。轴方向是由空间参考系统指定的方向。

    地理坐标以空间参考系的角度单位存储，经度在 X 坐标中，纬度在 Y 坐标中。轴方向和子午线是由空间参考系统指定的。

    这[`长度（）`](string-functions.html#function_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 (0) 的 4 个字节

-   1 个字节用于整数字节顺序（1 = little-endian）

-   4 个字节用于整数类型信息（1 =`观点`)

-   双精度 X 坐标 8 个字节 (1)

-   双精度 Y 坐标 (−1) 为 8 个字节
