• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • 支持的空间数据格式

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

    • 知名文字(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表示转换为PointST_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,以表示PointLineStringPolygonMultiPointMultiLineStringMultiPolygon,和GeometryCollection
    • 一个Point值具有X和Y坐标,每个坐标都表示为双精度值。

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

    内部几何存储格式

    MySQL使用4个字节存储几何值,以指示SRID,后跟该值的WKB表示。有关WKB格式的说明,请参见“众所周知的二进制(WKB)格式”。

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

    • 字节序指示符字节为1,因为MySQL将几何存储为低端值。
    • MySQL支持几何类型PointLineStringPolygonMultiPointMultiLineStringMultiPolygon,和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)