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。但是我将 latlng 存储在它们自己的列中。


我想将这段代码转换成一个函数,比如说 WITHINDISTANCE 函数,我将调用它而不是那一大堆代码。

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/