问 题

我在开发一个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方法的说明(不过好像没有找到的样子)