2012-01-18 44 views
7

這是我的代碼。在sqlserver 2008中使用地理數據類型的兩點之間的距離?

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中兩個位置之間的距離。

請幫幫我。 謝謝。

+0

可能重複(http://stackoverflow.com/questions/8667647/find-the-nearest-location-in-ms-sql) – 2012-01-18 09:41:07

回答

20

如果你有你的度形式的緯度和經度(就像在你的桌子),那麼你可以使用以下功能:

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 

OR如果你堅持地理類型,用法是:

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); 
的[發現在MS-SQL最近的位置]
+1

請注意,球體組合諸如此類的推理精確到數千公里的約10米。如果需要更高的精確度,請使用Vincenty或Karney的算法。 – N8allan 2014-08-29 16:23:19

+1

@OlegDok - 我也試圖找出使用sql腳本的算法實現。我找不到任何東西... – 2014-10-09 11:56:12

+0

@ N8allan - 很好的指出算法 – Shajo 2014-10-09 11:59:43