客户希望在他们的网站上有一个页面,用户可以在其中搜索他们产品范围的库存商。他们想要的是能够输入英国邮政编码并以最接近的顺序显示他们的库存商列表。
有没有办法利用谷歌地图来确定最近的供应商?
我有一个 PHP MySQL 数据库,其中包含所有供应商的邮政编码和详细信息,我也将使用用户的邮政编码。
客户希望在他们的网站上有一个页面,用户可以在其中搜索他们产品范围的库存商。他们想要的是能够输入英国邮政编码并以最接近的顺序显示他们的库存商列表。
有没有办法利用谷歌地图来确定最近的供应商?
我有一个 PHP MySQL 数据库,其中包含所有供应商的邮政编码和详细信息,我也将使用用户的邮政编码。
我认为您需要军械测量局 CodePoint 数据来将您的邮政编码映射到经度和纬度。Codepoint 可作为商业产品使用,或者还有Codepoint Open
获得纬度和经度后,您可以使用标准算法(例如 Haversine 或 Vincenty)来计算点之间的距离
编辑
CodePoint Open CSV 文件的结构可以在这里找到。请注意,位置被保存为 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,此转换的另一个解决方案是Jonathan Stott的PHPCoord
为了在您的数据库查询中获得更高的性能,请在计算距离之前针对“边界框”查找纬度/经度。我已经解释了如何响应类似的查询来执行此操作。
我认为你需要比这更多的数据。我建议您需要将每个英国邮政编码的纬度和经度与邮政编码本身一起存储。我认为这些数据可以从皇家邮政获得,而且我记得在某处读到它也将在公共领域提供。让用户输入他们的邮政编码,在数据库中查找他们的纬度和经度,然后使用它来执行另一个查询,计算离他们最近的供应商,可能在一定英里数内。您也许可以创建一个存储过程来在数据库上执行所有这些操作。这篇文章似乎有一些关于如何做到这一点的细节。
这个开放的邮政编码地理编码 API可能对您有用,而不是 Google 地图。正如其他人所提到的,一旦您对两个点都有 lat long,您就可以使用标准算法来查找距离。上一个问题包含有关如何直接在 SQL 中执行此操作的一些信息。
如果您希望它更快,请预先计算彼此一定半径内的邮政编码之间的距离 - 请参见以下内容:
这在您的情况下应该可以正常工作,除非您认为用户愿意旅行超过 100 英里来购买产品?