2015-02-08 123 views
0

好的,所以我是MBRContains方法的新手,并且无法获得工作方法。基本上我只是试图根据远离输入位置的距离来过滤列表。MBRContains距离位置的距离帮助MySQL


我听说这种方法比只进行复杂的数学计算更快。如果我错了,请纠正我。


我还没有能够得到这项工作,希望有人解释它是如何工作以及修复此代码。

SELECT * 
FROM listings JOIN suburbs ON listings.suburb_id = suburbs.id 
WHERE MBRContains 
    (
    LineString 
     (
     Point (
      @lon + 10/(111.1/COS(RADIANS(@lat))), 
      @lat + 10/111.1 
     ), 
     Point (
      @lon - 10/(111.1/COS(RADIANS(@lat))), 
      @lat - 10/111.1 
     ) 
     ), 
     LineString(
     Point(
      suburbs.longitude/(111.1/COS(RADIANS(suburbs.latitude))), 
      suburbs.latitude/111.1 
     ) 
    ) 
    ) 

我从另一个问题得到了这段代码,但我还没有能够理解它或解决它。其实他们有在哪里我有我的第二个内线。但是我有我的latlng存储在自己的列。


我想这个代码转变成一个功能,说WITHINDISTANCE功能,我会打电话的而不是大的一串代码。

回答

1

MBRContains()的目的是利用MySQL geospatial index。当您在自己的栏中有latlng时,MBRContains()根本无助于表现。

但是,您可以直接使用列值进行包围矩形计算。当你这样做时,你使用BETWEEN运算符来查找适当的行。该操作符对MySQL索引确实工作得很好,因为它可以执行索引范围扫描。

您可以像这样使用SQL。

@lat := --the latitude of your point; 
@lng := --the longitude of your point; 
@radius := 10; 
@distance_unit = 111.1; 

WHERE suburbs.latitude 
    BETWEEN @lat - (@radius/@distance_unit) 
     AND @lat + (@radius/@distance_unit) 
AND suburbs.longitude 
BETWEEN @lng - (@radius/(@distance_unit * COS(RADIANS(@lat)))) 
    AND @lng + (@radius/(@distance_unit * COS(RADIANS(@lat)))) 

它看起来很混乱,但它做了一个简单的边界框计算,然后在您的纬度和经度列进行索引扫描。

下面是如何做到这一点的完整的书面。 http://www.plumislandmedia.net/mysql/haversine-mysql-nearest-loc/

+0

好的。这很好。那么将位置数据存储为一列中的lat和lng会更好吗? – 2015-02-08 19:18:26