地理信息系统 (GIS) 是一个用于描绘地球和其他地理要素并突出其特征,从而显示和分析经空间配准的信息的系统。MySQL的GIS功能遵守OGC的OpenGIS Geometry Model(国际标准),MySQL对GIS的支持始于5.6版本,并随着版本的更新而不断增强,到MySQL8.0中的重大飞跃。
- MySQL5.6:引入了基础的空间支持,包括基本的空间数据类型(GEOMETRY, POINT, LINESTRING, POLYGON 等)和部分函数,以及 R-Tree 索引(用于加速空间查询)。但此时的功能还比较基础。
- MySQL5.7:对 GIS 进行了重要增强,增加了大量新的 GIS 函数(超过 50 个),大大提升了功能完备性,使其能够处理更复杂的空间操作和 GeoJSON 格式。
- MySQL8.0:进行了增强,优化了GIS性能,并引入了新的GIS功能,如ST_IsValid、ST_IsSimple等。
下面了解下MySQL都支持那些GIS特性。
GIS 数据类型
目前GIS支持的符合标准的8种类型,包含了基础使用场景,足以应对许多常见的空间数据存储和查询场景,例如地理位置搜索、区域包含判断、距离计算等。
| Data Types | 说明 | 示例 |
|---|---|---|
| GEOMETRY | 存储任何类型的几何对象的基类 | - |
| POINT | 点 | POINT(116.3974 39.9093)表示北京天安门的经纬度 |
| LINESTRING | 线 | LINESTRING(0 0, 10 10, 20 25) 表示一条由三个点连接而成的折线 |
| POLYGON | 多边形,由多条闭合的线构成的图形 | POLYGON((0 0, 100 0, 100 100, 0 100, 0 0)) 表示一个正方形 |
| MULTIPOINT | 点集合 | MULTIPOINT((0 0), (20 20), (60 60)) 表示三个离散的点 |
| MULTILINESTRING | 线集合 | MULTILINESTRING((10 10, 20 20), (15 15, 30 15)) 表示两条线 |
| MULTIPOLYGON | 多边形集合 | MULTIPOLYGON(((0 0, 100 0, 100 100, 0 100, 0 0)), ((200 200, 300 200, 300 300, 200 300, 200 200))) 表示两个不相交的正方形。 |
| GEOMCOLLECTION | 空间对象集合 | GEOMETRYCOLLECTION(POINT(1 1), LINESTRING(0 0, 2 2)) |
可以按照需求选择合适的类型,命令行定义方式跟其他类型一样。
CREATE TABLE geom (
gp POINT NOT NULL,
gm GEOMETRY NOT NULL SRID 4326,
gmp MULTIPOINT,
gmc GEOMCOLLECTION
。。。
);
备注:SRID 4326:SRID(Spatial Reference System Identifier)是定义地理空间数据坐标系统的数字标识符。是一种广泛使用的全球定位系统(GPS)坐标系统。
GIS函数
MySQL提供了丰富的 GIS 函数来操作和查询空间数据。这些函数遵循 Open Geospatial Consortium (OGC) 标准。按照官方文档,MySQL8.0+版本供有93个地理函数支持:
https://dev.mysql.com/doc/refman/8.4/en/spatial-function-reference.html
基础构造函数:
- ST_GeomFromText()可将WKT格式文本转换为几何对象,
- ST_PointFromText()专用于创建点对象
- ST_Dimension()返回对象维度(-1空/0点/1线/2面),
- ST_GeometryType()返回几何类型名称
特定对象函数:
- 点对象:ST_X()/ST_Y()获取坐标值
- 线对象:ST_Length()计算长度,ST_StartPoint()/ST_EndPoint()获取端点
- 面对象:ST_Area()计算面积,ST_ExteriorRing()返回外环
空间分析函数: 拓扑关系判断,空间运算 等
数据格式转换: 文本/二进制转换,坐标系处理 等
这些函数使得MySQL能够处理大多数常见的GIS应用场景,如地理位置搜索、空间关系分析和地理围栏等,提供了丰富的地理空间数据处理能力。
索引
GIS使用R-TREE方式进行检索,提高性能。R-Tree是一种专为多维空间数据(如地理坐标、几何图形)设计的高效索引数据结构。它本质上是B-Tree在多维空间上的扩展,通过将空间对象用其最小边界矩形(MBR)进行近似,并组织成一棵平衡树,来实现快速的空间范围查询和邻接查询。

示例
下面是使用的简单的示例。
#创建表
CREATE TABLE gis_places (
gis_id INT AUTO_INCREMENT PRIMARY KEY,
gis_name VARCHAR(255) NOT NULL,
gis_location POINT NOT NULL,
INDEX location_index (gis_location)
);
#插入一些数据
INSERT INTO gis_places (gis_name, gis_location) VALUES
('Eiffel Tower', ST_GeomFromText('POINT(2.2945 48.8584)')),
('Statue of Liberty', ST_GeomFromText('POINT(-74.0445 40.6893)'));
#查询两个地点之间的距离
SELECT gis_name,
ST_Distance(gis_location, ST_GeomFromText('POINT(3.0000 10.0000)')) AS gs_distance
FROM gis_places
WHERE ST_Distance(gis_location, ST_GeomFromText('POINT(2.2945 48.8584)')) < 10000;
+-------------------+-------------------+
| gis_name | gs_distance |
+-------------------+-------------------+
| Eiffel Tower | 38.86480388230462 |
| Statue of Liberty | 82.93182811647166 |
+-------------------+-------------------+
总结
GIS是一个非常强大且被广泛应用的功能集,能和关系型数据库结合,肯定是按照需求推进的。如果计划使用MySQL的GIS功能,建议直接选择 MySQL8.0或更高版本。
参考
https://dev.mysql.com/doc/refman/8.0/en/geometry-well-formedness-validity.html
https://dev.mysql.com/worklog/task/?id=6968




