簡體   English   中英

MBR包含距位置幫助MySQL的距離

[英]MBRContains distance from location help MySQL

好的,所以我是MBRContains方法的新手,無法正常工作。 基本上,我只是試圖根據與輸入位置的距離來過濾列表。


我聽說這種方法比進行復雜的數學計算更快。 如果我錯了,請糾正我。


到目前為止,我還無法完成這項工作,並希望有人能解釋一下它是如何工作的以及如何修復此代碼。

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
         )
      ) 
   ) 

我從另一個問題中得到了這段代碼,但我無法理解它或解決它。 好吧,實際上他們已經指出了我擁有第二個LIneString的位置 可是,我卻存儲在自己的欄目我的緯度經度


我想將此代碼轉換為一個函數,例如WITHINDISTANCE函數,而不是那堆大代碼,我將調用它。

MBRContains()的目的是利用MySQL地理空間索引 當您在自己的列中包含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/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM