MySQL设置SRID为4326时坐标互换,这是Bug吗?
MySQL中ST_SRID()设置SRID为4326时坐标互换的问题分析
MySQL提供的ST_SRID()函数,设计目的是仅修改几何对象的SRID元数据,不转换坐标值。在多数场景下,该函数确实符合预期:
mysql> select st_astext(point(23,56)); +-------------------------+ | st_astext(point(23,56)) | +-------------------------+ | POINT(23 56) | +-------------------------+ 1 row in set (0,00 sec) mysql> select st_astext(st_srid(point(23,56),3059)); +---------------------------------------+ | st_astext(st_srid(point(23,56),3059)) | +---------------------------------------+ | POINT(23 56) | +---------------------------------------+ 1 row in set (0,00 sec)
但当将SRID设置为4326时,会出现坐标互换的异常情况:
mysql> select st_astext(st_srid(point(23,56),4326)); +---------------------------------------+ | st_astext(st_srid(point(23,56),4326)) | +---------------------------------------+ | POINT(56 23) | +---------------------------------------+ 1 row in set (0,00 sec)
临时解决方案
通过序列化后再解析的方式设置SRID,不会触发坐标互换:
mysql> select st_astext(st_geomfromwkb(st_asbinary(point(23,56)),4326)); +-----------------------------------------------------------+ | st_astext(st_geomfromwkb(st_asbinary(point(23,56)),4326)) | +-----------------------------------------------------------+ | POINT(23 56) | +-----------------------------------------------------------+ 1 row in set (0,00 sec)
问题性质判断
这属于MySQL的Bug,理由如下:
ST_SRID()的设计语义明确为仅修改SRID元数据,不应改变坐标值- 对比PostGIS的
ST_SetSRID()函数,设置SRID为4326时不会出现坐标互换,符合函数的预期逻辑 - 序列化再解析的方式能得到正确结果,说明
ST_SRID()针对4326的处理逻辑存在特殊错误,而非坐标存储或解析的通用问题
内容的提问来源于stack exchange,提问作者OPPO
相关产品推荐
相关产品推荐

