2

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

我想填写的几个用例:

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

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

基本上我正在寻找的是一个可编程的 API,我可以编写代码来执行以下操作:

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

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

提前致谢

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

4

4 回答 4

4

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

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

这是一篇关于Google Geocoding API的好文章

于 2010-04-16T15:01:30.943 回答
2

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

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

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

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

于 2010-04-16T15:30:17.540 回答
2

您可能会在某些时候遇到的一件事是必须计算两点(纬度/经度)对之间的距离。最著名的算法之一是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 本质上只是一个具有两个双重属性的结构或类。

于 2010-04-16T15:34:07.470 回答
0

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

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

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

于 2010-08-20T07:49:56.447 回答