gpt4 book ai didi

sql - 测量两个纬度/经度点之间的距离

转载 作者:行者123 更新时间:2023-12-04 18:47:54 25 4
gpt4 key购买 nike

我在尝试通过 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

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

编辑:
由于我知道自己在做什么似乎有些困惑:
>被替换以产生结果, 1914显然大于 25 .

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

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

最佳答案

我想我已经通过从 Google 的示例更改为“被收养的 yooper 的冒险”提供的公式解决了这个问题。使用他/她的版本 Haversine Formula .
注意:上面的 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"}]

我已经用其他坐标测试了这些结果,似乎工作得很好。还没有测试任何两点之间有很大距离的东西,但我的应用程序不需要我这样做。

关于sql - 测量两个纬度/经度点之间的距离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11212381/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com