大圆距离公式:T-SQL

Posted

技术标签:

【中文标题】大圆距离公式:T-SQL【英文标题】:Great Circle Distance Formula: T-SQL 【发布时间】:2011-04-29 00:00:31 【问题描述】:

所以我有一张桌子,里面有一堆不同的地址。我需要一个 proc 来选择该表中与传入的纬度/经度值相距指定距离(以英里为单位)内的地址。

我的桌子的例子:

- messageId
- lat (float)
- long (float)

Proc 正在传递另一个纬度/经度对(floats 以及 int(英里)

我找到了这个http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=81360 来计算实际的公式,但我想不出以 proc 形式修改它以便能够浏览整个地址列表,只给我Id 的从我传入的纬度/经度算起

我可以在这里得到任何帮助吗?

谢谢!

【问题讨论】:

【参考方案1】:

SQL Server 2008

使用空间函数STDistance 返回距离(以米为单位)

geography::Point(@lat1, @lon1, 4326).STDistance(geography::Point(@lat2, @lon2, 4326))

【讨论】:

我更喜欢这种方式,它更清洁,而且我可以将米转换为英里 4326 是 WGS82 地理点的 SRID。除非您打算使用与标准 GPS 纬度/经度不同的坐标系,否则您将始终希望使用 4326。 为了极大地提高查询速度,请预先计算 geography::Point 并将其存储为空间数据类型,并对其进行索引。然后你可以拨打point1.STDistance(point2) 如果我创建了一个计算列,在我插入它们时存储为纬度/经度的地理,然后我只在存储的过程中创建另一个点? 那会很好用。这样做是为了避免不必要地生成地理点。【参考方案2】:

实际上,为了这个目的,我不久前写了一个简短的blog post。基本上,我的查询是:

SELECT
  Name,
  Address,
  City,
  State,
  Latitude,
  Longitude,
  (
    ACOS(
      COS(@center_latitude * (PI()/180)) *
      COS(@center_longitude * (PI()/180)) *
      COS(Latitude * (PI()/180)) *
      COS(Longitude * (PI()/180)) +
      COS(@center_latitude * (PI()/180)) *
      SIN(@center_longitude * (PI()/180)) *
      COS(Latitude * (PI()/180)) *
      SIN(Longitude * (PI()/180)) +
      SIN(@center_latitude * (PI()/180)) *
      SIN(Latitude * (PI()/180))
    ) *
    (
      (@equatorial_radius * @polar_radius) /
      (
        SQRT(
          (@equatorial_radius * @equatorial_radius) -
          (
            (
              (@equatorial_radius * @equatorial_radius) -
              (@polar_radius * @polar_radius)
            ) *
            (
              COS(@center_latitude) *
              COS(@center_latitude)
            )
          )
        )
      )
    )
  ) AS Miles
FROM
  Places
WHERE
  Miles <= @search_radius

给它中心纬度,中心经度和搜索半径,你应该很好。 (地球赤道和极地半径的参数自然可以硬编码。)

所有这些数学都应该解释地球的曲率、赤道的膨胀等等。

【讨论】:

我在 WHERE 子句中运行它时遇到错误。它说“无效的列名 - 英里” @slandau:很有趣。我认为它应该可以工作,因为包含所有数学的列都别名为Miles。但经过进一步研究,我猜 T-SQL 不喜欢那样。 (我可能以前在 mysql 中使用过它,已经有一段时间了。)您可以尝试将它放在派生表中。见:***.com/questions/260399/… 有没有办法可以在计算中使用表格中的经度/纬度,但不将它们作为结果集的一部分返回? @slandau:只要从 SELECT 子句中删除它们就可以了。【参考方案3】:

您可以直接在 SP 中使用该函数...我在想:

创建过程 [FindPlaces](@lat 浮点数,@long 浮点数,@min_dist 浮点数) 作为 从您的表中选择 messageId 其中 dbo.F_GREAT_CIRCLE_DISTANCE(@lat, @long, lat, long)

【讨论】:

以上是关于大圆距离公式:T-SQL的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 大圆距离(Haversine 公式)

java Java / Android - 使用大圆公式计算两个坐标之间的距离。

java Java / Android - 使用大圆公式计算两个坐标之间的距离。

java Java / Android - 使用大圆公式计算两个坐标之间的距离。

java Java / Android - 使用大圆公式计算两个坐标之间的距离。

java Java / Android - 使用大圆公式计算两个坐标之间的距离。