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

发布于 2022-09-05 05:21:22 字数 924 浏览 21 评论 0

我在开发一个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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

朮生 2022-09-12 05:21:22
  • 首先,看起来,26.074508是纬度并没有错,因为,纬度在-90到90度之间,绝对值不可能超过90

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

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

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

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

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

自由如风 2022-09-12 05:21:22

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文