计算PHP中邮政编码之间的距离

时间:2009-01-02 20:52:58

标签: php mysql algorithm math distance

我从中获取了邮政编码及其实力/纬度等数据库 This page。它有以下几个领域:

  

ZIP,LATITUDE,LONGITUDE,CITY,STATE,COUNTY,ZIP_CLASS

数据在文本文件中,但我将其插入MySQL表中。我现在的问题是,我如何利用上面的字段来计算用户可以在网站上输入的两个邮政编码之间的距离? PHP中的工作代码将不胜感激

5 个答案:

答案 0 :(得分:24)

这是迈克对魔数的一些注释的回答。 some test data

对我来说似乎很好
function calc_distance($point1, $point2)
{
    $radius      = 3958;      // Earth's radius (miles)
    $deg_per_rad = 57.29578;  // Number of degrees/radian (for conversion)

    $distance = ($radius * pi() * sqrt(
                ($point1['lat'] - $point2['lat'])
                * ($point1['lat'] - $point2['lat'])
                + cos($point1['lat'] / $deg_per_rad)  // Convert these to
                * cos($point2['lat'] / $deg_per_rad)  // radians for cos()
                * ($point1['long'] - $point2['long'])
                * ($point1['long'] - $point2['long'])
        ) / 180);

    return $distance;  // Returned using the units used for $radius.
}

答案 1 :(得分:7)

可以用数学来完成......

function calc_distance($point1, $point2)
{
    $distance = (3958 * 3.1415926 * sqrt(
            ($point1['lat'] - $point2['lat'])
            * ($point1['lat'] - $point2['lat'])
            + cos($point1['lat'] / 57.29578)
            * cos($point2['lat'] / 57.29578)
            * ($point1['long'] - $point2['long'])
            * ($point1['long'] - $point2['long'])
        ) / 180);

    return $distance;
}

答案 2 :(得分:6)

您还可以尝试点击网络服务来计算距离。让其他人做重担。

https://www.zipcodeapi.com/API#distance

答案 3 :(得分:6)

查看Haversine formula以计算两点之间的大圆距离。可以找到更多样本here

Haversine公式:

  • R =地球半径(平均半径= 6,371km)
  • Δlat= lat2- lat1
  • Δlong= long2-long1
  • a =sin²(Δlat/ 2)+ cos(lat1).cos(lat2).sin²(Δlong/ 2)
  • c = 2.atan2(√a,√(1-a))
  • d = R.c

(注意角度需要以弧度表示才能传递给trig函数)。

答案 4 :(得分:1)

在你的拉链表中你需要抓住你想要获得距离的两个点的坐标(纬度,长度)。

然后,您可以在SQL中或使用PHP计算距离。这篇文章概述了这两种方法:

http://dev.strategystar.net/2011/10/mysql-php-get-distance-between-two-coordinates-in-miles-kilometers/

示例中的计算基于此线程中已讨论的公式。它以英里和公里为单位提供地球半径,因此它可以让你获得两个单位中两点之间的距离。

上面的链接很棒,因为计算方法不包括任何幻数,只包括地球的半径!