简化问题:
我想将存储在数据库中的位置与定义的位置进行比较,如果它们彼此相距1000米,则显示结果。我需要结果是即时的,因此可能需要使用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
)之间的距离,并且是实现我想要的内容的一部分。
现在,我不想使用表单中的邮政编码,而是使用数据库中的地理编码,并将这些地理编码与定义的位置进行比较。如果它们落在一定距离内(例如1000米),我希望能够在数据库中使用该行来显示网页上的信息。
我的绊脚石是如何从数据库中获取相应的行。我找到两个位置之间距离的唯一方法是使用谷歌函数computeDistanceBetween()
,但这是javascript,对数据库的AJAX调用是PHP,它煎炸我的大脑试图弄清楚如何将两者结合起来! / p>
答案 0 :(得分:0)
假设你有两件事:
然后,您可以使用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
列进行排序。基本上这只是选择一堆列(从我当时在我的项目中的表结构),包括Latitude
和Longitude
列,并添加一个计算列的距离“点“。
所有这些数学的目的是计算地球表面上圆形半径的距离,同时考虑该表面本身的曲率以及赤道上的凸起。因此,准确度应该非常好,对于任何给定点,可能在几米之内。
因此,在您的情况下,我猜您的AJAX调用将包含“点”的纬度/经度,然后服务器端代码将使用这些值运行此数据库查询。半径值是常量,您可以在维基百科上查找它们,如果您愿意,可以直接将它们放入查询中。 (我怀疑地球的形状会在你的应用生命中发生重大变化,但these things do happen。)要记住的主要事项是测量单位保持不变。如果半径以米为单位,则距离以米为单位。如果半径以英里为单位,则距离以英里为单位。因此,如果您的单位发生变化,您可以相应地换出值。然后,此查询的结果集将作为该AJAX调用的响应返回到您的页面,并且您可以相应地显示结果。