在 MySQL 中处理地理空间要素

在 MySQL 中处理地理空间要素

💡 原文英文,约3100词,阅读约需12分钟。
📝

内容提要

MySQL 提供地理空间功能,地理要素分为实体与空间,支持 POINT、LINESTRING、POLYGON 等数据类型及 WKT、WKB 格式。可用 CREATE TABLE 创建空间表,并通过 ST_Distance、ST_Area、ST_Contains、ST_Buffer 等函数进行查询分析,例如计算城市距离、查找半径内的城市。MySQL 8 改进了空间参考系统与空间索引,支持 5000 多种 SRID,使计算更准确。

🔎

延伸解读

空间索引生效的两个前提

文章指出,在 MySQL 8 中要让空间索引正常工作,必须满足两个条件:一是几何列需定义为 NOT NULL,二是列必须限定 SRID 且所有值使用同一 SRID。若忽略这些要求,索引可能无法被优化器使用,导致空间查询性能下降。因此,建表时明确 SRID 并设置非空约束,是发挥空间索引作用的关键步骤。

MySQL 8 之前的地理计算局限

在 MySQL 8.0 之前,空间数据虽存储了 SRID,但数据库无法利用它进行计算,所有函数都基于平面(SRID 0)操作。这意味着用户需自行编写函数转换单位并保证精度,对数学和几何知识要求较高。此外,许多空间关系函数仅使用最小边界矩形(MBR)而非对象实际形状,进一步限制了计算准确性。

SRID 选择影响计算精度

MySQL 8 支持超过 5000 种空间参考系统(SRS),分为投影 SRS、地理 SRS 和 SRID 0 三种类型。投影 SRS 使用笛卡尔坐标,单位可为米或英尺;地理 SRS 使用经纬度,单位为角度;SRID 0 则是无单位的无限平面。选择适合的 SRID 直接关系到距离、面积等计算结果的准确性,例如计算城市间距离时使用地理 SRS 更符合实际。

❓

Q&A

MySQL 支持哪些空间数据类型?

MySQL 支持单几何类型(GEOMETRY、POINT、LINESTRING、POLYGON)和多几何类型(MULTIPOINT、MULTILINESTRING、MULTIPOLYGON、GEOMETRYCOLLECTION)。

如何在 MySQL 中创建包含空间列的表?

使用 CREATE TABLE 语句,指定空间列的数据类型(如 GEOMETRY),并可设置 SRID 属性和空间索引。例如:CREATE TABLE locations (id int NOT NULL, city varchar(255) NOT NULL, g geometry NOT NULL SRID 4326, PRIMARY KEY (id), SPATIAL KEY g (g));

MySQL 中常用的空间函数有哪些?

常用空间函数包括:ST_GeomFromText(转换 WKT 为几何对象)、ST_X/ST_Y(提取坐标)、ST_Distance(计算距离)、ST_Area(计算面积)、ST_Contains(包含判断)、ST_Intersects(相交判断)、ST_Buffer(创建缓冲区)、ST_Union(合并几何)、ST_Difference(求差集)、ST_Touches/ST_Crosses/ST_Overlaps(关系判断)等。

如何计算两个城市之间的距离?

可以使用 ST_Distance_Sphere 函数,例如:SELECT ST_Distance_Sphere((SELECT g FROM locations WHERE city_ascii = 'Santos'), (SELECT g FROM locations WHERE city_ascii = 'Sao Paulo'));

MySQL 8 在空间数据处理方面有哪些改进?

MySQL 8 改进了空间参考系统(SRS)支持,提供超过 5000 种 SRID,并支持投影 SRS、地理 SRS 和 SRID 0;同时改进了空间索引,要求几何列 NOT NULL 且具有相同 SRID。

MySQL 支持哪些空间数据格式?

MySQL 支持三种空间数据格式:Well-Known Text (WKT) 人类可读文本格式、Well-Known Binary (WKB) 紧凑二进制格式,以及内部格式(类似 WKB 但额外存储 4 字节 SRID)。

🏷️

标签

➡️

继续阅读