MySQL多边形存储

1 Geometry

该类为几何数据类型的基类

子类(常用):

Point: 点,两个坐标确定一点。

数据格式: POINT(113.64258 21.57715)

经度(longitude)在前,维度(latitude)在后,用空格分隔。

LineString: 线,由一系列点连接而成。

数据格式: LINESTRING(113.64258 21.57715,113.63159 21.9397)

点与点之间用逗号分隔;一个点中的经纬度用空格分隔。

Polygon:多边形。可以是一个实心平面形,即没有内部边界,也可以有空洞,类似纽扣。

数据格式: POLYGON((0 0,5 0,5 5, 0 5,0 0))

点与点之间的线连成一个多边形。

注意:第一个点和最后一个点必须一样,形成一个封闭的图形。

POLYGON() 中可以有多个多边形,例如一个大正方形内一个小正方形,就会形成一个空洞。 POLYGON((0 0,5 0,5 5,0 5,0 0),(1 1,4 1,4 4,1 4,1 1))

2 创建几何对象

ST_GeomFromText() 推荐使用

该函数可以创建任意几何体 SET @p1 = ST_GeomFromText('POINT(3 3)');

SET @p2 = ST_GeomFromText('LINESTRING(1 1,2 2)');

SET @p3 = ST_GeomFromText('POLYGON((0 0,5 0,5 5, 0 5,0 0))');

SET @p4 = ST_GeomFromText('POLYGON((0 0,5 0,5 5,0 5,0 0),(1 1,4 1,4 4,1 4,1 1))');

SELECT ST_ASTEXT(@p1),ST_ASTEXT(@p2),ST_ASTEXT(@p3),ST_ASTEXT(@p4);

ST_ASTEXT()将Geometry对象转换成文本

效果:

ST_PointFromText()

创建一个Point对象 SET @p1 = ST_PointFromText('POINT(3 3)');

SELECT ST_ASTEXT(@p1);

ST_LineStringFromText()

创建一个LineString对象 SET @p2 = ST_LineStringFromText('LINESTRING(1 1,2 2)');

SELECT ST_ASTEXT(@p2);

ST_PolygonFromText()

创建一个Polygon对象 SET @p3 = ST_PolygonFromText('POLYGON((0 0,5 0,5 5, 0 5,0 0))');

SET @p4 = ST_PolygonFromText('POLYGON((0 0,5 0,5 5,0 5,0 0),(1 1,4 1,4 4,1 4,1 1))');

SELECT ST_ASTEXT(@p3),ST_ASTEXT(@p4);

3 常用函数
3.1 ST_AsText(g1) geometry类型转Text

geometry类型转Text ,方便输出

SET @p1 = ST_PointFromText('POINT(3 3)');

SELECT ST_ASTEXT(@p1);

b6f3fcac49b3834326003483300ea313.png

3.2 ST_Equals(g1, g2) 坐标相等(任意几何)

判断任意几何是否相等,相等返回1,反之0

SET @g1 = Point(1,1);

SET @g2 = Point(2,2);

SELECT ST_Equals(@g1, @g1), ST_Equals(@g1, @g2);

c3f6be3ef60e40be1bdcf56dd8206580.png

3.3 ST_Distance(g1, g2) 两点距离(点)

计算两个点的距离

SET @g1 = Point(1,1);

SET @g2 = Point(2,2);

SELECT ST_Distance(@g1, @g2);

b6536c1392dc22f462063ac1a9d01317.png

3.4 ST_Crosses(g1, g2) 相交关系(非面与面)

判断 线段之间 || 点和线 || 点和面 || 线和面(非面与面之间 )是否相交,相交返回1,反之0

SET @g1 = ST_LineStringFromText('LINESTRING(0 0,1 1)');

SET @g2 = ST_LineStringFromText('LINESTRING(1 0,0 1)');

SET @g3 = ST_LineStringFromText('LINESTRING(1 2,4 5)');

SELECT ST_Crosses(@g1, @g2) AS '相交',ST_Crosses(@g1, @g3) AS '不相交';

f1b75c3141aeb12a0d50bb84a239e281.png

3.5 ST_Touches(g1, g2) 边界接触(任意几何)

判断g1与g2边界是否接触,接触返回1,反之0

SET @g1 = ST_PolygonFromText('POLYGON((0 0,5 0,5 5,0 5,0 0))');

SET @g2 = ST_PolygonFromText('POLYGON((1 1,4 1,4 4,1 4,1 1))');

SET @g3 = ST_PolygonFromText('POLYGON((4 0,4 1,6 1,6 0,4 0))');

SET @g4 = ST_PolygonFromText('POLYGON((5 0,5 1,6 1,6 0,5 0))');

SET @g5 = ST_PolygonFromText('POLYGON((6 0,6 1,7 1,7 0,6 0))');

SELECT ST_Touches(@g1, @g2) AS '包含',ST_Touches(@g1, @g3) AS '不包含,但相交',ST_Touches(@g1, @g4) AS '不包含,边界接触',ST_Touches(@g1, @g5) AS '不包含,完全不接触';

9cfc8d079933aa18c735e5efb4a83773.png

3.6 ST_Contains(g1, g2) 包含关系(任意几何)

判断g1是否完全包含g2,完全包含返回1,反之0

bc50686a88a02dd3b5e8a2d145947e5d.png

SET @g1 = ST_PolygonFromText('POLYGON((0 0,5 0,5 5,0 5,0 0))');

SET @g2 = ST_PolygonFromText('POLYGON((1 1,4 1,4 4,1 4,1 1))');

SET @g3 = ST_PolygonFromText('POLYGON((4 0,4 1,6 1,6 0,4 0))');

SET @g4 = ST_PolygonFromText('POLYGON((5 0,5 1,6 1,6 0,5 0))');

SET @g5 = ST_PolygonFromText('POLYGON((6 0,6 1,7 1,7 0,6 0))');

SELECT ST_Contains(@g1, @g2) AS '包含',ST_Contains(@g1, @g3) AS '不包含,但相交',ST_Contains(@g1, @g4) AS '不包含,边界接触',ST_Contains(@g1, @g5) AS '不包含,完全不接触';

3e68491e05bd95bf6bcd345af064b9ba.png

3.7 ST_Intersects(g1, g2) 相交关系(任意几何体)

官方介绍是两个几何体相交,但我认为 这里是判断两个几何体有无关系,有关系则返回1,反之0

线段:

SET @g1 = ST_LineStringFromText('LINESTRING(0 0,1 1)');

SET @g2 = ST_LineStringFromText('LINESTRING(1 0,0 1)');

SET @g3 = ST_LineStringFromText('LINESTRING(1 2,4 5)');

SELECT ST_Intersects(@g1, @g2) AS '相交',ST_Intersects(@g1, @g3) AS '不相交';

345bb7c96e3e18dd1df99aa3a4286bb8.png

多边形:

bc50686a88a02dd3b5e8a2d145947e5d.png

SET @g1 = ST_PolygonFromText('POLYGON((0 0,5 0,5 5,0 5,0 0))');

SET @g2 = ST_PolygonFromText('POLYGON((1 1,4 1,4 4,1 4,1 1))');

SET @g3 = ST_PolygonFromText('POLYGON((4 0,4 1,6 1,6 0,4 0))');

SET @g4 = ST_PolygonFromText('POLYGON((5 0,5 1,6 1,6 0,5 0))');

SET @g5 = ST_PolygonFromText('POLYGON((6 0,6 1,7 1,7 0,6 0))');

SELECT ST_Intersects(@g1, @g2) AS '包含',ST_Intersects(@g1, @g3) AS '不包含,但相交',ST_Intersects(@g1, @g4) AS '不包含,边界接触',ST_Intersects(@g1, @g5) AS '不包含,完全不接触';

9c7dece59bef8cc14171cb0f5c951f57.png

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值