代码之家  ›  专栏  ›  技术社区  ›  Chris Bier

在特定半径内查找邮政编码

  •  6
  • Chris Bier  · 技术社区  · 17 年前

    我发现这个流行的php/mysql脚本叫做zip location by sanisoft,除了一件事外,它工作得很好:在某些情况下它不工作。

    如果半径小于20英里,返回的邮政编码似乎与20英里相同。我搜遍了谷歌,但没有用,我想知道是否有人对这种情况有所了解。

    我宁愿在支付课程费用之前解决这个问题,我也可以利用学习经验。数据库中列出了邮政编码和每个邮政编码的经度和纬度。该脚本使用一种方法来确定输入的邮政编码周围的距离,并根据其lon/lat返回该半径内的邮政编码。

    谢谢您!!

    编辑: 通过使用脚本提供的距离函数,我发现程序提供给我的邮政编码和我的邮政编码之间的距离是0英里。

    主要更新

    研究表明,数据库具有重复的lat/lon值。使用拉链定位器时请注意这一点。虽然PHP可以完成它的工作,但是您需要找到一个新的邮政编码数据库。我稍后会把我的发现贴出来。

    3 回复  |  直到 17 年前
        1
  •  1
  •   Otterfan    17 年前

    第二次尝试!

    看到您编辑的问题语句,我将看看您如何分配zip值。

    如果您的邮政编码是整数而不是字符串,则会引入许多错误。最大的问题是美国的邮政编码可以从0开始。

    php中的示例并不好,因为将zips视为整数。当你试图用一个整数来描述我自己的邮政编码时:

    $zip1 = 02446;
    

    它由php解释为八进制值2446。phpzipLocator使用该值作为字符串,而不进行任何显式转换。因此,PHP将八进制2446的十进制值作为字符串(1318)提供给它,该字符串根本不是邮政编码。

    phpziplocator没有通知它没有找到邮政编码,而是对给定半径内不存在的所有邮政编码进行半径搜索,它认为应该是1。

    如果我用字符串设置邮政编码

    $zip1 = '02446';
    

    我得到了正确的结果。

    不知道,似乎phpziplocator可以使用一点工作。

        2
  •  10
  •   ChssPly76    17 年前

    下面的近似距离计算相对简单,但是 可产生10%以上的距离误差。这些近似值 计算使用纬度和经度值 度 . 第一个近似值只需要简单的数学函数:

    Approximate distance in miles = sqrt(x * x + y * y)
    
    where
          x = 69.1 * (lat2 - lat1)
    and   
          y = 53 * (lon2 - lon1)
    

    您可以通过以下方式提高近似距离计算的精度: 添加余弦数学函数:

    Approximate distance in miles = sqrt(x * x + y * y)
    
    where
          x = 69.1 * (lat2 - lat1)
    and   
          y = 69.1 * (lon2 - lon1) * cos(lat1/57.3)
    

    如果需要更高的精度,必须使用精确的距离计算。 精确的距离计算需要使用球面几何,因为 地球是一个球体。精确的距离计算也需要较高的水平 浮点数学精度-约15位精度 (有时称为“双精度”)。另外,三角数学 精确计算中使用的函数需要转换纬度 经度值从度到弧度。转换纬度或 经度从度到弧度,除以经度和纬度值 在这个数据库中按180/pi,或57.2958。地球半径假定为 行驶6371公里或3958.75英里。

    您必须在 计算。用度数代替弧度,计算如下:

              Exact distance in miles = 3958.75 * arccos[sin(lat1/57.2958) *
                                   sin(lat2/57.2958) + 
                                   cos(lat1/57.2958) * 
                                   cos(lat2/57.2958) * 
                                   cos(lon2/57.2958 - lon1/57.2958)]
    
        3
  •  0
  •   Otterfan    17 年前

    phpzipLocator(ziptest.php)演示脚本中radius的默认值使用20英里作为其默认半径。

    $radius = 20;
    $zipArray = $zipLoc->inradius($zipOne,$radius);
    

    我的猜测是 $radius 仍在代码中,正在覆盖要使用的半径。尝试搜索并替换 圆半径 .

    更好的是,使用调试器查看代码,并查看 圆半径 打电话时设为20 inradius() .

    推荐文章