MySQL Geometry的使用 —— 地理空间类型Geometry

注意:在投影坐标系中不同的投影标准有不同的单位,如常用到的投影标准:3857以米为单位,4326以度为单位

一、Geometry数据类型有哪些?

1.Geometry介绍
  • MySQL中支持的几何数据类型包括Geometry(几何)、Point(点)、LineString(线)、Polygon(面)
    以及集合类型的MultiPoint(多点)、MultiLineString(多线)、MultiPolygon(多面)、GeometryCollection(混合数据类型)
  • 其中,Geometry可以表示其他任意类型的值,剩下的只能表示单个类型的值
2.Geometry类型

注意:数据中间不能有多余的空格

名称 类型 例如
Point 点坐标 POINT(103 35)
LineString 线坐标 LINESTRING(103 35,103 36,104 36,105 37)
Polygon 面坐标 POLYGON(103 35,104 35,104 36,103 36,103 35)
MultiPoint 多点 MULTIPOINT(103 35, 104 34,105 35)
MultiLineString 多线 MULTILINESTRING((103 35, 104 35), (105 36, 105 37))
MultiPolygon 多面 MULTIPOLYGON(((103 35,104 35,104 36,103 36,103 35)),((103 36,104 36,104 37,103 36)))
GeometryCollection 混合类型 GEOMETRYCOLLECTION(POINT(103 35), LINESTRING(103 35, 103 37))

二、Geometry数据格式

  • WKT(文本格式:在代码中的格式)
  • WKB(二进制格式:存储在Geometry类型的表字段中)

三、Geometry的常用函数

1.构造函数

构造函数会获取一种几何类型或几何的文本说明,然后创建一个几何

  • ST_Point:文本格式转Point格式(例如存表的时候)
  • ST_PointFromText:Point格式转文本格式(例如查询的时候)
  • ST_Polygon:文本格式转Polygon格式
  • ST_PolygonFromText:Polygon格式转文本格式
  • ST_PointFromWKB:以熟知二进制 (WKB) 表示和空间参考 ID 作为输入参数返回 ST_Point 类型的对象
2.存取器函数

函数都采用一个或多个几何作为输入,并返回关于几何的特定信息

  • 获取线/面对象四至:st_xmin(geometry)、st_ymin(geometry)、st_xmax(geometry)、st_ymax(geometry)
  • ST_AsText:获取一个几何类型,然后返回其可识别的文本表示
  • ST_AsGeoJSON:将Geometry格式转为JSON格式
  • ST_Centroid:以面或多面为参数输入,然后返回位于几何的包络矩形中心的点
  • ST_Length:用于返回线串或多线串的长度
  • ST_MaxX:以几何为参数,返回最大的 X 坐标
  • ST_SRID:以几何对象作为输入参数,并返回其空间参考 ID
  • ST_X:返回点坐标的 X 坐标
  • ST_Y:返回点坐标的 Y 坐标
3.关系函数

关系函数将几何作为输入并确定各几何之间是否存在特定关系

  • ST_Contains :判断第一个几何对象是否完全包含第二个几何对象
  • ST_Disjoint:判断两个几何对象无交集
  • ST_Equals:判断两个几何对象是否完全相同
4.几何函数

函数利用空间数据并对其执行分析,然后返回新的空间数据

  • ST_Buffer:获取几何对象和距离,然后返回表示围绕源对象的缓冲区的几何对象(例如可以使用线坐标,构造一个线坐标50米之内的面)
  • ST_Distance:用于返回两个几何之间的距离。这一距离是两个几何的最近折点之间的距离
  • ST_Difference:获取两个几何对象,然后返回表示两个源对象之差的几何对象(例如,计算两个面积差)

更多相关函数可参考:ArcMap

四、使用实例

1.从Geometry字段获得信息
  • 通过点坐标 wzxx 字段、线坐标 sydwfw 字段,获得不同类型的数据
select ST_AsText(wzxx) as geometry, ST_X(wzxx) as x, ST_Y(wzxx) as y,	ST_AsGeoJSON(wzxx) as wzxx, ST_AsText(sydwfw) as sydwfwfrom tb_sydw

2.搜索指定范围之内的数据
  • 获得点坐标(103,36)2000米之内的数据
select * from tb_sydwwhere st_distance_sphere(ST_POINTFROMTEXT('POINT(103,36)'), wzxx) < 2000
3.搜索指定范围之内的数据(Geohash算法提速)
  • 通过Geohash算法,可先将范围缩小,在进行精确查找,提高效率(注意边缘问题和曲线突变问题)

GeoHash是一种地址编码方法。他能够把二维的空间经纬度数据编码成一个字符串,然后通过编码前多少位,直接进行匹配,从而快速的锁定一个较小范围

select * from tb_sydwwhere st_geohash(wzxx,5) like concat(st_geohash(ST_POINTFROMTEXT('POINT(103,36)'),5),'%')
4.获得路径多大范围内的面坐标
  • 通过路径坐标数据,获得路径多边形(如需要查找路径多少范围内的数据时),需要注意单位是度还是米,其中ST_Buffer_Strategy为线构造面时,起始点及拐弯处,精度策略

具体可参考:ST_Buffer

SELECT ST_AsText(		 ST_Buffer(			ST_GeomFromText('LINESTRING(103 35,103 36,104 36)'), 0.04,					ST_Buffer_Strategy('end_round',4),ST_Buffer_Strategy('join_round',4)         )       )

函数后两个参数,影响箭头处圆滑程度,精度越高,构造出来的面越圆滑,消耗也更大