You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL 8.0.35坐标在多边形内却无法查询地址的问题

MySQL 8.0.35空间查询异常:ST_SRID生成POINT时经纬度顺序颠倒导致ST_Within无结果

问题复现

以下是最小化SQL代码,可复现该问题:

1. 创建空间表

CREATE TABLE test_spatial (
    id INT AUTO_INCREMENT PRIMARY KEY,
    address_point POINT SRID 4326
);

2. 使用ST_SRID插入点

INSERT INTO test_spatial (address_point)
VALUES (ST_SRID(POINT(15.0791673, 37.5071435), 4326));

3. 执行ST_Within查询

-- 目标多边形包含原坐标点(15.0791673, 37.5071435)
SELECT id 
FROM test_spatial 
WHERE ST_Within(
    address_point,
    ST_GeomFromText('POLYGON((14.8 37.3, 15.2 37.3, 15.2 37.6, 14.8 37.6, 14.8 37.3))', 4326)
);

执行后返回空结果,但预期应返回id为1的记录。

4. 对比ST_GeomFromText创建的点

SELECT ST_Within(
    ST_GeomFromText('POINT(15.0791673 37.5071435)', 4326),
    ST_GeomFromText('POLYGON((14.8 37.3, 15.2 37.3, 15.2 37.6, 14.8 37.6, 14.8 37.3))', 4326)
);

执行后返回1,证明该坐标点确实在目标多边形内。

5. 检查坐标顺序

通过ST_AsText查看插入的点坐标:

SELECT ST_AsText(address_point) FROM test_spatial;

返回结果为POINT(37.5071435 15.0791673),可见经纬度顺序被颠倒。

原因分析

MySQL的POINT()函数遵循内部规则,默认采用**(纬度, 经度)的坐标顺序;而OGC标准(包括ST_GeomFromText)则采用(经度, 纬度)**的顺序。当你使用ST_SRID(POINT(经度, 纬度), 4326)时,相当于把经度值放在了纬度的参数位置,最终生成的点坐标顺序完全颠倒,导致该点不在目标多边形范围内。

解决方案

方案1:调整POINT()的参数顺序

按照MySQLPOINT()的要求,传入**(纬度, 经度)**顺序:

INSERT INTO test_spatial (address_point)
VALUES (ST_SRID(POINT(37.5071435, 15.0791673), 4326));

方案2:统一使用ST_GeomFromText创建点

遵循OGC标准的经纬度顺序,避免混淆:

INSERT INTO test_spatial (address_point)
VALUES (ST_GeomFromText('POINT(15.0791673 37.5071435)', 4326));

方案3:修正已存在的错误数据

如果表中已有顺序颠倒的点,可使用ST_SwapXY()函数交换坐标:

UPDATE test_spatial 
SET address_point = ST_SRID(ST_SwapXY(address_point), 4326);

内容的提问来源于stack exchange,提问作者amarynets

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 19:20:04