支持的空间数据格式
两种标准空间数据格式用于表示查询中的几何对象:
- 知名文字(WKT)格式
- 众所周知的二进制(WKB)格式
在内部,MySQL以与WKT或WKB格式不同的格式存储几何值。(内部格式类似于WKB,但以4个初始字节表示SRID。)
有一些功能可以在不同的数据格式之间进行转换。请参见“几何格式转换函数”。
以下各节介绍了MySQL使用的空间数据格式:
- 众所周知的文本(WKT)格式
- 众所周知的二进制(WKB)格式
- 内部几何存储格式
众所周知的文本(WKT)格式
几何值的熟知文本(WKT)表示旨在交换ASCII形式的几何数据。OpenGIS规范提供了Backus-Naur语法,该语法指定用于编写WKT值的正式生产规则(请参见“空间数据类型”)。
WKT几何对象表示的示例:
- 答 - Point:- POINT(15 20) - 指定的点坐标不带逗号。这与SQL - Point()函数的语法不同,SQL 函数的语法要求坐标之间使用逗号。注意使用适合给定空间操作上下文的语法。例如,以下语句均用于- 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 | +--------------------------------------- +
- A - 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)) 
- MultiPoint具有三个- Point值的 A :- MULTIPOINT(0 0, 20 20, 60 60) - 诸如 - ST_MPointFromText()和- ST_GeomFromText()接受- MultiPoint值的WKT格式表示的空间函数允许值内的各个点用括号括起来。例如,以下两个函数调用均有效:- ST_MPointFromText('MULTIPOINT (1 1, 2 2, 3 3)') ST_MPointFromText('MULTIPOINT ((1 1), (2 2), (3 3))')
- MultiLineString具有两个- LineString值的 A :- MULTILINESTRING((10 10, 20 20), (15 15, 30 15)) 
- MultiPolygon具有两个- Polygon值的 A :- MULTIPOLYGON(((0 0,10 0,10 10,0 10,0 0)),((5 5,7 5,7 7,5 7, 5 5))) 
- 阿 - GeometryCollection由两个的- Point值和一- LineString:- GEOMETRYCOLLECTION(POINT(10 10), POINT(30 30), LINESTRING(15 15, 20 20)) 
众所周知的二进制(WKB)格式
几何值的众所周知的二进制(WKB)表示形式用于交换几何数据,作为由BLOB包含几何WKB信息的值表示的二进制流。此格式由OpenGIS规范定义(请参见“空间数据类型”)。它也在ISO SQL / MM第3部分:空间标准中定义。
WKB使用1字节无符号整数,4字节无符号整数和8字节双精度数字(IEEE 754格式)。一个字节是八位。
例如,一个与之对应的WKB值POINT(1 -1)由以下21个字节组成,每个序列由两个十六进制数字表示:
0101000000000000000000F03F000000000000F0BF
序列由下表所示的组件组成。
表11.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坐标,每个坐标都表示为双精度值。
如OpenGIS规范中所述,用于更复杂的几何值的WKB值具有更复杂的数据结构。
内部几何存储格式
MySQL使用4个字节存储几何值,以指示SRID,后跟该值的WKB表示。有关WKB格式的说明,请参见“众所周知的二进制(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)
