邮政编码查询

Posted

技术标签:

【中文标题】邮政编码查询【英文标题】:Post Code Lookup 【发布时间】:2011-01-17 17:53:33 【问题描述】:

客户希望在他们的网站上有一个页面,用户可以在其中搜索他们产品范围的库存商。他们想要的是能够输入英国邮政编码并以最接近的顺序显示他们的库存商列表。

有没有办法利用谷歌地图来确定最近的供应商?

我有一个 php mysql 数据库,其中包含所有供应商的邮政编码和详细信息,我还将拥有用户的邮政编码以供使用。

【问题讨论】:

【参考方案1】:

我认为您需要军械测量局 CodePoint 数据来将您的邮政编码映射到经度和纬度。代码点可用作 commercial product,或者还有 Codepoint Open

一旦有了纬度和经度,就可以使用标准算法(例如 Haversine 或 Vincenty)来计算点之间的距离

编辑

CodePoint Open CSV 文件的结构可以在here 找到。请注意,位置被保存为 Northings 和 Esatings 而不是经度和纬度,因此需要转换。网上有很多关于此的文章,例如

http://www.deepbluesky.com/blog/-/converting-os-coodinates-into-longitude-latitude_7/
http://mediakey.dk/~cc/convert-northing-and-easting-utm-to-longitude-and-latitude/

但您需要注意,OS Northings/Eastings 是基于 Airy 1830 椭球而不是 Google 地图(和大多数 GSM 系统)使用的 WGS84 模型。如果不考虑这种差异,康沃尔和东英吉利之间的距离可能会在 70-120 米之间。

您还可以在Movable Type 站点上找到 PHP 函数来执行此转换(任何 PHP 开发人员的必备读物,使用 GeoData。我建议在您的库存数据库中添加几个关于经度和纬度的列,以及使用 Codepoint 数据更新所有现有数据的一次性脚本,然后修改库存商的插入/更新例程,以使此信息保持最新。 使用 PHP,此转换的另一个解决方案是 PHPCoord by Jonathan Stott

为了提高数据库查询的性能,请在计算距离之前针对“边界框”查找纬度/经度。我已经解释了如何响应similar query。

【讨论】:

【参考方案2】:

我认为您需要更多的数据。我建议您需要将每个英国邮政编码的纬度和经度与邮政编码本身一起存储。我认为这些数据可以从皇家邮政获得,而且我记得在某处读到它也将在公共领域提供。让用户输入他们的邮政编码,在数据库中查找他们的纬度和经度,然后使用它来执行另一个查询,计算离他们最近的供应商,可能在一定英里数内。您也许可以创建一个存储过程来在数据库上执行所有这些操作。 This post 似乎有一些关于如何做到这一点的细节。

【讨论】:

【参考方案3】:

如果您希望它更快,请预先计算一定半径内的邮政编码之间的距离 - 请参阅以下内容:

Calculate distance between zip codes and users

除非您认为用户愿意旅行超过 100 英里来购买产品,否则这在您的情况下应该可以正常工作??

【讨论】:

【参考方案4】:

这个开放的邮政编码geocoding API 可能对您有用,而不是 Google 地图。正如其他人所提到的,一旦你对两个点都有 lat long,你就可以使用标准算法来查找距离。 previous question 包含有关如何直接在 SQL 中执行此操作的一些信息。

【讨论】:

【参考方案5】:

您可能会发现此网站对您有所帮助:SQL/CSV Postcode Database

我以前用它从邮政编码“outcode”中查找 long/lat。

还有一个 php 脚本(我没有测试过),它计算两个邮政编码之间的距离。

【讨论】:

以上是关于邮政编码查询的主要内容,如果未能解决你的问题,请参考以下文章

LINQ查询以检查邮政编码是不是在起始和结束邮政编码范围内?

邮政编码查询

MariaDB - 地理编码查询非常慢

冒号是不是需要在 URI 查询参数中进行编码?

sqlserver多表查询

合并两个 MySQL 查询并获取两个邮政编码之间的距离