MySQL中ST_Contains返回结果不准确的原因排查
问题原因及解决方案
核心问题是经纬度在WKT格式中的顺序搞反了,SRID 4326(WGS84坐标系)遵循OGC规范,WKT格式里的坐标顺序是经度(X轴)在前,纬度(Y轴)在后,你在生成空间列和构造查询多边形时都弄反了顺序,导致空间查询的范围和预期的经纬度范围完全不匹配。
具体错误点
latlon列生成错误
你生成POINT的语句是:
ST_GeomFromText(concat("POINT(",latitude," ",longitude,")"), 4326)
这里把纬度放在了经度前面,不符合SRID 4326的WKT规范,导致存储的点坐标是(纬度值,经度值),相当于把地理坐标系的X/Y轴颠倒了。
- 查询用的POLYGON坐标顺序错误
你构造的多边形顶点是(69 -78, 69 84, 15 84, 15 -78),同样是纬度在前、经度在后,生成的多边形范围和原查询的经纬度范围(纬度15-69,经度-78-84)完全不对应,自然无法匹配所有符合条件的点。
修正步骤
- 重新生成
latlon列的正确值
执行更新语句,将经纬度顺序纠正为经度 纬度:
UPDATE location SET latlon = ST_GeomFromText(concat("POINT(", longitude, " ", latitude, ")"), 4326);
- 修正空间查询的POLYGON语句
构造对应原查询范围的正确多边形(顶点顺序为西南→东南→东北→西北→西南,闭合矩形):
SELECT * FROM location WHERE ST_CONTAINS( ST_GeomFromText('POLYGON((-78 15, 84 15, 84 69, -78 69, -78 15))', 4326), latlon );
修正后,空间查询的结果就会和原经纬度范围查询的结果一致。
内容的提问来源于stack exchange,提问作者Studio Eveline
相关产品推荐
相关产品推荐

