查找特定半径的邮政编码

Chr*_*ier 6 php mysql

我在SaniSoft找到了这个名为Zip Location的流行的PHP/MySQL脚本,它除了一件事之外还很有用:它在某些情况下并不适用.

看起来20英里以下的任何半径都会返回相同数量的邮政编码,即20英里.我搜遍了谷歌,但无济于事,我想知道是否有人对这种情况有所了解.

我不得不在支付一个程序之前弄清楚这个问题,我也可以使用学习经验.数据库是邮政编码列表以及每个邮政编码的经度和纬度.该脚本使用一种方法确定输入的邮政编码周围的距离,并根据其lon/lat返回该半径中的邮政编码.

谢谢!!

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

主要更新

从研究中可以看出,数据库具有重复的lat/lon值.使用Zip Locator时请注意这一点.虽然PHP可以完成它的工作,但您需要找到一个新的邮政编码数据库.我会在以后发表我的发现.

Chs*_*y76 10

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

Approximate distance in miles = sqrt(x * x + y * y)

where
      x = 69.1 * (lat2 - lat1)
and   
      y = 53 * (lon2 - lon1)
Run Code Online (Sandbox Code Playgroud)

您可以通过添加余弦数学函数来提高此近似距离计算的准确性:

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

如果需要更高的精度,则必须使用精确的距离计算.精确的距离计算需要使用球面几何,因为地球是一个球体.精确的距离计算还需要高水平的浮点数学精度 - 大约15位精度(有时称为"双精度").此外,精确计算中使用的trig数学函数需要将纬度和经度值从度数转换为弧度.要将纬度或经度从度数转换为弧度,请将此数据库中的纬度和经度值除以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)]
Run Code Online (Sandbox Code Playgroud)


Ott*_*fan 1

第二次尝试!

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

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

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

$zip1 = 02446;
Run Code Online (Sandbox Code Playgroud)

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

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

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

$zip1 = '02446';
Run Code Online (Sandbox Code Playgroud)

我得到了正确的结果。

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