23

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

邮编、纬度、经度、城市、州、县、邮编类

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

4

5 回答 5

24

这是 mike 的答案,带有一些魔术数字的注释。对于一些测试数据,它似乎对我来说很好:

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.
}
于 2009-01-03T00:32:04.213 回答
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;
}
于 2009-01-02T20:58:34.817 回答
6

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

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

于 2009-01-02T21:22:20.727 回答
6

查看用于计算两点之间大圆距离的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

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

于 2009-01-02T21:32:03.127 回答
1

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

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

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

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

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

于 2011-10-07T18:12:35.603 回答