所以我有一个包含大量不同地址的表。我需要一个proc,它将选择该表中与传入的lat / long值相距指定距离的地址。
我表的例子:
- messageId
- lat (float)
- long (float)
Proc正在传入另一个纬度/长度对(同时也是float
个)以及int
(英里)
我发现这个http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=81360来计算实际的公式,但是我无法想出在proc表单中修改它以便能够遍历整个地址列表而只给我Id
地址是< =里程(我传入的),来自我传入的纬度/经度。
我可以在这里得到任何帮助吗?
谢谢!
答案 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)