【问题标题】:How to retrieve data from a table, based on user coordinates and the radius如何根据用户坐标和半径从表中检索数据
【发布时间】:2012-12-07 09:51:32
【问题描述】:

基本上,我向php 文件发送一个GET 请求,其中包含用户lat 和long 值(分别为$userLat, $userLong)。
在我的数据库中,我有一个包含以下列的“位置”表:

  • Lo​​cation_Name
  • 纬度
  • Lng
  • 半径(米)

所以,我想进行查询,将用户的坐标与所有位置坐标进行比较,看看位置和用户之间的距离是否


查询将是这样的(伪代码):

SELECT Location_Name FROM Locations WHERE distanceBetween(($userLat, $userLong) AND (Lat, Lng))

【问题讨论】:

标签: php mysql geolocation latitude-longitude


【解决方案1】:

我使用与@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);

因此,例如,如果您想以公里而不是英里进行搜索,则可以使用以公里为单位的地球半径,即 6,371 公里。

【讨论】:

  • 非常感谢!就我测试过的而言,它工作得很好。谢谢
【解决方案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 &lt; 25 ORDER BY distance LIMIT 0 , 20;

这取自Google Map's article

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-02
    • 1970-01-01
    • 1970-01-01
    • 2012-01-27
    相关资源
    最近更新 更多