2010-04-16 69 views
3

我负责为基于英国的会员组织提供多个分部网站,并且我们想要提供的以及其他地址功能是网站用户最接近的网站成员查询他们自己。邮政编码和半径查找建议

,我要填写一些用例:

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

案例2:成员放置在一个地区(市,县等),并获得该地区的成员名单。

基本上就是我要找的是一个可编程的API,我可以对代码做:

  • 邮编查询并返回地址(选择门牌号例如后)。
  • 搜索职位代码+半径(5英里,10英里等),并得到了一套适用的工作地点代码然后在数据库中

的任何建议加入到会员记录?它可以是服务器上的季度更新安装,它可以是可查询的Web服务。我接受建议。

在此先感谢

编辑没有忘记这一点;在工作中混入了另外一些东西,这已经变成了背后的燃烧器。当它回到沸腾时会更新(panlog沸腾评论:-))

+0

不知道问题是什么。你想要提供这些数据的第三方服务? – RedFilter 2010-04-16 15:01:08

+0

@OrbMan - 或者我可以用来获取特定范围内邮政编码的数据。但也需要查找查找,因此第三方看起来很可能。 – WestDiscGolf 2010-04-16 15:23:34

回答

4

更新:我刚刚在BBC News site上看到PostCode数据将从本月开放。鉴于此,我会使用这些数据。我会看看这个数据库的API。

上一个回答:英国邮政编码数据以Royal Mail提供,费用重大。这是每个邮政编码的Lng Lat数据。皇家邮政数据库的专有性质颇具争议性。有关更多信息,请参见this site
话虽如此,你可以使用谷歌地图API来做到这一点。用户可以在他们居住的地图上输入一个别针,并且可以捕获该地图的Lng和Lat。它不会给你你上面指定的一切。

这是至少在美国的Google Geocoding API

+1

+1感谢您的回复。我刚刚找到了http://www.ernestmarples.com/和https://www.ordnancesurvey.co.uk/opendatadownload/products.html ...现在只看它:-) – WestDiscGolf 2010-04-16 15:22:22

+0

祝你好运。测绘是一个雷区。如果您确实在这些数据中找到了好的API,请添加您自己的答案。如果我也会更新我自己的。 – 2010-04-16 15:24:48

+0

看看我的答案中的新链接。 – 2010-04-16 21:28:24

2

一个很好的文章(我完全不知道任何其他国家的邮政编码格式的 - 但如果他们映射到经度/纬度,这应该工作),您应该可以使用Haversine公式计算给定地理空间半径内的邮政编码。

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

之后,这是一个绘制在地图上的问题。下面将给出更多的细节比我所能,因为它解释了数学和实际上它转换成一个工作MySQL查询,让您开始:

你可能会在某个时候遇到

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

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是一个简单枚举和经纬度本质上只是一个结构或类有两个双重属性。

0

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

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

因此查询花费了大约100ms。但是你必须使用Diplo的函数作为SQL索引,它不应该成为当前提供数学函数的数据库的问题。