请教 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
两个参数之间为什么不需要逗号?
用微信地图的经纬度的存入数据库的顺序到底是哪个在前?
然后应该怎么查询才是正确的?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
首先,看起来,26.074508是纬度并没有错,因为,纬度在-90到90度之间,绝对值不可能超过90
然而,对于
POINT()
而言,它是定义了一个XOY的笛卡尔坐标系而如果将地图展开为XOY坐标系的话,经度对应的是横坐标值,纬度对应的才是纵坐标值,所以
POINT(26.074507, 119.296493)
应该是写反了微信地图可能用的是经纬度坐标系,经纬度坐标系一般先写纬度后写经度;所以转换成笛卡尔坐标系时,看起来就是反的
另外由于笛卡尔坐标系本身就不是以角度为单位的,而是以数值为单位,所以用
POINT
就算将经纬度对应位置写反了,也不会报错,但是取出来给地理位置处理方法ST_GeomFromText
处理时,地理位置方法就无法识别这个地理位置点了(比较经纬度写反之后这个坐标已经不在地球上了)至于为什么
POINT
中间可以没有逗号,可能是因为POINT
里面参数定义方法有多种吧,具体的需要看POINT
方法的说明(不过好像没有找到的样子)这个函数,应该边界值有问题吧,你的边界值怎么处理的 ?