暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

万里数据库GreatDB GIS支持文档全文(含实例操作)

原创 Dbb 2024-05-16
231

数据类型

数据类型说明
POINT
MULTIPOINT多个点的集合
LINESTRING线
MULTILINESTRING多条线的集合
POLYGON多边形
MULTIPOLYGON多边形的集合
GEOMETRY不可实例化的数据类型,但是可以作为一个列的类型,存储任何一种其
他类型的数据
GEOMETRYCOLLECTION空间对象集合

POINT、LINESTRING、POLYGON用于保存单个空间数据,MULTIPOINT、MULTILINESTRING、MULTIPOLYGON、GEOMCOLLECTION用于保存空间数据集合,GEOMCOLLECTION可以存储任意空间数据的集合。GEOEMTRY不可实例化的数据类型,但是可以作为一个列的类型,存储任何一种其他类型的数据。

例如:

数据类型数据
POINTPOINT(0 0)
MULTIPOINTMULTIPOINT(0 0, 20 20, 60 60)
LINESTRINGLINESTRING(0 0, 10 10, 20 25, 50 60)
MULTILINESTRINGMULTILINESTRING((10 10, 20 20), (15 15, 30 30))
POLYGONPOLYGON((0 0,10 0,10 10,0 10,0 0),(5 5,7 5,7 7,5 7, 5 5))
MULTIPOLYGONMULTIPOLYGON(((0 0,10 0,10 10,0 10,0 0)),((5 5,7 5,7 7,5 7, 5 5)))
GEOMETRYCOLLECTIONGEOMETRYCOLLECTION(POINT(1 -1), POINT(10 10), POINT(30 30), LINESTRING(15 15, 20 20))

空间坐标系

每个GIS对象都对应一个SRID,该值标识了当前对象属于哪个空间参考系(SRS)。目前MySQL支持地理和投影两类共5152个空间参考系,MySQL也支持用户自定义空间参考系,可以通过查询表information_schema.st_spatial_reference_systems获取系统中所有空间参考系的详细定义。MySQL中根据SRID number,分为笛卡尔直角坐标系和空间坐标系。 number 为0 时为笛卡尔直角坐标系,number非0时标识空间坐标系。MySQL中比较常用空间参考系的有SRID 0以及SRID 4326,SRID 0是一个无限大的平面笛卡尔坐标系,如果一个对象没有定义SRID,则默认使用SRID 0;SRID 4326是GPS系统使用的地理空间参考系。在MySQL中对GIS对象进行计算时各个GIS对象必须在同一坐标系中,不在同一参考系的话会报错,如果需要对不同坐标系中的对象计算可以使用MySQL提供的坐标系转换函数在不同的空间坐标系中进行转换。

数据类型格式

空间类型数据保存内部使用WKB格式,平时使用的便于查看的是WKT格式。在用户进行插入时可以使用ST_GeomFromText等函数来将WKT格式的GIS数据转换成内部格式进行插入,在进行查询时可以使用ST_AsText函数来将内部数据转换为更直观的WKT结果格式。

WKT(SRID 0)WKB
point(0, 0)0x00000000010100000000000000000000000000000000000000

注释:point的WKB为4bytes srid | 1bytes little-endian | 4 bytes Type| 8bytes x | 8bytes y。不同类型的WKB格式不同

空间索引

innodb支持的空间索引是将空间元素根据对应坐标系转换成对应的MBR(最小矩形)构成字符串,用Rtree组织,构成索引。在对索引进行查询时,都是使用MBR数据进行比较。下面是部分使用空间索引的限制:

  1. 空间索引不能包含null值
  2. 不能作为primary key和unique
  3. 空间索引需要指定SRID不指定默认为SRID 0,
  4. 空间索引不能作为联合索引。

在使用MBRContains,ST_Contains等等函数做为条件查询空间索引列时,可能会用到空间索引。

注释:MBR将空间元素在对应的坐标系下都使用一个最小矩形将其包括,这个最小矩形就是该元素的MBR,格式为(xmin, xmax, ymin, ymax)4个点组成。在SRID为0时,一个平面POLYGON((0 0, 10 0, 8 5, 0 5, 0 0))的梯形,MBR为(0, 10 ,0, 5)

支持函数

空间对象构造函数

这类函数用于构造空间对象,其中点是由两个坐标构成的,其他的对象都是基于点生成的。

函数名描述
GeomCollection(g [, g] …),GeometryCollection(g [, g] …)构造一个地理空间集合,参数可为空
Point(x, y)构造一个点对象,参数是两个double型数据,可以是x、y轴值也可以是经纬度值
LineString(pt [, pt] …)根据多个点构造一条线,可以不是直线,参数至少是两个点
Polygon(ls [, ls] …)构造一个多边形对象,参数是一条或多条线
MultiLineString(ls [, ls] …)根据多条线构造一个线的集合,参数是一条或多条线
MultiPoint(pt [, pt2] …)根据多个点构造一个点的集合,参数是一个或多个点
MultiPolygon(poly [, poly] …)根据多个多边形构造一个多边形的集合,参数是一个或多个多边形

举例

create table t1(c1 Geometry);

# 测试构建函数
insert into t1 values
(POINT(0, 0)),         
(MULTIPOINT(POINT(0,0), POINT(20, 20), POINT(60, 60))),
(LINESTRING(POINT(0,0), POINT(10, 10), POINT(20, 25), POINT(50, 60))),
(MULTILINESTRING(LINESTRING(POINT(10, 10), POINT(20, 20)),
                 LINESTRING(POINT(15, 15), POINT(30, 30)))),
(POLYGON(LINESTRING(POINT(0, 0),POINT(10, 0),POINT(10 ,10),POINT(0 ,10),POINT(0, 0)),
         LINESTRING(POINT(5, 5),POINT(7, 5),POINT(7, 7),POINT(5, 7), POINT(5, 5)))),
(MULTIPOLYGON(POLYGON(LINESTRING(POINT(0, 0),POINT(10, 0),
                                 POINT(10, 10),POINT(0, 10),POINT(0,0))),
              POLYGON(LINESTRING(POINT(5, 5),POINT(7, 5),
                                 POINT(7, 7),POINT(5, 7), POINT(5,5))))),
(GEOMETRYCOLLECTION(POINT(1 ,-1), POINT(10, 10), POINT(30, 30),
                    LINESTRING(POINT(15, 15), POINT(20, 20))));

select st_astext(c1) from t1;
+-----------------------------------------------------------------------------------+
| st_astext(c1)                                                                     |
+-----------------------------------------------------------------------------------+
| POINT(0 0)                                                                        |
| MULTIPOINT((0 0),(20 20),(60 60))                                                 |
| LINESTRING(0 0,10 10,20 25,50 60)                                                 |
| MULTILINESTRING((10 10,20 20),(15 15,30 30))                                      |
| POLYGON((0 0,10 0,10 10,0 10,0 0),(5 5,7 5,7 7,5 7,5 5))                          |
| MULTIPOLYGON(((0 0,10 0,10 10,0 10,0 0)),((5 5,7 5,7 7,5 7,5 5)))                 |
| GEOMETRYCOLLECTION(POINT(1 -1),POINT(10 10),POINT(30 30),LINESTRING(15 15,20 20)) |
+-----------------------------------------------------------------------------------+

空间数据格式转换函数

这类函数用于将空间对象从一种格式转化成另一种格式,主要是内部格式和WKB、WKT格式的相互转换,可用于空间数据的导入导出。

函数名描述
ST_GeomCollFromText(wkt [, srid [, options]])
ST_GeometryCollectionFromText(wkt [, srid [, options]])
ST_GeomCollFromTxt(wkt [, srid [, options]])
根据wkt格式的输入参数返回几何集合
ST_GeomFromText(wkt [, srid [, options]])
ST_GeometryFromText(wkt [, srid [, options]])
根据wkt格式的参数返回几何对象,与上一函数不同之处在于该函数接受单个对象为输入,而上一函数接受的空间对象集合
ST_LineFromText(wkt [, srid [, options]])
ST_LineStringFromText(wkt [, srid [, options]])
根据wkt格式的输入参数构造一个linestring对象
ST_MLineFromText(wkt [, srid [, options]])
ST_MultiLineStringFromText(wkt [, srid [, options]])
根据wkt格式的输入参数构造一个multilinestring对象
ST_MPointFromText(wkt [, srid [, options]])
ST_MultiPointFromText(wkt [, srid [, options]])
根据wkt格式的输入参数构造一个multipoint对象
ST_MPolyFromText(wkt [, srid [, options]])
ST_MultiPolygonFromText(wkt [, srid [, options]])
根据wkt格式的输入参数构造一个multipolygon对象
ST_PolyFromText(wkt [, srid [, options]])
ST_PolygonFromText(wkt [, srid [, options]])
根据wkt格式的输入参数构造一个polygon对象
ST_PointFromText(wkt [, srid [, options]])根据wkt格式的输入参数构造一个point对象
ST_GeomCollFromWKB(wkb [, srid [, options]])
ST_GeometryCollectionFromWKB(wkb [, srid [, options]])
从wkb格式的参数返回几何集合
ST_GeomFromWKB(wkb [, srid [, options]])
ST_GeometryFromWKB(wkb [, srid [, options]])
根据wkb格式的参数返回几何对象,与上一函数不同之处在于该函数接受单个对象为输入,而上一函数接受的空间对象集合
ST_LineFromWKB(wkb [, srid [, options]])
ST_LineStringFromWKB(wkb [, srid [, options]])
根据wkb格式的输入参数构造一个linestring对象
ST_MLineFromWKB(wkb [, srid [, options]])
ST_MultiLineStringFromWKB(wkb [, srid [, options]])
根据wkb格式的输入参数构造一个multilinestring对象
ST_MPointFromWKB(wkb [, srid [, options]])
ST_MultiPointFromWKB(wkb [, srid [, options]])
根据wkb格式的输入参数构造一个multipoint对象
ST_MPolyFromWKB(wkb [, srid [, options]])
ST_MultiPolygonFromWKB(wkb [, srid [, options]])
根据wkb格式的输入参数构造一个multipolygon对象
ST_PointFromWKB(wkb [, srid [, options]])根据wkb格式的输入参数构造一个point对象
ST_PolyFromWKB(wkb [, srid [, options]])
ST_PolygonFromWKB(wkb [, srid [, options]])
根据wkb格式的输入参数构造一个polygon对象
ST_AsBinary(g [, options])
ST_AsWKB(g [, options])
将内部几何格式参数转换为WKB形式,并返回二进制结果
ST_AsText(g [, options])
ST_AsWKT(g [, options])
将内部几何格式的参数转换为其WKT表示形式,并返回字符串结果
ST_AsGeoJSON(g [, max_dec_digits [, options]])将一个空间对象转换成一个GeoJSON形式输出
ST_GeomFromGeoJSON(str [, options [, srid]])读取一个以geojson格式字符串输入的空间对象

举例

create table t1(c1 Geometry);

# 测试ST_*FromText,从WKT形式中获取gis对象
insert into t1 values
(ST_PointFromText('POINT(0 0)')),                                                 
(ST_MPointFromText('MULTIPOINT((0 0),(20 20),(60 60))')),
(ST_LineFromText('LINESTRING(0 0,10 10,20 25,50 60)')),
(ST_MLineFromText('MULTILINESTRING((10 10,20 20),(15 15,30 30))')),
(ST_PolyFromText('POLYGON((0 0,10 0,10 10,0 10,0 0),(5 5,7 5,7 7,5 7,5 5))')),
(ST_MPolyFromText('MULTIPOLYGON(((0 0,10 0,10 10,0 10,0 0)),((5 5,7 5,7 7,5 7,5 5)))')),
(ST_GeomCollFromText('GEOMETRYCOLLECTION(POINT(1 -1),POINT(10 10),POINT(30 30),
                      LINESTRING(15 15,20 20))'));

# 测试ST_ASTEXT,将数据转换为WKT形式
select st_astext(c1) from t1;
+-----------------------------------------------------------------------------------+
| st_astext(c1)                                                                     |
+-----------------------------------------------------------------------------------+
| POINT(0 0)                                                                        |
| MULTIPOINT((0 0),(20 20),(60 60))                                                 |
| LINESTRING(0 0,10 10,20 25,50 60)                                                 |
| MULTILINESTRING((10 10,20 20),(15 15,30 30))                                      |
| POLYGON((0 0,10 0,10 10,0 10,0 0),(5 5,7 5,7 7,5 7,5 5))                          |
| MULTIPOLYGON(((0 0,10 0,10 10,0 10,0 0)),((5 5,7 5,7 7,5 7,5 5)))                 |
| GEOMETRYCOLLECTION(POINT(1 -1),POINT(10 10),POINT(30 30),LINESTRING(15 15,20 20)) |
+-----------------------------------------------------------------------------------+

# 测试ST_*FromWKB,ST_AsWKB,插入数据时将WKT数据类型转换为WKB类型插入
delete from t1;
insert into t1 values
(ST_PointFromWKB(ST_AsWKB(ST_PointFromText('POINT(0 0)')))),                                                 
(ST_MPointFromWKB(ST_AsWKB(ST_MPointFromText('MULTIPOINT((0 0),(20 20),(60 60))')))),
(ST_LineFromWKB(ST_AsWKB(ST_LineFromText('LINESTRING(0 0,10 10,20 25,50 60)')))),
(ST_MLineFromWKB(ST_AsWKB(ST_MLineFromText('MULTILINESTRING((10 10,20 20),(15 15,30 30))')))),
(ST_PolyFromWKB(ST_AsWKB(ST_PolyFromText('POLYGON((0 0,10 0,10 10,0 10,0 0),
                                                  (5 5,7 5,7 7,5 7,5 5))')))),
(ST_MPolyFromWKB(ST_AsWKB(ST_MPolyFromText('MULTIPOLYGON(((0 0,10 0,10 10,0 10,0 0)),
                                                         ((5 5,7 5,7 7,5 7,5 5)))')))),
(ST_GeomCollFromWKB(ST_ASWKB(ST_GeomCollFromTXT('GEOMETRYCOLLECTION(POINT(1 -1),POINT(10 10),
                                                 POINT(30 30),LINESTRING(15 15,20 20))'))));

select st_astext(c1) from t1;
+-----------------------------------------------------------------------------------+
| st_astext(c1)                                                                     |
+-----------------------------------------------------------------------------------+
| POINT(0 0)                                                                        |
| MULTIPOINT((0 0),(20 20),(60 60))                                                 |
| LINESTRING(0 0,10 10,20 25,50 60)                                                 |
| MULTILINESTRING((10 10,20 20),(15 15,30 30))                                      |
| POLYGON((0 0,10 0,10 10,0 10,0 0),(5 5,7 5,7 7,5 7,5 5))                          |
| MULTIPOLYGON(((0 0,10 0,10 10,0 10,0 0)),((5 5,7 5,7 7,5 7,5 5)))                 |
| GEOMETRYCOLLECTION(POINT(1 -1),POINT(10 10),POINT(30 30),LINESTRING(15 15,20 20)) |
+-----------------------------------------------------------------------------------+

# 测试ST_ASGeoJOSN,将gis数据用JOSN的形式展示
select ST_AsGeoJSON(c1) from t1;
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| ST_AsGeoJSON(c1)                                                                                                                                                                                                                                                   |
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| {"type": "Point", "coordinates": [0.0, 0.0]}                                                                                                                                                                                                                       |
| {"type": "MultiPoint", "coordinates": [[0.0, 0.0], [20.0, 20.0], [60.0, 60.0]]}                                                                                                                                                                                    |
| {"type": "LineString", "coordinates": [[0.0, 0.0], [10.0, 10.0], [20.0, 25.0], [50.0, 60.0]]}                                                                                                                                                                      |
| {"type": "MultiLineString", "coordinates": [[[10.0, 10.0], [20.0, 20.0]], [[15.0, 15.0], [30.0, 30.0]]]}                                                                                                                                                           |
| {"type": "Polygon", "coordinates": [[[0.0, 0.0], [10.0, 0.0], [10.0, 10.0], [0.0, 10.0], [0.0, 0.0]], [[5.0, 5.0], [7.0, 5.0], [7.0, 7.0], [5.0, 7.0], [5.0, 5.0]]]}                                                                                               |
| {"type": "MultiPolygon", "coordinates": [[[[0.0, 0.0], [10.0, 0.0], [10.0, 10.0], [0.0, 10.0], [0.0, 0.0]]], [[[5.0, 5.0], [7.0, 5.0], [7.0, 7.0], [5.0, 7.0], [5.0, 5.0]]]]}                                                                                      |
| {"type": "GeometryCollection", "geometries": [{"type": "Point", "coordinates": [1.0, -1.0]}, {"type": "Point", "coordinates": [10.0, 10.0]}, {"type": "Point", "coordinates": [30.0, 30.0]}, {"type": "LineString", "coordinates": [[15.0, 15.0], [20.0, 20.0]]}]} |
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

空间对象属性函数

函数名描述
ST_Dimension(g)返回空间对象的维度,维度有-1、0, 1, 2,-1是空对象的维度,0是点的维度
ST_Envelope(g)返回对象的MBR(minimum bounding rectangle),如果参数是点或者垂直或水平的直线,则返回参数本身
ST_GeometryType(g)返回空间对象的类型,参数可以是任意一个空间对象实例
ST_IsEmpty(g)返回一个对象集合是否是空的
ST_IsSimple(g)返回一个对象是否是简单的,简单对象不会发生自相交和自相切
ST_SRID(g [, srid])返回一个空间对象的SRS号(一个参数时)或者为一个空间对象设置SRS(两个参数时)
ST_Latitude(p [, new_latitude_val])返回一个点的纬度值(一个参数时)或者设置一个点的纬度值(两参数时)
ST_Longitude(p [, new_longitude_val])返回一个点的经度值(一个参数时)或者设置一个点的经度值(两参数时)
ST_X(p [, new_x_val])返回一个点的x坐标(一个参数时)或设置一个点的x坐标(两参数时)
ST_Y(p [, new_y_val])返回一个点的y坐标(一个参数时)或设置一个点的y坐标(两参数时)
ST_EndPoint(ls)返回线段的终点,参数只可是lingstring对象,否则会返回NULL值,正常返回值是point
ST_IsClosed(ls)返回一个lingstring是否是闭环(头顶点和尾顶点是同一个),返回值为0或1,参数可以是linestring和multilinestring(multilinestring需要所有的linestring都是闭环才会返回1)
ST_Length(ls [, unit])返回linestring或者multilinestring的长度,multilinestring的长度是其中所有linestring的长度和
ST_NumPoints(ls)返回linestring上点的个数,参数只能是lingstring否则返回NULL值
ST_PointN(ls, N)返回linestring中第N(第二个参数决定)个顶点
ST_StartPoint(ls)返回linestring的开始顶点(第一个点)
ST_Area({polympoly})计算多边形的面积,参数可以是Polygon或者MultiPolygon,MultiPolygon的面积是其中所有多边形面积的和
ST_Centroid({polympoly})返回多边形的质心,参数是polygon或者multipolygon,返回值是一个点返回多边形的质心,参数是polygon或者multipolygon,返回值是一个点
ST_ExteriorRing(poly)返回一个多边形对象的外圈,返回值是linestring(一条线),参数只能是polygon,否则报错或返回NULL
ST_InteriorRingN(poly, N)返回多边形的第N(第二个参数)个的内环,只支持polygon,返回值是linestring
ST_NumInteriorRing(poly),ST_NumInteriorRings(poly)返回多边形内环的个数,参数只能是polygon类型对象
ST_GeometryN(gc, N)读取空间对象集合中的第N(第二个参数)个对象,第一个参数需要是GeometryCollection
ST_NumGeometries(gc)返回空间对象集合中对象的个数,参数只能是geometrycollection类型对象
ST_IsValid(g)返回一个空间对象是否是有效的,空对象只有对象集合有效,其余看实际对象,比如linestring(0 0, -0 0, 0 0)就不是有效的

举例

create table t1(c1 Geometry);
insert into t1 values
(ST_PointFromText('POINT(0 0)')),                                                 
(ST_MPointFromText('MULTIPOINT((0 0),(20 20),(60 60))')),
(ST_LineFromText('LINESTRING(0 0,10 10,20 25,50 60)')),
(ST_MLineFromText('MULTILINESTRING((10 10,20 20),(15 15,30 30))')),
(ST_PolyFromText('POLYGON((0 0,10 0,10 10,0 10,0 0),(5 5,7 5,7 7,5 7,5 5))')),
(ST_MPolyFromText('MULTIPOLYGON(((0 0,10 0,10 10,0 10,0 0)),((5 5,7 5,7 7,5 7,5 5)))')),
(ST_GeomCollFromText('GEOMETRYCOLLECTION(POINT(1 -1),POINT(10 10),POINT(30 30),
                      LINESTRING(15 15,20 20))'));

# 测试ST_Dimension,返回每个类型维度
select ST_Dimension(c1) from t1;
+------------------+
| ST_Dimension(c1) |
+------------------+
|                0 |
|                0 |
|                1 |
|                1 |
|                2 |
|                2 |
|                1 |
+------------------+

# 测试ST_GeometryType,返回每个GIS对象的类型
select ST_GeometryType(c1) from t1;
+---------------------+
| ST_GeometryType(c1) |
+---------------------+
| POINT               |
| MULTIPOINT          |
| LINESTRING          |
| MULTILINESTRING     |
| POLYGON             |
| MULTIPOLYGON        |
| GEOMCOLLECTION      |
+---------------------+

# 测试ST_IsEmpty,测试GIS是否为空
select ST_IsEmpty(c1) from t1;
+----------------+
| ST_IsEmpty(c1) |
+----------------+
|              0 |
|              0 |
|              0 |
|              0 |
|              0 |
|              0 |
|              0 |
+----------------+

# 测试ST_SRID, 返回每个GIS对象的SRID值
select ST_SRID(c1) from t1;
+-------------+
| ST_SRID(c1) |
+-------------+
|           0 |
|           0 |
|           0 |
|           0 |
|           0 |
|           0 |
|           0 |
+-------------+

# 测试ST_Latitude,ST_SRID,先测试使用ST_SRID两个参数,为GIS对象指定SRID值;并用ST_Latitude返回纬度
select ST_Latitude(ST_SRID(c1,4326)) from t1 where ST_GeometryType(c1) = 'POINT';
+-------------------------------+
| ST_Latitude(ST_SRID(c1,4326)) |
+-------------------------------+
|                             0 |
+-------------------------------+

# 测试ST_X,返回一个点的x坐标
select ST_X(c1) from t1 where ST_GeometryType(c1) = 'POINT';
+----------+
| ST_X(c1) |
+----------+
|        0 |
+----------+

# 测试ST_Length,返回一个线段或者线段集合的长度
select ST_Length(c1) from t1
 where ST_GeometryType(c1) = 'LINESTRING' or ST_GeometryType(c1) = 'MULTILINESTRING';
+-------------------+
| ST_Length(c1)     |
+-------------------+
| 78.26761428751533 |
| 35.35533905932738 |
+-------------------+
# 测试ST_Area,返回一个平面或者一个平面集合的面积
select ST_Area(c1) from t1
 where ST_GeometryType(c1) = 'POLYGON' or ST_GeometryType(c1) = 'MULTIPOLYGON';
+-------------+
| ST_Area(c1) |
+-------------+
|          96 |
|         104 |
+-------------+

# 测试ST_NumInteriorRing,返回多边形内环的个数
select ST_NumInteriorRing(c1) from t1
 where ST_GeometryType(c1) = 'POLYGON' or ST_GeometryType(c1) = 'MULTIPOLYGON';
+------------------------+
| ST_NumInteriorRing(c1) |
+------------------------+
|                      1 |
|                   NULL |
+------------------------+

空间对象关系计算函数

这类函数主要是计算两个空间对象之间的关系,比如包含、相交、距离等等。

函数名描述
ST_Contains(g1, g2)测试第一个参数的对象是否包含第二个参数的对象,与ST_Within正好相反
ST_Crosses(g1, g2)测试两个空间对象是否交叉,非一维对象指的是两个对象有相同的点,但不是完全相同,一维对象指有交叉点而无公共线段,但是如果参数一是polygon或者multipolygon或参数二是point或者multipoint时会返回NULL值
ST_Disjoint(g1, g2)测试两个空间对象是否不相交,是ST_Crossess的反函数
ST_Distance(g1, g2 [, unit])返回两个空间对象的距离,可用于任何空间对象,第三个参数可用于指定距离单位,比如米(metre)、英尺(foot)等
ST_Equals(g1, g2)两个空间对象是否在空间上相同
ST_FrechetDistance(g1, g2 [, unit])一个几何体与另一个几何体之间的离散弗雷切特距离,第三个参数可用于指定距离单位,比如米(metre)、英尺(foot)等
ST_HausdorffDistance(g1, g2 [, unit])一个几何体与另一个几何体之间的离散Hausdorff距离,第三个参数可用于指定距离单位,比如米(metre)、英尺(foot)等
ST_Intersects(g1, g2)返回两个对象是否相交,与ST_Crosses不同的是它可以处理各个空间对象,没有polygon和point的限制
ST_Overlaps(g1, g2)返回两个对象是否重叠,跟ST_Intersects的区别在与该函数只在相交部分和对象的维度相同是才返回1
ST_Touches(g1, g2)返回两个空间对象是否相邻,即边界挨着,但不相交或重叠
ST_Within(g1, g2)返回参数一是否在参数二内部,与ST_Contains相反
MBRContains(g1, g2)测试第一个参数的MBR是否包含第二个参数的MBR,与MBRWithin正好相反
MBRCoveredBy(g1, g2)测试第二个参数的MBR是否覆盖了第一个参数的MBR,与MBRCovers相反
MBRCovers(g1, g2)测试第一个参数的MBR是否覆盖了第二个参数的MBR,与MBRCoveredBy相反
MBRDisjoint(g1, g2)测试两个参数的MBR是否不相交
MBREquals(g1, g2)测试两个参数的MBR是否相同
MBRIntersects(g1, g2)测试两个参数的MBR是否相交
MBROverlaps(g1, g2)测试两个参数的MBR是否重叠
MBRTouches(g1, g2)测试两个参数的MBR是否相邻,边界挨着而不重叠
MBRWithin(g1, g2)测试第二个参数的MBR是否包含第一个参数的MBR,与MBRWithin正好相反

举例

# 测试ST_Contains,ST_Within,ST_Contains测试第一个参数对象是否包含第二个参数对象,
# ST_Within测试第参数一是否在参数二内部。
SET @g1 = ST_GeomFromText('Polygon((0 0,0 3,3 3,3 0,0 0))');
SET @g2 = ST_GeomFromText('Point(1 1)');
SELECT ST_Contains(@g1,@g2), ST_Within(@g2,@g1);
+----------------------+--------------------+
| ST_Contains(@g1,@g2) | ST_Within(@g2,@g1) |
+----------------------+--------------------+
|                    1 |                  1 |
+----------------------+--------------------+

# 测试ST_Crosses,ST_Disjoint,ST_Crosses测试第一个参数对象和第二个参数对象是否相交,
# ST_Disjoint测试第一个参数和第二个对象是否不相交
SET @g1 = ST_GeomFromText('LINESTRING(1 1,10 10)');
SET @g2 = ST_GeomFromText('MULTIPOINT(0 0,3 3)');
select ST_Crosses(@g2, @g1), ST_Disjoint(@g2, @g2);
+----------------------+-----------------------+
| ST_Crosses(@g2, @g1) | ST_Disjoint(@g2, @g2) |
+----------------------+-----------------------+
|                    1 |                     0 |
+----------------------+-----------------------+

# 测试ST_Distance,返回在平面坐标系中(SRID=0)两个点的距离
SET @g1 = ST_GeomFromText('POINT(1 1)');
SET @g2 = ST_GeomFromText('POINT(2 2)');
SELECT ST_Distance(@g1, @g2);
+-----------------------+
| ST_Distance(@g1, @g2) |
+-----------------------+
|    1.4142135623730951 |
+-----------------------+

# 测试ST_Distance,返回在空间坐标系中(SRID=4326)两个点的距离
SET @g1 = ST_GeomFromText('POINT(1 1)', 4326);
SET @g2 = ST_GeomFromText('POINT(2 2)', 4326);
SELECT ST_Distance(@g1, @g2);
+-----------------------+
| ST_Distance(@g1, @g2) |
+-----------------------+
|     156874.3859490455 |
+-----------------------+

# 测试ST_Distance,返回在空间坐标系中(SRID=4326)两个点的距离,并指定单位米(metre)、英尺(foot)
SELECT ST_Distance(@g1, @g2, 'metre');
+--------------------------------+
| ST_Distance(@g1, @g2, 'metre') |
+--------------------------------+
|              156874.3859490455 |
+--------------------------------+

SELECT ST_Distance(@g1, @g2, 'foot');
+-------------------------------+
| ST_Distance(@g1, @g2, 'foot') |
+-------------------------------+
|             514679.7439273146 |
+-------------------------------+

# 测试ST_Equals,返回两个GIS对象是否相等
SET @g1 = Point(1,1), @g2 = Point(2,2);
SELECT ST_Equals(@g1, @g1), ST_Equals(@g1, @g2);
+---------------------+---------------------+
| ST_Equals(@g1, @g1) | ST_Equals(@g1, @g2) |
+---------------------+---------------------+
|                   1 |                   0 |
+---------------------+---------------------+

# 测试ST_FrechetDistance,返回在平面坐标系中(SRID=0)两个GIS对象离散弗雷切特距离
SET @ls1 = ST_GeomFromText('LINESTRING(0 0,0 5,5 5)');
SET @ls2 = ST_GeomFromText('LINESTRING(0 1,0 6,3 3,5 6)');
 SELECT ST_FrechetDistance(@ls1, @ls2);
+--------------------------------+
| ST_FrechetDistance(@ls1, @ls2) |
+--------------------------------+
|             2.8284271247461903 |
+--------------------------------+

# 测试ST_FrechetDistance,返回在空间坐标系中((SRID=4326)两个GIS对象离散弗雷切特距离,
# 并指定单位米(metre)、英尺(foot)
SET @ls1 = ST_GeomFromText('LINESTRING(0 0,0 5,5 5)', 4326);
SET @ls2 = ST_GeomFromText('LINESTRING(0 1,0 6,3 3,5 6)', 4326);
SELECT ST_FrechetDistance(@ls1, @ls2);
+--------------------------------+
| ST_FrechetDistance(@ls1, @ls2) |
+--------------------------------+
|              313421.1999416798 |
+--------------------------------+

SELECT ST_FrechetDistance(@ls1, @ls2, 'foot');
+----------------------------------------+
| ST_FrechetDistance(@ls1, @ls2, 'foot') |
+----------------------------------------+
|                     1028284.7767115477 |
+----------------------------------------+

# 测试ST_FrechetDistance,返回在平面坐标系中(SRID=0)两个GIS对象离散Hausdorff特距离
SET @ls1 = ST_GeomFromText('LINESTRING(0 0,0 5,5 5)');
SET @ls2 = ST_GeomFromText('LINESTRING(0 1,0 6,3 3,5 6)');
SELECT ST_HausdorffDistance(@ls1, @ls2);
+----------------------------------+
| ST_HausdorffDistance(@ls1, @ls2) |
+----------------------------------+
|                                1 |
+----------------------------------+

# 测试ST_FrechetDistance,返回在空间坐标系中((SRID=4326)两个GIS对象离散Hausdorff距离,
# 并指定单位米(metre)、英尺(foot)
SET @ls1 = ST_GeomFromText('LINESTRING(0 0,0 5,5 5)', 4326);
SET @ls2 = ST_GeomFromText('LINESTRING(0 1,0 6,3 3,5 6)', 4326);
SELECT ST_HausdorffDistance(@ls1, @ls2);
+----------------------------------+
| ST_HausdorffDistance(@ls1, @ls2) |
+----------------------------------+
|               111319.49079326246 |
+----------------------------------+

SELECT ST_HausdorffDistance(@ls1, @ls2, 'foot');
+------------------------------------------+
| ST_HausdorffDistance(@ls1, @ls2, 'foot') |
+------------------------------------------+
|                        365221.4264870815 |
+------------------------------------------+

# 测试MBRContains,MBRWithin,MBRContains第一个参数的MBR是否包含第二个参数的MBR,
# MBRWithin测试第二个参数的MBR是否包含第一个参数的MBR
SET @g1 = ST_GeomFromText('Polygon((0 0,0 3,3 3,3 0,0 0))');
SET @g2 = ST_GeomFromText('Point(1 1)');
SELECT MBRContains(@g1,@g2), MBRWithin(@g2,@g1);
+----------------------+--------------------+
| MBRContains(@g1,@g2) | MBRWithin(@g2,@g1) |
+----------------------+--------------------+
|                    1 |                  1 |
+----------------------+--------------------+

# 测试MBRCovers,MBRCoveredby,MBRCovers测试第二个参数的MBR是否覆盖了第一个参数的MBR,
# MBRCoveredby测试第二个参数的MBR是否覆盖了第一个参数的MBR,与MBRCovers相反
SELECT MBRCovers(@g1,@g2), MBRCoveredby(@g1,@g2);
+--------------------+-----------------------+
| MBRCovers(@g1,@g2) | MBRCoveredby(@g1,@g2) |
+--------------------+-----------------------+
|                  1 |                     0 |
+--------------------+-----------------------+

SELECT MBRCovers(@g2,@g1), MBRCoveredby(@g2,@g1);
+--------------------+-----------------------+
| MBRCovers(@g2,@g1) | MBRCoveredby(@g2,@g1) |
+--------------------+-----------------------+
|                  0 |                     1 |
+--------------------+-----------------------+

空间对象生成函数

这类函数依据某种规则从一个已有的空间对象生成另一个空间对象,比如生成凸包、坐标系转换等等。

函数名描述
ST_Buffer(g, d [, strategy1 [, strategy2 [, strategy3]]])返回一个空间对象,返回的空间对象中的所有的点距离参数一表示的对象都小于等于参数二指定的长度,参数三指定计算策略
ST_Buffer_Strategy(strategy [, points_per_circle])根据输入的参数返回一个值用于指定ST_Buffer函数使用的策略(参数三)
ST_ConvexHull(g)生成参数对象的凸包,凸包是指包含给定集合的凸集的交集,不严谨的说是最外层的点连接起来构成的凸多边形
ST_Difference(g1, g2)返回参数一减去参数二的对象
ST_Intersection(g1, g2)返回两个空间对象的交集,返回值可能是各种类型,取决于输入
ST_SymDifference(g1, g2)返回两个对象的对称差集,即两对象的并集减去两对象的交集
ST_Transform(g, target_srid)将一个空间对象转换到另一个坐标系中,第二个参数决定了目标坐标系
ST_Union(g1, g2)返回两个空间对象的并集,目前只支持平面坐标系

举例

# 测试ST_Buffer,返回一个空间对象,返回的空间对象中的所有的点距离参数一表示的对象
# 都小于等于参数二指定的长度,参数三指定计算策略
SET @pt = ST_GeomFromText('POINT(0 0)');
SELECT ST_AsText(ST_Buffer(@pt, 0));
+------------------------------+
| ST_AsText(ST_Buffer(@pt, 0)) |
+------------------------------+
| POINT(0 0)                   |
+------------------------------+

# 测试ST_Buffer_Strategy,根据输入的参数返回一个值用于指定ST_Buffer函数使用的策略
SET @pt = ST_GeomFromText('POINT(0 0)');
SET @pt_strategy = ST_Buffer_Strategy('point_square');
SELECT ST_AsText(ST_Buffer(@pt, 2, @pt_strategy));
+--------------------------------------------+
| ST_AsText(ST_Buffer(@pt, 2, @pt_strategy)) |
+--------------------------------------------+
| POLYGON((-2 -2,2 -2,2 2,-2 2,-2 -2))       |
+--------------------------------------------+

SET @ls = ST_GeomFromText('LINESTRING(0 0,0 5,5 5)');
SET @end_strategy = ST_Buffer_Strategy('end_flat');
SET @join_strategy = ST_Buffer_Strategy('join_round', 10);
SELECT ST_AsText(ST_Buffer(@ls, 5, @end_strategy, @join_strategy))
+---------------------------------------------------------------+
| ST_AsText(ST_Buffer(@ls, 5, @end_strategy, @join_strategy))   |
+---------------------------------------------------------------+
| POLYGON((5 5,5 10,0 10,-3.5355339059327373 8.535533905932738, |
| -5 5,-5 0,0 0,5 0,5 5))                                       |
+---------------------------------------------------------------+

# 测试ST_ConvexHull,返回参数对象的凸包
SET @g = 'MULTIPOINT(5 0,25 0,15 10,15 25)';
SELECT ST_AsText(ST_ConvexHull(ST_GeomFromText(@g)));
+-----------------------------------------------+
| ST_AsText(ST_ConvexHull(ST_GeomFromText(@g))) |
+-----------------------------------------------+
| POLYGON((5 0,25 0,15 25,5 0))                 |
+-----------------------------------------------+

# 测试ST_Difference,返回参数一减去参数二的对象
SET @g1 = Point(1,1), @g2 = Point(2,2);
SELECT ST_AsText(ST_Difference(@g1, @g2));
+------------------------------------+
| ST_AsText(ST_Difference(@g1, @g2)) |
+------------------------------------+
| POINT(1 1)                         |
+------------------------------------+

# 测试ST_Intersection,返回两个空间对象的交集,返回值可能是各种类型,取决于输入
SET @g1 = ST_GeomFromText('LineString(1 1, 3 3)');
SET @g2 = ST_GeomFromText('LineString(1 3, 3 1)');
SELECT ST_AsText(ST_Intersection(@g1, @g2));
+--------------------------------------+
| ST_AsText(ST_Intersection(@g1, @g2)) |
+--------------------------------------+
| POINT(2 2)                           |
+--------------------------------------+

# 测试ST_SymDifference,返回两个对象的对称差集,即两对象的并集减去两对象的交集
SET @g1 = ST_GeomFromText('MULTIPOINT(5 0,15 10,15 25)');
SET @g2 = ST_GeomFromText('MULTIPOINT(1 1,15 10,15 25)');
SELECT ST_AsText(ST_SymDifference(@g1, @g2));
+---------------------------------------+
| ST_AsText(ST_SymDifference(@g1, @g2)) |
+---------------------------------------+
| MULTIPOINT((1 1),(5 0))               |
+---------------------------------------+

# 测试ST_Transform,将一个空间对象转换到另一个坐标系中,第二个参数决定了目标坐标系
SET @p = ST_GeomFromText('POINT(52.381389 13.064444)', 4326);
SET @p = ST_Transform(@p, 4230);
SELECT ST_AsText(@p);
+---------------------------------------------+
| ST_AsText(@p)                               |
+---------------------------------------------+
| POINT(52.38208611407426 13.065520672345304) |
+---------------------------------------------+

# 测试ST_Union,返回两个空间对象的并集,目前只支持平面坐标系
SET @g1 = ST_GeomFromText('LineString(1 1, 3 3)');
SET @g2 = ST_GeomFromText('LineString(1 3, 3 1)');
SELECT ST_AsText(ST_Union(@g1, @g2));
+--------------------------------------+
| ST_AsText(ST_Union(@g1, @g2))        |
+--------------------------------------+
| MULTILINESTRING((1 1,3 3),(1 3,3 1)) |
+--------------------------------------+

空间聚合函数

函数名描述
ST_Collect([DISTINCT] g) [over_clause]将空间值聚合到集合中

举例

# 测试空间聚合函数ST_Collect
CREATE TABLE product (
  year INTEGER,
  product VARCHAR(256),
  location Geometry
);

INSERT INTO product
(year,  product,     location) VALUES
(2000, "Calculator", ST_GeomFromText('point(60 -24)',4326)),
(2000, "Computer"  , ST_GeomFromText('point(28 -77)',4326)),
(2000, "Abacus"    , ST_GeomFromText('point(28 -77)',4326)),
(2000, "TV"        , ST_GeomFromText('point(38  60)',4326)),
(2001, "Calculator", ST_GeomFromText('point(60 -24)',4326)),
(2001, "Computer"  , ST_GeomFromText('point(28 -77)',4326));

SELECT ST_AsText(ST_Collect(location)) AS result FROM product;
+------------------------------------------------------------------+
| result                                                           |
+------------------------------------------------------------------+
| MULTIPOINT((60 -24),(28 -77),(28 -77),(38 60),(60 -24),(28 -77)) |
+------------------------------------------------------------------+

SELECT ST_AsText(ST_Collect(DISTINCT location)) AS result FROM product;
+---------------------------------------+
| result                                |
+---------------------------------------+
| MULTIPOINT((60 -24),(28 -77),(38 60)) |
+---------------------------------------+

SELECT year, ST_AsText(ST_Collect(location)) AS result FROM product GROUP BY year;
+------+------------------------------------------------+
| year | result                                         |
+------+------------------------------------------------+
| 2000 | MULTIPOINT((60 -24),(28 -77),(28 -77),(38 60)) |
| 2001 | MULTIPOINT((60 -24),(28 -77))                  |
+------+------------------------------------------------+

SELECT year, ST_AsText(ST_Collect(DISTINCT location)) AS result FROM product GROUP BY year;
+------+---------------------------------------+
| year | result                                |
+------+---------------------------------------+
| 2000 | MULTIPOINT((60 -24),(28 -77),(38 60)) |
| 2001 | MULTIPOINT((60 -24),(28 -77))         |
+------+---------------------------------------+

# selects nothing
SELECT ST_Collect(location) AS result FROM product WHERE year = 1999;
+--------+
| result |
+--------+
| NULL   |
+--------+

SELECT ST_AsText(ST_Collect(location)
    OVER (ORDER BY year, product ROWS BETWEEN 1 PRECEDING AND CURRENT ROW))
       AS result
       FROM product;
+-------------------------------+
| result                        |
+-------------------------------+
| MULTIPOINT((28 -77))          |
| MULTIPOINT((28 -77),(60 -24)) |
| MULTIPOINT((60 -24),(28 -77)) |
| MULTIPOINT((28 -77),(38 60))  |
| MULTIPOINT((38 60),(60 -24))  |
| MULTIPOINT((60 -24),(28 -77)) |
+-------------------------------+

其他函数

这类函数主要是一些提供其他操作以提高应用灵活性的函数。

函数名描述
ST_GeoHash(longitude, latitude, max_length)ST_GeoHash(point, max_length)返回一个点的geohash值(字符串),第二或三个参数定义了hash值的长度
ST_LatFromGeoHash(geohash_str)从geohash中读取纬度值
ST_LongFromGeoHash(geohash_str)从geohash中读取经度值
ST_PointFromGeoHash(geohash_str, srid)从geohash值中解析出point点,point点是以经纬度形式输出的
ST_Distance_Sphere(g1, g2 [, radius])返回两个空间对象的球面距离(以米为单位),目前只可用于point以及multipoint对象,第三个参数指定了球的半径
ST_MakeEnvelope(pt1, pt2)返回两个点的MBR,与ST_Envelope不同之处在于该函数只支持点作为参数,返回值可能是点(两个参数相同),线(两个参数构成水平或垂直的线)或者多边形(其他情况)
ST_Simplify(g, max_distance)使用Douglas-Peucker算法对曲线进行简化,第二参数(必须是正数)决定了距离阈值,第一个参数可以是任意类型,但是理论上Douglas-Peucker算法只能处理曲线
ST_Validate(g)检查一个空间对象是否有效,比如顶点全是(0 0)的多边形或者曲线就是无效的,例外空的geometry collection是有效的,如果对象有效,返回对象本身,否则返回NULL值
ST_LineInterpolatePoint(ls, fractional_distance)计算给定线段上指定比例位置处的点坐标
ST_LineInterpolatePoints(ls, fractional_distance)计算给定线段上指定比例位置处的多点坐标
ST_PointAtDistance(ls, distance)返回给定线段指定距离的点
ST_SwapXY(g)交换空间对象中所有顶点坐标的x轴和y轴值

举例

# 测试ST_GeoHash,回一个点的geohash值(字符串
SELECT ST_GeoHash(180,0,10), ST_GeoHash(-180,-90,15);
+----------------------+-------------------------+
| ST_GeoHash(180,0,10) | ST_GeoHash(-180,-90,15) |
+----------------------+-------------------------+
| xbpbpbpbpb           | 000000000000000         |
+----------------------+-------------------------+

# 测试ST_LatFromGeoHash,从geohash中读取一个点纬度值
SELECT ST_LatFromGeoHash(ST_GeoHash(45,-20,10));
+------------------------------------------+
| ST_LatFromGeoHash(ST_GeoHash(45,-20,10)) |
+------------------------------------------+
|                                      -20 |
+------------------------------------------+

# 测试ST_LongFromGeoHash,从geohash中读取一个点经度值
SELECT ST_LongFromGeoHash(ST_GeoHash(45,-20,10));
+-------------------------------------------+
| ST_LongFromGeoHash(ST_GeoHash(45,-20,10)) |
+-------------------------------------------+
|                                        45 |
+-------------------------------------------+

# 测试ST_PointFromGeoHash,从geohash值中解析出point点,point点是以经纬度形式输出的
SET @gh = ST_GeoHash(45,-20,10);
SELECT ST_AsText(ST_PointFromGeoHash(@gh,0));
+---------------------------------------+
| ST_AsText(ST_PointFromGeoHash(@gh,0)) |
+---------------------------------------+
| POINT(45 -20)                         |
+---------------------------------------+

# 测试ST_LineInterpolatePoint,计算给定线段上指定比例位置处的点坐标
SET @ls1 = ST_GeomFromText('LINESTRING(0 0,0 5,5 5)');
SELECT ST_AsText(ST_LineInterpolatePoint(@ls1, .5));
+----------------------------------------------+
| ST_AsText(ST_LineInterpolatePoint(@ls1, .5)) |
+----------------------------------------------+
| POINT(0 5)                                   |
+----------------------------------------------+

SELECT ST_AsText(ST_LineInterpolatePoint(@ls1, .75));
+-----------------------------------------------+
| ST_AsText(ST_LineInterpolatePoint(@ls1, .75)) |
+-----------------------------------------------+
| POINT(2.5 5)                                  |
+-----------------------------------------------+

SELECT ST_AsText(ST_LineInterpolatePoint(@ls1, 1));
+---------------------------------------------+
| ST_AsText(ST_LineInterpolatePoint(@ls1, 1)) |
+---------------------------------------------+
| POINT(5 5)                                  |
+---------------------------------------------+

# 测试ST_LineInterpolatePoints,计算给定线段上指定比例位置处的多点坐标
SELECT ST_AsText(ST_LineInterpolatePoints(@ls1, .25));
+------------------------------------------------+
| ST_AsText(ST_LineInterpolatePoints(@ls1, .25)) |
+------------------------------------------------+
| MULTIPOINT((0 2.5),(0 5),(2.5 5),(5 5))        |
+------------------------------------------------+

select ST_AsText(ST_LineInterpolatePoints(@ls1, 1));
+----------------------------------------------+
| ST_AsText(ST_LineInterpolatePoints(@ls1, 1)) |
+----------------------------------------------+
| MULTIPOINT((5 5))                            |
+----------------------------------------------+

# 测试ST_SwapXY,交换空间对象中所有顶点坐标的x轴和y轴值
select ST_AsText(ST_SwapXY(@ls1));
+----------------------------+
| ST_AsText(ST_SwapXY(@ls1)) |
+----------------------------+
| LINESTRING(0 0,5 0,5 5)    |
+----------------------------+

不支持项

  1. 不支持全局创建CREATE SPATIAL REFERENCE,只有在sqlnode 和 datanode上分别创建,和create user类似。

  2. 暂时不支持空间数据类型的改变。

    create table t1(c1 point);
    alter table t1 modify column c1 varchar(200);
    ERROR 8535 (HY000): GreatDB prepare alter table failed: unsupport online-ddl . Field 'c1' change
    to non-online-convertion type, case by charset is diffrent, convert binary to utf8mb4
    
    备注:当前版本在column对空间类型,转换为其它数据类型有限制,后续版本会相继放开这些限制。
    
© 万里开源 all right reserved,powered by Gitbook
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论