代码之家  ›  专栏  ›  技术社区  ›  BlueGene

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

  •  8
  • BlueGene  · 技术社区  · 16 年前

    现在大多数餐馆和其他企业都有 Find Locations “在他们的网站上列出给定地址/邮政编码的最近位置的功能。这是如何实现的?将zipcode与db进行匹配是一种简单而简单的方法,但可能并不总是有效的,例如,可能有一个靠近给定位置的分支,但可能位于不同的zip中。我想到的一种方法是将给定的邮政编码/地址转换为地图坐标,并列出属于预定义半径的任何分支。我欢迎您对如何实现这一点的想法。如果可能,请提供更详细的实现细节,如使用的任何Web服务等。

    8 回复  |  直到 10 年前
        1
  •  6
  •   Charles Graham    16 年前

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

    很多网站基本上都是这样做的。它们给你一个5英里长的多边形内的所有点,然后可能是一个10英里长的多边形,等等。他们实际上并不计算距离。网络上的大多数材料都不复杂。

    你可以看到一些基本的例子 here 了解我在说什么。

        2
  •  4
  •   Brian C. Lane    16 年前

    有一个标准的Zipode/位置数据库可用。 Here is one version in Access format 包括邮政编码的lat/long和其他信息。然后,您可以使用PostgreSQL GIS扩展来搜索位置,例如。

    (当然,假设您提取access db并插入到更友好的数据库(如postgresql)中)

        3
  •  1
  •   Nick Johnson    16 年前

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

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

        4
  •  0
  •   Vilx-    16 年前

    就像你说的。将地址/zip转换为二维世界坐标,并将其与其他已知位置进行比较。选择最近的。:)我认为有些数据库(Oracle,MSSQL2008)甚至提供了一些可以帮助的功能,但我从未使用过它们。

        5
  •  0
  •   SoapBox    16 年前

    我认为这是相当普遍的。他们获取地址或邮政编码并将其转换为“地图坐标”(根据实现情况而不同,可能是lat/long),然后使用数据库中事物的“地图坐标”,很容易计算距离。

    注意,一些糟糕的实现将zipcode转换为表示zipcode区域中心的坐标,这有时会产生糟糕的结果。

        6
  •  0
  •   Craig    16 年前

    你对如何做这件事的想法可能就是我该怎么做的。你可以对邮政编码,然后以此为基础进行计算。我知道SQLServer2008有一些特殊的新功能,可以帮助您根据这些地理编码的lon/lat坐标进行查询。

        7
  •  0
  •   peSHIr    16 年前

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

    this book 例如:沃罗诺伊图、四叉树等。

    然而,我认为在大多数情况下,您在软件中发现的其他答案是正确的:

    1. 搜索区域的地理编码(单点)
    2. 边界框查询,以获取初始大概值
    3. 内存排序/选择
        8
  •  0
  •   Elijah Glover    16 年前

    我有一个每6个月编译一个数据库表的表,它包含3列,我在澳大利亚的一些客户机中使用它,它包含大约4万行,运行查询非常轻量级。 这很快,如果只是想为一个客户做些事情的话

    1. 邮政编码来自
    2. 邮政编码
    3. 距离

      选择store_id,store_accountname,store_postalcode,store_address,store_郊区,store_phone,store_state,code_Distance from store,(选择code_to作为code_to,code_Distance from code where code_from=@postalcode union all选择code_from as code_to,code_Distance from code where code_to=@postalcode union all选择@postalcode作为code_to,0表示代码\u距离)表示代码,其中存储\u postalcode=code_to和code_距离<=@按代码排序的距离\u距离

    为了加快查询速度,可能需要进行大量的优化!.