邮政编码和半径查找建议

时间:2010-04-16 14:56:42

标签: c# asp.net api postal-code

我为一个基于英国的会员制组织提供了许多部门网站,我们想要做的是提供以及其他地址功能,这是网站用户从网站本身最近的成员查询。

我要填写的一些用例:

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

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

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

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

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

提前致谢

编辑不要忘记这一点;在工作中已经投入了其他一些东西,这已经成为后顾之忧。当它恢复沸腾时会更新(泛沸腾评论的应用程序: - ))

4 个答案:

答案 0 :(得分:4)

更新:我刚刚在BBC News site看到PostCode数据将于本月免费发布。鉴于此,我会使用这些数据。我想看看这个数据库的API。

  

上一个答案:英国邮政编码数据由Royal Mail按重大成本提供。这包含每个邮政编码的Lng Lat数据。皇家邮政数据库的专有性质颇具争议。有关详细信息,请参阅this site   话虽如此,您可以使用Google Maps Api执行此操作。用户可以在他们居住的地图上输入一个别针,你可以捕捉它的Lng和Lat。它不会为您提供上面指定的所有内容。

这是关于Google Geocoding API

的好文章

答案 1 :(得分:2)

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

简而言之,您必须拥有邮政编码 - >长/拉特表。然后,根据给定的邮政编码(坐标),您可以在数学上确定该点的给定距离内的所有纬度和纵向坐标 - 然后您将这些近似坐标转换回拉链,然后查询邮政编码内的成员。

之后,这是将它们绘制在地图上的问题。以下将提供更多详细信息,因为它解释了数学并实际将其转换为有效的MySQL查询以帮助您入门:

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

答案 2 :(得分:2)

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

答案 3 :(得分:0)

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

正如Dan Diplo建议你需要距离这样的查询。我的查询是找到给定lat / lng坐标的最近位置。 使用与Dan Diplo的类似功能,我创建了一个索引,用于计算DB条目(latlng1)和零(latlng2)的距离。此索引仅用于获取索引扫描以减少数据集 - 它有助于查找最终值。最后,您必须查询搜索的数据并将距离设置为零以减少搜索集。

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

相关问题