我为一个基于英国的会员制组织提供了许多部门网站,我们想要做的是提供以及其他地址功能,这是网站用户从网站本身最近的成员查询。
我要填写的一些用例:
案例1 :用户输入他们的邮政编码,希望看到距离他们5/10/15/20/30/40英里半径的所有成员
案例2 :成员放入一个区域(城市,县等)并获取该区域内的成员列表。
基本上我正在寻找的是一个可编程的API,我可以编写代码来做:
有什么建议吗?它可以是服务器上的季度更新安装,也可以是可查询的Web服务。我愿意接受建议。
提前致谢
编辑不要忘记这一点;在工作中已经投入了其他一些东西,这已经成为后顾之忧。当它恢复沸腾时会更新(泛沸腾评论的应用程序: - ))
答案 0 :(得分:4)
更新:我刚刚在BBC News site看到PostCode数据将于本月免费发布。鉴于此,我会使用这些数据。我想看看这个数据库的API。
的好文章上一个答案:英国邮政编码数据由Royal Mail按重大成本提供。这包含每个邮政编码的Lng Lat数据。皇家邮政数据库的专有性质颇具争议。有关详细信息,请参阅this site 话虽如此,您可以使用Google Maps Api执行此操作。用户可以在他们居住的地图上输入一个别针,你可以捕捉它的Lng和Lat。它不会为您提供上面指定的所有内容。
答案 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)
正如Dan Diplo建议你需要距离这样的查询。我的查询是找到给定lat / lng坐标的最近位置。 使用与Dan Diplo的类似功能,我创建了一个索引,用于计算DB条目(latlng1)和零(latlng2)的距离。此索引仅用于获取索引扫描以减少数据集 - 它有助于查找最终值。最后,您必须查询搜索的数据并将距离设置为零以减少搜索集。
因此查询大约需要100毫秒。但是你必须使用Diplo的函数作为SQL索引,这对于提供数学函数的当前数据库来说不应该是一个问题。