邮政编码和半径查找建议[关闭]

Posted

技术标签:

【中文标题】邮政编码和半径查找建议[关闭]【英文标题】:Postcode and radius lookup recommendations [closed] 【发布时间】:2010-04-16 14:56:41 【问题描述】:

我为一家英国会员组织管理多个部门网站,我们想要做的是提供以及其他地址功能,是从网站本身最接近网络用户的会员查找。

我想填写的几个用例:

案例 1:用户输入他们的邮政编码并希望查看距离他们 5/10/15/20/30/40 英里半径范围内的所有成员

案例 2:成员放入一个区域(市、县等)并获取该区域的成员列表。

基本上我正在寻找的是一个可编程的 API,我可以编写代码来做:

邮政编码查找和返回地址(例如在选择门牌号之后)。 搜索邮政编码 + 半径(5 英里、10 英里等)并获取一组适用的邮政编码,然后加入数据库中的会员记录

有什么建议吗?它可以是服务器上的季度更新安装,也可以是可查询的 Web 服务。我愿意接受建议。

提前致谢

编辑不要忘记这一点;其他一些东西在工作中被扔进了混合物中,而这已经被搁置了。当它再次沸腾时会更新(适用于平底锅沸腾 cmets :-))

【问题讨论】:

不确定问题是什么。您想要提供这些数据的第 3 方服务吗? @OrbMan - 或者我可以用来获取指定范围内的邮政编码的数据。但也需要地址查找,因此最有可能是第 3 方。 【参考方案1】:

更新:我刚刚在BBC News site 上看到,邮政编码数据将从本月开始免费提供。鉴于此,我会使用这些数据。我会寻找这个数据库的 API。

上一个答案:英国邮政编码数据由Royal Mail 提供,费用高昂。这带有每个邮政编码的 Lng Lat 数据。皇家邮政数据库的专有性质颇具争议。请参阅this site 了解更多信息。 话虽如此,您可以使用 Google Maps Api 来执行此操作。用户可以在他们居住的地图上输入一个图钉,然后您可以捕获其中的 Lng 和 Lat。它不会为您提供上面指定的所有内容。

这是Google Geocoding API上的一篇好文章

【讨论】:

+1 感谢您的回复。我刚找到ernestmarples.com 和ordnancesurvey.co.uk/opendatadownload/products.html ...现在就看它:-) 祝你好运。测绘是一个雷区。如果您确实在此数据中找到了一个好的 API,请添加您自己的答案。如果我也这样做,我会更新自己的。 看看我的答案中的新链接。【参考方案2】:

至少在美国(我完全不知道任何其他国家/地区的邮政编码格式 - 但如果它们映射到 Long/Lat,这应该可以)您应该能够使用 Haversine 公式来计算给定地理空间半径内的邮政编码。

简单地说,您必须有一个邮政编码 -> 长/纬度表。然后,根据给定的邮政编码(坐标),您可以在数学上确定该点给定距离内的所有纬度和经度坐标 - 然后您将这些近似坐标转换回邮政编码,然后查询邮政编码内的成员。

之后,只需将它们绘制在地图上即可。以下将提供比我所能提供的更多细节,因为它解释了数学并将其实际转换为有效的 mysql 查询以帮助您入门:

http://www.scribd.com/doc/2569355/Geo-Distance-Search-with-MySQL

【讨论】:

【参考方案3】:

您可能会在某些时候遇到的一件事是必须计算两点(纬度/经度)对之间的距离。最著名的算法之一是the Haversine Forumla。我已经根据我找到的一些 C 代码编写了一个实现(不记得原作者对他们的信任)。它是这样的:

public static double DistanceBetween(LatLng pos1, LatLng pos2, DistanceUnit unit)

    double R = 6371;

    switch (unit)
    
        case DistanceUnit.Miles:
            R = 3960;
            break;
        case DistanceUnit.Kilometers:
            R = 6371;
            break;
        case DistanceUnit.Meters:
            R = 6371000;
            break;
    

    double dLat = GeoMath.DegreesToRadians(pos2.Latitude - pos1.Latitude);
    double dLon = GeoMath.DegreesToRadians(pos2.Longitude - pos1.Longitude);
    double a = Math.Sin(dLat / 2) * Math.Sin(dLat / 2) +
        Math.Cos(GeoMath.DegreesToRadians(pos1.Latitude)) *
        Math.Cos(GeoMath.DegreesToRadians(pos2.Latitude)) *
        Math.Sin(dLon / 2) * Math.Sin(dLon / 2);
    double c = 2 * Math.Asin(Math.Min(1, Math.Sqrt(a)));
    double d = R * c;
    return d;

其中 DistantUnit 是一个简单的枚举,而 LatLng 本质上只是一个具有两个双重属性的结构或类。

【讨论】:

【参考方案4】:

几个月前我做过类似的事情。给定一个 IP 地址,我需要知道该服务应该在我们自己的服务器上运行的附近城镇/城市。从我不知道的网站上,我得到了世界各地纬度/经度/城市位置的列表。该表包含大约 8 个 mio 条目。

正如 Dan Diplo 建议的那样,您将需要距离来进行此类查询。我的查询是找到给定纬度/经度坐标的最近位置。 使用与 Dan Diplo 类似的函数,我创建了一个索引,用于计算 DB 条目 (latlng1) 和零 (latlng2) 的距离。该索引仅用于获取索引扫描以减少数据集 - 它不帮助找到最终值。最后,您必须查询您搜索的数据以及到零的距离以减少搜索集。

因此,查询大约需要 100 毫秒。但是你必须使用 Diplo 的函数作为 SQL 索引,这在当前提供数学函数的数据库上应该不是问题。

【讨论】:

以上是关于邮政编码和半径查找建议[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

使用google maps api,如何查找半径内的所有邮政编码?

在其他用户邮政编码的半径范围内定位用户

邮政编码查找 API? [关闭]

使用 array_intersect

基于邮政编码的搜索[关闭]

按邮政编码查找位置[关闭]