使用AJAX将给定位置与SQL数据库中存储的地理编码进行比较

时间:2014-02-16 01:01:26

标签: javascript php jquery mysql ajax

简化问题:

我想将存储在数据库中的位置与定义的位置进行比较,如果它们彼此相距1000米,则显示结果。我需要结果是即时的,因此可能需要使用AJAX。

解释和到目前为止我在哪里:

我有一个包含人员列表的数据库,以及它们所在位置的地理编码位置:

enter image description here

我希望能够循环使用这些位置,将它们与定义的位置进行比较,检索属于定义位置的特定范围内的位置(全部使用AJAX,以便立即显示结果)。

到目前为止,我有以下内容:

<script>
$(document).ready(function() {

geocoder = new google.maps.Geocoder();

var saddress = $('#postcode').val(); //get postcode from form

geocoder.geocode( { 'address': saddress}, function(results,status) {
    if( status == google.maps.GeocoderStatus.OK ) { //waits for results
    var latlng = results[0].geometry.location; //gets location
    var locationlatlng = new google.maps.LatLng(52.6628780, -3.1380000);

    var distance = google.maps.geometry.spherical.computeDistanceBetween(latlng, locationlatlng); //gets distance between the two geocodes
    }
});



})//end ready
</script> 

此脚本给出表格(第4行)上给出的邮政编码与定义的位置(var locationlatlng)之间的距离,并且是实现我想要的内容的一部分。

现在,我不想使用表单中的邮政编码,而是使用数据库中的地理编码,并将这些地理编码与定义的位置进行比较。如果它们落在一定距离内(例如1000米),我希望能够在数据库中使用该行来显示网页上的信息。

我的绊脚石是如何从数据库中获取相应的行。我找到两个位置之间距离的唯一方法是使用谷歌函数computeDistanceBetween(),但这是javascript,对数据库的AJAX调用是PHP,它煎炸我的大脑试图弄清楚如何将两者结合起来! / p>

1 个答案:

答案 0 :(得分:0)

假设你有两件事:

  1. 纬度和经度值的数据库表
  2. 用于比较的纬度和经度“点”
  3. 然后,您可以使用SQL查询计算距离。我为an old blog post编写了一些内容,为MS SQL Server编写(因此需要对MySQL进行一些翻译我确定,虽然它看起来像the math functions needed可用),如下所示:

    SELECT
      Name,
      Address,
      City,
      State,
      Latitude,
      Longitude,
      (
        ACOS(
          COS(@center_latitude * (PI()/180)) *
          COS(@center_longitude * (PI()/180)) *
          COS(Latitude * (PI()/180)) *
          COS(Longitude * (PI()/180)) +
          COS(@center_latitude * (PI()/180)) *
          SIN(@center_longitude * (PI()/180)) *
          COS(Latitude * (PI()/180)) *
          SIN(Longitude * (PI()/180)) +
          SIN(@center_latitude * (PI()/180)) *
          SIN(Latitude * (PI()/180))
        ) *
        (
          (@equatorial_radius * @polar_radius) /
          (
            SQRT(
              (@equatorial_radius * @equatorial_radius) -
              (
                (
                  (@equatorial_radius * @equatorial_radius) -
                  (@polar_radius * @polar_radius)
                ) *
                (
                  COS(@center_latitude) *
                  COS(@center_latitude)
                )
              )
            )
          )
        )
      ) AS DistanceInMeters
    FROM
      Places
    WHERE
      DistanceInMeters <= @search_radius
    

    在此查询中,您需要插入一些值:

    1. @center_latitude是您“点”的纬度
    2. @center_longitude是您“点”的经度
    3. @equatorial_radius是赤道地球的半径,以米为单位
    4. @polar_radius是极地的地球半径,以米为单位
    5. @search_radius是搜索区域的半径,以米为单位
    6. 您可以进一步添加ORDER BY以按距离的顺序获取列表,并对计算出的DistanceInMeters列进行排序。基本上这只是选择一堆列(从我当时在我的项目中的表结构),包括LatitudeLongitude列,并添加一个计算列的距离“点“。

      所有这些数学的目的是计算地球表面上圆形半径的距离,同时考虑该表面本身的曲率以及赤道上的凸起。因此,准确度应该非常好,对于任何给定点,可能在几米之内。

      因此,在您的情况下,我猜您的AJAX调用将包含“点”的纬度/经度,然后服务器端代码将使用这些值运行此数据库查询。半径值是常量,您可以在维基百科上查找它们,如果您愿意,可以直接将它们放入查询中。 (我怀疑地球的形状会在你的应用生命中发生重大变化,但these things do happen。)要记住的主要事项是测量单位保持不变。如果半径以米为单位,则距离以米为单位。如果半径以英里为单位,则距离以英里为单位。因此,如果您的单位发生变化,您可以相应地换出值。然后,此查询的结果集将作为该AJAX调用的响应返回到您的页面,并且您可以相应地显示结果。