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
)
)
)
我从另一个问题得到这段代码,但我无法理解或解决它。实际上他们有 point 而我有第二个 LIneString。但是我将 lat 和 lng 存储在它们自己的列中。
我想将这段代码转换成一个函数,比如说 WITHINDISTANCE 函数,我将调用它而不是那一大堆代码。
MBRContains()
的目的是利用 MySQL geospatial index。当 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/
好的,所以我是 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
)
)
)
我从另一个问题得到这段代码,但我无法理解或解决它。实际上他们有 point 而我有第二个 LIneString。但是我将 lat 和 lng 存储在它们自己的列中。
我想将这段代码转换成一个函数,比如说 WITHINDISTANCE 函数,我将调用它而不是那一大堆代码。
MBRContains()
的目的是利用 MySQL geospatial index。当 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/