2015-02-08 116 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