[英]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地理空間索引 。 當您在自己的列中包含lat
和lng
時, 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.