我有一种情况,我想查找表中所有在给定纬度和经度坐标内一定半径范围内的行。
这是表格的结构:
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
答案 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