当前位置: 首页 > 文档资料 > MySQL 中文手册 >

19.5. 分析空间信息

优质
小牛编辑
130浏览
2023-12-01
19.5.1. Geometry格式转换函数
19.5.2. Geometry函数
19.5.3. 从已有Geometry创建新Geometry的函数
19.5.4. 测试几何对象间空间关系的函数
19.5.5. 关于几何最小边界矩形(MBR)的关系
19.5.6. 测试几何类之间空间关系的函数
用值填充了空间列后,即可查询和分析它们。MySQL提供了一组在空间数据上执行各种操作的函数。根据它们所执行的操作类型,可以将这些函数分为四种主要类别:

·用于在各种格式间转换几何值的函数。

·用于访问几何值定性或定量属性的函数。

·描述两种几何值之间关系的函数。

·从已有Geometry创建新Geometry的函数

空间分析函数可用于很多场合下,如:

·任何交互式SQL程序,如mysqlMySQLCC

·以任何语言编写的、支持MySQL客户端API的应用程序。

19.5.1. Geometry格式转换函数

MySQL支持下述用于在内部格式和WKT或WKB格式间转换几何值的函数:

  • AsBinary(g)

    将采用内部几何格式的值转换为其WKB表示,并返回二进制结果。

    SELECT AsBinary(g) FROM geom;
  • AsText(g)

    将采用内部几何格式的值转换为其WKT表示,并返回字符串结果。

    mysql> SET @g = 'LineString(1 1,2 2,3 3)';mysql> SELECT AsText(GeomFromText(@g));+--------------------------+| AsText(GeomFromText(@g)) |+--------------------------+| LINESTRING(1 1,2 2,3 3)  |+--------------------------+
  • GeomFromText(wkt[,srid])

    将字符串值从其WKT表示转换为内部几何格式,并返回结果。也支持多种与类型相关的函数,如PointFromText()和LineFromText(),请参见19.4.2.1节,“使用WKT函数创建Geometry(几何)值”。

  • GeomFromWKB(wkb[,srid])

    将二进制值从其WKB表示转换为内部几何格式,并返回结果。也支持多种与类型相关的函数,如PointFromWKB()和LineFromWKB(),请参见19.4.2.2节,“使用WKB函数创建Geometry(几何)值”。

19.5.2. Geometry函数

19.5.2.1. 通用几何函数
19.5.2.2. Point函数
19.5.2.3. LineString函数
19.5.2.4. MultiLineString函数
19.5.2.5. Polygon函数
19.5.2.6. MultiPolygon函数
19.5.2.7. GeometryCollection函数
属于该组的每个函数均将几何值作为其参量,并返回几何值的定性或定量属性。某些函数限制了其参量类型。如果参量是不正确的几何类型,这类函数将返回NULL。例如,如果对象类型既不是Polygon也不是MultiPolygon,Area()将返回NULL。

19.5.2.1. 通用几何函数

本节列出的函数不限制其参量,可接受任何类型的几何值。

  • Dimension(g)

    返回几何值g的固有维数。结果可以是-1、0、1或2。(关于这些值的含义,请参见19.2.2节,“类Geometry”)。

    mysql> SELECT Dimension(GeomFromText('LineString(1 1,2 2)'));+------------------------------------------------+| Dimension(GeomFromText('LineString(1 1,2 2)')) |+------------------------------------------------+|      1 |+------------------------------------------------+
  • Envelope(g)

    返回几何值g的最小边界矩形(MBR)。结果以Polygon值的形式返回。

    多边形(polygon)是由边界框的顶点定义的:
    POLYGON((MINX MINY, MAXX MINY, MAXX MAXY, MINX MAXY, MINX MINY))
    mysql> SELECT AsText(Envelope(GeomFromText('LineString(1 1,2 2)')));+-------------------------------------------------------+| AsText(Envelope(GeomFromText('LineString(1 1,2 2)'))) |+-------------------------------------------------------+| POLYGON((1 1,2 1,2 2,1 2,1 1))|+-------------------------------------------------------+
  • GeometryType(g)

    以字符串形式返回几何类型的名称,几何实例g是几何类型的成员。该名称与可实例化几何子类之一对应。

    mysql> SELECT GeometryType(GeomFromText('POINT(1 1)'));+------------------------------------------+| GeometryType(GeomFromText('POINT(1 1)')) |+------------------------------------------+| POINT    |+------------------------------------------+
  • SRID(g)

    返回指明了几何值g的空间参考系统ID的整数。

    在MySQL中,SRID值仅是与几何值相关的整数。所有计算均是在欧几里得(平面)几何中进行的。

    mysql> SELECT SRID(GeomFromText('LineString(1 1,2 2)',101));+-----------------------------------------------+| SRID(GeomFromText('LineString(1 1,2 2)',101)) |+-----------------------------------------------+|   101 |+-----------------------------------------------+

OpenGIS规范还定义了下述函数,MySQL未实施这类函数:

  • Boundary(g)

    返回几何值g的组合边界的闭包的几何对象。

  • IsEmpty(g)

    如果几何值g为空的几何对象,返回1,如果非空,返回0,如果参量为NULL,返回-1。如果几何对象是空的,它表示空的点集合。

  • IsSimple(g)

    目前该函数是占位符,不应使用它。如果实施了它,其行为与下段所给出的描述类似。

    如果几何值g没有异常的几何点(如自相交或自相切),返回1。如果参量不是简单参量,IsSimple()返回0,如果参量是NULL,返回-1。

    对于本章前面介绍的每个可实例化几何类,均包含特定的条件,这类条件会使类实例被分类为非简单的。

19.5.2.2. Point函数

Point由X和Y坐标构成,可使用下述函数获得它们:

  • X(p)

    以双精度数值返回点p的X坐标值。

    mysql> SELECT X(GeomFromText('Point(56.7 53.34)'));+--------------------------------------+| X(GeomFromText('Point(56.7 53.34)')) |+--------------------------------------+| 56.7 |+--------------------------------------+
  • Y(p)

    以双精度数值返回点p的Y坐标值。

    mysql> SELECT Y(GeomFromText('Point(56.7 53.34)'));+--------------------------------------+| Y(GeomFromText('Point(56.7 53.34)')) |+--------------------------------------+|53.34 |+--------------------------------------+

19.5.2.3. LineString函数

LineString由Point值组成。你可以提取LineString的特定点,计数它所包含的点数,或获取其长度。

  • EndPoint(ls)

    返回LineString值1s的最后一个点的Point。

    mysql> SET @ls = 'LineString(1 1,2 2,3 3)';mysql> SELECT AsText(EndPoint(GeomFromText(@ls)));+-------------------------------------+| AsText(EndPoint(GeomFromText(@ls))) |+-------------------------------------+| POINT(3 3)  |+-------------------------------------+
  • GLength(ls)

    以双精度数值返回LineString值1s在相关的空间参考系中的长度。

    mysql> SET @ls = 'LineString(1 1,2 2,3 3)';mysql> SELECT GLength(GeomFromText(@ls));+----------------------------+| GLength(GeomFromText(@ls)) |+----------------------------+|    2.8284271247462 |+----------------------------+
  • NumPoints(ls)

    返回LineString值1s中的点数。

    mysql> SET @ls = 'LineString(1 1,2 2,3 3)';mysql> SELECT NumPoints(GeomFromText(@ls));+------------------------------+| NumPoints(GeomFromText(@ls)) |+------------------------------+|    3 |+------------------------------+
  • PointN(ls,n)

    返回LineString值1s中的第n个点。点编号从1开始。

    mysql> SET @ls = 'LineString(1 1,2 2,3 3)';mysql> SELECT AsText(PointN(GeomFromText(@ls),2));+-------------------------------------+| AsText(PointN(GeomFromText(@ls),2)) |+-------------------------------------+| POINT(2 2)  |+-------------------------------------+
  • StartPoint(ls)

    返回LineString值1s的第一个点的Point。

    mysql> SET @ls = 'LineString(1 1,2 2,3 3)';mysql> SELECT AsText(StartPoint(GeomFromText(@ls)));+---------------------------------------+| AsText(StartPoint(GeomFromText(@ls))) |+---------------------------------------+| POINT(1 1)    |+---------------------------------------+

OpenGIS规范还定义了下述函数,MySQL尚未实施这些函数:

  • IsRing(ls)

    如果LineString值ls是封闭的(即其StartPoint()和EndPoint()值相同)和简单的(未通过相同的点1次以上)返回1。如果ls不是环,返回0,如果它是NULL,返回-1。

19.5.2.4. MultiLineString函数

  • GLength(mls)

    以双精度数值形式返回MultiLineString值m1s的长度。mls的长度等于其元素的长度之和。

    mysql> SET @mls = 'MultiLineString((1 1,2 2,3 3),(4 4,5 5))';mysql> SELECT GLength(GeomFromText(@mls));+-----------------------------+| GLength(GeomFromText(@mls)) |+-----------------------------+|     4.2426406871193 |+-----------------------------+
  • IsClosed(mls)

    如果MultiLineString值m1s是封闭的(即StartPoint()和EndPoint()值对m1s中的每个LineString是相同的)返回1。如果mls是非封闭的,返回0,如果它是NULL,返回-1。

    mysql> SET @mls = 'MultiLineString((1 1,2 2,3 3),(4 4,5 5))';mysql> SELECT IsClosed(GeomFromText(@mls));+------------------------------+| IsClosed(GeomFromText(@mls)) |+------------------------------+|    0 |+------------------------------+

19.5.2.5. Polygon函数

  • Area(poly)

    以双精度数值形式返回Polygon值poly的面积,根据在其空间参考系中的测量值。

    mysql> SET @poly = 'Polygon((0 0,0 3,3 0,0 0),(1 1,1 2,2 1,1 1))';mysql> SELECT Area(GeomFromText(@poly));+---------------------------+| Area(GeomFromText(@poly)) |+---------------------------+| 4 |+---------------------------+
  • ExteriorRing(poly)

    以LineString形式返回Polygon值poly的外环。

    mysql> SET @poly =    -> 'Polygon((0 0,0 3,3 3,3 0,0 0),(1 1,1 2,2 2,2 1,1 1))';mysql> SELECT AsText(ExteriorRing(GeomFromText(@poly)));+-------------------------------------------+| AsText(ExteriorRing(GeomFromText(@poly))) |+-------------------------------------------+| LINESTRING(0 0,0 3,3 3,3 0,0 0)   |+-------------------------------------------+
  • InteriorRingN(poly,n)

    以LineString形式返回Polygon值poly的第n个内环。环编号从1开始。

    mysql> SET @poly =    -> 'Polygon((0 0,0 3,3 3,3 0,0 0),(1 1,1 2,2 2,2 1,1 1))';mysql> SELECT AsText(InteriorRingN(GeomFromText(@poly),1));+----------------------------------------------+| AsText(InteriorRingN(GeomFromText(@poly),1)) |+----------------------------------------------+| LINESTRING(1 1,1 2,2 2,2 1,1 1)      |+----------------------------------------------+
  • NumInteriorRings(poly)

    返回Polygon值poly的内环的数目。

    mysql> SET @poly =    -> 'Polygon((0 0,0 3,3 3,3 0,0 0),(1 1,1 2,2 2,2 1,1 1))';mysql> SELECT NumInteriorRings(GeomFromText(@poly));+---------------------------------------+| NumInteriorRings(GeomFromText(@poly)) |+---------------------------------------+|     1 |+---------------------------------------+

19.5.2.6. MultiPolygon函数

  • Area(mpoly)

    以双精度数值形式返回MultiPolygon值mpoly的面积,根据在其空间参考系中的测量结果。

    mysql> SET @mpoly =    -> 'MultiPolygon(((0 0,0 3,3 3,3 0,0 0),(1 1,1 2,2 2,2 1,1 1)))';mysql> SELECT Area(GeomFromText(@mpoly));+----------------------------+| Area(GeomFromText(@mpoly)) |+----------------------------+|  8 |+----------------------------+

OpenGIS规范还定义了下述函数,MySQL未实施这类函数:

  • Centroid(mpoly)

    以Point形式返回用于MultiPolygon值mpoly的数学质心。不保证结果位于MultiPolygon上。

  • PointOnSurface(mpoly)

    返回Point值,保证该值位于MultiPolygon值mpoly上。

19.5.2.7. GeometryCollection函数

  • GeometryN(gc,n)

    返回GeometryCollection值gc中第n个几何对象。几何对象的编号从1开始。

    mysql> SET @gc = 'GeometryCollection(Point(1 1),LineString(2 2, 3 3))';mysql> SELECT AsText(GeometryN(GeomFromText(@gc),1));+----------------------------------------+| AsText(GeometryN(GeomFromText(@gc),1)) |+----------------------------------------+| POINT(1 1)     |+----------------------------------------+
  • NumGeometries(gc)

    返回GeometryCollection值gc中几何对象的数目。

    mysql> SET @gc = 'GeometryCollection(Point(1 1),LineString(2 2, 3 3))';mysql> SELECT NumGeometries(GeomFromText(@gc));+----------------------------------+| NumGeometries(GeomFromText(@gc)) |+----------------------------------+|2 |+----------------------------------+

19.5.3. 从已有Geometry创建新Geometry的函数

19.5.3.1. 生成新Geometry的Geometry函数
19.5.3.2. 空间操作符

19.5.3.1. 生成新Geometry的Geometry函数

在19.5.2节,“Geometry函数”中,我们讨论了一些可从已有几何对象构造新几何对象的函数:

  • Envelope(g)

  • StartPoint(ls)

  • EndPoint(ls)

  • PointN(ls,n)

  • ExteriorRing(poly)

  • InteriorRingN(poly,n)

  • GeometryN(gc,n)

19.5.3.2. 空间操作符

OpenGIS建议了很多可生成几何对象的其他函数。它们是为实施空间操作符而设计的。

在MySQL中未实施这些函数。它们或许会在未来的版本中出现。

  • Buffer(g,d)

    返回几何对象,该对象代表所有距几何值g的距离小于或等于d的所有点。

  • ConvexHull(g)

    返回几何对象,该对象代表几何值g的凸包。

  • Difference(g1,g2)

    返回几何对象,该对象表示了几何值g1与g2的点集合差异。

  • Intersection(g1,g2)

    返回几何对象,该对象表示了几何值g1与g2的点集合交集。

  • SymDifference(g1,g2)

    返回几何对象,该对象表示了几何值g1与g2的点集合对称差。

  • Union(g1,g2)

    返回几何对象,该对象表示了几何值g1与g2的点集合联合。

19.5.4. 测试几何对象间空间关系的函数

这些节中所介绍的函数以2个几何对象作为输入参数,并返回它们之间的定量或定性关系。

19.5.5. 关于几何最小边界矩形(MBR)的关系

MySQL提供了一些可测试两个几何对象g1和g2最小边界矩形之间关系的函数。它们包括:

  • MBRContains(g1,g2)

    返回1或0以指明g1的最小边界矩形是否包含g2的最小边界矩形。

    mysql> SET @g1 = GeomFromText('Polygon((0 0,0 3,3 3,3 0,0 0))');mysql> SET @g2 = GeomFromText('Point(1 1)');mysql> SELECT MBRContains(@g1,@g2), MBRContains(@g2,@g1);----------------------+----------------------+| MBRContains(@g1,@g2) | MBRContains(@g2,@g1) |+----------------------+----------------------+|    1 |    0 |+----------------------+----------------------+
  • MBRDisjoint(g1,g2)

    返回1或0以指明两个几何变量g1g2的最小边界矩形是否不相交。

  • MBREqual(g1,g2)

    返回1或0以指明两个几何变量g1g2的最小边界矩形是否相同。

  • MBRIntersects(g1,g2)

    返回1或0以指明两个几何变量g1g2的最小边界矩形是否相交。

  • MBROverlaps(g1,g2)

    返回1或0以指明两个几何变量g1g2的最小边界矩形是否交迭。

  • MBRTouches(g1,g2)

    返回1或0以指明两个几何变量g1g2的最小边界矩形是否接触。

  • MBRWithin(g1,g2)

    返回1或0以指明g1的最小边界矩形是否位于g2的最小边界矩形内。

    mysql> SET @g1 = GeomFromText('Polygon((0 0,0 3,3 3,3 0,0 0))');mysql> SET @g2 = GeomFromText('Polygon((0 0,0 5,5 5,5 0,0 0))');mysql> SELECT MBRWithin(@g1,@g2), MBRWithin(@g2,@g1);+--------------------+--------------------+| MBRWithin(@g1,@g2) | MBRWithin(@g2,@g1) |+--------------------+--------------------+|  1 |  0 |+--------------------+--------------------+

19.5.6. 测试几何类之间空间关系的函数

OpenGIS规范定义了下述函数。目前在MySQL尚未按照规范实施它们。对于那些已实施的函数,它们返回的结果与对应的基于MBR的函数返回的相同。包括下面列出的函数,但Distance()和Related()除外。

在未来的版本中,可能会实施这些函数,为空间分析提供全部支持,而不仅仅是基于MBR的支持。

这些函数作用在2个几何值g1和g2上。

  • Contains(g1,g2)

    返回1或0以指明g1是否完全包含g2

  • Crosses(g1,g2)

    如果g1在空间上与g2相交,返回1。如果g1为Polygon或MultiPolygon,返回NULL,或如果g2为Point或MultiPoint返回NULL。否则,返回0。

    术语“空间上交叉”指的是2个给定几何对象之间的空间关系,它具有下述属性:

    o2个结合对象交叉。

    o其交叉结果将导致其维数小于两个给定几何对象最大维数的几何对象。

    o其交叉不等于两个几何对象中的任何1个。

  • Disjoint(g1,g2)

    返回1或0以指明g1是否与g2从空间上不相交。

  • Distance(g1,g2)

    以双精度数值形式返回2个几何对象中2点间的最短距离。

  • Equals(g1,g2)

    返回1或0以指明g1是否从空间上等同于g2

  • Intersects(g1,g2)

    返回1或0以指明g1是否从空间上与g2相交。

  • Overlaps(g1,g2)

    返回1或0以指明g1是否从空间上与g2交迭。如果2个几何对象交叉而且其交叉将导致具有相同维数但并不等同于任一几何对象的几何对象,将使用术语“空间交迭”。

  • Related(g1,g2,pattern_matrix)

    返回1或0以指明由pattern_matrix指定的空间关系是否在g1g2间存在。如果参量为NULL返回-1。模式矩形为字符串。如果实施了该函数,其规范将在此给出。

  • Touches(g1,g2)

    返回1或0以指明g1是否从空间上与g2接触。如果几何对象的内部不交叉,但1个几何对象的边界与另一个的边界或内部交叉,这两个几何对象是从空间上接触的。

  • Within(g1,g2)

    返回1或0以指明g1是否从空间上位于g2内。