【问题标题】:Sorting users by distance in mysql using st_distance使用 st_distance 在 mysql 中按距离对用户进行排序
【发布时间】:2015-05-05 09:37:56
【问题描述】:

我已经对此进行了一些阅读,但几乎没有任何关于使用点和 mysql 中的 st_distance 函数进行操作的信息。我认为这是有道理的,因为根据http://bugs.mysql.com/bug.php?id=70494,它甚至直到去年中途才被记录下来。几乎我见过的每个解决方案都使用单独的 long 和 lat 列,然后将它们放入 hasrsine 公式中,如下所示:sorting distance in MySQL PHP 虽然由于几何数据类型的存在和空间函数。

到目前为止我的桌子是:

用户名 - varchar

位置 - 点(1 1)或类似的东西

我想选择一个用户,然后显示离他们最近的 10 个左右的用户。是否可以完全通过 SQL 使用 points 和 st_distance 函数来做到这一点,还是我必须进行一些更改并改用 hasrsine 公式?

【问题讨论】:

  • 从用户当前的经纬度可以找到最近的用户

标签: php mysql geolocation geospatial


【解决方案1】:

是否可以完全通过 SQL 使用 points 和 st_distance 函数来做到这一点,还是我必须进行一些更改并改用 hasrsine 公式?

Geometry Class 中所述:

Geometry 是层次结构的根类。它是一个不可实例化的类,但具有以下列表中描述的许多属性,这些属性对于从任何 Geometry 子类创建的所有几何值都是通用的。

[ deletia ]

所有计算都是在假设欧几里得(平面)几何的情况下完成的。

[ deletia ]

例如,在不同的坐标系中,即使对象具有相同的坐标,两个对象之间的距离也可能不同,因为平面坐标系上的距离和地心系统上的距离(地球表面上的坐标)是不同的东西。

因此 MySQL 的空间扩展(包括其ST_Distance() 函数)不能用于计算geodesicsgreat-circle distance,这就是你所追求的。正如您推断的那样,您将不得不使用诸如Haversine 之类的公式。

Google Developers 网站上有一个很好的教程:Creating a Store Locator with PHP, MySQL & Google Maps

【讨论】:

    【解决方案2】:
    CREATE FUNCTION fnDistanceMiles(lat1 DECIMAL(12, 7),
                                    lon1 DECIMAL(12, 7),
                                    lat2 DECIMAL(12, 7),
                                    lon2 DECIMAL(12, 7))
    RETURNS DECIMAL(16, 8)
    BEGIN
    
    DECLARE DISTANCE DECIMAL(11, 4) DEFAULT 0;
    
    SELECT 69.04117454 *
           DEGREES(ACOS(LEAST(COS(RADIANS(lat1))
                              * COS(RADIANS(lat2))
                              * COS(RADIANS(lon1 - lon2))
                              + SIN(RADIANS(lat1))
                              * SIN(RADIANS(lat2)), 1.0)))
    INTO DISTANCE;
    
    RETURN DISTANCE;
    
    END;
    
    DELIMITER ;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-16
      • 1970-01-01
      • 2015-08-06
      • 2019-02-05
      相关资源
      最近更新 更多