Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 Reference Manual  /  ...  /  Supported Spatial Data Formats

13.4.3 支持的空间数据格式

在查询中,用于表示几何对象的两个标准空间数据格式是:

  • 文本知名格式(WKT)

  • 二进制知名格式(WKB)

MySQL内部将几何值存储在一个与 WKT 或 WKB 格式不同的格式中。(内部格式类似于 WKB,但具有初始 4 字节以指示 SRID。)

可以使用函数来转换不同数据格式;请参阅第14.16.6节,“Geometry Format Conversion Functions”

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

文本知名格式(WKT)用于将几何数据以 ASCII 形式交换。OpenGIS 规范提供了一份 Backus- Naur 语法,指定了写 WKT 值的正式生产规则(请参阅第13.4节,“Spatial Data Types”)。

WKT 表示几何对象的示例:

  • 一个Point:

    POINT(15 20)

    点坐标使用无逗号分隔。这与 SQL 中Point()函数的语法不同,该函数需要逗号分隔坐标。请注意,在给定的空间操作上下文中使用适当的语法。例如,以下两个语句都使用ST_X()从一个Point对象中提取X坐标。第一个语句直接使用Point()函数,而第二个语句使用WKT表示形式转换为Point对象,使用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:

    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)

    接受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)表示形式,使用BLOB值来包含几何WKB信息。这一格式由OpenGIS规范定义(见第13.4节,“Spatial Data Types”),也在ISO SQL/MM Part 3: Spatial标准中定义。

WKB使用1字节无符号整数、4字节无符号整数和8字节双精度浮点数(IEEE 754格式)。一个字节是八位二进制数字。

例如,WKB值对应于POINT(1 -1),由21个字节组成,每个字节用两个十六进制数字表示:

0101000000000000000000F03F000000000000F0BF

该序列由以下表格所示的组件组成。

Table 13.2 WKB Components Example

Component Size Value
Byte order 1字节 01
WKB type 4字节 01000000
X coordinate 8字节 000000000000F03F
Y coordinate 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) Format

对于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个字节,组成部分(可以从十六进制值中看到):

  • 4个字节用于整数SRID(0)

  • 1个字节用于整数字节顺序(1 = little-endian)

  • 4个字节用于整数类型信息(1 = Point

  • 8个字节用于双精度X坐标(1)

  • 8个字节用于双精度Y坐标(−1)