基本上我向一个php
文件发送一个GET请求,其中包含用户lat和long值(分别为$userLat, $userLong
)。
在我的数据库中,我有一个表'Locations',其中包含以下列:
所以,我想进行一个查询,我将用户坐标与所有位置坐标进行比较,看看位置和用户之间的距离是否是< =该位置的半径。如果是,请返回该位置的名称。
查询将是这样的(伪代码):
SELECT Location_Name FROM Locations WHERE distanceBetween(($ userLat,$ userLong)AND(Lat,Lng))< = Radius
答案 0 :(得分:2)
您正在寻找的查询是:
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;
答案 1 :(得分:2)
我使用与@ socca1157相同的查询,但我认为我可以在查询开头提供常量3959
的微小解释。
我的示例还获取了用户地址的lat和lng
$address = urlencode($_GET['user-address']);
$earth_radius = 3959;
$search_radius = 100;
$ch = curl_init('https://maps.google.com/maps/api/geocode/json?address='.$address.'&sensor=false');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$geocode = curl_exec($ch);
curl_close($ch);
$output = json_decode($geocode);
$lat = $output->results[0]->geometry->location->lat;
$lng = $output->results[0]->geometry->location->lng;
$sql = "SELECT *, ( $earth_radius * acos( cos( radians($lat) ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians($lng) ) + sin( radians($lat) ) * sin( radians( latitude ) ) ) ) AS distance FROM table WHERE isActive = 1 HAVING distance < $search_radius ORDER BY distance LIMIT 5";
$result = mysql_query($sql);
所以,例如,如果你想用km而不是里程进行搜索,你可以用km的地球半径,即6,371km。