当前位置: 首页 > 知识库问答 >
问题:

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

许高峻
2023-03-14

我试图开发一个小网站,它从数据库中按设定的半径检索结果,并将其放在地图上。我使用谷歌地图api从那里获得lat和long搜索条件,将这些传递给我的php脚本,该脚本查询数据库并返回结果集作为JSON对象。

我在使用json向php发送lat和long时遇到了一个小问题。

我的主要问题是,我搜索数据库的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,感谢您的帮助。

共有3个答案

牟恺
2023-03-14

拉里·乌尔曼在他的书《PHP 5高级:可视化快速专业指南》中做了非常相似的事情

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

ROUND(DEGREES(ACOS(SIN(RADIANS($lat)) 
* SIN(RADIANS(latitude)) 
+ COS(RADIANS($lat))  
* COS(RADIANS(latitude))
* COS(RADIANS($long - longitude)))) * 69.09) AS distance
季城
2023-03-14

我使用have没有问题。伊林的回答有误导性。下面是一个查找到纽约市距离的正确查询示例:

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},
栾昂雄
2023-03-14

对于您的情况,尝试使用WHERE而不是have

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
 类似资料:
  • 这个问题不同于常规的mysql lat/long、基于radius的数据获取 例如,我想搜索包含以下列的mysql数据库表- 现在,如果用户具有lat/long(29.941095/77.812424),则希望知道这些项目中的哪些可以在其位置提供服务。那么我将如何使用php获取结果

  • 我在学习PHP,我创建了一个页面来用MySQL显示我的数据表。我想用这些数据进行分页、搜索和排序。 我写了一些条件来搜索和排序。但它不起作用。我的传呼似乎工作得很好。 当我运行它时,它说:警告:mysqli_fetch_array()期望参数1是mysqli_result。你能帮助我吗?非常感谢。

  • 我运行下面的脚本时出错,我不知道如何更正它。本质上,我在mysql中有一个名为gamestbl的表。我希望用户输入一些关于游戏名称或游戏描述的关键词,然后php将正确的游戏显示为下拉列表(理想情况下)甚至信息表。 错误显示: 警告:mysqli_query()至少需要2个参数,其中1个参数在第29行的C:\xampp\htdocs\introductiongphp\Email.php中给出 警告:

  • 问题内容: 我正在尝试根据用户输入创建动态搜索查询。 用户可以不填写任何,部分或全部字段。 该查询在表中搜索符合所有要求的记录。 现在,我已经完成了研究,并且发现了执行此操作的多种方法。但是它们都不起作用,如果起作用了,那么它们就不可行了。 试图: 目前,我正在创建这样的查询: 该查询有效,但前提是您填写了所有字段。 我是从stackoverflow文章中得到的,我再也找不到了,它说: 如果用户已

  • 我不理解高级REST客户机(它取代了传输客户机)和Spring Data ElasticSearch之间的关系。 有一些教程(https://www.baeldung.com/spring-data-elasticsearch-tutorial)展示了如何使用像getSomethingById()这样的自动实现方法进行JPA风格的查询。他们利用这个接口: 所以如果我想使用最新的官方客户端,对我来说

  • 我是mysql和php的新手。 一直致力于为用户创建一个带有表的数据库。 我已经成功地将用户添加到数据库中,他们的密码是md5(是的,我知道它不安全),它不会在线启动。 我的问题是,如何根据用户正确的用户名和密码登录。 这是我的密码 我的逻辑是taht查询运行后,它将返回true或false。 如果为真,则显示成功登录,否则不成功。 然而,即使我输入了正确的用户名和密码,我仍然会收到一条不成功的登