2013-02-22 70 views
10

Tôi có bảng với dữ liệu từ GPS, ví dụ .: Latitude, Longitude, Time, UserIdCách tính khoảng cách giữa nhiều điểm trong SQL Server?

Làm thế nào để tổng hợp tổng số khoảng cách trong khung thời gian quy định tổng hợp tất cả các khoảng cách của tất cả các điểm (đặt hàng theo thời gian) và dữ liệu nhóm bằng cách sử dụng?

Cảm ơn

+0

Đối với việc tính toán khoảng cách bản thân bạn có thể muốn nhìn vào < http://williams.best.vwh.net/avform.htm#Dist> –

Trả lời

7

Nếu bạn đang sử dụng SQL Server, bạn có thể quan tâm trong việc sử dụng các kiểu dữ liệu địa lý, do đó bạn có thể yêu cầu các cơ sở dữ liệu bằng cách sử dụng phương pháp chuyên dụng và chỉ số địa lý.

Các kiểu dữ liệu địa lý có sẵn từ SQL Server 2008, bạn có thể biết thêm thông tin ngay tại đây:

http://msdn.microsoft.com/en-us/library/cc280766.aspx

Một khi bạn đã có dữ liệu vào cột địa lý, bạn sẽ có thể để tính toán khoảng cách giữa hai điểm sử dụng STDistance) phương pháp (, xem MSDN:

http://msdn.microsoft.com/en-us/library/bb933808.aspx

Dưới đây là một ví dụ nơi STDistance() được sử dụng để tính toán khoảng cách (với biến dạng địa lý) giữa hai điểm trở lại trong mét (đơn vị tiêu chuẩn quốc tế):

DECLARE @pointA geography; 
DECLARE @pointB geography; 
SET @pointA = geography::STGeomFromText('POINT(-122.34900 50)', 4326); 
SET @pointB = geography::STGeomFromText('POINT(-122.34900 47.65100)', 4326); 
SELECT @pointA.STDistance(@pointB); 

Nếu bạn đang sử dụng SQL Server 2005 (hoặc nếu bạn muốn tránh sử dụng các kiểu dữ liệu địa lý), bạn có thể có một cái nhìn tại dự án MsSQLSpatial trên CodePlex, có sẵn ở đây: http://mssqlspatial.codeplex.com/wikipage?title=Features&referringTitle=Home

+0

Và vì một số lý do, STDistance phân biệt chữ hoa chữ thường. – David

+1

Lý do thực tế là do.Net thực hiện cơ bản trong các tính năng không gian (tương tự cho địa lý hoặc hình học). Trong thực tế, OGC xác định rằng nó phải là ST_Distance trong tiêu chuẩn mà tôi nghĩ, đã được điều chỉnh theo quy ước SQL Server thông thường. –

5

hàm dưới đây mang đến cho khoảng cách giữa hai geocoordinates trong dặm

create function [dbo].[fnCalcDistanceMiles] (@Lat1 decimal(8,4), @Long1 decimal(8,4), @Lat2 decimal(8,4), @Long2 decimal(8,4)) 
returns decimal (8,4) as 
begin 
declare @d decimal(28,10) 
-- Convert to radians 
set @Lat1 = @Lat1/57.2958 
set @Long1 = @Long1/57.2958 
set @Lat2 = @Lat2/57.2958 
set @Long2 = @Long2/57.2958 
-- Calc distance 
set @d = (Sin(@Lat1) * Sin(@Lat2)) + (Cos(@Lat1) * Cos(@Lat2) * Cos(@Long2 - @Long1)) 
-- Convert to miles 
if @d <> 0 
begin 
set @d = 3958.75 * Atan(Sqrt(1 - power(@d, 2))/@d); 
end 
return @d 
end 

Hàm dưới đây mang đến cho khoảng cách giữa hai geocoordinates bằng km

CREATE FUNCTION dbo.fnCalcDistanceKM(@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 

Cách sử dụng:

select [dbo].[fnCalcDistanceKM](13.077085,80.262675,13.065701,80.258916) 

Hàm dưới đây mang đến cho khoảng cách giữa hai geocoordinates bằng km sử dụng Geography loại dữ liệu mà đã được giới thiệu trong sql server 2008

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

tham khảo:Ref1, Ref2

Tôi hy vọng điều này sẽ giúp

+1

Lưu ý rằng các tính toán hình cầu như thế này là chính xác đến khoảng 10 mét trên hàng ngàn km. Nếu cần độ chính xác cao hơn, hãy sử dụng thuật toán của Vincenty hoặc Karney. – N8allan

+0

@ N8allan Cảm ơn bạn đã chỉ ra ** Thuật toán của Vincenty và Karney ** –

+1

@ N8allan Tôi không thể tìm thấy bất kỳ tập lệnh sql nào cho thuật toán này. Tôi sẽ cố gắng chuyển đổi thuật toán thành các tập lệnh SQL khi tôi có thời gian rảnh. –

Các vấn đề liên quan