使用php mysql使用lat和long by radius搜索数据库

时间:2012-05-16 15:04:52

标签: php sql json jquery

我正在尝试开发一个小型站点,该站点通过设置半径从数据库中检索结果并将它们放在地图上。 我使用Google maps api从那里获取lat和long搜索条件,将这些传递给我的php脚本,该脚本查询数据库并将结果集作为JSON对象返回。

我有一个小问题,使用json将lat和long发送到php。

我的主要问题是我的sql搜索数据库似乎是错误的,因为它只是在我的数据库中检索前10个结果。我希望它从搜索点返回半径范围内的前10个结果。

这是我的ajax代码

function showCarPark(location)
{
    var lat = location.lat();
    var lng = location.lng();
    //alert("Lat: " +lat.toFixed(6));
    //alert("Lng: " +lng.toFixed(6));
    document.getElementById('carParkResults').innerHTML = "";
    var criterion = document.getElementById("address").value;
    var count = 0;
    $.ajax({    
              url: 'process.php',
              type: 'GET',
              data: "lat=" + lat + "&lng=" + lng,
              dataType: 'json',
              success: function(data) 
              {
                  jQuery.each(data, function()
                  {
                    $('<p>').text("Car Park: " + data[count].name).appendTo('#carParkResults');
                    placeCarParks(data[count].postcode,data[count].name, data[count].street, data[count].type);
                    count++;
                  });
              },
              error: function(e) 
              {
                //called when there is an error
                console.log(e.message);
                alert("error" + e.message);
              }
    });

这是我的php脚本

$rad = 20;
$lat = $_GET['lat'];
$lng = 1.4681464; //put a temporary number in as it wont pass the lng in the JSON

$sql="SELECT *, (3959 * acos(cos(radians('".$lat."')) * cos(radians(lat)) * cos( radians(long) - radians('".$lng."')) + sin(radians('".$lat."')) * 
sin(radians(lat)))) 
AS distance 
FROM carpark HAVING distance < 15 ORDER BY distance LIMIT 0 , 10";

$result = mysql_query($sql);

while($r = mysql_fetch_assoc($result)) $rows[] = $r;

echo json_encode($rows);

我表格中的列名为lat和long 任何帮助表示赞赏。

4 个答案:

答案 0 :(得分:8)

我使用HAVING没有问题。 iLLin的回答是误导性的。以下是查找纽约市距离的正确查询示例:

SELECT *, (3959 * acos(cos(radians('40.7142')) * cos(radians(latitudeColName)) * cos( radians(longitudeColName) - radians('-74.0064')) + sin(radians('40.7142')) * sin(radians(latitudeColName)))) AS distance FROM myTable HAVING distance < 15 ORDER BY distance LIMIT 0 , 10

更改jQuery请求中的行以使用此表示法{name:value,name:value}:

          data: {lat : lat, long : long},

答案 1 :(得分:4)

对于您的情况,请尝试使用WHERE代替HAVING

SELECT *, (3959 * acos(cos(radians('".$lat."')) * cos(radians(lat)) * cos( radians(long) - radians('".$lng."')) + sin(radians('".$lat."')) * 
sin(radians(lat)))) 
AS distance 
FROM carpark WHERE distance < 15 ORDER BY distance LIMIT 0 , 10

答案 2 :(得分:1)

Larry Ullman在他的书#34; PHP 5 Advanced:Visual Quickpro Guide中做了类似的事情。&#34;

查看他的示例代码,尝试计算距离:

ROUND(DEGREES(ACOS(SIN(RADIANS($lat)) 
* SIN(RADIANS(latitude)) 
+ COS(RADIANS($lat))  
* COS(RADIANS(latitude))
* COS(RADIANS($long - longitude)))) * 69.09) AS distance

答案 3 :(得分:0)

"SELECT *, ( 3959 * acos( cos( radians(".$lat.") ) * cos( radians( ".$lat." ) ) * cos( radians( ".$long." ) - radians(".$long.") ) + sin( radians(".$lat.") ) * sin( radians( ".$lat." ) ) ) ) AS distance FROM carpark HAVING distance < 15 ORDER BY distance LIMIT 0, 10"

您需要修复查询以提取纬度和经度值。你只是在几个点上传入lat / long这个词。将此查询与您的查询进行比较,看看我的意思。