存在哪些预先存在的服务来计算两个地址之间的距离?

时间:2008-09-22 16:19:54

标签: algorithm geolocation distance

我想实现一种方法来显示按给定地址的接近度排序的存储地址列表。

列表中的地址将存储在数据库表中。单独的部分有单独的字段(我们有邮政编码,城市名称等字段),所以它不仅仅是一个巨大的varchar。这些是用户输入的,由于系统的性质可能并不总是完整的(有些可能缺少邮政编码,而其他可能只有城市和州)。

虽然这是针对Intranet应用程序的,但我使用外部资源(包括访问Internet Web服务等)没有任何问题。我实际上更喜欢滚动自己,除非做自己是微不足道的。如果谷歌或雅虎!已经提供免费服务,我非常愿意查看。关键字是它必须​​是免费的,因为我不能自由地为这个功能引入任何额外的费用,因为它已经是一个奖励“特权”可以这么说。

我正在考虑这个问题,就像很多砖块和砖头一样。砂浆店做他们的“寻找位置”功能。在一个简单的表格中显示它并进行适当的排序并显示距离(例如,英里)很棒。显示地图混搭甚至更酷,但我绝对可以忍受距离回来,我处理所有后续的显示和排序。

简单距离算法的问题在于数据的性质。由于全部或部分地址可能未定义,因此我没有像lat / long coords那样方便的东西。此外,即使我需要邮政编码,90%的地址可能会有相同的五个邮政编码。

虽然它不需要非常快,但是由于延迟而在页面上显示超过7秒的任何内容对于普通用户来说可能太长了,我们知道。如果这样的假设服务支持一次发送一批地址而不是一次查询一个地址,那就太好了。尽管如此,我还是不应该认为地址列表总数会超过50个。

8 个答案:

答案 0 :(得分:10)

GoogleYahoo!都免费提供地理编码服务。您可以使用Haversine formulaimplemented in .NET or SQL)计算距离。这两种服务都允许您进行部分搜索(仅限邮政编码,仅限城市),并让您知道其结果的精确度(以便您可以排除没有有意义信息的位置,尽管Yahoo!提供的精确信息比Google更精确)。

答案 1 :(得分:4)

Google Maps API因其使用条款而对您不利。但是,Yahoo提供了一种REST服务,用于将地址转换为Long / Lat坐标,然后您可以使用它来计算距离。它的here

答案 2 :(得分:2)

要求他们输入邮政编码,然后创建一个数据库表,将邮政编码映射到纬度/经度对(或在线查找)。我不知道你在哪里工作,但在这里,邮政编码可以特定到几米,所以这应该足够精确。然后使用此方法计算两个邮政编码之间的距离:

public static double distance(double lat1, double lon1, double lat2, double lon2, char unit)
{
  double theta = lon1 - lon2;
  double dist = Math.Sin(deg2rad(lat1)) * Math.Sin(deg2rad(lat2)) +
    Math.Cos(deg2rad(lat1)) * Math.Cos(deg2rad(lat2)) * Math.Cos(deg2rad(theta));
  dist = Math.Acos(dist);
  dist = rad2deg(dist);
  dist = dist * 60 * 1.1515;
  if (unit == 'K')
  {
    dist = dist * 1.609344;
  }
  else if (unit == 'N')
  {
    dist = dist * 0.8684;
  }
  return (dist);
}

private static double deg2rad(double deg)
{
  return (deg * Math.PI / 180.0);
}

private static double rad2deg(double rad)
{
  return (rad / Math.PI * 180.0);
}

在地理编码服务上使用自己的代码的好处是,您可以针对数据进行一系列更有趣的计算,并将数据存储在数据库中。

答案 3 :(得分:1)

难道你不能只使用谷歌地图API来获取距离并对它们进行排序吗?

http://code.google.com/apis/maps/

答案 4 :(得分:0)

我建议调查google maps API。

它需要你有一个外部连接(并且它可以将数据分流到Web服务上)但它提供了你需要的东西,即通过要求2点之间的路由获得距离离它的距离。

API reference of the directions API

答案 5 :(得分:0)

我们在公司做过的一件事就是欺骗并使用邮政编码的纬度/经度(大致是邮政编码区域的中心)。它并不完美,但它足够接近那些在n英里的y类搜索中找到x的人。 当地址清理服务无法识别地址时,此功能特别有用。

在某些时候,我遇到了一个免费邮政编码到纬度/经度查找表,用于此近似值。对不起,我再也没有这个链接了。

答案 6 :(得分:0)

其他人已经在Daft Logic完成了这项工作(编辑:错字)。他们将Google Maps API与Great-circle formula一起使用。我认为实施起来并不困难。

更新:实际上,您只需要从您喜爱的提供商处获取坐标,然后使用您的代码进行计算。当用户提供他们的位置时,您可以预先加载商店的坐标 - 您甚至可以使用它来进行验证。然后,在发出请求时,您只能查找客户的位置。

答案 7 :(得分:0)

查看此网站:http://geocoder.us/help/utility.shtml

你可以像这样每15秒处理一次记录: http://geocoder.us/service/distance?zip1=95472&zip2=94305

他们也有没有时间限制的订阅服务