麟の随笔

  • 游戏
  • 影视
  • Tech
  1. 首页
  2. 科技
  3. SQL
  4. 正文

MySQL空间查询函数

2021年9月4日 1879点热度 0人点赞 0条评论

数据写入

插入时使用ST_GeomFromText,也可使用GeomFromText

INSERT INTO t_customers ( lon_lat_point )
VALUES
    ( GeomFromText ( 'POINT(123 123)' ) )

查询空间数据

SELECT
    astext ( lon_lat_point ) 
FROM
    `t_customers`

空间查询函数

  • 包含相关

MBRContains(A,B) –> A包含B

MBRWithin(A,B) –> A在B中

注意:包含关系中,所要验证的集合必须全部包含在指定的集合中。如果只有部分在其中,应该使用相交

  • 覆盖相关

MBRCoveredBy(A,B) –> A被B覆盖

MBRCovers(A,B) –> A覆盖B

  • 相交相关

MBRDisjoint(A,B) –> A、B不相交

MBRIntersects(A,B) –> A、B相交

  • 接触

MBRTouches(A,B) –> A、B接触,接触的概念类似于相切

  • 重叠

MBROverlaps(A,B) –> A、B重叠

  • 相同

MBREquals(A,B) –> A、B相同

空间数据相关方法

  • 点独有

开始、结束点

ST_StartPoint(A)

ST_EndPoint(A)

获取x或y

ST_X(A)

ST_Y(A)

  • 包

ST_ConvexHull(A) –> 多点A的凸包面

  • 返回矩形

ST_MakeEnvelope(A,B) –> A、B为对角点

  • 线独有

线是否闭合

ST_IsClosed(A)

线中点数量

ST_NumPoints

线中第n个点

ST_PointN(A,n)

线长度

ST_Length(A)

生成矩形

ST_Envelope(A) –> A只有两个点,且不是水平或竖直线

  • 面积

ST_Area(A)

面的内外边界

ST_ExteriorRing(A) –> 获取A面外环边界,返回值为LineString

ST_InteriorRingN(A,num) –> 获取A面中第num个内环边界,返回值为LineString。num从1开始。

ST_NumInteriorRings(A) –> 获取A面内环数量(5.7.8后添加ST_NumInteriorRing,效果一样)

部分geo对象可用

  • 集合

交集

ST_Intersection(A,B)

异或

ST_SymDifference(A,B) –> A、B中独有的

并集

ST_Union(A,B)

质心

ST_Centroid(A)

距离

ST_Distance(A,B) –> A和B距离

ST_Distance_Sphere(A,B) –> A和B的球面距离

不同

ST_Difference(A,B) –> 返回A中有B中没有的

抽稀

ST_Simplify(A,mix_distance) –> 将A抽稀,简化A中两点距离小于max的值(用起来有点迷。。待研究)

  • 缓冲区

ST_Buffer(A,length) –> 通过A几何体,生成他周边范围为length距离的面

5.7.7后可以添加策略影响缓冲区的计算,设置的语句是ST_Buffer_Strategy()

  • point策略

point_circle –> 点的缓冲区是一个圆(默认)

point_square –> 点的缓冲区是一个正方形,length是点到其中一边的距离

  • join策略

join_round –> 连接处缓冲区边界为圆弧(默认)

join_miter –> 连接处缓冲区边界为尖角

  • end策略

end_round –> 在结束处缓冲区为圆弧(默认)

end_flat –> 在结束处缓冲区为平坦的直线

  • 举例生成缓冲区

ST_Buffer(point, 5, ST_Buffer_Strategy('point_square'))

ST_Buffer(line, 5, ST_Buffer_Strategy('join_miter', 10), ST_Buffer_Strategy('end_flat'))
  • 相交

ST_Intersects(A,B) –> A和B是否相交

ST_Crosses(A,B) –> A和B是否相交(相交部分不等于A或B)

ST_Disjoint(A,B) –> A和B是否不相交

  • 重叠

ST_Overlaps(A,B)

  • 接触

ST_Touches(A,B)

  • 包含

ST_Contains(A,B) –> A是否包含B

ST_Within(A,B) –> A是否在B中

  • 验证数据是否合法

ST_IsValid(A)

ST_Validate(A)

  • geo对象返回格式

ST_AsText(字段名) –> 以文本形式返回

ST_AsBinary(字段名) –> 以二进制形式返回

包含、覆盖、重叠三个方法不清楚具体的区别


注意:每个方法前的MBR、ST可要可不要,在mysql5.7.6之后,不带MBR、ST的方法开始弃用

  • 查询样例:
  1. 查询在指定面中的点

    select * from test where MBRContains(ST_GeomFromText('Polygon((0 0,0 5,5 5,5 0,0 0))'),point)
  2. 查询所有point点的x坐标

    SELECT ST_X(point) FROM test
标签: 暂无
最后更新:2021年9月4日

晓虎

必须有人浴血奋战,世上才有自由可言!

点赞
下一篇 >

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复

COPYRIGHT © 2024 kirinz.com. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

闽ICP备19013981号