【问题标题】:Zip codes within a certain range一定范围内的邮政编码
【发布时间】:2011-06-08 12:13:11
【问题描述】:

我有一个包含一系列条目(不超过数千个)的数据库,其中一个字段是邮政编码。

我希望创建一个脚本,当给定邮政编码和英里半径(如 50 英里、100 英里)时,我可以找到该范围内的所有条目。

我在网上看到很多文章和脚本都允许这样做,但他们通常通过包含自己的庞大数据库来做到这一点。

有没有一种方法可以在不需要数据库的情况下使用简单的计算?

注意:准确性不是什么大问题。如果在输入 50 英里的情况下可以运行 60 英里,那就完全没问题了。

编辑

我注意到很多涉及获取邮政编码的纬度/经度的答案,但是,数据库只存储了邮政编码,所以我可以假设这包括追溯获取/存储每个条目的纬度/经度到数据库呢?

【问题讨论】:

标签: php zipcode


【解决方案1】:

没有。邮政编码确实遵循certain logic at a high level,但邮政编码和位置之间没有算法映射(即,邮政编码分配到一个位置,而不是计算一个位置 -这个过程由邮政当局(美国的USPS)监督,但它总是会考虑非地理因素,例如人口密度;因此不可能从一个位置计算邮政编码,反之亦然)。

所以,您需要那个“庞大的数据库”来告诉您哪个邮政编码属于哪个位置;获得位置后,您可以像往常一样计算半径内的条目。

(您可以查询 Web 服务,但这只是将数据库隐藏在云中 - 在某些时候,某人 必须检查 90210 的物理位置。)

【讨论】:

  • 某些高级逻辑实际上是我希望利用的。同样,只要合理,准确性并不是什么大问题。
  • @steveo225:那么请查看维基百科链接上的地图。不过,我认为您无法从中获得比“此邮政编码位于加利福尼亚某处”更准确的结果。
  • 我看到了,我希望有一些与北、东、南、西相关的逻辑,但事实并非如此。感谢 USPS
  • @steveo225:嗯,这就是人们拒绝统一安置土地,而是聚集在资源附近并制造那些讨厌的城市的结果;)
  • 我认为使用状态方法实际上会很好。 90% 的情况下,所有邮政编码都在 200 英里范围内。因此,也许是该区域上方的纬度/经度数据库以及维基百科地图中的数据。如果它不在热区,那么我们可以按状态分组。
【解决方案2】:

如果准确性不是问题,您可以绘制邮政编码中心的经度和纬度,或对中心进行粗略估计。然后,您可以让脚本使用公式计算每个中心之间的距离 列出here。不需要使用如 here 所示的半正弦公式,这是为了获得极高的准确性,您不需要。三角函数和反三角函数会消耗大量计算资源,是一种浪费。每次都查询距离,让MySQL对每个邮政编码都跑这么复杂的公式,简直是浪费资源。

如果您必须每天多次执行此操作,则仅存储每个邮政编码之间的距离可能会更快(此处为空间与速度权衡)。这种存储表中的条目总数是您拥有的邮政编码数量的平方。每次运行数以万计的邮政编码来计算会消耗大量的计算能力,更不用说对最终用户来说更慢了。

另外,之前已经在此处提出了类似的问题,请查看此问题的已接受答案,它适用于您的情况:Calculate distance between zip codes and users

【讨论】:

  • +1 表示“只计算一次”。此外,长距离需要Haversine;但是对于 100 英里的半径,曲面和平面之间的差异确实是微不足道的。
  • +1 我同意。尽可能多地预先计算肯定会对性能有所帮助。我想我会根据 Piskvor 提供的数据使用混合方法,但这会加快热区计算。谢谢
【解决方案3】:

在这种情况下可能适合也可能不适合的另一个选项是在寻找半径时使用县。对于我从事的大多数项目,用户都知道他们所在的县并熟悉它。你可以花 20 美元到 40 美元购买一个县压缩数据库(和城市/州/等)。它可以在许多不同的项目中一遍又一遍地重复使用。它不一定让您能够准确地执行 10/25/50/100 英里半径,但可能允许您根据请求的邮政编码执行 in my region 样式的半径查找。

【讨论】:

    【解决方案4】:

    您可以使用谷歌地图获取此邮政编码的纬度和经度,查询可能像这样“邮编”

    您可以阅读此http://www.movable-type.co.uk/scripts/latlong.html 了解如何计算点之间的距离

    这是使用 SQL http://www.movable-type.co.uk/scripts/latlong-db.html 执行此操作的方法,首先它计算范围,然后按此范围进行搜索(它会更快)

    【讨论】:

      【解决方案5】:

      一种选择是使用 Google 地图 API 来查找您所在位置的经纬度。然后,您必须在数据库中为每个邮政编码提供经纬度,然后编写脚本从那里进行计算。

      【讨论】:

        【解决方案6】:

        您需要做的主要事情是将这些邮政编码转换为地理坐标(即纬度和经度对)。完成后,您可以查看this presentation,它详细解释了如何根据给定坐标的距离进行搜索。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-09-09
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多