【问题标题】:Calculating distance between zip codes in PHP在PHP中计算邮政编码之间的距离
【发布时间】:2009-01-02 20:52:57
【问题描述】:

我从中获取了邮政编码及其经度/纬度等的数据库 This page。它有以下字段:

邮政编码、纬度、经度、城市、州、县、邮政编码

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

【问题讨论】:

  • 什么是“距离”?你想要“乌鸦飞”的距离/大圆距离吗?道路距离?空间中两点之间的实际 3D 距离?
  • @Shreevats:由于他要求使用纬度/经度进行计算,因此可以安全地假设您不会获得道路距离。空间中两点之间的实际距离(例如通过地球的身体)可能也没有用。因此,“如乌鸦飞”/大圆最有可能。

标签: php mysql algorithm math distance


【解决方案1】:

这是迈克对幻数的一些注释的回答。 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.
}

【讨论】:

    【解决方案2】:

    只用数学就可以了……

    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;
    }
    

    【讨论】:

    • 你能提供一个参考你从哪里进行这个计算吗?
    • 幻数太多,向右缩进太多!
    • 返回距离的单位是什么?对于应该给出 10 英里的邮政编码,它给出了类似 7892.xx(大约)的信息。如何将其转换为里程?
    • 而且 pi 不应该是 3.1415927(末尾是 7,而不是 6,因为下一个数字是 5?还是我记错了......)
    • 3958 可能是平均半径:3963 是赤道半径。鉴于美国实际上与球体表面的子集不是等距的,因此使用更准确的平均半径可能毫无意义:您想要的是对美国采取更准确的平均值。或者使用 GPS 球体。
    【解决方案3】:

    您也可以尝试点击网络服务来计算距离。让其他人完成繁重的工作。

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

    【讨论】:

    • 这适用于 2 个邮政编码,但想象一下尝试从数据库中的数千条记录中选择最接近给定邮政编码的前 100 个位置:)
    【解决方案4】:

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

    Haversine 公式:

    • R = 地球半径(平均半径 = 6,371 公里)
    • Δ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

    (请注意,角度需要以弧度为单位才能传递给三角函数)。

    【讨论】:

      【解决方案5】:

      在您的 zip 表中,您需要获取要获取距离的两点的坐标(纬度、经度)。

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-06-09
        • 1970-01-01
        • 2017-10-25
        • 2011-04-28
        • 1970-01-01
        • 1970-01-01
        • 2014-08-12
        • 1970-01-01
        相关资源
        最近更新 更多