大圆距离公式:T-SQL

时间:2011-04-29 00:00:32

标签: tsql great-circle

所以我有一个包含大量不同地址的表。我需要一个proc,它将选择该表中与传入的lat / long值相距指定距离的地址。

我表的例子:

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

Proc正在传入另一个纬度/长度对(同时也是float个)以及int(英里)

我发现这个http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=81360来计算实际的公式,但是我无法想出在proc表单中修改它以便能够遍历整个地址列表而只给我Id地址是< =里程(我传入的),来自我传入的纬度/经度。

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

谢谢!

3 个答案:

答案 0 :(得分:6)

SQL Server 2008

使用空间函数STDistance返回距离(米)

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

答案 1 :(得分: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

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

所有这些数学都应该考虑到地球的曲率,赤道的凸起等等。

答案 2 :(得分:0)

你可以直接在SP中使用这个功能......我在想:


CREATE PROCEDURE [FindPlaces](@lat float, @long float, @min_dist float) 
AS 

select messageId from yourtable
where dbo.F_GREAT_CIRCLE_DISTANCE(@lat, @long, lat, long)