请教 MySQL 5.7 geometry 字段类型的正确使用方式?

王道中强流
  • 1.7k

我在开发一个LBS类型的小程序,
其实就是根据定位列出附近的帖子,

用的是 MYSQL 5.7 的geometry字段类型,
(不要建议我用PostGIS,MongoDB之类的解决方案,运维成本吃不消)
存入的时候我是这样的,INSERT xxtable SET yyfield=ST_GeomFromText('POINT(26.074508 119.296494)')

26.074508是纬度,119.296494是经度,这个顺序有没有错?

这个经纬度是腾讯地图坐标系的值,有没有什么不妥?

为什么POINT的两个参数间不需要逗号?

反正插入是成功的,但是查询却有问题,我是这样查询的:
SELECT * FROM xxtable WHERE ST_Distance_Sphere(POINT(26.074507,119.296493), yyfield)<10000 也就是查询10公里内的帖子,

但是提示错误:Incorrect arguments to st_distance_sphere 说传给st_distance_sphere的参数是错误的,

于是我尝试存入和查询的时候 经度放在纬度前,然后就可以了,
但我感觉这不是真正解决问题的方法,也许我根本没解决问题,其中有什么问题根本没搞懂,

请问有没有内行的,微信地图的坐标系和标准坐标系的经纬度难道是相反的?
将经纬度存到geometry类型字段为什么要ST_GeomFromText('POINT(26.074508 119.296494)')这种写法,甚至这个point两个参数之间为什么不需要逗号?
用微信地图的经纬度的存入数据库的顺序到底是哪个在前?
然后应该怎么查询才是正确的?

回复
阅读 7.5k
2 个回答
✓ 已被采纳
  • 首先,看起来,26.074508是纬度并没有错,因为,纬度在-90到90度之间,绝对值不可能超过90

  • 然而,对于POINT()而言,它是定义了一个XOY的笛卡尔坐标系

  • 而如果将地图展开为XOY坐标系的话,经度对应的是横坐标值,纬度对应的才是纵坐标值,所以POINT(26.074507, 119.296493)应该是写反了

  • 微信地图可能用的是经纬度坐标系,经纬度坐标系一般先写纬度后写经度;所以转换成笛卡尔坐标系时,看起来就是反的

  • 另外由于笛卡尔坐标系本身就不是以角度为单位的,而是以数值为单位,所以用POINT就算将经纬度对应位置写反了,也不会报错,但是取出来给地理位置处理方法ST_GeomFromText处理时,地理位置方法就无法识别这个地理位置点了(比较经纬度写反之后这个坐标已经不在地球上了)

  • 至于为什么POINT中间可以没有逗号,可能是因为POINT里面参数定义方法有多种吧,具体的需要看POINT方法的说明(不过好像没有找到的样子)

万兵
  • 3
新手上路,请多包涵

这个函数,应该边界值有问题吧,你的边界值怎么处理的 ?

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏