“查找最近的位置”如何工作?

时间:2008-11-30 23:51:38

标签: algorithm mapping

如今大多数餐馆和其他企业在其网站上都有“Find Locations”功能,其中列出了给定地址/ Zip的最近位置。这是如何实现的?将邮政编码与数据库匹配是一种简单易用的方法,但可能并不总是有效,例如,可能有一个更接近给定位置的分支,但可能是不同的拉链。我想到的一种方法是将给定的邮政编码/地址转换为地图坐标,并列出任何落入预定义半径的分支。我欢迎你对如何实现这一点的想法。如果可能提供更详细的实施细节,如任何使用的网络服务等,

8 个答案:

答案 0 :(得分:6)

许多地理空间框架将帮助您解决这个问题。在地理空间世界中,邮政编码只是一个“多边形”,它只是地图上的一个区域,它定义了清晰的边界(不是数学意义上的多边形)。例如,在SQL 2008 spatial中,您可以基于原始多边形创建新的多边形。因此,您可以动态创建一个多边形,这是您的邮政编码在每个点都延伸了一定距离。它考虑了邮政编码的时髦形状。使用地址,这很容易,因为您只需创建一个多边形,这是一个圆周围的圆。然后,您可以执行查询,为您提供在任一方法中创建的新多边形内的所有点。

很多这些网站基本上都是这样做的。它们为您提供5英里扩展多边形内的所有点,然后可能是10英里的扩展多边形,依此类推。它们实际上并不是在计算距离。网上的大部分内容都不复杂。

你可以看到一些基本的例子here来了解我所说的内容。

答案 1 :(得分:4)

有一个标准的zipode /位置数据库可用。 Here is one version in Access format包括zip码的纬度/经度以及其他信息。然后,您可以使用PostgreSQL GIS扩展来搜索位置,例如。

(当然假设你提取访问数据库并插入一个更友好的数据库,如PostgreSQL)

答案 2 :(得分:1)

首先,您对地址进行地理编码,将其转换为(通常)纬度和经度。然后,在数据库中对感兴趣的点执行最近邻居查询。

大多数空间索引不直接支持最近邻居查询,因此这里通常的方法是在中心的地理编码点上查询合理大小的边界框,然后在内存中对结果进行排序以选择最接近的的。

答案 3 :(得分:0)

就像你说的那样。将地址/ ZIP转换为2D世界坐标,并将其与其他已知位置进行比较。选择最近的。 :)我认为一些DB(Oracle,MSSQL 2008)甚至提供了一些可以提供帮助的功能,但我从未使用它们。

答案 4 :(得分:0)

我认为它非常普遍。他们将地址或邮政编码转换为“地图坐标”(根据实施情况而有所不同,可能是纬度/经度),然后使用数据库中事物的“地图坐标”,很容易计算距离。

请注意,一些糟糕的实现将zipcode转换为代表邮政编码区域中心的坐标,这有时会产生不良结果。

答案 5 :(得分:0)

你对如何做到这一点的想法是我可能会这样做的。您可以对zip进行地理编码,然后根据该计算进行计算。我知道SQL Server 2008有一些特殊的新功能可以帮助您根据这些地理编码的lon / lat坐标进行查询。

答案 6 :(得分:0)

实际的几何算法和/或数据结构支持对点,线和/或区域数据进行较低的O(...)最近位置查询。

请参阅this book作为其中一些信息的示例,例如:Voronoi图,四叉树等。

但是我认为这里的其他答案在大多数情况下都适用于今天的软件:

  1. 地理编码(搜索区域中的单个点)
  2. 边界框查询以获得初始球场
  3. 在内存排序/选择中

答案 7 :(得分:0)

我有一个表,我将每6个月编译一个数据库表,它包含3列,我在澳大利亚的几个客户端使用它,它包含大约40k行,非常轻量级运行查询。 这很快,如果只想为客户提供一些东西

  1. 的邮政编码
  2. 邮政编码至
  3. 距离

    SELECT Store_ID,Store_AccountName,Store_PostalCode,Store_Address,Store_Suburb,Store_Phone,Store_State,Code_Distance FROM Store,(SELECT Code_To As Code_To,Code_Distance FROM Code WHERE Code_From = @PostalCode UNION ALL SELECT Code_From As Code_To,Code_Distance FROM Code WHERE Code_To = @ PostalCode UNION ALL SELECT @PostalCode As Code_To,0 As Code_Distance)As Code WHERE Store_PostalCode = Code_To AND Code_Distance< = @Distance ORDER BY Code_Distance

  4. 您可以进行大量优化以加快此查询速度!。

相关问题