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

标签 javascript php jquery mysql ajax

简化问题:

我想将数据库中存储的位置与定义的位置进行比较,如果它们彼此相距在 1000m 以内,则显示结果。我需要即时得到结果,因此可能需要使用 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 )之间的距离,并且是实现我想要的目标的一部分。

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

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

最佳答案

假设你有两件事:

  1. 纬度和经度值的数据库表
  2. 用于比较的纬度和经度“点”

然后您可以使用 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 是搜索区域的半径,以米为单位

您可以进一步添加 ORDER BY 来按距离顺序获取列表,并根据计算出的 DistanceInMeters 列进行排序。基本上,这只是选择一堆列(从我当时项目中的表结构中),包括纬度和经度列,并添加计算列距离“点”的距离。

所有这些数学运算的目的是计算地球表面圆半径内的距离,同时考虑到该表面本身的曲率以及赤道处的凸起。所以精度应该相当不错,对于任何给定点可能在几米之内。

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

关于javascript - 使用 AJAX 将给定位置与 SQL 数据库中存储的地理编码进行比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21805907/

相关文章:

javascript - 字符 id= + 是 + 正确= + 正确 不正确...我怎样才能使它成为 javascript 中的字符串

php - 如何为不同的根目录配置 xampp Web 服务器

javascript - .click 在reactjs 中不起作用

android - 手机CSS - 地址栏调整屏幕大小

javascript - 如何使用 Ajax 发送图像

javascript - highcharts 2 变量 JSON(日期、值)未正确显示

javascript - 获取资源作为控制台输出

php - 尝试登录时 Yii2 中的错误请求 (#400)

php - 在也是子域的共享主机上运行 Zend Framework 应用程序

jQuery CSS 类作为 LESS mixins