【问题标题】:Product Lookup By Postal/Zip Code | Haversine Algorithm | Performance按邮政编码查找产品 |半正弦算法 |表现
【发布时间】:2016-05-17 06:52:53
【问题描述】:

我有一个基于邮政编码搜索项目的应用程序。

在搜索邮政编码时,我会返回来自该城市/社区的所有产品(通过解析邮政编码完成)。

我现在需要根据与原始邮政编码的距离对这些产品进行分类。

我将 Lat/Long 存储在 DB 中,并计划使用 Haversine 公式计算与原始查询的距离。

我的问题是,这应该在哪里计算。 在返回我的数据集之前,我应该在存储过程中执行此操作吗?

或者我应该返回我的数据集,我的纬度/经度,并在返回给用户之前在服务器端计算它。

可能需要针对多达 1000 个结果执行计算。

【问题讨论】:

  • 我远不是这个主题的专家(我曾使用 PostGIS 和 vincenty 进行空间查询),但可能是数据库,因为您可以对纬度/经度数据和顺序进行空间索引通过STDistance(),您需要按距离排序。数据库之外的任何东西都可以,但你会重新发明轮子。

标签: c# sql sql-server haversine


【解决方案1】:

通常,数据库服务器受 IO 限制而不是 CPU 限制。 YMMV,但如果您的情况很典型,最好在数据库服务器上执行 Haversine 计算。

我建议为您的 反正弦 计算使用自定义查找表,因为您可以提供对数刻度的近似距离,例如:

  • 100 米,

  • 300 米,

  • 1 公里,

  • 3 公里,

  • 10 公里,

  • 30 公里,

  • > 30 公里

    然后使用线性插值作为细化。

对于单个大都市区遇到的典型距离,您可以考虑仅使用 the Taylor expansion for sin and cos 的 2 或 3 个术语,而不是更精确的计算:

  • sin(x) =~ x - x^3 / 6 + x^5 / 120
  • cos(x) =~ 1 - x^2 / 2 + x^4 / 24

还记得对于收敛的泰勒级数,第 n 项之后的误差严格小于第 (n+1) 项的大小。这使您可以在达到所需精度后有效地终止计算,由于地球不是一个均匀的球体,Haversine 公式的精度通常仅为 0.5%。

【讨论】:

    【解决方案2】:

    您使用的是 SQL Server 2008 或更高版本吗?如果是这样,我建议使用内置的地理数据类型,而不是直接进行 Haversine 计算。您可以有一个邮政编码表,其中包含邮政编码(例如 90210)和邮政编码的中心点或另一列中邮政编码覆盖的整个区域(或者如果这对您的应用程序有意义)。然后,您可以使用STDistance() 函数计算距离。此外,通过空间索引,您可以轻松获得按距离排序的列表。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-17
      • 1970-01-01
      • 1970-01-01
      • 2016-10-06
      • 1970-01-01
      • 2014-12-10
      • 2012-04-03
      相关资源
      最近更新 更多