本文共 3622 字,大约阅读时间需要 12 分钟。
最近在学习MySQL的Geometry数据存储和计算,下面是我理解的内容。
Geometry推荐在5.6版本以上使用,尽管大部分功能在5.5版本中已经可用,除了距离计算函数st_distance
等新增函数。
Geometry是所有几何类型的基类,其子类包括Point、LineString、Polygon等。Geometry具有以下共同属性:
Point是几何类型中最简单的,它具有一个坐标值,没有长度、面积或边界。例如:
POINT(121.213342 31.234532)
LineString由一系列点连接而成。如果线段没有交叉且端点不重复,则为简单线段;如果起点和终点重合,则为封闭线段。例如:
LINESTRING(121.342423 31.542423, 121.345664 31.246790, 121.453178 31.456862)
Polygon可以是一个实心平面形(没有内部边界)或具有空洞。例如:
POLYGON((121.342423 31.542423, 121.345664 31.246790, 121.453178 31.456862), (121.563633 31.566652, 121.233565 31.234565, 121.568756 31.454367))
MySQL支持三种几何对象存储格式:
本文将重点介绍WKT格式。
POINT(121.213342 31.234532)
LINESTRING(121.342423 31.542423, 121.345664 31.246790, 121.453178 31.456862)
POLYGON((121.342423 31.542423, 121.345664 31.246790, 121.453178 31.456862), (121.563633 31.566652, 121.233565 31.234565, 121.568756 31.454367))
MULTIPOINT(0 0, 20 20, 60 60)
MULTILINESTRING((10 10, 20 20), (15 15, 30 15))
MULTIPOLYGON(((0 0,10 0,10 10,0 10,0 0)),((5 5,7 5,7 7,5 7, 5 5)))
GEOMETRYCOLLECTION(POINT(10 10), POINT(30 30), LINESTRING(15 15, 20 20))
MySQL提供了多种函数用于创建几何对象:
GeomFromText(wkt)
:将WKT格式转换为Geometry对象。PointFromText(wkt)
:创建Point对象。LineStringFromText(wkt)
:创建LineString对象。PolygonFromText(wkt)
:创建Polygon对象。CREATE TABLE `t_geo_test` ( `ID` int(11) NOT NULL AUTO_INCREMENT, `NAME` varchar(64) NOT NULL, `SHAPE` geometry NOT NULL, PRIMARY KEY (`ID`)) ENGINE=MyISAM AUTO_INCREMENT=10 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC
INSERT INTO `t_geo_test` (ID, NAME, SHAPE) VALUES (1, 'P1', geomFromText('POINT(121.474103 31.232862)'));
INSERT INTO `t_geo_test` (ID, NAME, SHAPE) VALUES (2, 'L1', geomFromText('LINESTRING(121.474103 31.232862, 121.472462 31.231339, 121.471984 31.232821)'));
INSERT INTO `t_geo_test` (ID, NAME, SHAPE) VALUES (5, 'POLYGON_1', geomfromtext('POLYGON((121.474243 31.234504, 121.471775 31.233348, 121.470724 31.23155, 121.471603 31.230229, 121.472655 31.230357, 121.475777 31.232045, 121.474243 31.234504))'));
使用AsText()
函数将几何对象转换为WKT格式:
SELECT AsText(SHAPE) FROM `t_geo_test` WHERE ID = 1;
Dimension(g)
:返回几何对象g的维度。Envelope(g)
:返回几何对象g的最小包围矩形(MBR)。GeometryType(g)
:返回几何对象g的类型字符串。IsClosed(g)
:判断几何对象是否封闭。IsSimple(g)
:判断几何对象是否简单。X(p)
:返回点p的X坐标。Y(p)
:返回点p的Y坐标。EndPoint(line)
:返回线段的终点。StartPoint(line)
:返回线段的起点。PointN(line, N)
:返回线段中的第N个点。ExteriorRing(poly)
:返回多边形的外环。InteriorRingN(poly, N)
:返回多边形的第N个内环。NumInteriorRings(poly)
:返回多边形的内环数。st_union(g1, g2)
:将g1和g2合并为一个集合类对象。st_difference(g1, g2)
:返回g1与g2的点集合差异。st_intersection(g1, g2)
:返回g1与g2的点集合交集。st_within(g1, g2)
:判断g1是否在g2内部。st_contains(g1, g2)
:判断g1是否完全包含g2。st_crosses(g1, g2)
:判断g1与g2是否相交。st_intersects(g1, g2)
:判断g1与g2是否有交集。st_disjoint(g1, g2)
:判断g1与g2是否不相交。对geometry
类型字段创建空间索引可以显著提升查询性能。例如:
CREATE SPATIAL INDEX i_shape ON `t_geo_test`(SHAPE);
删除索引:
DROP INDEX i_shape ON `t_geo_test`;
st_distance
等函数进行距离、长度或面积计算时,可能存在一定误差,建议谨慎使用。以上就是对MySQL Geometry类型的理解和实践总结。
转载地址:http://opbfk.baihongyu.com/