使用纬度和经度返回 SQL Server 2008 中两个位置之间的距离
Posted
技术标签:
【中文标题】使用纬度和经度返回 SQL Server 2008 中两个位置之间的距离【英文标题】:Return distance between two locations in SQL Server 2008 using latitude and longitude 【发布时间】:2011-11-21 07:05:44 【问题描述】:我们有一张表格,上面有地点及其经纬度。
我们正在尝试在 SQL Server 2008 中创建一个函数,以使用特定的纬度和经度作为中心点来列出接下来 25 公里内的地点。
如果这是开始和测试我们的功能并获取中心点(当前位置)和目标位置(@latitude/@longitude)之间的当前距离的好方法,我正在徘徊:
ALTER FUNCTION [dbo].[GetDistanceFromLocation]
(
@myCurrentLatitude float,
@myCurrentLongitude float,
@latitude float,
@longitude float
)
RETURNS int
AS
BEGIN
DECLARE @radiusOfTheEarth int
SET @radiusOfTheEarth = 6371--km
DECLARE @distance int
SELECT @distance = ( @radiusOfTheEarth
* acos( cos( radians(@myCurrentLatitude) )
* cos( radians( @latitude ) )
* cos( radians( @longitude ) - radians(@myCurrentLongitude) ) + sin( radians(@myCurrentLatitude) )
* sin( radians( @latitude ) ) ) )
RETURN @distance
END
是正确的还是我们遗漏了什么?
【问题讨论】:
【参考方案1】:看起来您正在使用great-circle distance 公式,这对您来说可能已经足够准确了,尽管您必须对此做出判断。
如果要检查公式的结果,可以使用geography 数据类型:
declare @geo1 geography = geography::Point(@lat1, @long1, 4326),
@geo2 geography = geography::Point(@lat2, @long2, 4326)
select @geo1.STDistance(@geo2)
由于您正在执行proximity search,您可能需要进一步调查geography
数据类型。
【讨论】:
什么是 4326?我试图查看 MSDN,但没有任何相关信息。 4326 是世界大地参考系统的空间参考 ID。有关详细信息,请参阅 technet.microsoft.com/en-us/library/bb933811.aspx en.wikipedia.org/wiki/SRID 和 en.wikipedia.org/wiki/WGS84【参考方案2】:这有效吗?
CREATE FUNCTION [dbo].[GetDistanceFromLocation]
(
@CurrentLatitude float,
@CurrentLongitude float,
@latitude float,
@longitude float
)
RETURNS int
AS
BEGIN
DECLARE @geo1 geography = geography::Point(@lat1, @long1, 4268),
@geo2 geography = geography::Point(@lat2, @long2, 4268)
DECLARE @distance int
SELECT @distance = @geo1.STDistance(@geo2)
RETURN @distance
END
谢谢!
【讨论】:
欢迎来到 Stack Overflow!这实际上是评论,而不是答案。多一点代表,you will be able to post comments。我正在标记这篇文章以供删除。以上是关于使用纬度和经度返回 SQL Server 2008 中两个位置之间的距离的主要内容,如果未能解决你的问题,请参考以下文章