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

查看:772
本文介绍了lbs - 请教 MySQL 5.7 geometry 字段类型的正确使用方式?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

我在开发一个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两个参数之间为什么不需要逗号?
用微信地图的经纬度的存入数据库的顺序到底是哪个在前?
然后应该怎么查询才是正确的?

解决方案

  • 首先,看起来,26.074508是纬度并没有错,因为,纬度在-90到90度之间,绝对值不可能超过90

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

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

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

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

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

这篇关于lbs - 请教 MySQL 5.7 geometry 字段类型的正确使用方式?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆