在 sql server 2008 中使用地理数据类型的两点之间的距离?

Posted

技术标签:

【中文标题】在 sql server 2008 中使用地理数据类型的两点之间的距离?【英文标题】:Distance between two points using Geography datatype in sqlserver 2008? 【发布时间】:2012-01-18 09:32:19 【问题描述】:

这是我的代码。

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)

我想在 KM 中找到两个位置之间的距离。

请帮助我。 谢谢。

【问题讨论】:

find the nearest location in ms-sql 的可能重复项 【参考方案1】:

如果您有度数形式的纬度和经度(就像在您的表格中),那么您可以使用以下函数:

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

如果您坚持使用 Geography 类型,则用法为:

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);

【讨论】:

请注意,此类球体计算在数千公里范围内精确到大约 10 米。如果需要更高的准确度,请使用 Vincenty 或 Karney 的算法。 @OlegDok - 我还尝试使用 sql 脚本找出算法实现。我找不到任何东西...

以上是关于在 sql server 2008 中使用地理数据类型的两点之间的距离?的主要内容,如果未能解决你的问题,请参考以下文章

如何将地理批量插入新的 sql server 2008 表

SQL Server 2008 地理空间查询

使用 SQL Server 2008 地理类型的查询点

查询以将在特定地理距离内的行返回到给定行(使用 sql server 2008)

SQL Server 2008 在具有空间索引的可空地理列上的性能

将有效的几何形状保存到 Sql Server 2008 地理列中