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

Cli*_*ote 23 php mysql algorithm math distance

我从这个页面中抓取了一个邮政编码数据库及其经纬度等 .它有以下字段:

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

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

Ada*_*ire 24

这是迈克的答案,其中包含一些神奇数字的注释.对于一些测试数据,它似乎对我来说很好:

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.
}
Run Code Online (Sandbox Code Playgroud)


小智 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;
}
Run Code Online (Sandbox Code Playgroud)

  • 你能举一个参考这个计算的地方吗? (3认同)
  • 太多的魔法数字,右边的压痕太多了! (2认同)

bre*_*dan 6

您也可以尝试点击Web服务来计算距离.让其他人做繁重的工作.

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

  • 这将适用于2个zipcodes,但想象一下,尝试从数据库中的数千条记录中选择给定邮政编码的前100个最近位置:) (3认同)

Pau*_*xon 6

查看用于计算两点之间的大圆距离的Haversine公式.这里可以找到更多样品

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 = Rc

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