9

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

所以我的桌子的例子:

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

Proc 正在传递另一个 lat/long 对(两个floats 以及)以及一个int(英里)

我发现这个http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=81360来计算实际的公式,但我无法弄清楚以 proc 形式修改它以便能够通过整个列表地址,并且只给我Id从我传入的纬度/经度开始的 <= 英里(我传入的英里)的地址。

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

谢谢!

4

3 回答 3

6

SQL Server 2008

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

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

于 2011-04-29T00:32:36.963 回答
2

实际上,为了这个目的,我不久前写了一篇简短的博客文章。基本上,我的查询是:

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

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

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

于 2011-04-29T00:07:32.457 回答
0

您可以直接在 SP 中使用该功能...我在想:

创建过程 [FindPlaces](@lat 浮点数,@long 浮点数,@min_dist 浮点数)
作为

从您的表中选择 messageId
其中 dbo.F_GREAT_CIRCLE_DISTANCE(@lat, @long, lat, long)
于 2011-04-29T00:10:21.007 回答