Mysql空间数据类型(⼊门教程)多边形、矩形、点相交包含等条件查询,常⽤
函数详细介绍(图。。。
1 介绍
Mysql不仅⽀持普通的数据类型,还⽀持⼏何数据类型,并且能对⼏何数据类型进⾏查询(感觉好厉害!),该⼏何类型为geometry,下⾯就让我们从geometry开始学习!
2 Geometry
该类为⼏何数据类型的基类
⼦类(常⽤):
Point: 点,两个坐标确定⼀点。
数据格式:
POINT(113.6425821.57715)
经度(longitude)在前,维度(latitude)在后,⽤空格分隔。
LineString: 线,由⼀系列点连接⽽成。
数据格式:
LINESTRING(113.6425821.57715,113.6315921.9397)
点与点之间⽤逗号分隔;⼀个点中的经纬度⽤空格分隔。
Polygon:多边形。可以是⼀个实⼼平⾯形,即没有内部边界,也可以有空洞,类似纽扣。
数据格式:
POLYGON((00,50,55,05,00))
点与点之间的线连成⼀个多边形。
注意:第⼀个点和最后⼀个点必须⼀样,形成⼀个封闭的图形。
POLYGON() 中可以有多个多边形,例如⼀个⼤正⽅形内⼀个⼩正⽅形,就会形成⼀个空洞。
POLYGON((00,50,55,05,00),(11,41,44,14,11))
3 创建⼏何对象
1. ST_GeomFromText(wkt字符串,srid默认为0) 推荐使⽤
注意:srid=0时是没什么意义的,⼀般选择使⽤4326或3857,该值需要与前端使⽤的地图投影坐标系统匹配,具体请⾃⾏百度EPGS:3857等
该函数可以创建任意⼏何体
SET@p1= ST_GeomFromText('POINT(3 3)',4326);
SET@p2= ST_GeomFromText('LINESTRING(1 1,2 2)',4326);
SET@p3= ST_GeomFromText('POLYGON((0 0,5 0,5 5, 0 5,0 0))',4326);
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))',4326);
SELECT ST_ASTEXT(@p1),ST_ASTEXT(@p2),ST_ASTEXT(@p3),ST_ASTEXT(@p4);
ST_ASTEXT()将Geometry对象转换成⽂本
效果:
2. ST_PointFromText()
创建⼀个Point对象
SET@p1= ST_PointFromText('POINT(3 3)',4326);
SELECT ST_ASTEXT(@p1);
3. ST_LineStringFromText()
创建⼀个LineString对象
SET@p2= ST_LineStringFromText('LINESTRING(1 1,2 2)',4326);
SELECT ST_ASTEXT(@p2);
4. ST_PolygonFromText()
创建⼀个Polygon对象
SET@p3= ST_PolygonFromText('POLYGON((0 0,5 0,5 5, 0 5,0 0))',4326);
barista
prototype是什么意思英语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))',4326);
SELECT ST_ASTEXT(@p3),ST_ASTEXT(@p4);
4 常⽤函数
4.1 ST_AsText(g1) geometry类型转Text
一个月学会java可能吗geometry类型转Text ,⽅便输出
SET@p1= ST_PointFromText('POINT(3 3)',4326);
SELECT ST_ASTEXT(@p1);
4.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);
4.3 ST_Distance(g1, g2) 两点距离(点)
计算两个点的距离
SET@g1=Point(1,1);
SET@g2=Point(2,2);
SELECT ST_Distance(@g1,@g2);
4.4 ST_Crosses(g1, g2) 相交关系(⾮⾯与⾯)
判断 线段之间 || 点和线 || 点和⾯ || 线和⾯(⾮⾯与⾯之间 )是否相交,相交返回1,反之0
SET@g1= ST_LineStringFromText('LINESTRING(0 0,1 1)',4326);
SET@g2= ST_LineStringFromText('LINESTRING(1 0,0 1)',4326);
SET@g3= ST_LineStringFromText('LINESTRING(1 2,4 5)',4326);
SELECT ST_Crosses(@g1,@g2)AS'相交',ST_Crosses(@g1,@g3)AS'不相交';
4.6 ST_Touches(g1, g2) 边界接触(任意⼏何)
判断g1与g2边界是否接触,接触返回1,反之0
SET@g1= ST_PolygonFromText('POLYGON((0 0,5 0,5 5,0 5,0 0))',4326);
SET@g2= ST_PolygonFromText('POLYGON((1 1,4 1,4 4,1 4,1 1))',4326);
SET@g3= ST_PolygonFromText('POLYGON((4 0,4 1,6 1,6 0,4 0))',4326);
SET@g4= ST_PolygonFromText('POLYGON((5 0,5 1,6 1,6 0,5 0))',4326);
mysql菜鸟教程字符串型SET@g5= ST_PolygonFromText('POLYGON((6 0,6 1,7 1,7 0,6 0))',4326);
SELECT ST_Touches(@g1,@g2)AS'包含',ST_Touches(@g1,@g3)AS'不包含,但相交',ST_Touches(@g1,@g4)AS'不包含,边界接触',ST_Touches( @g1,@g5)AS'不包含,完全不接触';
4.7 ST_Contains(g1, g2) 包含关系(任意⼏何)
判断g1是否完全包含g2,完全包含返回1,反之0
SET@g1= ST_PolygonFromText('POLYGON((0 0,5 0,5 5,0 5,0 0))',4326);or指令的作用是
SET@g2= ST_PolygonFromText('POLYGON((1 1,4 1,4 4,1 4,1 1))',4326);
SET@g3= ST_PolygonFromText('POLYGON((4 0,4 1,6 1,6 0,4 0))',4326);
SET@g4= ST_PolygonFromText('POLYGON((5 0,5 1,6 1,6 0,5 0))',4326);
SET@g5= ST_PolygonFromText('POLYGON((6 0,6 1,7 1,7 0,6 0))',4326);
SELECT ST_Contains(@g1,@g2)AS'包含',ST_Contains(@g1,@g3)AS'不包含,但相交',ST_Contains(@g1,@g4)AS'不包含,边界接触',ST_Contains( @g1,@g5)AS'不包含,完全不接触';
4.8 ST_Intersects(g1, g2) 相交关系(任意⼏何体)
官⽅介绍是两个⼏何体相交,但我认为 这⾥是判断两个⼏何体有⽆关系,有关系则返回1,反之0
线段:
SET@g1= ST_LineStringFromText('LINESTRING(0 0,1 1)',4326);
SET@g2= ST_LineStringFromText('LINESTRING(1 0,0 1)',4326);
SET@g3= ST_LineStringFromText('LINESTRING(1 2,4 5)',4326);
头文件includeSELECT ST_Intersects(@g1,@g2)AS'相交',ST_Intersects(@g1,@g3)AS'不相交';
多边形:
SET@g1= ST_PolygonFromText('POLYGON((0 0,5 0,5 5,0 5,0 0))',4326);
SET@g2= ST_PolygonFromText('POLYGON((1 1,4 1,4 4,1 4,1 1))',4326);
SET@g3= ST_PolygonFromText('POLYGON((4 0,4 1,6 1,6 0,4 0))',4326);
SET@g4= ST_PolygonFromText('POLYGON((5 0,5 1,6 1,6 0,5 0))',4326);
SET@g5= ST_PolygonFromText('POLYGON((6 0,6 1,7 1,7 0,6 0))',4326);
SELECT ST_Intersects(@g1,@g2)AS'包含',ST_Intersects(@g1,@g3)AS'不包含,但相交',ST_Intersects(@g1,@g4)AS'不包含,边界接触',ST_Intersec ts(@g1,@g5)AS'不包含,完全不接触';
参考官⽅:
觉得不错的⼩伙伴可以点点赞!!
觉得不错的⼩伙伴可以点点赞!!
觉得不错的⼩伙伴可以点点赞!!