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
相关产品推荐
相关产品推荐

