注意:在投影坐标系中不同的投影标准有不同的单位,如常用到的投影标准:3857以米为单位,4326以度为单位
地理空间类型Geometry
一、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
:以几何对象作为输入参数,并返回其空间参考 IDST_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 sydwfw
from tb_sydw
![](https://i-blog.csdnimg.cn/blog_migrate/ae8323fe31830064ce6484ffe389a7ba.png)
2.搜索指定范围之内的数据
- 获得点坐标(103,36)2000米之内的数据
select * from tb_sydw
where st_distance_sphere(ST_POINTFROMTEXT('POINT(103,36)'), wzxx) < 2000
3.搜索指定范围之内的数据(Geohash算法提速)
- 通过Geohash算法,可先将范围缩小,在进行精确查找,提高效率(注意边缘问题和曲线突变问题)
GeoHash是一种地址编码方法。他能够把二维的空间经纬度数据编码成一个字符串,然后通过编码前多少位,直接进行匹配,从而快速的锁定一个较小范围
select * from tb_sydw
where 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)
)
)
函数后两个参数,影响箭头处圆滑程度,精度越高,构造出来的面越圆滑,消耗也更大