Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
利用PHP和MySQL计算地理位置距离_Php_Mysql_Geolocation_Where Clause - Fatal编程技术网

利用PHP和MySQL计算地理位置距离

利用PHP和MySQL计算地理位置距离,php,mysql,geolocation,where-clause,Php,Mysql,Geolocation,Where Clause,我有一个php脚本和一个地理位置数据库 目前,我的用户可以输入他们的邮政编码,使用Yahaa我可以得到他们的地理位置 现在我有了他们的地理位置,我想写一个脚本,按照距离的顺序加载他们的本地业务。我猜要做到这一点,我需要从数据库中加载与用户当前地理位置坐标最相似的记录。我尝试了以下代码: $sql = "SELECT * FROM dirlistings WHERE ABS(latitude - $lat) AND ABS(longitude - $long)"; 但是,它只是按正常顺序显示结果

我有一个php脚本和一个地理位置数据库

目前,我的用户可以输入他们的邮政编码,使用Yahaa我可以得到他们的地理位置

现在我有了他们的地理位置,我想写一个脚本,按照距离的顺序加载他们的本地业务。我猜要做到这一点,我需要从数据库中加载与用户当前地理位置坐标最相似的记录。我尝试了以下代码:

$sql = "SELECT * FROM dirlistings WHERE ABS(latitude - $lat) AND ABS(longitude - $long)";
但是,它只是按正常顺序显示结果

我遗漏了什么吗?

试着按纬度排序,最后按经度排序。这样就可以了,或者差不多可以了。

试着按纬度排序,最后按经度排序。应该可以,或者差不多可以。

我想你需要一个订单条款

但你真正想要的是哈弗森公式:

我想你想要一个ORDER子句


但你真正想要的是哈弗森公式:

它比你想象的要复杂

这是一篇很好的文章,对我帮助很大。虽然它是用javascript编写的,但您可以轻松地将其更改为php


这比你想象的要复杂

这是一篇很好的文章,对我帮助很大。虽然它是用javascript编写的,但您可以轻松地将其更改为php


你错过了很多东西。为了做你想做的事情,你需要使用毕达哥拉斯定理计算两点之间的距离,然后按距离排序

您可以通过以下方式计算距离lat-$lat^2+lon-$lon^2^0.5:

那么就简单到:

ORDER BY distance ASC

你错过了很多东西。为了做你想做的事情,你需要使用毕达哥拉斯定理计算两点之间的距离,然后按距离排序

您可以通过以下方式计算距离lat-$lat^2+lon-$lon^2^0.5:

那么就简单到:

ORDER BY distance ASC

请注意,如果你说的是数千英里的大距离,那么圆距离就不够精确,因为地球表面并不平坦。如果需要更好的计算地理距离的公式,可以使用以下公式:

$dlat = ((double)$lat) / 57.29577951;
$dlon = ((double)$lon) / 57.29577951;

$sql = "SELECT *
        FROM dirlistings
        WHERE 3963.0 * acos(sin(latitude / 57.29577951) * sin($dlat) + cos(latitude / 57.29577951) * cos($dlat) * cos($dlon - longitude / 57.29577951)) < MAX_DIST
        ORDER BY acos(sin(latitude / 57.29577951) * sin($dlat) + cos(latitude / 57.29577951) * cos($dlat) * cos($dlon - longitude / 57.29577951))
        ";

这里的距离以英里为单位-确保指定正确的最大距离-此公式将给出非常接近一万英里距离的结果。请注意,尽管这样的计算非常耗时耗电,如果你不是在处理大距离(即不超过几百英里),那么你应该使用更快的近似值。

请注意,如果你谈论的是数千英里的大距离,那么圆距离就不够精确,例如,因为地球表面并不平坦。如果需要更好的计算地理距离的公式,可以使用以下公式:

$dlat = ((double)$lat) / 57.29577951;
$dlon = ((double)$lon) / 57.29577951;

$sql = "SELECT *
        FROM dirlistings
        WHERE 3963.0 * acos(sin(latitude / 57.29577951) * sin($dlat) + cos(latitude / 57.29577951) * cos($dlat) * cos($dlon - longitude / 57.29577951)) < MAX_DIST
        ORDER BY acos(sin(latitude / 57.29577951) * sin($dlat) + cos(latitude / 57.29577951) * cos($dlat) * cos($dlon - longitude / 57.29577951))
        ";

这里的距离以英里为单位-确保指定正确的最大距离-此公式将给出非常接近一万英里距离的结果。请注意,这种计算非常耗时耗电,如果您不处理大距离(即不超过几百英里的距离),则应使用更快的近似值。

警告您的代码容易受到sql注入攻击。我正是这样做的,事情是它存储在家里的电脑,而我现在不在那里,我可以提供你需要的所有信息。因为地球是一个球体,所以不仅仅是减法。警告您的代码容易受到sql注入攻击。我正在做的事情与此完全相同,它存储在家庭计算机中,我现在不在,我可以提供您需要的所有信息。因为地球是一个球体,所以不仅仅是减法。在短距离内,任何小于~50英里的物体都可以将地球视为一个平面来计算距离,至少在这个范围内。在短距离内,任何小于~50英里的物体,至少在这个领域,你可以把地球当作一个平面来计算距离,我认为这没有任何用处。排序必须由使用纬度和经度的公式的结果来完成,而不是分别由每个公式来完成。你完全正确。哇!我已经好几年没有这样做了,我忘记了公式。我认为这不会有任何用处。排序必须由使用纬度和经度的公式的结果来完成,而不是分别由每个公式来完成。你完全正确。哇!我已经有几年没有这样做了,我忘记了公式。我已经指定了最大距离,没有出现任何东西?在这种情况下,我建议你检查你的数据。多年来,我们一直在有效数据中使用此公式,并取得了巨大成功。很抱歉,我们花了一段时间才回复。我弄了些乱七八糟的事,终于成功了。我能问一下我应该把我的最大距离设置成什么吗?只有当它处于高值时才有效,应该怎么做
当我只查找最大40英里的位置时,该值为。如果您查找的是半径为40英里的位置,则应将最大距离设置为40。但是,请确保您的数据在测试点40英里范围内。我已经指定了最大距离,但没有显示任何内容?在这种情况下,我建议您实际检查您的数据。多年来,我们一直在有效数据中使用此公式,并取得了巨大成功。很抱歉,我们花了一段时间才回复。我弄了些乱七八糟的事,终于成功了。我能问一下我应该把我的最大距离设置成什么吗?它仅在其值较高时有效,当我仅查找最大40英里的位置时,该值应为多少。如果您查找的是半径为40英里的位置,则应将最大距离设置为40。但要确保你的数据在测试点40英里以内。