支持的空间数据格式
两种标准空间数据格式用于表示查询中的几何对象:
- 知名文字(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)