简化问题:
我想将数据库中存储的位置与定义的位置进行比较,如果它们彼此相距在 1000m 以内,则显示结果。我需要即时得到结果,因此可能需要使用 AJAX。
说明以及我目前所处的位置:
我有一个数据库,其中包含人员列表以及他们所在位置的地理编码位置:
我希望能够循环这些,将它们与定义的位置进行比较,检索属于定义位置的特定范围内的内容(全部使用 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,它在绞尽脑汁地试图弄清楚如何将两者结合起来!
最佳答案
假设你有两件事:
- 纬度和经度值的数据库表
- 用于比较的纬度和经度“点”
然后您可以使用 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
在此查询中,您需要插入一些值:
@center_latitude
是您的“点”的纬度@center_longitude
是您的“点”的经度@equatorial_radius
是地球赤道处的半径,以米为单位@polar_radius
是地球两极的半径,以米为单位@search_radius
是搜索区域的半径,以米为单位
您可以进一步添加 ORDER BY
来按距离顺序获取列表,并根据计算出的 DistanceInMeters
列进行排序。基本上,这只是选择一堆列(从我当时项目中的表结构中),包括纬度和经度列,并添加计算列距离“点”的距离。
所有这些数学运算的目的是计算地球表面圆半径内的距离,同时考虑到该表面本身的曲率以及赤道处的凸起。所以精度应该相当不错,对于任何给定点可能在几米之内。
因此,在您的情况下,我猜您的 AJAX 调用将包括“点”的纬度/经度,然后服务器端代码将使用这些值运行此数据库查询。半径值是常量,您可以在维基百科上查找它们,然后根据需要将它们直接放入查询中。 (我怀疑地球的形状在您的应用程序的生命周期中会发生显着变化,尽管these things do happen。)要记住的主要事情是测量单位保持不变。如果半径以米为单位,则距离也以米为单位。如果半径以英里为单位,则距离也以英里为单位。因此,如果单位发生变化,您可以相应地交换值。然后,该查询的结果集将作为该 AJAX 调用的响应返回到您的页面,您可以相应地显示结果。
关于javascript - 使用 AJAX 将给定位置与 SQL 数据库中存储的地理编码进行比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21805907/