为什么这个来自Google示例的MySQL查询无法正常工作? (haversine公式)

时间:2019-06-08 16:37:11

标签: php mysql

我有一种情况,我想查找表中所有在给定纬度和经度坐标内一定半径范围内的行。

这是表格的结构:

id | name | address | lat | lng
-------------------------------

因此,例如,给我一个坐标:纬度和经度,我需要查找距离给定坐标25英里的所有行。

我找到了有关如何执行此操作的Google教程:Creating a Store Locator on Google Maps

但是无论我做什么,我总是得到0个结果。这是PHP代码:

$sql = "SELECT id, ( 3959 * acos( cos( radians(-33) ) * cos( radians( lat ) ) * cos( radians( lng ) - radians(151) ) + sin( radians(-33) ) * sin( radians( lat ) ) ) ) AS distance FROM markers HAVING distance < 25 ORDER BY distance LIMIT 0 , 20;";

$stmt = $conn->prepare($sql);
$stmt->execute();
$number_of_rows = $stmt->rowCount();

echo $number_of_rows; // echoes 0

我的表的列和行与Google商店定位器中的列和行完全相同:

1,Heir Apparel,"Crowea Pl, Frenchs Forest NSW 2086",-33.737885,151.235260
2,BeeYourself Clothing,"Thalia St, Hassall Grove NSW 2761",-33.729752,150.836090
3,Dress Code,"Glenview Avenue, Revesby, NSW 2212",-33.949448,151.008591
4,The Legacy,"Charlotte Ln, Chatswood NSW 2067",-33.796669,151.183609
5,Fashiontasia,"Braidwood Dr, Prestons NSW 2170",-33.944489,150.854706
6,Trish & Tash,"Lincoln St, Lane Cove West NSW 2066",-33.812222,151.143707
7,Perfect Fit,"Darley Rd, Randwick NSW 2031",-33.903557,151.237732
8,Buena Ropa!,"Brodie St, Rydalmere NSW 2116",-33.815521php,151.026642
9,Coxcomb and Lily Boutique,"Ferrers Rd, Horsley Park NSW 2175",-33.829525,150.873764
10,Moda Couture,"Northcote Rd, Glebe NSW 2037",-33.873882,151.177460

2 个答案:

答案 0 :(得分:0)

您的查询与Google链接中的查询不同。尝试将其更改为:

SELECT id, ( 3959 * acos( cos( radians(37) ) * cos( radians( lat ) ) * cos( radians( lng ) - radians(-122) ) + sin( radians(37) ) * sin( radians( lat ) ) ) ) AS distance 
FROM markers 
HAVING distance < 25 
ORDER BY distance 
LIMIT 0 , 20;

如您所见,在您的查询中,您有cos( radians(-33) )开头,而Google查询中有cos( radians(37) )和其他一些差异

编辑

也许您是对的,示例中的数据也不正确,即使使用数据,所有距离也都大于50。尝试以下方法:

SELECT id, ( 3959 * acos( cos( radians(-34) ) * cos( radians( lat ) ) * cos( radians( lng ) - radians(151) ) + sin( radians(-34) ) * sin( radians( lat ) ) ) ) AS distance 
FROM markers 
having distance<25
 ORDER BY distance LIMIT 0 , 20;

或者更改您的内容并设置HAVING<60

答案 1 :(得分:0)

只需根据表重命名列名,然后尝试

$sql = "
SELECT id
     , ( 3959 * acos( cos( radians(-33) ) * cos( radians( lat ) ) * cos( radians( lng ) - radians(151) ) + sin( radians(-33) ) * sin( radians( lat ) ) ) ) AS distance 
  FROM places 
 HAVING distance < 25 
 ORDER 
  BY distance 
 LIMIT 0 , 20;
";
$stmt = $conn->prepare($sql);
$stmt->execute();
$number_of_rows = $stmt->rowCount();

echo $number_of_rows; // echoes 0