【问题标题】:Finding Zip Codes in a Specific Radius查找特定半径内的邮政编码
【发布时间】:2010-11-17 18:59:50
【问题描述】:

我发现了这个由 SaniSoft 开发的名为 Zip Location 的流行 PHP/MySQL 脚本,除了一件事之外,它还很有效:在某些情况下它不会。

似乎 20 英里以下的任何半径都返回与 20 英里相同数量的邮政编码。我在谷歌上搜索过,但无济于事,我想知道是否有人对这种情况有所了解。

我宁愿在为程序付费之前弄清楚这个问题,我也可以利用学习经验。该数据库是邮政编码和每个邮政编码的经度和纬度的列表。该脚本使用一种方法来确定输入的邮政编码周围的距离,并根据其经度/纬度返回该半径内的邮政编码。

谢谢!!

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

重大更新

研究表明,数据库具有重复的纬度/经度值。使用 Zip Locator 时请注意这一点。尽管 PHP 完成了它的工作,但您需要找到一个新的邮政编码数据库。我将在稍后发布我的发现。

【问题讨论】:

    标签: php mysql


    【解决方案1】:

    下面的近似距离计算比较简单,但是 可以产生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。假设地球的半径为 为 6,371 公里,或 3,958.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)]
    

    【讨论】:

      【解决方案2】:

      第二次尝试!

      看到您编辑的问题陈述,我会看看您如何分配 zip 值。

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

      ziptest.php 中的示例并不好,因为将 zip 视为整数。当您尝试用整数描述我自己的邮政编码时:

      $zip1 = 02446;
      

      PHP 将其解释为八进制值 2446。phpZipLocator 将该值用作字符串,无需任何显式转换。因此 PHP 将八进制 2446 的十进制值作为字符串 (1318) 提供,这根本不是邮政编码。

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

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

      $zip1 = '02446';
      

      我得到了正确的结果。

      恕我直言,phpZipLocator 似乎需要做一些工作。

      【讨论】:

      • 非常感谢 otterfan。为您 +1,但不幸的是,这并不能解决问题。我使用的邮政编码是 11950,半径设置为 5,它提供了 73 个邮政编码。我目前正在通过 post 变量发送邮政编码变量。但我将变量更改为 $zip1 = '11950';我仍然得到相同的结果。
      • 我确实看到了它如何与您的邮政编码一起使用,这里有有趣的东西。
      • 更有趣的是,出现的 73 个邮政编码中的一些距离大约 20 英里。
      • 原来,这个数据库中有大量重复的邮政编码经度和纬度。搜索此 72.6370 40.92232。该死的。
      【解决方案3】:

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

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

      我的猜测是$radius 的值仍在您的代码中,并且正在覆盖您要使用的半径。尝试对$radius 进行搜索和替换。

      更好的是,使用调试器查看您的代码,并在您调用 inradius() 时查看 $radius 是否设置为 20。

      【讨论】:

      • 我第一次直接更改了该值。不过感谢您的帮助。
      • 我使用了距离函数,令我惊讶的是,出现的邮政编码距离我的邮政编码 0 英里。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-10
      • 1970-01-01
      • 1970-01-01
      • 2016-09-29
      • 1970-01-01
      相关资源
      最近更新 更多