2013-08-02 26 views
0

我有以下的纬度和经度:MySQL无法检查点是否在距离内... MBRContains查询错误或错误?

lat - 18.9802767 
lng - 72.8142511 

我想下面的查询为地方withint从关注点10公里。

select mbrcontains(geomfromtext(
'LINESTRING(72.8993663648088 19.0702857,72.72913583519122 18.8902677)' 
), 
geomfromtext(
'point(18.9802767 72.8142511)' 
) ); 

的线串几何对象是从我试图确定确切点导出是内使用下式使用该方法的MySQL 5.1及以上从 this例如:

linestring(point(@lng+10/(111.1/cos(radians(@lat))),@lat+10/111.1), point(@lng-10/(111.1/cos(radians(@lat))),@lat-10/111.1))

从我所理解的点属于最小边界矩形(MBR)。但是查询返回0作为答案。以上是遵循 this示例中给出的原则。

查询有什么问题?我怎么知道这个点是否在特定的地理空间距离之内(在这种情况下,MBR点是使用坐标给出的10 kms来计算的:lat - 18.9802767, lng - 72.8142511)。

顺便说一句,我正在使用MySQL 5.5.32。

回答

0

你的观点不属于该行的MBR。看起来您已经将线或点上的纬度或经度坐标反转。交换机在'point(18.9802767 72.8142511)' X和Y得到了这一点,这将是该行的MBR中:

POINT (72.8142511 18.9802767)

如果你绑到MySQL,你可以考虑升级到MySQL 5.6,然后使用缓冲区函数根据您的兴趣点创建一个圆形区域,然后使用ST_Within在该圆形区域内找到任何东西。

如果你不绑定到MySQL,可以考虑PostGIS,它提供了一个很好的ST_DWithin函数,使得这些比较非常简单。

+0

这是我用作给定的公式[这里](http://stackoverflow.com/questions/1006654/fastest-way-to-find-distance-between-two-lat-long-points?lq= 1):线串(点(@ lng + 10 /(111.1/cos(弧度(@lat))),@ lat + 10/111.1),点(@ lng-10 /(111.1/cos(弧度(@lat ))),@ lat-10/111.1))' 所以'Linestring'几何对象是从我试图确定的确切点派生而来的。我在这里做错了什么? – woofmeow

+0

您的线串可能是正确的,但是您传递给geomfromtext的点将x和y翻转,这使得它远离线串。我已经更新了我的答案,以使其更加清晰 – lreeder

+0

谢谢我认为它现在的工作。尽管表中的问题仍然存在:-(无论如何,你能否通过cos解释除法背后的逻辑? – woofmeow