在SQL Server 2008中使用地理数据类型计算两点之间的距离?

7

这是我的代码。

Create Table [dbo].[MajorCities]
(
[CityID] int Identity(1,1),
[CityName] varchar(60),
[Latitude] float,
[Longitude] float,
GeoRef Geography
)

INSERT INTO dbo.[MajorCities] values
 ('New Delhi, India', 28.6, 77.2, null),
 ('Paris, France', 48.86667, 2.3333, null),
 ('Rio de Janeiro, Brazil', -22.9, -43.23333, null),
 ('Sydney, Australia', -33.88306, 151.21667, null),
('New York City, USA', 40.78333, -73.96667, null)

select * from [MajorCities]


UPDATE [dbo].[MajorCities]
SET [GeoRef] = geography::STPointFromText ('POINT (' + CAST ([Longitude] AS VARCHAR (20)) + ' ' +
                    CAST ([Latitude] AS VARCHAR (20)) + ')', 4326)

我想找到两个位置之间的距离,单位为公里。

请帮助我。 谢谢。


可能是重复的问题:在 MS-SQL 中查找最近的位置 - Oleg Dok
1个回答

22

如果您的纬度和经度以度为单位给出(就像在您的表格中一样),则可以使用以下函数:

CREATE FUNCTION dbo.DictanceKM(@lat1 FLOAT, @lat2 FLOAT, @lon1 FLOAT, @lon2 FLOAT)
RETURNS FLOAT 
AS
BEGIN

    RETURN ACOS(SIN(PI()*@lat1/180.0)*SIN(PI()*@lat2/180.0)+COS(PI()*@lat1/180.0)*COS(PI()*@lat2/180.0)*COS(PI()*@lon2/180.0-PI()*@lon1/180.0))*6371
END

或者,如果您坚持使用地理类型,则应使用:

DECLARE @g geography;
DECLARE @h geography;
SET @g = geography::STGeomFromText('LINESTRING(-122.360 47.656, -122.343 47.656)', 4326);
SET @h = geography::STGeomFromText('POINT(-122.34900 47.65100)', 4326);
SELECT @g.STDistance(@h);

1
请注意,此类椭球计算在数千公里范围内的精度约为10米。 如果需要更高的精度,请使用Vincenty或Karney的算法。 - N8allan
1
@OlegDok - 我也尝试使用SQL脚本查找算法实现,但是我什么也没找到... - Durai Amuthan.H
如果两个位置完全相同,则使用纯数学版(带三角函数)会产生“无效的浮点运算”。 - BusinessAlchemist

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接