12

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

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

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

我想这很像许多实体店做他们的“查找位置”功能。将它显示在一个适当排序的简单表格中并显示距离(例如英里)非常棒。显示地图混搭更酷,但我绝对可以忍受只是恢复距离,我处理所有后续显示和排序。

简单距离算法的问题在于数据的性质。由于地址的全部或部分可能未定义,因此我没有任何方便的东西,例如纬度/经度坐标。此外,即使我要求邮政编码,90% 的地址也可能具有相同的五个邮政编码。

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

4

8 回答 8

10

谷歌雅虎!两者都免费提供地理编码服务。您可以使用Haversine 公式在 .NET 或 SQL 中实现)计算距离。这两种服务都可以让您进行部分搜索(仅限邮政编码,仅限城市),并让您知道其结果的精确度(这样您就可以排除没有有意义信息的位置,尽管 Yahoo! 提供的精确度信息比 Google 高)。

于 2008-09-22T16:26:50.150 回答
4

由于使用条款,Google Maps API 对您没有好处。但是,Yahoo 提供 REST 服务,用于将地址转换为经纬度坐标,然后您可以使用它来计算距离。它在这里

于 2008-09-22T16:27:42.100 回答
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);
}

使用您自己的代码而不是地理编码服务的优势在于,您可以对数据进行更多有趣的计算,并将数据与数据一起存储在您的数据库中。

于 2008-09-22T16:34:55.857 回答
1

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

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

于 2008-09-22T16:23:12.313 回答
0

我建议调查谷歌地图 API。

它需要您有一个外部连接(并且可以将其上的数据分流到 Web 服务),但它提供了您所需要的,即通过询问 2 点之间的路线并获取距离它。

路线 API 的 API 参考

于 2008-09-22T16:23:21.563 回答
0

我们在我公司做过的一件事是作弊并使用邮政编码的纬度/经度(大致是邮政编码区域的中心)。它并不完美,但对于那些在 y 类型的搜索 n 英里内找到我 x 的人来说已经足够接近了。当地址清理服务无法识别地址时,这尤其有用。

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

于 2008-09-22T16:25:35.007 回答
0

其他人已经在Daft Logic做到了(编辑:错字)。他们使用 Google Maps API 和Great-circle formula。我认为实施起来并不难。

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

于 2008-09-22T16:28:09.213 回答
0

看看这个网站: http: //geocoder.us/help/utility.shtml

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

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

于 2008-09-22T18:34:20.423 回答