5

我在尝试通过 SQL 语句将最近的位置返回给用户时遇到问题。为了测试我使用完全相同的坐标,这就是我所拥有的:

SQL:

SELECT  `companies`.`customerName` , 
    (3959 * 
        ACOS(
            COS(
                RADIANS(37.367485) * COS(RADIANS(`locations`.`gps_lat`)) * 
                COS(
                    RADIANS(`locations`.`gps_lng`) - RADIANS(-77.399994) + 
                    SIN(RADIANS(37.367485)) * SIN(RADIANS(`locations`.`gps_lat`))
                )
            )
        )
    )
AS  `distance` 
FROM  `locations` 
JOIN  `companies` ON  `locations`.`co_id` 
HAVING  `distance` > 25
ORDER BY distance
LIMIT 0 , 10

结果:

| customerName  | distance           |
| SOME COMPANY  | 1914.41747964854   |


locations 表值:

gps_lat   | gps_lng
37.367485 | -77.399994


我使用了谷歌的例子,我检查了几次公式,我似乎无法想出哪里出错了。任何帮助表示赞赏。


编辑:
因为我知道自己在做什么似乎有些困惑:

>替换以产生结果,1914显然大于25

这个应用程序将用户坐标从 Android 应用程序传递到我们的 Web 服务器。纬度和经度将从我们的网络服务器 MYSQL 数据库中的公司的值中提取$_GET并交叉引用。

上面的语法只是我在 Mysql Workbench 中检查我的 SQL 语句。显然我正在寻找一个零值的结果。

4

2 回答 2

5

我想我已经通过将 Google 的示例更改为“被收养的 yooper 的冒险”提供的公式解决了这个问题。使用他/她的Haversine 公式版本。
注意:上面的 Google 示例也使用了 Haversine。

SQL:

SELECT  `companies`.`customerName` , 
(2 * (3959 * ATAN2(
          SQRT(
            POWER(SIN((RADIANS(37.367485 - `locations`.`gps_lat` ) ) / 2 ), 2 ) +
            COS(RADIANS(`locations`.`gps_lat`)) *
            COS(RADIANS(37.367485 )) *
            POWER(SIN((RADIANS(-77.399994 - `locations`.`gps_lng` ) ) / 2 ), 2 )
          ),
          SQRT(1-(
            POWER(SIN((RADIANS(37.367485 - `locations`.`gps_lat` ) ) / 2 ), 2 ) +
            COS(RADIANS(`locations`.`gps_lat`)) *
            COS(RADIANS(37.367485)) *
            POWER(SIN((RADIANS(-77.399994 - `locations`.`gps_lng` ) ) / 2 ), 2 )
          ))
        )
      ))
AS 'distance'
FROM  `locations` 
JOIN  `companies` ON  `locations`.`co_id` 
HAVING  distance < 25
ORDER BY distance
LIMIT 0 , 10



对于那些对我的应用程序感到好奇的人,Final PHP:

获取值:?lat=37.367485&lng=-77.399994

$earth_radius_miles = 3959; // Earth radius in miles
$earth_radius_kilometers = 6371; // Earth radius in kilometers
$result_radius = 10000; // Maximum distance in either miles or kilometers

$get_lat = $_GET["lat"];
$get_lng = $_GET["lng"];

$dbSelect = mysql_query("SELECT  `companies`.`customerName`,
(2 * (".$earth_radius_miles." * ATAN2(
          SQRT(
            POWER(SIN((RADIANS(".$get_lat." - `locations`.`gps_lat` ) ) / 2 ), 2 ) +
            COS(RADIANS(`locations`.`gps_lat`)) *
            COS(RADIANS(".$get_lat.")) *
            POWER(SIN((RADIANS(".$get_lng." - `locations`.`gps_lng` ) ) / 2 ), 2 )
          ),
          SQRT(1-(
            POWER(SIN((RADIANS(".$get_lat." - `locations`.`gps_lat` ) ) / 2 ), 2 ) +
            COS(RADIANS(`locations`.`gps_lat`)) *
            COS(RADIANS(".$get_lat.")) *
            POWER(SIN((RADIANS(".$get_lng." - `locations`.`gps_lng` ) ) / 2 ), 2 )
          ))
        )
      ))
AS 'distance'
FROM  `locations` 
JOIN  `companies` ON  `locations`.`co_id` 
HAVING  distance < ".$result_radius."
ORDER BY distance
LIMIT 0 , 10") 
or die(mysql_error());

结果:

[{"customerName":"SOME COMPANY","distance":"0"}]

我已经用其他坐标测试了这些结果,并且似乎运行良好。尚未测试两点之间距离很远的任何东西,但我的应用程序不需要我这样做。

于 2012-06-26T20:33:44.660 回答
1

Ashok,您可以使用以下公式计算两个坐标之间的距离:

在此处输入图像描述

在哪里

R  =  radius of the earth (6,371 km)
Δlat =  |lat2- lat1|
Δlong = |long2- long1|
于 2013-05-02T21:22:37.633 回答